From 489e1902f709dc5b74fe95bbb7c8785238ba74c3 Mon Sep 17 00:00:00 2001 From: Mike Solomon Date: Sun, 12 Sep 2021 11:03:10 +0300 Subject: [PATCH] Bumps version --- .github/workflows/unit-tests.yml | 2 ++ CHANGELOG.md | 7 +++++ package.json | 2 +- src/WAGS/Interpret.js | 49 +++++++++++++++++++------------- 4 files changed, 40 insertions(+), 20 deletions(-) diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 63b1df43..36c05bd9 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -17,5 +17,7 @@ jobs: run: npx spago -x test.dhall build - name: Spago build examples run: npx spago -x examples.dhall build + - name: Spago build cheatsheet + run: npx spago -x cheatsheet.dhall build - name: Spago test run: npx spago -x test.dhall test \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b258435..c69ee421 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.4.6] - 2021-09-12 + +### Fixed + +- All generators are now disconnected only after stopping, avoiding abrupt disconnects and pops. + ## [0.4.5] - 2021-09-11 ### Fixed diff --git a/package.json b/package.json index 0516c44c..6f9a3264 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "purescript-wags", - "version": "0.4.5", + "version": "0.4.6", "description": "Web Audio Graphs as a Stream", "scripts": { "build": "spago build", diff --git a/src/WAGS/Interpret.js b/src/WAGS/Interpret.js index 74fae472..94e53df6 100644 --- a/src/WAGS/Interpret.js +++ b/src/WAGS/Interpret.js @@ -165,7 +165,7 @@ exports.setAnalyserNodeCb_ = function (ptr) { return function (a) { return function (state) { return function () { - if (state.units[ptr].analyserOrig === a) {return;} + if (state.units[ptr].analyserOrig === a) { return; } // first, unsubscribe state.units[ptr].analyser && state.units[ptr].analyser(); state.units[ptr].analyser = a(state.units[ptr].se)(); @@ -456,8 +456,8 @@ exports.makeLowshelf_ = function (ptr) { }; }; exports.makeMicrophone_ = function (microphone) { - return function(state) { - return function () { + return function (state) { + return function () { state.units["microphone"] = { main: state.context.createMediaStreamSource(microphone), outgoing: [], @@ -676,7 +676,7 @@ exports.setMediaRecorderCb_ = function (ptr) { return function (a) { return function (state) { return function () { - if (state.units[ptr].recorderOrig === a) {return;} + if (state.units[ptr].recorderOrig === a) { return; } state.units[ptr].recorder && state.units[ptr].recorder.stop(); var mediaRecorderSideEffectFn = a; state.units[ptr].recorderOrig = a; @@ -965,18 +965,29 @@ var setOff_ = function (ptr) { return; } state.units[ptr].onOff = false; - state.units[ptr].main.stop(state.writeHead + onOffInstr.timeOffset); - for (var i = 0; i < state.units[ptr].outgoing.length; i++) { - state.units[ptr].main.disconnect( - state.units[state.units[ptr].outgoing[i]].main - ); - if (state.units[state.units[ptr].outgoing[i]].se) { - state.units[ptr].main.disconnect( - state.units[state.units[ptr].outgoing[i]].se - ); + var oldMain = state.units[ptr].main; + var oldOutgoing = state.units[ptr].outgoing.slice(); + oldMain.stop(state.writeHead + onOffInstr.timeOffset); + // defer disconnection until stop has happened + setTimeout(() => { + for (var i = 0; i < oldOutgoing.length; i++) { + try { + oldMain.disconnect( + state.units[oldOutgoing[i]].main + ); + if (state.units[oldOutgoing[i]].se) { + oldMain.disconnect( + state.units[oldOutgoing[i]].se + ); + } + } catch (e) { + console.log(e); + // fail silently, as it means the unit is no longer available, but + // as we are disconnecting it doesn't matter + continue; + } } - } - delete state.units[ptr].main; + }, 1000.0 * (state.writeHead + onOffInstr.timeOffset + 0.2 - state.context.currentTime)); state.units[ptr].main = state.units[ptr].createFunction(); for (var i = 0; i < state.units[ptr].outgoing.length; i++) { state.units[ptr].main.connect( @@ -1404,7 +1415,7 @@ exports.getByteFrequencyData = function (analyserNode) { return dataArray; } } -exports.bufferSampleRate = function(buffer) { return buffer.sampleRate } -exports.bufferLength = function(buffer) { return buffer.length } -exports.bufferDuration = function(buffer) { return buffer.duration } -exports.bufferNumberOfChannels = function(buffer) { return buffer.numberOfChannels } +exports.bufferSampleRate = function (buffer) { return buffer.sampleRate } +exports.bufferLength = function (buffer) { return buffer.length } +exports.bufferDuration = function (buffer) { return buffer.duration } +exports.bufferNumberOfChannels = function (buffer) { return buffer.numberOfChannels }