+2012-01-31 Raymond Liu <raymond.liu@intel.com>
+
+ Clean up m_processLock logic in AudioBasicProcessorNode and AudioGainNode
+ https://bugs.webkit.org/show_bug.cgi?id=76772
+
+ Reviewed by Kenneth Russell.
+
+ No new tests required.
+
+ * webaudio/AudioBasicProcessorNode.cpp:
+ (WebCore::AudioBasicProcessorNode::process):
+ (WebCore::AudioBasicProcessorNode::checkNumberOfChannelsForInput):
+ * webaudio/AudioBasicProcessorNode.h:
+ * webaudio/AudioGainNode.cpp:
+ (WebCore::AudioGainNode::process):
+ (WebCore::AudioGainNode::checkNumberOfChannelsForInput):
+ * webaudio/AudioGainNode.h:
+ (AudioGainNode):
+
2012-01-31 Adam Klein <adamk@chromium.org>
ProcessingInstruction should not be a ContainerNode
{
AudioBus* destinationBus = output(0)->bus();
- // The realtime thread can't block on this lock, so we call tryLock() instead.
- if (m_processLock.tryLock()) {
- if (!isInitialized() || !processor())
- destinationBus->zero();
- else {
- AudioBus* sourceBus = input(0)->bus();
-
- // FIXME: if we take "tail time" into account, then we can avoid calling processor()->process() once the tail dies down.
- if (!input(0)->isConnected())
- sourceBus->zero();
-
- processor()->process(sourceBus, destinationBus, framesToProcess);
- }
-
- m_processLock.unlock();
- } else {
- // Too bad - the tryLock() failed. We must be in the middle of re-connecting and were already outputting silence anyway...
+ if (!isInitialized() || !processor())
destinationBus->zero();
+ else {
+ AudioBus* sourceBus = input(0)->bus();
+
+ // FIXME: if we take "tail time" into account, then we can avoid calling processor()->process() once the tail dies down.
+ if (!input(0)->isConnected())
+ sourceBus->zero();
+
+ processor()->process(sourceBus, destinationBus, framesToProcess);
}
}
if (isInitialized() && numberOfChannels != output(0)->numberOfChannels()) {
// We're already initialized but the channel count has changed.
- // We need to be careful since we may be actively processing right now, so synchronize with process().
- MutexLocker locker(m_processLock);
uninitialize();
}
AudioBus* outputBus = output(0)->bus();
ASSERT(outputBus);
- // The realtime thread can't block on this lock, so we call tryLock() instead.
- if (m_processLock.tryLock()) {
- if (!isInitialized() || !input(0)->isConnected())
- outputBus->zero();
- else {
- AudioBus* inputBus = input(0)->bus();
-
- if (gain()->hasTimelineValues()) {
- // Apply sample-accurate gain scaling for precise envelopes, grain windows, etc.
- ASSERT(framesToProcess <= m_sampleAccurateGainValues.size());
- if (framesToProcess <= m_sampleAccurateGainValues.size()) {
- float* gainValues = m_sampleAccurateGainValues.data();
- gain()->calculateSampleAccurateValues(gainValues, framesToProcess);
- outputBus->copyWithSampleAccurateGainValuesFrom(*inputBus, gainValues, framesToProcess);
- }
- } else {
- // Apply the gain with de-zippering into the output bus.
- outputBus->copyWithGainFrom(*inputBus, &m_lastGain, gain()->value());
+ if (!isInitialized() || !input(0)->isConnected())
+ outputBus->zero();
+ else {
+ AudioBus* inputBus = input(0)->bus();
+
+ if (gain()->hasTimelineValues()) {
+ // Apply sample-accurate gain scaling for precise envelopes, grain windows, etc.
+ ASSERT(framesToProcess <= m_sampleAccurateGainValues.size());
+ if (framesToProcess <= m_sampleAccurateGainValues.size()) {
+ float* gainValues = m_sampleAccurateGainValues.data();
+ gain()->calculateSampleAccurateValues(gainValues, framesToProcess);
+ outputBus->copyWithSampleAccurateGainValuesFrom(*inputBus, gainValues, framesToProcess);
}
+ } else {
+ // Apply the gain with de-zippering into the output bus.
+ outputBus->copyWithGainFrom(*inputBus, &m_lastGain, gain()->value());
}
-
- m_processLock.unlock();
- } else {
- // Too bad - the tryLock() failed. We must be in the middle of re-connecting and were already outputting silence anyway...
- outputBus->zero();
}
}
// uninitialize and then re-initialize with the new channel count.
void AudioGainNode::checkNumberOfChannelsForInput(AudioNodeInput* input)
{
+ ASSERT(context()->isAudioThread() && context()->isGraphOwner());
+
ASSERT(input && input == this->input(0));
if (input != this->input(0))
return;
if (isInitialized() && numberOfChannels != output(0)->numberOfChannels()) {
// We're already initialized but the channel count has changed.
- // We need to be careful since we may be actively processing right now, so synchronize with process().
- MutexLocker locker(m_processLock);
uninitialize();
}