Chromium Code Reviews| Index: Source/modules/webaudio/OscillatorNode.cpp |
| diff --git a/Source/modules/webaudio/OscillatorNode.cpp b/Source/modules/webaudio/OscillatorNode.cpp |
| index b62f8244ce254e74767da1609ebf8843b84d99a3..b62e7915f5b50d7c6f766e3e028a624d9bc9e24e 100644 |
| --- a/Source/modules/webaudio/OscillatorNode.cpp |
| +++ b/Source/modules/webaudio/OscillatorNode.cpp |
| @@ -226,102 +226,104 @@ void OscillatorHandler::process(size_t framesToProcess) |
| // The audio thread can't block on this lock, so we call tryLock() instead. |
| MutexTryLocker tryLocker(m_processLock); |
| - if (!tryLocker.locked()) { |
| - // Too bad - the tryLock() failed. We must be in the middle of changing wave-tables. |
| - outputBus->zero(); |
| - return; |
| - } |
| + if (tryLocker.locked()) { |
|
tkent
2015/09/11 00:02:00
Is this change necessary? The scope of tryLocker
|
| - // We must access m_periodicWave only inside the lock. |
| - if (!m_periodicWave.get()) { |
| - outputBus->zero(); |
| - return; |
| - } |
| + // We must access m_periodicWave only inside the lock. |
| + if (!m_periodicWave.get()) { |
| + outputBus->zero(); |
| + return; |
| + } |
| - size_t quantumFrameOffset; |
| - size_t nonSilentFramesToProcess; |
| + size_t quantumFrameOffset; |
| + size_t nonSilentFramesToProcess; |
| - updateSchedulingInfo(framesToProcess, outputBus, quantumFrameOffset, nonSilentFramesToProcess); |
| + updateSchedulingInfo(framesToProcess, outputBus, quantumFrameOffset, nonSilentFramesToProcess); |
| - if (!nonSilentFramesToProcess) { |
| - outputBus->zero(); |
| - return; |
| - } |
| + if (!nonSilentFramesToProcess) { |
| + outputBus->zero(); |
| + return; |
| + } |
| - unsigned periodicWaveSize = m_periodicWave->periodicWaveSize(); |
| - double invPeriodicWaveSize = 1.0 / periodicWaveSize; |
| + unsigned periodicWaveSize = m_periodicWave->periodicWaveSize(); |
| + double invPeriodicWaveSize = 1.0 / periodicWaveSize; |
| - float* destP = outputBus->channel(0)->mutableData(); |
| + float* destP = outputBus->channel(0)->mutableData(); |
| - ASSERT(quantumFrameOffset <= framesToProcess); |
| + ASSERT(quantumFrameOffset <= framesToProcess); |
| - // We keep virtualReadIndex double-precision since we're accumulating values. |
| - double virtualReadIndex = m_virtualReadIndex; |
| + // We keep virtualReadIndex double-precision since we're accumulating values. |
| + double virtualReadIndex = m_virtualReadIndex; |
| - float rateScale = m_periodicWave->rateScale(); |
| - float invRateScale = 1 / rateScale; |
| - bool hasSampleAccurateValues = calculateSampleAccuratePhaseIncrements(framesToProcess); |
| + float rateScale = m_periodicWave->rateScale(); |
| + float invRateScale = 1 / rateScale; |
| + bool hasSampleAccurateValues = calculateSampleAccuratePhaseIncrements(framesToProcess); |
| - float frequency = 0; |
| - float* higherWaveData = 0; |
| - float* lowerWaveData = 0; |
| - float tableInterpolationFactor = 0; |
| + float frequency = 0; |
| + float* higherWaveData = 0; |
| + float* lowerWaveData = 0; |
| + float tableInterpolationFactor = 0; |
| - if (!hasSampleAccurateValues) { |
| - frequency = m_frequency->smoothedValue(); |
| - float detune = m_detune->smoothedValue(); |
| - float detuneScale = powf(2, detune / 1200); |
| - frequency *= detuneScale; |
| - m_periodicWave->waveDataForFundamentalFrequency(frequency, lowerWaveData, higherWaveData, tableInterpolationFactor); |
| - } |
| + if (!hasSampleAccurateValues) { |
| + frequency = m_frequency->smoothedValue(); |
| + float detune = m_detune->smoothedValue(); |
| + float detuneScale = powf(2, detune / 1200); |
| + frequency *= detuneScale; |
| + m_periodicWave->waveDataForFundamentalFrequency(frequency, lowerWaveData, higherWaveData, tableInterpolationFactor); |
| + } |
| - float incr = frequency * rateScale; |
| - float* phaseIncrements = m_phaseIncrements.data(); |
| + float incr = frequency * rateScale; |
| + float* phaseIncrements = m_phaseIncrements.data(); |
| - unsigned readIndexMask = periodicWaveSize - 1; |
| + unsigned readIndexMask = periodicWaveSize - 1; |
| - // Start rendering at the correct offset. |
| - destP += quantumFrameOffset; |
| - int n = nonSilentFramesToProcess; |
| + // Start rendering at the correct offset. |
| + destP += quantumFrameOffset; |
| + int n = nonSilentFramesToProcess; |
| - while (n--) { |
| - unsigned readIndex = static_cast<unsigned>(virtualReadIndex); |
| - unsigned readIndex2 = readIndex + 1; |
| + while (n--) { |
| + unsigned readIndex = static_cast<unsigned>(virtualReadIndex); |
| + unsigned readIndex2 = readIndex + 1; |
| - // Contain within valid range. |
| - readIndex = readIndex & readIndexMask; |
| - readIndex2 = readIndex2 & readIndexMask; |
| + // Contain within valid range. |
| + readIndex = readIndex & readIndexMask; |
| + readIndex2 = readIndex2 & readIndexMask; |
| - if (hasSampleAccurateValues) { |
| - incr = *phaseIncrements++; |
| + if (hasSampleAccurateValues) { |
| + incr = *phaseIncrements++; |
| - frequency = invRateScale * incr; |
| - m_periodicWave->waveDataForFundamentalFrequency(frequency, lowerWaveData, higherWaveData, tableInterpolationFactor); |
| - } |
| + frequency = invRateScale * incr; |
| + m_periodicWave->waveDataForFundamentalFrequency(frequency, lowerWaveData, higherWaveData, tableInterpolationFactor); |
| + } |
| - float sample1Lower = lowerWaveData[readIndex]; |
| - float sample2Lower = lowerWaveData[readIndex2]; |
| - float sample1Higher = higherWaveData[readIndex]; |
| - float sample2Higher = higherWaveData[readIndex2]; |
| + float sample1Lower = lowerWaveData[readIndex]; |
| + float sample2Lower = lowerWaveData[readIndex2]; |
| + float sample1Higher = higherWaveData[readIndex]; |
| + float sample2Higher = higherWaveData[readIndex2]; |
| - // Linearly interpolate within each table (lower and higher). |
| - float interpolationFactor = static_cast<float>(virtualReadIndex) - readIndex; |
| - float sampleHigher = (1 - interpolationFactor) * sample1Higher + interpolationFactor * sample2Higher; |
| - float sampleLower = (1 - interpolationFactor) * sample1Lower + interpolationFactor * sample2Lower; |
| + // Linearly interpolate within each table (lower and higher). |
| + float interpolationFactor = static_cast<float>(virtualReadIndex) - readIndex; |
| + float sampleHigher = (1 - interpolationFactor) * sample1Higher + interpolationFactor * sample2Higher; |
| + float sampleLower = (1 - interpolationFactor) * sample1Lower + interpolationFactor * sample2Lower; |
| - // Then interpolate between the two tables. |
| - float sample = (1 - tableInterpolationFactor) * sampleHigher + tableInterpolationFactor * sampleLower; |
| + // Then interpolate between the two tables. |
| + float sample = (1 - tableInterpolationFactor) * sampleHigher + tableInterpolationFactor * sampleLower; |
| - *destP++ = sample; |
| + *destP++ = sample; |
| - // Increment virtual read index and wrap virtualReadIndex into the range 0 -> periodicWaveSize. |
| - virtualReadIndex += incr; |
| - virtualReadIndex -= floor(virtualReadIndex * invPeriodicWaveSize) * periodicWaveSize; |
| - } |
| + // Increment virtual read index and wrap virtualReadIndex into the range 0 -> periodicWaveSize. |
| + virtualReadIndex += incr; |
| + virtualReadIndex -= floor(virtualReadIndex * invPeriodicWaveSize) * periodicWaveSize; |
| + } |
| - m_virtualReadIndex = virtualReadIndex; |
| + m_virtualReadIndex = virtualReadIndex; |
| - outputBus->clearSilentFlag(); |
| + outputBus->clearSilentFlag(); |
| + } else { |
| + // Too bad - the tryLock() failed. We must be in the middle of changing wave-tables or |
| + // updating scheduling. |
| + outputBus->zero(); |
| + return; |
| + } |
| } |
| void OscillatorHandler::setPeriodicWave(PeriodicWave* periodicWave) |