From 48ddfb09c2db03b3ad13eb1ab292185863eb7e24 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Wed, 11 Apr 2018 10:08:33 -0700 Subject: [PATCH 1/3] Support per-avatar gain adjustment on stereo input streams --- assignment-client/src/audio/AudioMixerSlave.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/assignment-client/src/audio/AudioMixerSlave.cpp b/assignment-client/src/audio/AudioMixerSlave.cpp index ccdd2fca4f..f95d51720f 100644 --- a/assignment-client/src/audio/AudioMixerSlave.cpp +++ b/assignment-client/src/audio/AudioMixerSlave.cpp @@ -322,6 +322,11 @@ void AudioMixerSlave::addStream(AudioMixerClientData& listenerNodeData, const QU // stereo sources are not passed through HRTF if (streamToAdd.isStereo()) { + + // apply the avatar gain adjustment + auto& hrtf = listenerNodeData.hrtfForStream(sourceNodeID, streamToAdd.getStreamIdentifier()); + gain *= hrtf.getGainAdjustment(); + for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_STEREO; ++i) { _mixSamples[i] += float(streamPopOutput[i] * gain / AudioConstants::MAX_SAMPLE_VALUE); } From 537e54e9d461f06c4601eeb97e68bb9120bcd935 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Wed, 11 Apr 2018 10:54:31 -0700 Subject: [PATCH 2/3] Optimize the mixing loops --- assignment-client/src/audio/AudioMixerSlave.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerSlave.cpp b/assignment-client/src/audio/AudioMixerSlave.cpp index f95d51720f..e0c7e71589 100644 --- a/assignment-client/src/audio/AudioMixerSlave.cpp +++ b/assignment-client/src/audio/AudioMixerSlave.cpp @@ -327,8 +327,9 @@ void AudioMixerSlave::addStream(AudioMixerClientData& listenerNodeData, const QU auto& hrtf = listenerNodeData.hrtfForStream(sourceNodeID, streamToAdd.getStreamIdentifier()); gain *= hrtf.getGainAdjustment(); - for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_STEREO; ++i) { - _mixSamples[i] += float(streamPopOutput[i] * gain / AudioConstants::MAX_SAMPLE_VALUE); + for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL; i++) { + _mixSamples[2*i+0] += (float)streamPopOutput[2*i+0] * gain * (1/32768.0f); + _mixSamples[2*i+1] += (float)streamPopOutput[2*i+1] * gain * (1/32768.0f); } ++stats.manualStereoMixes; @@ -337,10 +338,10 @@ void AudioMixerSlave::addStream(AudioMixerClientData& listenerNodeData, const QU // echo sources are not passed through HRTF if (isEcho) { - for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_STEREO; i += 2) { - auto monoSample = float(streamPopOutput[i / 2] * gain / AudioConstants::MAX_SAMPLE_VALUE); - _mixSamples[i] += monoSample; - _mixSamples[i + 1] += monoSample; + for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL; i++) { + float sample = (float)streamPopOutput[i] * gain * (1/32768.0f); + _mixSamples[2*i+0] += sample; + _mixSamples[2*i+1] += sample; } ++stats.manualEchoMixes; From 2593d224c518f08a97e5ba41659759c1c2530268 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Thu, 12 Apr 2018 13:24:31 -0700 Subject: [PATCH 3/3] CR feedback --- assignment-client/src/audio/AudioMixerSlave.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerSlave.cpp b/assignment-client/src/audio/AudioMixerSlave.cpp index e0c7e71589..3c8e38f278 100644 --- a/assignment-client/src/audio/AudioMixerSlave.cpp +++ b/assignment-client/src/audio/AudioMixerSlave.cpp @@ -327,9 +327,11 @@ void AudioMixerSlave::addStream(AudioMixerClientData& listenerNodeData, const QU auto& hrtf = listenerNodeData.hrtfForStream(sourceNodeID, streamToAdd.getStreamIdentifier()); gain *= hrtf.getGainAdjustment(); + const float scale = 1/32768.0f; // int16_t to float + for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL; i++) { - _mixSamples[2*i+0] += (float)streamPopOutput[2*i+0] * gain * (1/32768.0f); - _mixSamples[2*i+1] += (float)streamPopOutput[2*i+1] * gain * (1/32768.0f); + _mixSamples[2*i+0] += (float)streamPopOutput[2*i+0] * gain * scale; + _mixSamples[2*i+1] += (float)streamPopOutput[2*i+1] * gain * scale; } ++stats.manualStereoMixes; @@ -338,8 +340,11 @@ void AudioMixerSlave::addStream(AudioMixerClientData& listenerNodeData, const QU // echo sources are not passed through HRTF if (isEcho) { + + const float scale = 1/32768.0f; // int16_t to float + for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL; i++) { - float sample = (float)streamPopOutput[i] * gain * (1/32768.0f); + float sample = (float)streamPopOutput[i] * gain * scale; _mixSamples[2*i+0] += sample; _mixSamples[2*i+1] += sample; }