From f5acd145a85fc9c0acd94106a706c47cba71b070 Mon Sep 17 00:00:00 2001 From: Ryan Ramage Date: Thu, 12 Oct 2017 01:41:43 -0600 Subject: [PATCH 1/4] super hacky changing a setups destination output --- demo-project/DWS - Beep Boop/index.json | 6 +++--- index.js | 13 +++++++++++++ nodes/setup/object.js | 12 +++++++++++- nodes/setup/view.js | 2 +- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/demo-project/DWS - Beep Boop/index.json b/demo-project/DWS - Beep Boop/index.json index 3b358e2a..0ab7ddbc 100644 --- a/demo-project/DWS - Beep Boop/index.json +++ b/demo-project/DWS - Beep Boop/index.json @@ -1,7 +1,7 @@ { "controllers": [ { - "port": "Launchpad MK2", + "port": null, "loopLength": 16, "chunkPositions": { "Perc": [ @@ -29,7 +29,7 @@ 0 ] }, - "node": "controller/launchpad-mk2" + "node": "controller/qwerty" }, { "port": "Launchpad MK2 2", @@ -622,7 +622,7 @@ "node": "modulatorChunk" } ], - "selectedChunkId": "Perc", + "selectedChunkId": "bass", "volume": 1, "globalScale": { "offset": 0, diff --git a/index.js b/index.js index 383c8d0a..947d6c0c 100644 --- a/index.js +++ b/index.js @@ -44,6 +44,19 @@ electron.ipcRenderer.on('close', function () { } }) +function gotDevices(deviceInfos) { + + for (var i = 0; i !== deviceInfos.length; ++i) { + var deviceInfo = deviceInfos[i]; + if (deviceInfo.kind === 'audiooutput') { + console.info('Found audio output device: ', deviceInfo.label, deviceInfo.deviceId); + } + } +} + +navigator.mediaDevices.enumerateDevices().then(gotDevices).catch(console.log); + + // create root context var audioContext = new global.AudioContext() var nodes = require('./nodes') diff --git a/nodes/setup/object.js b/nodes/setup/object.js index 3fbc9248..d8de091b 100644 --- a/nodes/setup/object.js +++ b/nodes/setup/object.js @@ -61,7 +61,17 @@ function Setup (parentContext) { context.output.connect(outputLowPass) outputLowPass.connect(outputHighPass) node.output = YankSilence(audioContext, outputHighPass) - node.output.connect(parentContext.output) + //node.output.connect(parentContext.output)// + var dest = audioContext.createMediaStreamDestination() + node.output.connect(dest) + setTimeout(() => { + var daout = document.getElementsByClassName('audioOut')[0] + daout.srcObject = dest.stream + daout.setSinkId('56bb1f840fa8cbf16a67c2bc27dd2279424ef5f5215963003e6b403854cd916e').then(console.log) + console.log(daout) + daout.play() + }, 2400) + context.active = node.output.active diff --git a/nodes/setup/view.js b/nodes/setup/view.js index d31f8446..06fedeb4 100644 --- a/nodes/setup/view.js +++ b/nodes/setup/view.js @@ -57,7 +57,7 @@ function renderSetup (setup) { function renderMasterVolume (volume) { return h('section.volume', [ - + h('audio.audioOut'), h('h1', 'Master Volume'), h('div.param', [ Range(volume, { From 77b72ccd3922bed9a150a1305c8930cd42dd13bd Mon Sep 17 00:00:00 2001 From: Ryan Ramage Date: Thu, 12 Oct 2017 09:00:12 -0600 Subject: [PATCH 2/4] working sound selector per project --- index.js | 29 +++++++++++++++-------------- nodes/setup/object.js | 20 ++++++++++++-------- nodes/setup/view.js | 19 +++++++++++++++++-- 3 files changed, 44 insertions(+), 24 deletions(-) diff --git a/index.js b/index.js index 947d6c0c..d80a6bde 100644 --- a/index.js +++ b/index.js @@ -44,19 +44,6 @@ electron.ipcRenderer.on('close', function () { } }) -function gotDevices(deviceInfos) { - - for (var i = 0; i !== deviceInfos.length; ++i) { - var deviceInfo = deviceInfos[i]; - if (deviceInfo.kind === 'audiooutput') { - console.info('Found audio output device: ', deviceInfo.label, deviceInfo.deviceId); - } - } -} - -navigator.mediaDevices.enumerateDevices().then(gotDevices).catch(console.log); - - // create root context var audioContext = new global.AudioContext() var nodes = require('./nodes') @@ -68,9 +55,23 @@ var rootContext = window.rootContext = { nodes: nodes.objectLookup, nodeInfo: nodes, zoom: Property(1.1), - version: version + version: version, + alternateOutputs: [], + alternateInputs: [] } +function addAlternates(deviceInfos) { + deviceInfos.forEach(function (device) { + var miniInfo = { label: device.label, deviceId: device.deviceId } + if (device.kind === 'audioinput') rootContext.alternateInputs.push(miniInfo) + if (device.kind === 'audiooutput') rootContext.alternateOutputs.push(miniInfo) + }) +} + +navigator.mediaDevices.enumerateDevices().then(addAlternates).catch(function (e) { + console.log('unable to get any alternate devices', e) +}); + watch(rootContext.zoom, function (value) { electron.webFrame.setZoomFactor(value || 1) }) diff --git a/nodes/setup/object.js b/nodes/setup/object.js index d8de091b..7e856bd5 100644 --- a/nodes/setup/object.js +++ b/nodes/setup/object.js @@ -34,7 +34,8 @@ function Setup (parentContext) { globalScale: Property({ offset: 0, notes: [0, 2, 4, 5, 7, 9, 11] - }) + }), + selectedOutputId: Property('default') }) node.overrideVolume = Property(1) @@ -64,13 +65,9 @@ function Setup (parentContext) { //node.output.connect(parentContext.output)// var dest = audioContext.createMediaStreamDestination() node.output.connect(dest) - setTimeout(() => { - var daout = document.getElementsByClassName('audioOut')[0] - daout.srcObject = dest.stream - daout.setSinkId('56bb1f840fa8cbf16a67c2bc27dd2279424ef5f5215963003e6b403854cd916e').then(console.log) - console.log(daout) - daout.play() - }, 2400) + node.audioElement = new Audio() + node.audioElement.srcObject = dest.stream + node.audioElement.play() context.active = node.output.active @@ -80,6 +77,13 @@ function Setup (parentContext) { }) var releases = [ + watch(node.selectedOutputId, function (value) { + console.log('selectedOutputId', value) + node.audioElement.setSinkId(value).then(function () { + console.log('done!') + }) + }), + watch(computed([node.volume, node.overrideVolume], (a, b) => a * b), function (value) { node.output.gain.value = value }), diff --git a/nodes/setup/view.js b/nodes/setup/view.js index 06fedeb4..9ecbc430 100644 --- a/nodes/setup/view.js +++ b/nodes/setup/view.js @@ -3,6 +3,7 @@ var send = require('mutant/send') var Collection = require('lib/widgets/collection') var Spawner = require('lib/widgets/spawner') +var Select = require('lib/params/select') var QueryParam = require('lib/query-param') var ScaleChooser = require('lib/params/scale-chooser') var Range = require('lib/params/range') @@ -49,15 +50,29 @@ function renderSetup (setup) { h('div.options', [ renderScaleChooser(setup.globalScale), - renderMasterVolume(setup.volume) + renderMasterVolume(setup.volume), + renderOutputSelector(setup), ]) ]) } +function renderOutputSelector(setup) { + var outputOptions = setup.context.alternateOutputs.map(function (info) { + return [info.label, info.deviceId] + }) + var params = [ + Select(QueryParam(setup, 'selectedOutputId'), { + options: outputOptions, + flex: true, + missingPrefix: ' (unknown)' + }) + ] + return h('ParamList', params) +} + function renderMasterVolume (volume) { return h('section.volume', [ - h('audio.audioOut'), h('h1', 'Master Volume'), h('div.param', [ Range(volume, { From 7dc2141220e28383f960a49c8e4884a68e7bd557 Mon Sep 17 00:00:00 2001 From: Ryan Ramage Date: Thu, 12 Oct 2017 12:45:35 -0600 Subject: [PATCH 3/4] clean up --- nodes/setup/object.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/nodes/setup/object.js b/nodes/setup/object.js index 7e856bd5..ff4f5113 100644 --- a/nodes/setup/object.js +++ b/nodes/setup/object.js @@ -78,10 +78,7 @@ function Setup (parentContext) { var releases = [ watch(node.selectedOutputId, function (value) { - console.log('selectedOutputId', value) - node.audioElement.setSinkId(value).then(function () { - console.log('done!') - }) + node.audioElement.setSinkId(value) }), watch(computed([node.volume, node.overrideVolume], (a, b) => a * b), function (value) { From 24ebf41db6330fd3a71c73e4a50bc4bbde5e861c Mon Sep 17 00:00:00 2001 From: Ryan Ramage Date: Thu, 12 Oct 2017 17:13:47 -0600 Subject: [PATCH 4/4] trying things --- nodes/setup/object.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/nodes/setup/object.js b/nodes/setup/object.js index ff4f5113..d8156c85 100644 --- a/nodes/setup/object.js +++ b/nodes/setup/object.js @@ -69,7 +69,6 @@ function Setup (parentContext) { node.audioElement.srcObject = dest.stream node.audioElement.play() - context.active = node.output.active node.onTrigger = Event(function (b) { @@ -78,7 +77,14 @@ function Setup (parentContext) { var releases = [ watch(node.selectedOutputId, function (value) { - node.audioElement.setSinkId(value) + node.output.disconnect() + node.audioElement = new Audio() + node.audioElement.setSinkId(value).then(() => { + var dest = audioContext.createMediaStreamDestination() + node.output.connect(dest) + node.audioElement.srcObject = dest.stream + node.audioElement.play() + }) }), watch(computed([node.volume, node.overrideVolume], (a, b) => a * b), function (value) {