Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Unified Diff: third_party/WebKit/Source/platform/audio/EqualPowerPanner.cpp

Issue 1820403002: Implement Automations for PannerNode and AutioListener (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update test because CL for min/maxValue AudioParam landed Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/audio/EqualPowerPanner.cpp
diff --git a/third_party/WebKit/Source/platform/audio/EqualPowerPanner.cpp b/third_party/WebKit/Source/platform/audio/EqualPowerPanner.cpp
index 968fee73e2724d4495130a4a032937d314cfbb11..2a17a0ff6caac1c5b30d2084286eeb5cfe122dd3 100644
--- a/third_party/WebKit/Source/platform/audio/EqualPowerPanner.cpp
+++ b/third_party/WebKit/Source/platform/audio/EqualPowerPanner.cpp
@@ -29,18 +29,11 @@
#include <algorithm>
#include <cmath>
-// Use a 50ms smoothing / de-zippering time-constant.
-const float SmoothingTimeConstant = 0.050f;
-
namespace blink {
EqualPowerPanner::EqualPowerPanner(float sampleRate)
: Panner(PanningModelEqualPower)
- , m_isFirstRender(true)
- , m_gainL(0.0)
- , m_gainR(0.0)
{
- m_smoothingConstant = AudioUtilities::discreteTimeConstantForSampleRate(SmoothingTimeConstant, sampleRate);
}
void EqualPowerPanner::pan(double azimuth, double /*elevation*/, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess)
@@ -97,54 +90,122 @@ void EqualPowerPanner::pan(double azimuth, double /*elevation*/, const AudioBus*
desiredGainL = std::cos(piOverTwoDouble * desiredPanPosition);
desiredGainR = std::sin(piOverTwoDouble * desiredPanPosition);
- // Don't de-zipper on first render call.
- if (m_isFirstRender) {
- m_isFirstRender = false;
- m_gainL = desiredGainL;
- m_gainR = desiredGainR;
- }
-
- // Cache in local variables.
- double gainL = m_gainL;
- double gainR = m_gainR;
-
- // Get local copy of smoothing constant.
- const double SmoothingConstant = m_smoothingConstant;
-
int n = framesToProcess;
if (numberOfInputChannels == 1) { // For mono source case.
while (n--) {
float inputL = *sourceL++;
- gainL += (desiredGainL - gainL) * SmoothingConstant;
- gainR += (desiredGainR - gainR) * SmoothingConstant;
- *destinationL++ = static_cast<float>(inputL * gainL);
- *destinationR++ = static_cast<float>(inputL * gainR);
+
+ *destinationL++ = static_cast<float>(inputL * desiredGainL);
+ *destinationR++ = static_cast<float>(inputL * desiredGainR);
}
} else { // For stereo source case.
if (azimuth <= 0) { // from -90 -> 0
while (n--) {
float inputL = *sourceL++;
float inputR = *sourceR++;
- gainL += (desiredGainL - gainL) * SmoothingConstant;
- gainR += (desiredGainR - gainR) * SmoothingConstant;
- *destinationL++ = static_cast<float>(inputL + inputR * gainL);
- *destinationR++ = static_cast<float>(inputR * gainR);
+
+ *destinationL++ = static_cast<float>(inputL + inputR * desiredGainL);
+ *destinationR++ = static_cast<float>(inputR * desiredGainR);
}
} else { // from 0 -> +90
while (n--) {
float inputL = *sourceL++;
float inputR = *sourceR++;
- gainL += (desiredGainL - gainL) * SmoothingConstant;
- gainR += (desiredGainR - gainR) * SmoothingConstant;
- *destinationL++ = static_cast<float>(inputL * gainL);
- *destinationR++ = static_cast<float>(inputR + inputL * gainR);
+
+ *destinationL++ = static_cast<float>(inputL * desiredGainL);
+ *destinationR++ = static_cast<float>(inputR + inputL * desiredGainR);
}
}
}
+}
+
+void EqualPowerPanner::calculateDesiredGain(double& desiredGainL, double& desiredGainR, double azimuth, int numberOfInputChannels)
+{
+ // Clamp azimuth to allowed range of -180 -> +180.
+ azimuth = clampTo(azimuth, -180.0, 180.0);
+
+ // Alias the azimuth ranges behind us to in front of us:
+ // -90 -> -180 to -90 -> 0 and 90 -> 180 to 90 -> 0
+ if (azimuth < -90)
+ azimuth = -180 - azimuth;
+ else if (azimuth > 90)
+ azimuth = 180 - azimuth;
+
+ double desiredPanPosition;
+
+ if (numberOfInputChannels == 1) { // For mono source case.
+ // Pan smoothly from left to right with azimuth going from -90 -> +90 degrees.
+ desiredPanPosition = (azimuth + 90) / 180;
+ } else { // For stereo source case.
+ if (azimuth <= 0) { // from -90 -> 0
+ // sourceL -> destL and "equal-power pan" sourceR as in mono case
+ // by transforming the "azimuth" value from -90 -> 0 degrees into the range -90 -> +90.
+ desiredPanPosition = (azimuth + 90) / 90;
+ } else { // from 0 -> +90
+ // sourceR -> destR and "equal-power pan" sourceL as in mono case
+ // by transforming the "azimuth" value from 0 -> +90 degrees into the range -90 -> +90.
+ desiredPanPosition = azimuth / 90;
+ }
+ }
- m_gainL = gainL;
- m_gainR = gainR;
+ desiredGainL = std::cos(piOverTwoDouble * desiredPanPosition);
+ desiredGainR = std::sin(piOverTwoDouble * desiredPanPosition);
+}
+
+void EqualPowerPanner::panWithSampleAccurateValues(double* azimuth, double* /*elevation*/, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess)
+{
+ bool isInputSafe = inputBus && (inputBus->numberOfChannels() == 1 || inputBus->numberOfChannels() == 2) && framesToProcess <= inputBus->length();
+ DCHECK(isInputSafe);
+ if (!isInputSafe)
+ return;
+
+ unsigned numberOfInputChannels = inputBus->numberOfChannels();
+
+ bool isOutputSafe = outputBus && outputBus->numberOfChannels() == 2 && framesToProcess <= outputBus->length();
+ DCHECK(isOutputSafe);
+ if (!isOutputSafe)
+ return;
+
+ const float* sourceL = inputBus->channel(0)->data();
+ const float* sourceR = numberOfInputChannels > 1 ? inputBus->channel(1)->data() : sourceL;
+ float* destinationL = outputBus->channelByType(AudioBus::ChannelLeft)->mutableData();
+ float* destinationR = outputBus->channelByType(AudioBus::ChannelRight)->mutableData();
+
+ if (!sourceL || !sourceR || !destinationL || !destinationR)
+ return;
+
+ int n = framesToProcess;
+
+ if (numberOfInputChannels == 1) { // For mono source case.
+ for (int k = 0; k < n; ++k) {
+ double desiredGainL;
+ double desiredGainR;
+ float inputL = *sourceL++;
+
+ calculateDesiredGain(desiredGainL, desiredGainR, azimuth[k], numberOfInputChannels);
+ *destinationL++ = static_cast<float>(inputL * desiredGainL);
+ *destinationR++ = static_cast<float>(inputL * desiredGainR);
+ }
+ } else { // For stereo source case.
+ for (int k = 0; k < n; ++k) {
+ double desiredGainL;
+ double desiredGainR;
+
+ calculateDesiredGain(desiredGainL, desiredGainR, azimuth[k], numberOfInputChannels);
+ if (azimuth[k] <= 0) { // from -90 -> 0
+ float inputL = *sourceL++;
+ float inputR = *sourceR++;
+ *destinationL++ = static_cast<float>(inputL + inputR * desiredGainL);
+ *destinationR++ = static_cast<float>(inputR * desiredGainR);
+ } else { // from 0 -> +90
+ float inputL = *sourceL++;
+ float inputR = *sourceR++;
+ *destinationL++ = static_cast<float>(inputL * desiredGainL);
+ *destinationR++ = static_cast<float>(inputR + inputL * desiredGainR);
+ }
+ }
+ }
}
} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/platform/audio/EqualPowerPanner.h ('k') | third_party/WebKit/Source/platform/audio/HRTFPanner.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698