const audioPlayer = createAudioPlayer({
behaviors: {
maxMissedFrames: 1000,
noSubscriber: NoSubscriberBehavior.Play,
},
})
const connection = joinVoiceChannel({
channelId: channel.id,
guildId: interaction.guildId!,
adapterCreator: channel.guild
.voiceAdapterCreator as DiscordGatewayAdapterCreator,
debug: true,
selfDeaf: false,
selfMute: false,
})
connection.on("stateChange", (oldState, newState) => {
logger.info(
`Connection transitioned from ${oldState.status} to ${newState.status}`
)
})
audioPlayer.on("stateChange", (oldState, newState) => {
logger.info(
`Audio player transitioned from ${oldState.status} to ${newState.status}`
)
})
let audioQueue: Buffer[] = []
const audioStream = new Readable({
read(size) {
console.log("read", size)
if (audioQueue.length > 0) {
logger.debug("sending audio data")
const chunk = audioQueue.shift()
return chunk
}
logger.debug("no audio data")
return null
},
})
emitter.on("audio", (audioData: AudioData) => {
audioQueue.push(audioData.audioBuffer)
audioStream.emit("readable", audioData.audioBuffer)
audioStream.emit("data", audioData.audioBuffer)
})
const resource = createAudioResource(audioStream, {
inputType: StreamType.WebmOpus,
inlineVolume: true,
})
audioPlayer.on("error", (error) => {
logger.error({ error }, "Error in audio player")
})
connection.on("error", (error) => {
logger.error({ error }, "Error in connection")
})
connection.subscribe(audioPlayer)
connection.on(VoiceConnectionStatus.Ready, () => {
logger.debug("Connection is ready, starting playback")
audioPlayer.play(resource)
})