{"_id":"@alexanderolsen/silence-listener-node","_rev":"3-3e1a1e143708ab682b113e4f56d9e84a","name":"@alexanderolsen/silence-listener-node","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.1":{"name":"@alexanderolsen/silence-listener-node","version":"1.0.1","description":"Pseudo-AudioNode to notify when an audio stream becomes silent.","main":"./dist/silence-listener-node.js","scripts":{"build":"npx webpack","watch-react-example":"cd examples/react && npx webpack --watch","watch":"npx webpack --watch","examples":"http-server","test":"jest --coverage","test:coverage":"node ./node_modules/coveralls/bin/coveralls.js < coverage/lcov.info"},"repository":{"type":"git","url":"git+https://github.com/aolsenjazz/silence-listener-node.git"},"keywords":["DSP","audio","web-audio","web","silence","audio node","node","workletnode","worklet","scriptprocessornode"],"author":{"name":"Alexander Olsen"},"license":"MIT","bugs":{"url":"https://github.com/aolsenjazz/silence-listener-node/issues"},"jest":{"collectCoverageFrom":["src/*.js"]},"homepage":"https://github.com/aolsenjazz/silence-listener-node#readme","devDependencies":{"@babel/core":"^7.12.17","@babel/plugin-transform-runtime":"^7.12.17","@babel/preset-env":"^7.12.17","babel-jest":"^26.6.3","babel-loader":"^8.2.2","babel-plugin-transform-class-properties":"^6.24.1","coveralls":"^3.1.0","http-server":"^0.12.3","jest":"^26.6.3","terser-webpack-plugin":"^5.1.1","web-audio-test-api":"^0.5.2","webpack":"^5.23.0","webpack-cli":"^4.5.0"},"gitHead":"15b222a355562c71d61fe3d1c7a97c87888a45e4","_id":"@alexanderolsen/silence-listener-node@1.0.1","_nodeVersion":"14.4.0","_npmVersion":"7.5.4","dist":{"integrity":"sha512-qarNz4/wAmhpEwshcjJPjKoELFr4muZkow8hnlPKZLAd4pOH/JrBL9w1ldY+5hEn92UoBJt/WzIjsj6LOCf37w==","shasum":"76c7eff8f86fe9e9665b7d1df1a9ecf61e70c227","tarball":"https://registry.npmjs.org/@alexanderolsen/silence-listener-node/-/silence-listener-node-1.0.1.tgz","fileCount":5,"unpackedSize":45520,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNvkNCRA9TVsSAnZWagAA010P/iDdc/ingi0PVoKdsfW1\nRECXxXavLhAlX9Zv0emoVi3ERii0fTonC28k3nkMwAR5RxROBAeAWbH/yIt3\nc03gt36zXlEVTY3xoF3gm3ZEMDJnu5ynQPUKaK5mb+bEIdgi8htlUQ0H03Ha\nOW+Hxs8177Ii1AVO3RLhh/A5j3lwV/RcpPvYzt3x2UNzrhB/ITwRXbBnLDq8\ncAjBbqxabcjaFlDNLsXLccJiuDvpnySkRyT3De6ntwphGYgK5V0WbPAEiTF8\nDSObEMNIDptoENyhMDf7kUBXVIrwd2Wn41tqY23Waz8n4jczecWsyNyzlGfP\nt1D4RxbOu9HLioS83LWcrU3iUEcIgv6Hpa7ZhoYcp8eDcktKc9IuY0cUEAVg\nd6MzgZerUD8foB3ZdmNABg+rJBzSzRAsMdxQBapDROvOCAYlZMpkYWIwjeNI\n3i+pvomykpG6Z17m8Q3zUS0MSuetJw3uvCZnWyIyLMmqM26TAvLknB+sUGPP\nlCT9sIL9WR97QtJuWOVuBgCx6yq4BLK15MpXyhqSfC5COE32v5m2NYTyikkQ\nFBElVY6Tu5RP8QmAlUaXoVFoio1WArUIsSRMvPVAN3p/zKZW8qZJACA3PAvS\nSj5XRCUHLhUvSYLAWadLv3S5Ww4iuppvjeNMvVMGrkykaqo7aSwTwgPzI3v6\ndjPM\r\n=VkLV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHruO1+r/qeLf6BDAs0g+mtoeW2TRUkys7Tj60yTFGE7AiEAtigwOvgtuVQQDYOXXkW7d7156wSdraYTpU8TBOMatvA="}]},"_npmUser":{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"},"directories":{},"maintainers":[{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/silence-listener-node_1.0.1_1614215436557_0.19816730302584373"},"_hasShrinkwrap":false},"1.0.2":{"name":"@alexanderolsen/silence-listener-node","version":"1.0.2","description":"Pseudo-AudioNode to notify when an audio stream becomes silent.","main":"./dist/silence-listener-node.js","scripts":{"build":"npx webpack","watch-react-example":"cd examples/react && npx webpack --watch","watch":"npx webpack --watch","examples":"http-server","test":"jest --coverage","test:coverage":"node ./node_modules/coveralls/bin/coveralls.js < coverage/lcov.info"},"repository":{"type":"git","url":"git+https://github.com/aolsenjazz/silence-listener-node.git"},"keywords":["DSP","audio","web-audio","web","silence","audio node","node","workletnode","worklet","scriptprocessornode"],"author":{"name":"Alexander Olsen"},"license":"MIT","bugs":{"url":"https://github.com/aolsenjazz/silence-listener-node/issues"},"jest":{"collectCoverageFrom":["src/*.js"]},"homepage":"https://github.com/aolsenjazz/silence-listener-node#readme","devDependencies":{"@babel/core":"^7.12.17","@babel/plugin-transform-runtime":"^7.12.17","@babel/preset-env":"^7.12.17","babel-jest":"^26.6.3","babel-loader":"^8.2.2","babel-plugin-transform-class-properties":"^6.24.1","coveralls":"^3.1.0","http-server":"^0.12.3","jest":"^26.6.3","terser-webpack-plugin":"^5.1.1","web-audio-test-api":"^0.5.2","webpack":"^5.23.0","webpack-cli":"^4.5.0"},"gitHead":"7255268c974d4393142d2ca220e9c50c560a2c48","_id":"@alexanderolsen/silence-listener-node@1.0.2","_nodeVersion":"14.4.0","_npmVersion":"7.5.4","dist":{"integrity":"sha512-AcbXzdh4AggBIzggBQzBKadPbLDCi9MeFnO/HNNEwA7vS+4JGJu8u0H7ZdGjgpJpVk/I9J/5j5Wjnl8gAzYYXg==","shasum":"bff7048da32bc3f294dfbdb67ac739a060da6bc8","tarball":"https://registry.npmjs.org/@alexanderolsen/silence-listener-node/-/silence-listener-node-1.0.2.tgz","fileCount":5,"unpackedSize":30594,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgN8z9CRA9TVsSAnZWagAAHrMP/RwXRgOOJacpNoDIQJCO\nSRankH7NrXfIwyzZYDcRTTYjsLEka+0lKG9Qx8mKSUxCQWDi+6Uw69UR5qrG\nBSF9TSOZlZnbOjIynegg30fUBa2p2ok+dL49SiwO3LyKJoCyAbPukYUlSbIq\ndMcd4jcje3PNGl7LOuY8Vz5Rxw1Zvc0xz4oyxXRjQ+r29X8bwHi6ryrIMdVU\nxkKKr8WPJMnqbXgpXawrTmDNkKYmqApMqbf80X0GRhTftN89c3Opf42hcZ+m\niBeEY1UJBimIFuw+sJwilevXGLInemKyWzsv8E75kP27/UYOniJPf+Eyu7Ah\n7+DeOjir1Kg1knnXWZU4B6D+3bbkwQ7bUcUOKIXjb2UGwGOB7YdMFswjpwrW\nKotalyLxzc6zQe6BAOOasjoPFoiR0p6ZdfGSreTSh0jbI/BaASyNGwsGpFND\nqTk9yOM11Fs3/lFmx0egvowCbYdq39GJLG2IhhceIPU86z+Zlctg1AMyM4Jv\nWD7/yo1uDVb0Xti4RPfABnwAaPZCqSJ137tFvaagaJ6eEWmSkPs7Clgx9YY0\n8L6IUMXmJ/jTRK/eJo+8A7pO+ka6igUDWPcfpfQ5pw6iCB36MJRYawujCP1H\nQ0CrymrN2/ed5FABM2xZeaX+2LCg1R0Gh4ZOvMOnxEJYKP67TNNEBP+BQaC0\nT5Gs\r\n=G8bb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbSlvzDhr1MvKzjn7AH2Q5mRywsS4771msa69fTY7bvgIhAJnaXmGzEvvljAmLDbgmZwUUFkDD+6eMdp0qhYYAu/of"}]},"_npmUser":{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"},"directories":{},"maintainers":[{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/silence-listener-node_1.0.2_1614269692497_0.979209130162038"},"_hasShrinkwrap":false},"1.0.3":{"name":"@alexanderolsen/silence-listener-node","version":"1.0.3","description":"Pseudo-AudioNode to notify when an audio stream becomes silent.","main":"./dist/silence-listener-node.js","scripts":{"build":"npx webpack","watch-react-example":"cd examples/react && npx webpack --watch","watch":"npx webpack --watch","examples":"http-server","test":"jest --coverage","test:coverage":"node ./node_modules/coveralls/bin/coveralls.js < coverage/lcov.info"},"repository":{"type":"git","url":"git+https://github.com/aolsenjazz/silence-listener-node.git"},"keywords":["DSP","audio","web-audio","web","silence","audio node","node","workletnode","worklet","scriptprocessornode"],"author":{"name":"Alexander Olsen"},"license":"MIT","bugs":{"url":"https://github.com/aolsenjazz/silence-listener-node/issues"},"jest":{"collectCoverageFrom":["src/*.js"]},"homepage":"https://github.com/aolsenjazz/silence-listener-node#readme","devDependencies":{"@babel/core":"^7.12.17","@babel/plugin-transform-runtime":"^7.12.17","@babel/preset-env":"^7.12.17","babel-jest":"^26.6.3","babel-loader":"^8.2.2","babel-plugin-transform-class-properties":"^6.24.1","coveralls":"^3.1.0","http-server":"^0.12.3","jest":"^26.6.3","terser-webpack-plugin":"^5.1.1","web-audio-test-api":"^0.5.2","webpack":"^5.23.0","webpack-cli":"^4.5.0"},"gitHead":"6d58c34ed5e343be55224c7c586d09e6c7e916f7","_id":"@alexanderolsen/silence-listener-node@1.0.3","_nodeVersion":"14.4.0","_npmVersion":"7.5.4","dist":{"integrity":"sha512-L814bRVAGQxDPrJw7W6mUrI0ia3xcb5MDfT/7270MqyOIbgtSuxUFDUnlh/UjB/TfWRugOTRj/LzRNGO+wmbVw==","shasum":"70aaedfe20046c43bafac4c41774e5d993c48598","tarball":"https://registry.npmjs.org/@alexanderolsen/silence-listener-node/-/silence-listener-node-1.0.3.tgz","fileCount":5,"unpackedSize":30724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgN9YsCRA9TVsSAnZWagAA8pEP/R9d6i0tlPPWCAgmCB6r\nVEWfSprrOAKoYhMNNv5bLahKw+Y5Q2vrfHo1U1RjQJMkV0yHr3WhQZ3jxsqV\ngO7rrgXe2netFGgnp5lRUh0uDvh6l6CYQsesAmVzo95ovDSMqaM4KmOpt9F4\nAoIMxW782/vj5C59q4qZzLmupWTpd9tNVgZgPBBSbw8IMolzs3lE3msA3Zeg\nH9EUiBTmAKxSIACwkePf0jrrWEd56qM7ZlMjD7hwZ+x25J+DbBJwawxzKUxb\nvipHYNUYOf4h6/OM1rxHGN24b0v+WfvFD42VTSxkkh38jQ0wmRCR8+WEW5ST\nhLs6O3EeWNC5Q2A69rnTJ1+vjAYSv+nl+DpSU4ZOhilyLI4t6i4dFcvQ3xp+\nyycOySXhGGWmIuwm/F4Sv1ftth70uDXE3PCLOXlci3f0wH066ZeMxF5AJC6I\npq58aqCo9zgpaVx8elCqo1BDy1AtxS/2Fwb2OJZkwV+1UqsYTeQ8Bh9eMLoV\nZiT4Y/m/vUPFtPQq1AWPsVC7Q9VZQ9K1BaNAmESYhDj550uONVB7PyUDqGMJ\nWKumkoSYbGa+ZS6jv7lDLm0L60ofoOMBor8lzlGm9SaXygSSOGicY7XBCJKe\nBV1bBqThRIHxH889FPo5mjUMPpZLdY7ZmrBaAzSxCCjQ+XWKxN3q4JEsziCH\nI4px\r\n=A52Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDdn5oSIWMtAo5V90q+1He+jjmCSwx2+rGaJIig2WLTMAiEAnebT6Itrw6XX5LsLVp1gURbTHLe3fvwiksR3GGMUniI="}]},"_npmUser":{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"},"directories":{},"maintainers":[{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/silence-listener-node_1.0.3_1614272044117_0.9110647506094425"},"_hasShrinkwrap":false}},"time":{"created":"2021-02-25T01:10:36.508Z","1.0.1":"2021-02-25T01:10:36.727Z","modified":"2022-04-04T12:39:08.333Z","1.0.2":"2021-02-25T16:14:52.624Z","1.0.3":"2021-02-25T16:54:04.293Z"},"maintainers":[{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"}],"description":"Pseudo-AudioNode to notify when an audio stream becomes silent.","homepage":"https://github.com/aolsenjazz/silence-listener-node#readme","keywords":["DSP","audio","web-audio","web","silence","audio node","node","workletnode","worklet","scriptprocessornode"],"repository":{"type":"git","url":"git+https://github.com/aolsenjazz/silence-listener-node.git"},"author":{"name":"Alexander Olsen"},"bugs":{"url":"https://github.com/aolsenjazz/silence-listener-node/issues"},"license":"MIT","readme":"# silence-listener-node\n\n![AppVeyor](https://img.shields.io/appveyor/build/aolsenjazz/silence-listener-node)    [![Coverage Status](https://coveralls.io/repos/github/aolsenjazz/silence-listener-node/badge.svg?branch=main)](https://coveralls.io/github/aolsenjazz/silence-listener-node?branch=main) [![Maintainability](https://api.codeclimate.com/v1/badges/1b47d3d0a92f4def2455/maintainability)](https://codeclimate.com/github/aolsenjazz/silence-listener-node/maintainability) ![Depfu](https://img.shields.io/depfu/aolsenjazz/silence-listener-node)\n\nSilenceListenerNode is a [pseudo](https://github.com/WebAudio/web-audio-api/issues/251)-[AudioNode](https://developer.mozilla.org/en-US/docs/Web/API/AudioNode) which invokes a callback function whenever a stream of audio becomes or unbecomes silent. Uses [AudioWorklet](https://developers.google.com/web/updates/2017/12/audio-worklet) when available, falling back to [ScriptProcessorNode](https://developer.mozilla.org/en-US/docs/Web/API/ScriptProcessorNode) when Worklets are not available. \n\n## Installation\n\nInstall using NPM:\n```bash\nnpm i @alexanderolsen/silence-listener-node\n```\n\n## Setup\nTo utilize AudioWorklet functionality, you **must** copy the `sln.worklet.js` file in */node_modules/@alexanderolsen/silence-listener-node/dist/* to where the library can find it. The default location for this file is at the server root (*/sln.worklet.js*). This location can be changed using the options dict passed into `createSilenceListenerNode()`:\n\n```javascript\ncreateSilenceListenerNode(context, nChannels, { \n    pathToWorklet: '/some/path/to/sln.worklet.js', // default '/sln.worklet.js'\n});\n```\nSee **Configuration** for more instructions on using the `options` dict.\n\n## Usage\n\n### In modules:\n```javascript\nimport { createSilenceListenerNode } from '@alexanderolsen/silence-listener-node'; \n\nlet context   = new AudioContext();\nlet nChannels = 2;\nlet options   = {}; // see **Configuration**\nlet buffSource = context.createBufferSource();\n\ncreateSilenceListenerNode(context, nChannels, options)\n    .then((silenceListenerNode) => {\n        buffSource.connect(silenceListenerNode);\n        silenceListenerNode.connect(context.destination);\n        buffSource.start();\n    });\n```\nor\n```javascript\nconst createSilenceListenerNode = require('@alexanderolsen/silence-listener-node').createSilenceListenerNode; \n\n(async function() {\n    let context   = new AudioContext();\n    let nChannels = 2;\n    let options   = {}; // see **Configuration**\n    \n    let buffSource = context.createBufferSource();\n    let silenceListenerNode = await createSilenceListenerNode(context, nChannels, options);\n    \n    buffSource.connect(silenceListenerNode);\n    silenceListenerNode.connect(context.destination);\n    \n    buffSource.start();\n})();\n```\n\n### In HTML:\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/@alexanderolsen/silence-listener-node\"></script>\n<script>\n    var context   = new AudioContext();\n    var nChannels = 2;\n    var options   = {}; // see **Configuration**\n    let buffSource = context.createBufferSource();\n\n    SilenceListenerNode.createSilenceListenerNode(context, nChannels, options)\n        .then((silenceListenerNode) => {\n            buffSource.connect(silenceListenerNode);\n            silenceListenerNode.connect(context.destination);\n            buffSource.start();\n        });\n</script>\n```\nOr use the silence-listener-node.js file in the *dist* folder:\n```html\n<script src=\"silence-listener-node.js\"></script>\n```\n\n## Configuration\n\nWhen creating a SilenceListenerNode instance, you have number of options available:\n\n```javascript\nlet context   = new AudioContext();\nlet nChannels = 2;\n\n// entries are defaults\nlet options = {\n    nInputs:   1,   // The number of inputs connected to this node. Probably 1\n    nOutputs:  1,   // The number of outputs connected to this node. Probably 1\n    batchSize: 512, // Stuck at 128 for `AudioWorklet`s. Can be powers of 2 where 256 < batchSize < 16384\n    \n    silenceThreshold: Math.floor(44100 / batchSize), // This is the number of silent batches which must\n                                                     // occur before silence callbacks are invoked.\n    pathToWorklet: '/sln.worklet.js' //The path to the worklet file\n}\n\ncreateSilenceListenerNode(context, nChannels, options).then((silenceListenerNode) => { ... });\n```\n\n#### `nInputs`\nThe number of `AudioNode`s connected to this instance of SilenceListenerNode. Default 1.\n\n#### `nOutputs`\nThe nubmer of outputs `AudioNode`s this instance of SilenceLisnerNode is connected to. Default 1.\n\n#### `batchSize`\nModifies the batch size processed by `ScriptProcessorNode`. This does not affect `AudioWorklet`s as they're stuck at 128. If using ScriptProcessorNode, must be one of the following: `[256, 512, 1024, 2048, 4096, 8192, 16384]`.\n\n#### `silenceThreshold`\nThe number of silent batches which must occur before the audio stream will be flagged as silent. Default is (roughly) one second worth of audio.\n\n#### `pathToWorklet`\nThe location of your *sln.worklet.js* file. Default is at server root.\n\n## API Reference\n\nOnce you've created the SilenceListenerNode using `createSilenceListener()` or `SilenceListenerNode.createSilenceListener()`, the returned object exposes:\n\n### `connect`\n```javascript\n/**\n * Connects SilenceListenerNode to the specific destination AudioNode\n *\n * @param {AudioNode} destination The node to connect to\n */\nconnect(destination) { ... }\n```\n\n### `disconnect`\n```javascript\n/** Disconnects from the currently-connected AudioNode */\ndisconnect() { ... }\n```\n\n### `subscribeToSilence`\n```javascript\n/**\n * Begin receiving silence notifications\n *\n * @param  { Function(isSilent, timeSinceLast) } callback Invoked whenever audio becomes or unbecomes silent\n * @return { String } id of the subscription. use with unsubscribeFromSilence(id) to stop receiving notifications\n */\nsubscribeToSilence(callback) { ... }\n```\n\n### `unsubscribeFromSilence`\n```javascript\n/**\n * Stop receiving silence events for given ID.\n * \n * @param { String } id Identifier for callback subscription\n */\nunsubscribeFromSilence(id) { ... }\n```\n\n### `getters`\n```javascript\nget silent()  { ... }\nget silence() { ... } // for simplicity\n\nget numberOfInputs() { ... }\nget numberOfOutputs() { ... }\nget channelCount() { ... }\nget channelCountMode() { ... }\nget channelInterpretation() { ... }\n\n// e.g. let isSilent = silenceListenerNode.silent;\n```\n\n### `setters`\n```javascript\nset channelCount(channelCount) { ... }\nset channelCountMode(channelCountMode) { ... }\nset channelInterpretation(channelInterpretation) { ... }\n\n// e.g. silenceListenerNode.channelInterpretation = 'speakers';\n```\n\n## Examples\n\nRun any server ([http-server](https://www.npmjs.com/package/http-server), etc) from the project directory:\n```bash\ncd silence-listener-node\nhttp-server\n```\nand visit *localhost:8080/examples/basic* or *localhost:8080/examples/react* in a browser. Examples **must be** hosted from the root directory, as they need to access the files in *dist*.\n\n## Building From Source\n\n```bash\ngit clone https://github.com/aolsenjazz/silence-listener-node\ncd silence-listener-node\nnpm run watch\n```\n\nProduction files are placed in the *dist* directory.\n\n## Uncaught (in promise) DOMException: The user aborted a request.\nThis super unhelpful error message occurs when SilenceListenerNode is unable to find your sln.worklet.js. To fix this, make sure your `options.pathToWorklet` is set correctly and that the file is actually reachable at that location.\n\n## Contributing\nPull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.\n\n## License\n\nLicenses are available in `LICENSE.md`.","readmeFilename":"README.md"}