diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index daf6a4a7ee..94e1cd336a 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -404,17 +404,6 @@ void Audio::handleAudioInput() { QByteArray inputByteArray = _inputDevice->readAll(); - // send our local loopback to any interested parties - if (_processSpatialAudio && !_muted && _audioOutput) { - if (false) { - // local audio is sent already resampled to match the output format, so processors - // can easily handle the audio in a format ready to post back to the audio device - //emit processLocalAudio(_spatialAudioStart, resampledInputByteArray, _outputFormat); - } else { - emit processLocalAudio(_spatialAudioStart, inputByteArray, _outputFormat); - } - } - if (Menu::getInstance()->isOptionChecked(MenuOption::EchoLocalAudio) && !_muted && _audioOutput) { // if this person wants local loopback add that to the locally injected audio @@ -575,6 +564,26 @@ void Audio::handleAudioInput() { _lastInputLoudness = 0; } + // at this point we have clean monoAudioSamples, which match our target output... this is what we should send + // to our interested listeners + // send our local loopback to any interested parties + if (_processSpatialAudio && !_muted && _audioOutput && + (Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingProcessLocalAudio))) { + // local audio is sent already resampled to match the network input format, so processors + // can easily handle the audio in a format ready to post back to the audio device + const int NUM_CHANNELS = 2; + QByteArray stereoInputData; + stereoInputData.resize(NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL * NUM_CHANNELS * sizeof(int16_t)); + int16_t* stereoSamples = (int16_t*)stereoInputData.data(); + const float LOCAL_SIGNAL_ATTENUATION = 0.125f; + for (int i = 0; i < NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; i++) { + stereoSamples[i* NUM_CHANNELS] = monoAudioSamples[i] * LOCAL_SIGNAL_ATTENUATION; + stereoSamples[(i * NUM_CHANNELS) + 1] = monoAudioSamples[i] * LOCAL_SIGNAL_ATTENUATION; + } + + emit processLocalAudio(_spatialAudioStart, stereoInputData, _desiredOutputFormat); + } + if (_proceduralAudioOutput) { processProceduralAudio(monoAudioSamples, NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL); } diff --git a/interface/src/AudioReflector.cpp b/interface/src/AudioReflector.cpp index fa4573b1b4..0bb2e7224e 100644 --- a/interface/src/AudioReflector.cpp +++ b/interface/src/AudioReflector.cpp @@ -224,7 +224,7 @@ void AudioReflector::injectAudiblePoint(const AudiblePoint& audiblePoint, _audio->addSpatialAudioToBuffer(sampleTimeRight, attenuatedRightSamples, totalNumberOfSamples); } void AudioReflector::processLocalAudio(unsigned int sampleTime, const QByteArray& samples, const QAudioFormat& format) { - // nothing yet, but will do local reflections too... + echoAudio(sampleTime, samples, format); } void AudioReflector::processInboundAudio(unsigned int sampleTime, const QByteArray& samples, const QAudioFormat& format) { diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index a02c8342a7..af4825fac8 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -423,6 +423,10 @@ Menu::Menu() : Qt::CTRL | Qt::SHIFT | Qt::Key_X, true); + addCheckableActionToQMenuAndActionHash(spatialAudioMenu, MenuOption::AudioSpatialProcessingProcessLocalAudio, + Qt::CTRL | Qt::SHIFT | Qt::Key_A, + true); + addActionToQMenuAndActionHash(developerMenu, MenuOption::PasteToVoxel, Qt::CTRL | Qt::SHIFT | Qt::Key_V, this, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 5fcbf11724..bc05e8921b 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -237,15 +237,18 @@ namespace MenuOption { const QString Atmosphere = "Atmosphere"; const QString AudioNoiseReduction = "Audio Noise Reduction"; const QString AudioToneInjection = "Inject Test Tone"; + const QString AudioSpatialProcessing = "Audio Spatial Processing"; - const QString AudioSpatialProcessingIncudeOriginal = "Audio Spatial Processing includes Original"; - const QString AudioSpatialProcessingSeparateEars = "Audio Spatial Processing separates ears"; - const QString AudioSpatialProcessingPreDelay = "Audio Spatial Processing add Pre-Delay"; - const QString AudioSpatialProcessingStereoSource = "Audio Spatial Processing Stereo Source"; - const QString AudioSpatialProcessingHeadOriented = "Audio Spatial Processing Head Oriented"; - const QString AudioSpatialProcessingWithDiffusions = "Audio Spatial Processing With Diffusions"; - const QString AudioSpatialProcessingRenderPaths = "Audio Spatial Processing Render Paths"; - const QString AudioSpatialProcessingSlightlyRandomSurfaces = "Audio Spatial Processing Slightly Random Surfaces"; + const QString AudioSpatialProcessingHeadOriented = "Head Oriented"; + const QString AudioSpatialProcessingIncudeOriginal = "Includes Network Original"; + const QString AudioSpatialProcessingPreDelay = "Add Pre-Delay"; + const QString AudioSpatialProcessingProcessLocalAudio = "Process Local Audio"; + const QString AudioSpatialProcessingRenderPaths = "Render Paths"; + const QString AudioSpatialProcessingSeparateEars = "Separate Ears"; + const QString AudioSpatialProcessingSlightlyRandomSurfaces = "Slightly Random Surfaces"; + const QString AudioSpatialProcessingStereoSource = "Stereo Source"; + const QString AudioSpatialProcessingWithDiffusions = "With Diffusions"; + const QString Avatars = "Avatars"; const QString Bandwidth = "Bandwidth Display"; const QString BandwidthDetails = "Bandwidth Details";