diff --git a/examples/utilities/tools/developerMenuItems.js b/examples/utilities/tools/developerMenuItems.js index a691031131..58b5149307 100644 --- a/examples/utilities/tools/developerMenuItems.js +++ b/examples/utilities/tools/developerMenuItems.js @@ -12,17 +12,27 @@ // var createdRenderMenu = false; +var createdGeneratedAudioMenu = 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 +64,20 @@ 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); + } + 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) { @@ -67,7 +91,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 && !createdGeneratedAudioMenu) { + Audio.injectGeneratedNoise(Menu.isOptionChecked(AUDIO_SOURCE_INJECT)); + } else if (menuItem == AUDIO_SOURCE_PINK_NOISE && !createdGeneratedAudioMenu) { + Audio.selectPinkNoise(); + Menu.setIsOptionChecked(AUDIO_SOURCE_SINE_440, false); + } else if (menuItem == AUDIO_SOURCE_SINE_440 && !createdGeneratedAudioMenu) { + Audio.selectSine440(); + Menu.setIsOptionChecked(AUDIO_SOURCE_PINK_NOISE, false); + } }); Scene.shouldRenderAvatarsChanged.connect(function(shouldRenderAvatars) { @@ -87,6 +119,12 @@ function scriptEnding() { Menu.removeMenuItem(RENDER_MENU, ENTITIES_ITEM); Menu.removeMenuItem(RENDER_MENU, AVATARS_ITEM); } + + if (createdGeneratedAudioMenu) { + Audio.injectGeneratedNoise(false); + Menu.removeMenuItem(AUDIO_MENU, AUDIO_SOURCE_INJECT); + Menu.removeMenu(AUDIO_SOURCE_MENU); + } } setupMenus(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index b33275083e..da0c669f35 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -491,30 +491,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 00f876a539..f580b9204b 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -124,9 +124,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"; diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index a02dc912f7..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); } @@ -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*/); } @@ -972,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*) 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();