TooTallNate/node-speaker

mmap() failed on Raspberry Pi

Opened this issue · 1 comments

Possibly related to #90

I can play a short sound a few times, and then it crashes

mmap() failed: Cannot allocate memory
Failed to create permanent mapping for memfd region with ID = 909071082
mmap() failed: Cannot allocate memory
Failed to create permanent mapping for memfd region with ID = 3399700439
Ignoring received block reference with non-registered memfd ID = 3399700439
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Protocol error

[../deps/mpg123/src/output/alsa.c:165] error: cannot open device default
events.js:167
      throw er; // Unhandled 'error' event
      ^

Error: open() failed: -1
    at Speaker._open (/home/pi/halloween/node_modules/speaker/index.js:106:13)
    at Speaker._write (/home/pi/halloween/node_modules/speaker/index.js:183:23)
    at doWrite (/home/pi/halloween/node_modules/readable-stream/lib/_stream_writable.js:428:64)
    at writeOrBuffer (/home/pi/halloween/node_modules/readable-stream/lib/_stream_writable.js:417:5)
    at Speaker.Writable.write (/home/pi/halloween/node_modules/readable-stream/lib/_stream_writable.js:334:11)
    at Volume.ondata (_stream_readable.js:666:20)
    at Volume.emit (events.js:182:13)
    at addChunk (_stream_readable.js:283:12)
    at readableAddChunk (_stream_readable.js:264:11)
    at Volume.Readable.push (_stream_readable.js:219:10)
Emitted 'error' event at:
    at Speaker.onerror (_stream_readable.js:690:12)
    at Speaker.emit (events.js:182:13)
    at onwriteError (/home/pi/halloween/node_modules/readable-stream/lib/_stream_writable.js:443:12)
    at onwrite (/home/pi/halloween/node_modules/readable-stream/lib/_stream_writable.js:470:11)
    at WritableState.onwrite (/home/pi/halloween/node_modules/readable-stream/lib/_stream_writable.js:180:5)
    at Speaker._write (/home/pi/halloween/node_modules/speaker/index.js:185:16)
    at doWrite (/home/pi/halloween/node_modules/readable-stream/lib/_stream_writable.js:428:64)
    [... lines matching original stack trace ...]
    at Volume.ondata (_stream_readable.js:666:20)

Here's the full code:

const Speaker = require('speaker');
const fs = require('fs');
const stream = require('stream');
const Volume = require('pcm-volume');
const lame = require('lame');
const streamToBuffer = require('stream-to-buffer');

function loadSound( sound ){
	return new Promise((res, rej) => {
		const decoder = new lame.Decoder();
		decoder.on('format', format => {
			streamToBuffer(decoder, (err, buffer) => {
				err ? rej(err) : res(buffer);
			});
		});
		fs.createReadStream(__dirname+'/'+sound).pipe(decoder);
	});
}

function playSound( buffer, volume = 1 ){
	let bufferStream = new stream.PassThrough();
	bufferStream.end(buffer);
	// Setup volume
	const v = new Volume();
	v.setVolume(volume);
	// Setup speaker
	let speaker = new Speaker();
	v.pipe(speaker);
	bufferStream.pipe(v);
}

var i = 0;
async function exec(){
	let sound = await loadSound('coin_in_cauldron.mp3');
	let timeout = setInterval(() => {
		playSound(sound);
		if( ++i > 4 )
			clearTimeout(timeout);
	}, 1000);
	playSound(sound);
}

exec();

I have the same issue, sound is just not outputting