EqualPowerPanner.cpp [plain text]
#include "config.h"
#if ENABLE(WEB_AUDIO)
#include "EqualPowerPanner.h"
#include "AudioBus.h"
#include "AudioUtilities.h"
#include <wtf/MathExtras.h>
const double SmoothingTimeConstant = 0.050;
namespace WebCore {
EqualPowerPanner::EqualPowerPanner(double 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 , AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess)
{
bool isInputSafe = inputBus && inputBus->numberOfChannels() == 1 && framesToProcess <= inputBus->length();
ASSERT(isInputSafe);
if (!isInputSafe)
return;
bool isOutputSafe = outputBus && outputBus->numberOfChannels() == 2 && framesToProcess <= outputBus->length();
ASSERT(isOutputSafe);
if (!isOutputSafe)
return;
AudioChannel* channel = inputBus->channel(0);
float* sourceP = channel->data();
float* destinationL = outputBus->channelByType(AudioBus::ChannelLeft)->data();
float* destinationR = outputBus->channelByType(AudioBus::ChannelRight)->data();
if (!sourceP || !destinationL || !destinationR)
return;
double desiredPanPosition;
if (azimuth > 30.0)
desiredPanPosition = 1.0;
else if (azimuth < -30.0)
desiredPanPosition = 0.0;
else
desiredPanPosition = (azimuth + 30.0) / 60.0;
double desiredGainL = 0.5 * cos(piDouble * desiredPanPosition) + 0.5;
double desiredGainR = sqrt(1.0 - desiredGainL*desiredGainL);
if (m_isFirstRender) {
m_isFirstRender = false;
m_gainL = desiredGainL;
m_gainR = desiredGainR;
}
double gainL = m_gainL;
double gainR = m_gainR;
const double SmoothingConstant = m_smoothingConstant;
int n = framesToProcess;
while (n--) {
float input = *sourceP++;
gainL += (desiredGainL - gainL) * SmoothingConstant;
gainR += (desiredGainR - gainR) * SmoothingConstant;
*destinationL++ = static_cast<float>(input * gainL);
*destinationR++ = static_cast<float>(input * gainR);
}
m_gainL = gainL;
m_gainR = gainR;
}
}
#endif // ENABLE(WEB_AUDIO)