voice icon indicating copy to clipboard operation
voice copied to clipboard

Memory leak with inlineVolume: true

Open cjh980402 opened this issue 2 years ago • 6 comments

Please describe the problem you are having in as much detail as possible:

Include a reproducible code sample here, if possible:

// Place your code here
let stream = await playdl.stream('https://www.youtube.com/watch?v=rn0wEJmoGdg')

let resource = createAudioResource(stream.stream, {
    inputType : stream.type,
    inlineVolume: true
})
let player = createAudioPlayer({
    behaviors: {
        noSubscriber: NoSubscriberBehavior.Stop
    }
})
player.play(resource)

connection.subscribe(player)

// wait 10 seconds

let connection = getVoiceConnection(message.guild.id)
let player = connection.state.subscription.player
player.stop()

// repeat above code about 5~10 times then we can see memory leak(memory usage is increased.)

Further details:

  • @discordjs/voice version: 0.6.0
  • Node.js version: 16.6.2
  • Operating system: ubuntu 20.04
  • Priority this issue should have – please be realistic and elaborate if possible:
  • Issue is memory usage is increased when inlineVolume: true for createAudioResource.
  • I can see my issue when play long song (like https://www.youtube.com/watch?v=rn0wEJmoGdg) and enable the volume (inlineVolume: true).

Relevant client options:

  • partials: none
  • gateway intents: none
  • other: none

cjh980402 avatar Sep 09 '21 12:09 cjh980402

You could have provided a better code for them to test :-

client.on('messageCreate', async message => {
	if(message.content.startsWith('!play')){
		await connectVC(message)
		play_loop(message)
	}
})

async function connectVC(message){
	if(!message.member.voice?.channel) return message.channel.send('Connect to a Voice Channel')
	const connection = joinVoiceChannel({
		channelId : message.member.voice.channel.id,
		guildId : message.guild.id,
		adapterCreator: message.guild.voiceAdapterCreator
	})
	
	let player = createAudioPlayer({
		behaviors: {
			noSubscriber: NoSubscriberBehavior.Play
		}
	})
	connection.subscribe(player)
}

async function play_loop(message){
	
	let stream = await playdl.stream('https://www.youtube.com/watch?v=6tyB97J1cVA&t=834s')

	let resource = createAudioResource(stream.stream, {
		inputType : stream.type,
		inlineVolume: true
	})
	
	let connection = getVoiceConnection(message.guild.id)
	let player = connection.state.subscription.player
	player.play(resource)

	setTimeout(() => {
		player.stop()
		setTimeout(() => {play_loop(message)}, 6000)
	}, 10000)
}

iim-ayush avatar Sep 09 '21 13:09 iim-ayush

Audio Resource getting in that 6 seconds loop [ where I am looping play_loop() function ] :-

here

iim-ayush avatar Sep 09 '21 13:09 iim-ayush

This seems to occur within the opus Encoder as piping audio control through FFMPEG (both prism-media's FFmpeg class and conventionally using child_process.spawn) outputting as S16LE and then piping to an opus Encoder causes the leak.

PapiOphidian avatar Sep 24 '21 04:09 PapiOphidian

Is there any fix yet?

pauldb09 avatar Nov 25 '21 20:11 pauldb09

A fix lib side has not been implemented yet

A workaround is to have all voice logic in a separate worker_thread since they're their own separate v8 instance which you can destroy arbitrarily and all the resources will be freed.

PapiOphidian avatar Nov 25 '21 20:11 PapiOphidian

Is there any fix yet?

Yup just uninstall discordjs opus now and start using opusscript.

iim-ayush avatar Nov 26 '21 02:11 iim-ayush