From bd3b25383ae3c1996589be8c59e7a78a38d7b9a7 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Apr 2015 14:20:50 +0200 Subject: [PATCH 1/8] Some code cleanup --- libraries/audio-client/src/AudioClient.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index a02dc912f7..f37172ea4e 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -726,9 +726,9 @@ void AudioClient::handleAudioInput() { int inputSamplesRequired = (int)((float)AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * inputToNetworkInputRatio); QByteArray inputByteArray = _inputDevice->readAll(); - + + // Add audio source injection if enabled if (!_muted && _audioSourceInjectEnabled) { - int16_t* inputFrameData = (int16_t*)inputByteArray.data(); const uint32_t inputFrameCount = inputByteArray.size() / sizeof(int16_t); @@ -737,17 +737,12 @@ void AudioClient::handleAudioInput() { #if ENABLE_INPUT_GAIN _inputGain.render(_inputFrameBuffer); // input/mic gain+mute #endif - // Add audio source injection if enabled - if (_audioSourceInjectEnabled) { - - if (_toneSourceEnabled) { // sine generator - _toneSource.render(_inputFrameBuffer); - } - else if(_noiseSourceEnabled) { // pink noise generator - _noiseSource.render(_inputFrameBuffer); - } - _sourceGain.render(_inputFrameBuffer); // post gain + if (_toneSourceEnabled) { // sine generator + _toneSource.render(_inputFrameBuffer); + } else if(_noiseSourceEnabled) { // pink noise generator + _noiseSource.render(_inputFrameBuffer); } + _sourceGain.render(_inputFrameBuffer); // post gain _inputFrameBuffer.copyFrames(1, inputFrameCount, inputFrameData, true /*copy out*/); } From 8f8e4d8dc66bd8e0a392d6344bdd847c71c251be Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Apr 2015 15:49:11 +0200 Subject: [PATCH 2/8] Add generated audio methods to audio interface --- libraries/audio-client/src/AudioClient.cpp | 4 ++-- libraries/audio-client/src/AudioClient.h | 8 ++++---- libraries/audio/src/AbstractAudioInterface.h | 4 ++++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index f37172ea4e..032c70985e 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -967,8 +967,8 @@ void AudioClient::setIsStereoInput(bool isStereoInput) { } } -void AudioClient::toggleAudioSourceInject() { - _audioSourceInjectEnabled = !_audioSourceInjectEnabled; +void AudioClient::enableAudioSourceInject(bool enable) { + _audioSourceInjectEnabled = enable; } void AudioClient::selectAudioSourcePinkNoise() { diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 7ac445a7fc..bb145a209f 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -1,6 +1,6 @@ // // AudioClient.h -// interface/src +// libraries/audio-client/src // // Created by Stephen Birarda on 1/22/13. // Copyright 2013 High Fidelity, Inc. @@ -143,9 +143,9 @@ public slots: void audioMixerKilled(); void toggleMute(); - void toggleAudioSourceInject(); - void selectAudioSourcePinkNoise(); - void selectAudioSourceSine440(); + virtual void enableAudioSourceInject(bool enable); + virtual void selectAudioSourcePinkNoise(); + virtual void selectAudioSourceSine440(); void toggleAudioNoiseReduction() { _isNoiseGateEnabled = !_isNoiseGateEnabled; } diff --git a/libraries/audio/src/AbstractAudioInterface.h b/libraries/audio/src/AbstractAudioInterface.h index 656d3c1f58..9649d11ad2 100644 --- a/libraries/audio/src/AbstractAudioInterface.h +++ b/libraries/audio/src/AbstractAudioInterface.h @@ -27,6 +27,10 @@ public: public slots: virtual bool outputLocalInjector(bool isStereo, qreal volume, AudioInjector* injector) = 0; + + virtual void enableAudioSourceInject(bool enable) = 0; + virtual void selectAudioSourcePinkNoise() = 0; + virtual void selectAudioSourceSine440() = 0; }; Q_DECLARE_METATYPE(AbstractAudioInterface*) From b1cfd3343877fa92869ac196edf9683f12d1b18e Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Apr 2015 15:49:47 +0200 Subject: [PATCH 3/8] Add generated audio controls to scripting interface --- .../src/AudioScriptingInterface.cpp | 23 ++++++++++++++++++- .../src/AudioScriptingInterface.h | 4 ++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/libraries/script-engine/src/AudioScriptingInterface.cpp b/libraries/script-engine/src/AudioScriptingInterface.cpp index deb1e1e9e9..8bcc4a20cf 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.cpp +++ b/libraries/script-engine/src/AudioScriptingInterface.cpp @@ -9,9 +9,10 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "AudioScriptingInterface.h" + #include "ScriptAudioInjector.h" #include "ScriptEngineLogging.h" -#include "AudioScriptingInterface.h" void registerAudioMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, injectorOptionsToScriptValue, injectorOptionsFromScriptValue); @@ -69,3 +70,23 @@ ScriptAudioInjector* AudioScriptingInterface::playSound(Sound* sound, const Audi return NULL; } } + +void AudioScriptingInterface::injectGeneratedNoise(bool inject) { + if (_localAudioInterface) { + _localAudioInterface->enableAudioSourceInject(inject); + } +} + +void AudioScriptingInterface::selectPinkNoise() { + if (_localAudioInterface) { + _localAudioInterface->selectAudioSourcePinkNoise(); + } +} + +void AudioScriptingInterface::selectSine440() { + if (_localAudioInterface) { + _localAudioInterface->selectAudioSourceSine440(); + } +} + + diff --git a/libraries/script-engine/src/AudioScriptingInterface.h b/libraries/script-engine/src/AudioScriptingInterface.h index b74c520670..9d02b8c9a1 100644 --- a/libraries/script-engine/src/AudioScriptingInterface.h +++ b/libraries/script-engine/src/AudioScriptingInterface.h @@ -29,6 +29,10 @@ protected: // this method is protected to stop C++ callers from calling, but invokable from script Q_INVOKABLE ScriptAudioInjector* playSound(Sound* sound, const AudioInjectorOptions& injectorOptions = AudioInjectorOptions()); + Q_INVOKABLE void injectGeneratedNoise(bool inject); + Q_INVOKABLE void selectPinkNoise(); + Q_INVOKABLE void selectSine440(); + signals: void mutedByMixer(); void environmentMuted(); From c2c1ccc2b75d62c665889274f021db94c74228c9 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Apr 2015 15:50:22 +0200 Subject: [PATCH 4/8] Remove generated audio options from menu --- interface/src/Menu.cpp | 24 ------------------------ interface/src/Menu.h | 3 --- 2 files changed, 27 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 1cce0b1f56..796c8e6dd6 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -483,30 +483,6 @@ Menu::Menu() { 0, audioIO.data(), SLOT(sendMuteEnvironmentPacket())); - - addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::AudioSourceInject, - 0, - false, - audioIO.data(), - SLOT(toggleAudioSourceInject())); - QMenu* audioSourceMenu = audioDebugMenu->addMenu("Generated Audio Source"); - { - QAction *pinkNoise = addCheckableActionToQMenuAndActionHash(audioSourceMenu, MenuOption::AudioSourcePinkNoise, - 0, - false, - audioIO.data(), - SLOT(selectAudioSourcePinkNoise())); - - QAction *sine440 = addCheckableActionToQMenuAndActionHash(audioSourceMenu, MenuOption::AudioSourceSine440, - 0, - true, - audioIO.data(), - SLOT(selectAudioSourceSine440())); - - QActionGroup* audioSourceGroup = new QActionGroup(audioSourceMenu); - audioSourceGroup->addAction(pinkNoise); - audioSourceGroup->addAction(sine440); - } auto scope = DependencyManager::get(); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index db126a3c9b..4589c94b08 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -123,9 +123,6 @@ namespace MenuOption { const QString AudioScopeTwentyFrames = "Twenty"; const QString AudioStats = "Audio Stats"; const QString AudioStatsShowInjectedStreams = "Audio Stats Show Injected Streams"; - const QString AudioSourceInject = "Generated Audio"; - const QString AudioSourcePinkNoise = "Pink Noise"; - const QString AudioSourceSine440 = "Sine 440hz"; const QString BandwidthDetails = "Bandwidth Details"; const QString BlueSpeechSphere = "Blue Sphere While Speaking"; const QString BookmarkLocation = "Bookmark Location"; From 9ea72f2a03052c0f37102a3d99d5a917fcf280bb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Apr 2015 16:16:13 +0200 Subject: [PATCH 5/8] Added generated audio to developer menu script --- .../utilities/tools/developerMenuItems.js | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/examples/utilities/tools/developerMenuItems.js b/examples/utilities/tools/developerMenuItems.js index a691031131..4243838601 100644 --- a/examples/utilities/tools/developerMenuItems.js +++ b/examples/utilities/tools/developerMenuItems.js @@ -13,16 +13,25 @@ var createdRenderMenu = false; -var ENTITIES_MENU = "Developer > Entities"; +var DEVELOPER_MENU = "Developer"; + +var ENTITIES_MENU = DEVELOPER_MENU + " > Entities"; var COLLISION_UPDATES_TO_SERVER = "Don't send collision updates to server"; -var RENDER_MENU = "Developer > Render"; +var RENDER_MENU = DEVELOPER_MENU + " > Render"; var ENTITIES_ITEM = "Entities"; var AVATARS_ITEM = "Avatars"; +var AUDIO_MENU = DEVELOPER_MENU + " > Audio"; +var AUDIO_SOURCE_INJECT = "Generated Audio"; +var AUDIO_SOURCE_MENU = AUDIO_MENU + " > Generated Audio Source"; +var AUDIO_SOURCE_PINK_NOISE = "Pink Noise"; +var AUDIO_SOURCE_SINE_440 = "Sine 440hz"; + + function setupMenus() { - if (!Menu.menuExists("Developer")) { - Menu.addMenu("Developer"); + if (!Menu.menuExists(DEVELOPER_MENU)) { + Menu.addMenu(DEVELOPER_MENU); } if (!Menu.menuExists(ENTITIES_MENU)) { Menu.addMenu(ENTITIES_MENU); @@ -54,6 +63,17 @@ function setupMenus() { if (!Menu.menuItemExists(RENDER_MENU, AVATARS_ITEM)) { Menu.addMenuItem({ menuName: RENDER_MENU, menuItemName: AVATARS_ITEM, isCheckable: true, isChecked: Scene.shouldRenderAvatars }) } + + + if (!Menu.menuExists(AUDIO_MENU)) { + Menu.addMenu(AUDIO_MENU); + } + Menu.addMenuItem({ menuName: AUDIO_MENU, menuItemName: AUDIO_SOURCE_INJECT, isCheckable: true, isChecked: false }); + Menu.addMenu(AUDIO_SOURCE_MENU); + Menu.addMenuItem({ menuName: AUDIO_SOURCE_MENU, menuItemName: AUDIO_SOURCE_PINK_NOISE, isCheckable: true, isChecked: false }); + Menu.addMenuItem({ menuName: AUDIO_SOURCE_MENU, menuItemName: AUDIO_SOURCE_SINE_440, isCheckable: true, isChecked: false }); + Menu.setIsOptionChecked(AUDIO_SOURCE_PINK_NOISE, true); + } Menu.menuItemEvent.connect(function (menuItem) { @@ -67,7 +87,15 @@ Menu.menuItemEvent.connect(function (menuItem) { Scene.shouldRenderEntities = Menu.isOptionChecked(ENTITIES_ITEM); } else if (menuItem == AVATARS_ITEM) { Scene.shouldRenderAvatars = Menu.isOptionChecked(AVATARS_ITEM); - } + } else if (menuItem == AUDIO_SOURCE_INJECT) { + Audio.injectGeneratedNoise(Menu.isOptionChecked(AUDIO_SOURCE_INJECT)); + } else if (menuItem == AUDIO_SOURCE_PINK_NOISE) { + Audio.selectPinkNoise(); + Menu.setIsOptionChecked(AUDIO_SOURCE_SINE_440, false); + } else if (menuItem == AUDIO_SOURCE_SINE_440) { + Audio.selectSine440(); + Menu.setIsOptionChecked(AUDIO_SOURCE_PINK_NOISE, false); + } }); Scene.shouldRenderAvatarsChanged.connect(function(shouldRenderAvatars) { @@ -87,6 +115,10 @@ function scriptEnding() { Menu.removeMenuItem(RENDER_MENU, ENTITIES_ITEM); Menu.removeMenuItem(RENDER_MENU, AVATARS_ITEM); } + + Audio.injectGeneratedNoise(false); + Menu.removeMenuItem(AUDIO_MENU, AUDIO_SOURCE_INJECT); + Menu.removeMenu(AUDIO_SOURCE_MENU); } setupMenus(); From 5f9d7a00fa01c426598a809b9349c1f7970b0087 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Apr 2015 16:22:18 +0200 Subject: [PATCH 6/8] Correct default to pink noise --- examples/utilities/tools/developerMenuItems.js | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/utilities/tools/developerMenuItems.js b/examples/utilities/tools/developerMenuItems.js index 4243838601..84e1853d64 100644 --- a/examples/utilities/tools/developerMenuItems.js +++ b/examples/utilities/tools/developerMenuItems.js @@ -73,6 +73,7 @@ function setupMenus() { Menu.addMenuItem({ menuName: AUDIO_SOURCE_MENU, menuItemName: AUDIO_SOURCE_PINK_NOISE, isCheckable: true, isChecked: false }); Menu.addMenuItem({ menuName: AUDIO_SOURCE_MENU, menuItemName: AUDIO_SOURCE_SINE_440, isCheckable: true, isChecked: false }); Menu.setIsOptionChecked(AUDIO_SOURCE_PINK_NOISE, true); + Audio.selectPinkNoise(); } From 62d3b39c2569a818a183a51fad92dfaa173970c7 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Apr 2015 16:22:52 +0200 Subject: [PATCH 7/8] less loud generated noise Prevents the audio mixer from muting you because of too much noise --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 032c70985e..331e62ec70 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -493,7 +493,7 @@ void AudioClient::start() { _sourceGain.initialize(); _noiseSource.initialize(); _toneSource.initialize(); - _sourceGain.setParameters(0.25f, 0.0f); + _sourceGain.setParameters(0.05f, 0.0f); _inputGain.setParameters(1.0f, 0.0f); } From d2775fe9b337b1be396a1f90c03709fc21c6c1cd Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Apr 2015 16:52:41 +0200 Subject: [PATCH 8/8] Fix for people running older version of interface --- .../utilities/tools/developerMenuItems.js | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/examples/utilities/tools/developerMenuItems.js b/examples/utilities/tools/developerMenuItems.js index 84e1853d64..58b5149307 100644 --- a/examples/utilities/tools/developerMenuItems.js +++ b/examples/utilities/tools/developerMenuItems.js @@ -12,6 +12,7 @@ // var createdRenderMenu = false; +var createdGeneratedAudioMenu = false; var DEVELOPER_MENU = "Developer"; @@ -68,13 +69,15 @@ function setupMenus() { if (!Menu.menuExists(AUDIO_MENU)) { Menu.addMenu(AUDIO_MENU); } - Menu.addMenuItem({ menuName: AUDIO_MENU, menuItemName: AUDIO_SOURCE_INJECT, isCheckable: true, isChecked: false }); - Menu.addMenu(AUDIO_SOURCE_MENU); - Menu.addMenuItem({ menuName: AUDIO_SOURCE_MENU, menuItemName: AUDIO_SOURCE_PINK_NOISE, isCheckable: true, isChecked: false }); - Menu.addMenuItem({ menuName: AUDIO_SOURCE_MENU, menuItemName: AUDIO_SOURCE_SINE_440, isCheckable: true, isChecked: false }); - Menu.setIsOptionChecked(AUDIO_SOURCE_PINK_NOISE, true); - Audio.selectPinkNoise(); - + if (!Menu.menuItemExists(AUDIO_MENU, AUDIO_SOURCE_INJECT)) { + Menu.addMenuItem({ menuName: AUDIO_MENU, menuItemName: AUDIO_SOURCE_INJECT, isCheckable: true, isChecked: false }); + Menu.addMenu(AUDIO_SOURCE_MENU); + Menu.addMenuItem({ menuName: AUDIO_SOURCE_MENU, menuItemName: AUDIO_SOURCE_PINK_NOISE, isCheckable: true, isChecked: false }); + Menu.addMenuItem({ menuName: AUDIO_SOURCE_MENU, menuItemName: AUDIO_SOURCE_SINE_440, isCheckable: true, isChecked: false }); + Menu.setIsOptionChecked(AUDIO_SOURCE_PINK_NOISE, true); + Audio.selectPinkNoise(); + createdGeneratedAudioMenu = true; + } } Menu.menuItemEvent.connect(function (menuItem) { @@ -88,12 +91,12 @@ Menu.menuItemEvent.connect(function (menuItem) { Scene.shouldRenderEntities = Menu.isOptionChecked(ENTITIES_ITEM); } else if (menuItem == AVATARS_ITEM) { Scene.shouldRenderAvatars = Menu.isOptionChecked(AVATARS_ITEM); - } else if (menuItem == AUDIO_SOURCE_INJECT) { + } else if (menuItem == AUDIO_SOURCE_INJECT && !createdGeneratedAudioMenu) { Audio.injectGeneratedNoise(Menu.isOptionChecked(AUDIO_SOURCE_INJECT)); - } else if (menuItem == AUDIO_SOURCE_PINK_NOISE) { + } else if (menuItem == AUDIO_SOURCE_PINK_NOISE && !createdGeneratedAudioMenu) { Audio.selectPinkNoise(); Menu.setIsOptionChecked(AUDIO_SOURCE_SINE_440, false); - } else if (menuItem == AUDIO_SOURCE_SINE_440) { + } else if (menuItem == AUDIO_SOURCE_SINE_440 && !createdGeneratedAudioMenu) { Audio.selectSine440(); Menu.setIsOptionChecked(AUDIO_SOURCE_PINK_NOISE, false); } @@ -117,9 +120,11 @@ function scriptEnding() { Menu.removeMenuItem(RENDER_MENU, AVATARS_ITEM); } - Audio.injectGeneratedNoise(false); - Menu.removeMenuItem(AUDIO_MENU, AUDIO_SOURCE_INJECT); - Menu.removeMenu(AUDIO_SOURCE_MENU); + if (createdGeneratedAudioMenu) { + Audio.injectGeneratedNoise(false); + Menu.removeMenuItem(AUDIO_MENU, AUDIO_SOURCE_INJECT); + Menu.removeMenu(AUDIO_SOURCE_MENU); + } } setupMenus();