{"_id":"@audio/speaker","_rev":"3-6c4292ed0547a800100079902530b02b","name":"@audio/speaker","dist-tags":{"latest":"2.3.3"},"versions":{"2.3.1":{"name":"@audio/speaker","version":"2.3.1","keywords":["audio","audiojs","pcm","speaker","web-audio","sound","sink","miniaudio"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/speaker@2.3.1","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"homepage":"https://github.com/audiojs/speaker#readme","bugs":{"url":"https://github.com/audiojs/speaker/issues"},"dist":{"shasum":"574a2219a7fd581a614d5619f24018b20ea2bff5","tarball":"https://registry.npmjs.org/@audio/speaker/-/speaker-2.3.1.tgz","fileCount":15,"integrity":"sha512-k+bL0O+vfDir6GfHvnDvMfn+il7oixxQvFxNXvf7T+wxdycWcYDtwEiSQfATL7LmrXK7XLZjc/nZ9QKg3OFE/Q==","signatures":[{"sig":"MEYCIQCGkwhlDm4CLcyrl0fdeper24jYnRom6E390Il8R/O8sQIhAO6EMgAOuXw8AC6oElHclwDE8NPqWtu9eLdBCl8FL8in","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4141703},"main":"./index.js","type":"module","types":"./index.d.ts","browser":{"./index.js":"./browser.js"},"engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","browser":"./browser.js","default":"./index.js"},"./stream":{"types":"./stream.d.ts","browser":"./browser.js","default":"./stream.js"}},"gitHead":"3938a6b2d8d1b173fbd6396b9e0e6e1e723ab1fa","gypfile":true,"scripts":{"test":"node test.js","build":"node-gyp rebuild","install":"node-gyp rebuild","version":"node -e \"const v=require('./package.json').version,fs=require('fs');for(const d of fs.readdirSync('packages')){const f='packages/'+d+'/package.json',p=JSON.parse(fs.readFileSync(f));p.version=v;fs.writeFileSync(f,JSON.stringify(p,null,2)+'\\n')}\" && git add packages/*/package.json"},"_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"repository":{"url":"git+https://github.com/audiojs/speaker.git","type":"git"},"_npmVersion":"11.12.1","description":"Output audio data to speaker in browser/node","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tst":"^9.3.0","prebuildify":"^6.0.1"},"optionalDependencies":{"@audio/speaker-linux-x64":">=2.0.0","@audio/speaker-win32-x64":">=2.0.0","@audio/speaker-darwin-x64":">=2.0.0","@audio/speaker-linux-arm64":">=2.0.0","@audio/speaker-darwin-arm64":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/speaker_2.3.1_1783540244331_0.013831888253345026","host":"s3://npm-registry-packages-npm-production"}},"2.3.2":{"name":"@audio/speaker","version":"2.3.2","keywords":["audio","audiojs","pcm","speaker","web-audio","sound","sink","miniaudio"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/speaker@2.3.2","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"homepage":"https://github.com/audiojs/speaker#readme","bugs":{"url":"https://github.com/audiojs/speaker/issues"},"dist":{"shasum":"8605f662fc63c10892ce2ec2278b53510666b4e1","tarball":"https://registry.npmjs.org/@audio/speaker/-/speaker-2.3.2.tgz","fileCount":15,"integrity":"sha512-dfrpfA2L9229xiWoOAUhFYM8vRrQBvn5K7GrTonQ9tH8R53pJgUlvUBDqlSTPkl/SEFyn6/UaCKLP976kQ6ZAw==","signatures":[{"sig":"MEUCIE1AdgzuKbrQweaJC3fb2UpSD3pL3MsKg90pOZQyIYRXAiEAyQu6cLkL6bC6ZQpnt2DUnKYTrsn7fogAONcmExCY67s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4141709},"main":"./index.js","type":"module","types":"./index.d.ts","browser":{"./index.js":"./browser.js"},"engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","browser":"./browser.js","default":"./index.js"},"./stream":{"types":"./stream.d.ts","browser":"./browser.js","default":"./stream.js"}},"funding":"https://github.com/sponsors/audiojs","gitHead":"f63bd13ecd50a7f4e88725b1f0d073b6c7ad083c","gypfile":true,"scripts":{"test":"node test.js","build":"node-gyp rebuild","install":"node-gyp rebuild","version":"node -e \"const v=require('./package.json').version,fs=require('fs');for(const d of fs.readdirSync('packages')){const f='packages/'+d+'/package.json',p=JSON.parse(fs.readFileSync(f));p.version=v;fs.writeFileSync(f,JSON.stringify(p,null,2)+'\\n')}\" && git add packages/*/package.json"},"_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"repository":{"url":"git+https://github.com/audiojs/speaker.git","type":"git"},"_npmVersion":"11.12.1","description":"Output audio data to speaker in browser/node","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tst":"^9.3.0","prebuildify":"^6.0.1"},"optionalDependencies":{"@audio/speaker-linux-x64":">=2.0.0","@audio/speaker-win32-x64":">=2.0.0","@audio/speaker-darwin-x64":">=2.0.0","@audio/speaker-linux-arm64":">=2.0.0","@audio/speaker-darwin-arm64":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/speaker_2.3.2_1783731846533_0.6902014670037098","host":"s3://npm-registry-packages-npm-production"}},"2.3.3":{"name":"@audio/speaker","version":"2.3.3","description":"Output audio data to speaker in browser/node","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"types":"./index.d.ts","browser":"./browser.js","default":"./index.js"},"./stream":{"types":"./stream.d.ts","browser":"./browser.js","default":"./stream.js"}},"browser":{"./index.js":"./browser.js"},"scripts":{"build":"node-gyp rebuild","test":"node test.js","version":"node -e \"const v=require('./package.json').version,fs=require('fs');for(const d of fs.readdirSync('packages')){const f='packages/'+d+'/package.json',p=JSON.parse(fs.readFileSync(f));p.version=v;fs.writeFileSync(f,JSON.stringify(p,null,2)+'\\n')}\" && git add packages/*/package.json","install":"node-gyp rebuild"},"gypfile":true,"repository":{"type":"git","url":"git+https://github.com/audiojs/speaker.git"},"keywords":["audio","audiojs","pcm","speaker","web-audio","sound","sink","miniaudio"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/audiojs/speaker/issues"},"homepage":"https://github.com/audiojs/speaker#readme","engines":{"node":">=18"},"optionalDependencies":{"@audio/speaker-darwin-arm64":">=2.0.0","@audio/speaker-darwin-x64":">=2.0.0","@audio/speaker-linux-arm64":">=2.0.0","@audio/speaker-linux-x64":">=2.0.0","@audio/speaker-win32-x64":">=2.0.0"},"devDependencies":{"prebuildify":"^6.0.1","tst":"^9.3.0"},"publishConfig":{"access":"public"},"funding":"https://github.com/sponsors/audiojs","gitHead":"ffeda8600c6616938c9d17fc4bdcb667e5d1a2f1","_id":"@audio/speaker@2.3.3","_nodeVersion":"25.9.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-+NcuJjKig+2tluEtxiP5keSEmqf/dtVWjdqlBy585GKxhZLAj2jrTgrWBUUtk9OFt4uD6A0qlmzMwJVhF7NgCQ==","shasum":"653825e7c3d2114a5f6dfcdf99a9f75802941dbc","tarball":"https://registry.npmjs.org/@audio/speaker/-/speaker-2.3.3.tgz","fileCount":15,"unpackedSize":4141726,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCrnfUyLNKbyPsV3/1bhhM8KkpPC8tmXYPZXM0zJPObQgIgFQz94t9FuDck+BVmao5bCgl6tCjspENRZ92a4Ip7LaU="}]},"_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"directories":{},"maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/speaker_2.3.3_1785854573655_0.944302297802992"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-08T19:50:44.105Z","modified":"2026-08-04T14:42:54.149Z","2.3.1":"2026-07-08T19:50:44.568Z","2.3.2":"2026-07-11T01:04:06.708Z","2.3.3":"2026-08-04T14:42:53.820Z"},"bugs":{"url":"https://github.com/audiojs/speaker/issues"},"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","homepage":"https://github.com/audiojs/speaker#readme","keywords":["audio","audiojs","pcm","speaker","web-audio","sound","sink","miniaudio"],"repository":{"type":"git","url":"git+https://github.com/audiojs/speaker.git"},"description":"Output audio data to speaker in browser/node","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"readme":"# @audio/speaker [![test](https://github.com/audiojs/speaker/actions/workflows/test.yml/badge.svg)](https://github.com/audiojs/speaker/actions/workflows/test.yml) [![npm](https://img.shields.io/npm/v/@audio/speaker)](https://npmjs.org/package/@audio/speaker)\n\nOutput audio data to speaker in node or browser.\n\n## Usage\n\n```js\nimport speaker from '@audio/speaker'\n\nlet write = speaker({\n  sampleRate: 44100,\n  channels: 2,\n  bitDepth: 16,\n  // bufferSize: 50,       // ring buffer ms (default 50)\n  // backend: 'miniaudio', // force backend\n})\n\nwrite(pcmBuffer, (err) => {\n  // ready for next chunk\n})\nwrite(null) // end playback\n```\n\n### Async iterable\n\nConsume an async iterable source directly:\n\n```js\nimport speaker from '@audio/speaker'\n\nawait speaker.from(audioSource, { sampleRate: 44100, channels: 2 })\n```\n\n### Stream\n\n```js\nimport SpeakerWritable from '@audio/speaker/stream'\n\nsource.pipe(SpeakerWritable({ sampleRate: 44100, channels: 2 }))\n```\n\n## Backends\n\nTried in order; first successful one wins.\n\n| Backend | How | Latency | Install |\n|---|---|---|---|\n| `miniaudio` | N-API addon wrapping [miniaudio.h](https://github.com/mackron/miniaudio) | Low | Prebuilt via `@audio/speaker-*` packages |\n| `process` | Pipes PCM to ffplay/sox/aplay | High | System tool must be installed |\n| `null` | Silent, maintains timing contract | — | Built-in (CI/headless fallback) |\n| `webaudio` | Web Audio API (browser only) | Low | Built-in |\n\n## API\n\n### `write = speaker(opts?)`\n\nReturns a sink function. Options:\n\n- `sampleRate` — default `44100`\n- `channels` — default `2`\n- `bitDepth` — `8`, `16` (default), `24`, `32`\n- `bufferSize` — ring buffer in ms, default `50`\n- `backend` — force a specific backend\n\n### `write(buffer, cb?)`\n\nWrite PCM data. Accepts `Buffer`, `Uint8Array`, or `AudioBuffer`. Callback fires when ready for next chunk.\n\n### `write(null)`\n\nEnd playback. Flushes remaining audio then closes device.\n\n### `write.flush(cb?)`\n\nWait for buffered audio to finish playing.\n\n### `write.close()`\n\nImmediately close the audio device.\n\n### `write.backend`\n\nName of the active backend (`'miniaudio'`, `'process'`, `'null'`, `'webaudio'`).\n\n## Building\n\n```sh\nnpm run build          # compile native addon locally\nnpm test               # run tests\n```\n\n## Publishing\n\n```sh\n# JS-only change (no native code changed):\nnpm version patch && git push && git push --tags\nnpm publish\n\n# Native code changed — rebuild platform packages:\nnpm version patch && git push && git push --tags\ngh run watch                    # wait for CI\nrm -rf artifacts\ngh run download --dir artifacts \\\n  -n speaker-darwin-arm64 -n speaker-darwin-x64 \\\n  -n speaker-linux-x64 -n speaker-linux-arm64 -n speaker-win32-x64\n\n# (fallback) If darwin-x64 CI is unavailable, cross-compile locally\nnpx node-gyp@latest rebuild --arch=x64\nmkdir -p artifacts/speaker-darwin-x64\ncp build/Release/speaker.node artifacts/speaker-darwin-x64/\n\nfor pkg in packages/speaker-*/; do\n  cp artifacts/$(basename $pkg)/speaker.node $pkg/\n  (cd $pkg && npm publish)\ndone\nnpm publish\n```\n\n## License\n\nMIT\n\n<a href=\"https://github.com/krishnized/license/\">ॐ</a>\n","readmeFilename":"readme.md"}