[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

crogers at google.com crogers at google.com
Wed Dec 22 14:59:31 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit fe109dd902486683d61173683929b75936a54e98
Author: crogers at google.com <crogers at google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Oct 27 02:31:35 2010 +0000

    2010-10-26  Chris Rogers  <crogers at google.com>
    
            Reviewed by Kenneth Russell.
    
            Add AudioNodeOutput files
            https://bugs.webkit.org/show_bug.cgi?id=45581
    
            No new tests since audio API is not yet implemented.
    
            * webaudio/AudioNodeOutput.cpp: Added.
            (WebCore::AudioNodeOutput::AudioNodeOutput):
            (WebCore::AudioNodeOutput::setNumberOfChannels):
            (WebCore::AudioNodeOutput::setInternalBus):
            (WebCore::AudioNodeOutput::updateRenderingState):
            (WebCore::AudioNodeOutput::updateNumberOfChannels):
            (WebCore::AudioNodeOutput::propagateChannelCount):
            (WebCore::AudioNodeOutput::pull):
            (WebCore::AudioNodeOutput::bus):
            (WebCore::AudioNodeOutput::renderingFanOutCount):
            (WebCore::AudioNodeOutput::fanOutCount):
            (WebCore::AudioNodeOutput::addInput):
            (WebCore::AudioNodeOutput::removeInput):
            (WebCore::AudioNodeOutput::disconnectAllInputs):
            (WebCore::AudioNodeOutput::disable):
            (WebCore::AudioNodeOutput::enable):
            * webaudio/AudioNodeOutput.h: Added.
            (WebCore::AudioNodeOutput::node):
            (WebCore::AudioNodeOutput::context):
            (WebCore::AudioNodeOutput::numberOfChannels):
            (WebCore::AudioNodeOutput::isChannelCountKnown):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@70602 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 226f092..6e25fb9 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -2,6 +2,37 @@
 
         Reviewed by Kenneth Russell.
 
+        Add AudioNodeOutput files
+        https://bugs.webkit.org/show_bug.cgi?id=45581
+
+        No new tests since audio API is not yet implemented.
+
+        * webaudio/AudioNodeOutput.cpp: Added.
+        (WebCore::AudioNodeOutput::AudioNodeOutput):
+        (WebCore::AudioNodeOutput::setNumberOfChannels):
+        (WebCore::AudioNodeOutput::setInternalBus):
+        (WebCore::AudioNodeOutput::updateRenderingState):
+        (WebCore::AudioNodeOutput::updateNumberOfChannels):
+        (WebCore::AudioNodeOutput::propagateChannelCount):
+        (WebCore::AudioNodeOutput::pull):
+        (WebCore::AudioNodeOutput::bus):
+        (WebCore::AudioNodeOutput::renderingFanOutCount):
+        (WebCore::AudioNodeOutput::fanOutCount):
+        (WebCore::AudioNodeOutput::addInput):
+        (WebCore::AudioNodeOutput::removeInput):
+        (WebCore::AudioNodeOutput::disconnectAllInputs):
+        (WebCore::AudioNodeOutput::disable):
+        (WebCore::AudioNodeOutput::enable):
+        * webaudio/AudioNodeOutput.h: Added.
+        (WebCore::AudioNodeOutput::node):
+        (WebCore::AudioNodeOutput::context):
+        (WebCore::AudioNodeOutput::numberOfChannels):
+        (WebCore::AudioNodeOutput::isChannelCountKnown):
+
+2010-10-26  Chris Rogers  <crogers at google.com>
+
+        Reviewed by Kenneth Russell.
+
         Add AudioNodeInput files
         https://bugs.webkit.org/show_bug.cgi?id=45577
 
diff --git a/WebCore/webaudio/AudioNodeOutput.cpp b/WebCore/webaudio/AudioNodeOutput.cpp
new file mode 100644
index 0000000..4c777e6
--- /dev/null
+++ b/WebCore/webaudio/AudioNodeOutput.cpp
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if ENABLE(WEB_AUDIO)
+
+#include "AudioNodeOutput.h"
+
+#include "AudioBus.h"
+#include "AudioContext.h"
+#include "AudioNodeInput.h"
+#include <wtf/Threading.h>
+
+namespace WebCore {
+
+AudioNodeOutput::AudioNodeOutput(AudioNode* node, unsigned numberOfChannels)
+    : m_node(node)
+    , m_numberOfChannels(numberOfChannels)
+    , m_desiredNumberOfChannels(numberOfChannels)
+    , m_internalOutputBus(0)
+    , m_actualDestinationBus(0)
+    , m_isEnabled(true)
+    , m_renderingFanOutCount(0)
+{
+    m_monoInternalBus = adoptPtr(new AudioBus(1, AudioNode::ProcessingSizeInFrames));
+    m_stereoInternalBus = adoptPtr(new AudioBus(2, AudioNode::ProcessingSizeInFrames));
+    setInternalBus();
+}
+
+void AudioNodeOutput::setNumberOfChannels(unsigned numberOfChannels)
+{
+    ASSERT(context()->isGraphOwner());
+    
+    m_desiredNumberOfChannels = numberOfChannels;
+
+    if (context()->isAudioThread()) {
+        // If we're in the audio thread then we can take care of it right away (we should be at the very start or end of a rendering quantum).
+        updateNumberOfChannels();
+    } else {
+        // Let the context take care of it in the audio thread in the pre and post render tasks.
+        context()->markAudioNodeOutputDirty(this);
+    }
+}
+
+void AudioNodeOutput::setInternalBus()
+{
+    switch (m_numberOfChannels) {
+    case 0:
+    case 1:
+        m_internalOutputBus = m_monoInternalBus.get();
+        break;
+    case 2:
+        m_internalOutputBus = m_stereoInternalBus.get();
+        break;
+    default:
+        // FIXME: later we can fully implement more than stereo, 5.1, etc.
+        ASSERT_NOT_REACHED();            
+    }
+
+    // This may later be changed in pull() to point to an in-place bus with the same number of channels.
+    m_actualDestinationBus = m_internalOutputBus;
+}
+
+void AudioNodeOutput::updateRenderingState()
+{
+    updateNumberOfChannels();
+    m_renderingFanOutCount = fanOutCount();
+}
+
+void AudioNodeOutput::updateNumberOfChannels()
+{
+    ASSERT(context()->isAudioThread() && context()->isGraphOwner());
+
+    if (m_numberOfChannels != m_desiredNumberOfChannels) {
+        m_numberOfChannels = m_desiredNumberOfChannels;
+        setInternalBus();
+        propagateChannelCount();
+    }
+}
+
+void AudioNodeOutput::propagateChannelCount()
+{
+    ASSERT(context()->isAudioThread() && context()->isGraphOwner());
+    
+    if (isChannelCountKnown()) {
+        // Announce to any nodes we're connected to that we changed our channel count for its input.
+        for (InputsIterator i = m_inputs.begin(); i != m_inputs.end(); ++i) {
+            AudioNodeInput* input = *i;
+            AudioNode* connectionNode = input->node();
+            connectionNode->checkNumberOfChannelsForInput(input);
+        }
+    }
+}
+
+AudioBus* AudioNodeOutput::pull(AudioBus* inPlaceBus, size_t framesToProcess)
+{
+    ASSERT(context()->isAudioThread());
+    ASSERT(m_renderingFanOutCount > 0);
+    
+    // Causes our AudioNode to process if it hasn't already for this render quantum.
+    // We try to do in-place processing (using inPlaceBus) if at all possible,
+    // but we can't process in-place if we're connected to more than one input (fan-out > 1).
+    // In this case pull() is called multiple times per rendering quantum, and the processIfNecessary() call below will
+    // cause our node to process() only the first time, caching the output in m_internalOutputBus for subsequent calls.    
+    
+    bool isInPlace = inPlaceBus && inPlaceBus->numberOfChannels() == numberOfChannels() && m_renderingFanOutCount == 1;
+
+    // Setup the actual destination bus for processing when our node's process() method gets called in processIfNecessary() below.
+    m_actualDestinationBus = isInPlace ? inPlaceBus : m_internalOutputBus;
+
+    node()->processIfNecessary(framesToProcess);
+    return m_actualDestinationBus;
+}
+
+AudioBus* AudioNodeOutput::bus() const
+{
+    ASSERT(const_cast<AudioNodeOutput*>(this)->context()->isAudioThread());
+    ASSERT(m_actualDestinationBus);
+    return m_actualDestinationBus;
+}
+
+unsigned AudioNodeOutput::renderingFanOutCount() const
+{
+    return m_renderingFanOutCount;
+}
+
+unsigned AudioNodeOutput::fanOutCount()
+{
+    ASSERT(context()->isGraphOwner());
+    return m_inputs.size();
+}
+
+void AudioNodeOutput::addInput(AudioNodeInput* input)
+{
+    ASSERT(context()->isGraphOwner());
+
+    ASSERT(input);
+    if (!input)
+        return;
+
+    m_inputs.add(input);
+}
+
+void AudioNodeOutput::removeInput(AudioNodeInput* input)
+{
+    ASSERT(context()->isGraphOwner());
+
+    ASSERT(input);
+    if (!input)
+        return;
+
+    m_inputs.remove(input);
+}
+
+void AudioNodeOutput::disconnectAllInputs()
+{
+    ASSERT(context()->isGraphOwner());
+    
+    // AudioNodeInput::disconnect() changes m_inputs by calling removeInput().
+    while (!m_inputs.isEmpty()) {
+        AudioNodeInput* input = *m_inputs.begin();
+        input->disconnect(this);
+    }
+}
+
+void AudioNodeOutput::disable()
+{
+    ASSERT(context()->isGraphOwner());
+
+    if (m_isEnabled) {
+        for (InputsIterator i = m_inputs.begin(); i != m_inputs.end(); ++i) {
+            AudioNodeInput* input = *i;
+            input->disable(this);
+        }
+        m_isEnabled = false;
+    }
+}
+
+void AudioNodeOutput::enable()
+{
+    ASSERT(context()->isGraphOwner());
+
+    if (!m_isEnabled) {
+        for (InputsIterator i = m_inputs.begin(); i != m_inputs.end(); ++i) {
+            AudioNodeInput* input = *i;
+            input->enable(this);
+        }
+        m_isEnabled = true;
+    }
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_AUDIO)
diff --git a/WebCore/webaudio/AudioNodeOutput.h b/WebCore/webaudio/AudioNodeOutput.h
new file mode 100644
index 0000000..7114b38
--- /dev/null
+++ b/WebCore/webaudio/AudioNodeOutput.h
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef AudioNodeOutput_h
+#define AudioNodeOutput_h
+
+#include "AudioBus.h"
+#include "AudioNode.h"
+#include <wtf/HashSet.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/Vector.h>
+
+namespace WebCore {
+
+class AudioContext;
+class AudioNodeInput;
+
+// AudioNodeOutput represents a single output for an AudioNode.
+// It may be connected to one or more AudioNodeInputs.
+
+class AudioNodeOutput {
+public:
+    // It's OK to pass 0 for numberOfChannels in which case setNumberOfChannels() must be called later on.
+    AudioNodeOutput(AudioNode*, unsigned numberOfChannels);
+
+    // Can be called from any thread.
+    AudioNode* node() const { return m_node; }
+    AudioContext* context() { return m_node->context(); }
+    
+    // Causes our AudioNode to process if it hasn't already for this render quantum.
+    // It returns the bus containing the processed audio for this output, returning inPlaceBus if in-place processing was possible.
+    // Called from context's audio thread.
+    AudioBus* pull(AudioBus* inPlaceBus, size_t framesToProcess);
+
+    // bus() will contain the rendered audio after pull() is called for each rendering time quantum.
+    // Called from context's audio thread.
+    AudioBus* bus() const;
+
+    // fanOutCount() is the number of AudioNodeInputs that we're connected to.
+    // This function should not be called in audio thread rendering code, instead renderingFanOutCount() should be used.
+    // It must be called with the context's graph lock.
+    unsigned fanOutCount();
+
+    // renderingFanOutCount() is the number of AudioNodeInputs that we're connected to during rendering.
+    // Unlike fanOutCount() it will not change during the course of a render quantum.
+    unsigned renderingFanOutCount() const;
+
+    // It must be called with the context's graph lock.
+    void disconnectAllInputs();
+
+    void setNumberOfChannels(unsigned);
+    unsigned numberOfChannels() const { return m_numberOfChannels; }
+    bool isChannelCountKnown() const { return numberOfChannels() > 0; }
+
+    // Disable/Enable happens when there are still JavaScript references to a node, but it has otherwise "finished" its work.
+    // For example, when a note has finished playing.  It is kept around, because it may be played again at a later time.
+    // They must be called with the context's graph lock.
+    void disable();
+    void enable();
+
+    // updateRenderingState() is called in the audio thread at the start or end of the render quantum to handle any recent changes to the graph state.
+    // It must be called with the context's graph lock.
+    void updateRenderingState();
+    
+private:
+    AudioNode* m_node;
+
+    friend class AudioNodeInput;
+    
+    // These are called from AudioNodeInput.
+    // They must be called with the context's graph lock.
+    void addInput(AudioNodeInput*);
+    void removeInput(AudioNodeInput*);
+
+    // setInternalBus() sets m_internalOutputBus appropriately for the number of channels.
+    // It is called in the constructor or in the audio thread with the context's graph lock.
+    void setInternalBus();
+
+    // Announce to any nodes we're connected to that we changed our channel count for its input.
+    // It must be called in the audio thread with the context's graph lock.
+    void propagateChannelCount();
+
+    // updateNumberOfChannels() is called in the audio thread at the start or end of the render quantum to pick up channel changes.
+    // It must be called with the context's graph lock.
+    void updateNumberOfChannels();
+
+    // m_numberOfChannels will only be changed in the audio thread.
+    // The main thread sets m_desiredNumberOfChannels which will later get picked up in the audio thread in updateNumberOfChannels().
+    unsigned m_numberOfChannels;
+    unsigned m_desiredNumberOfChannels;
+    
+    // m_internalOutputBus will point to either m_monoInternalBus or m_stereoInternalBus.
+    // It must only be changed in the audio thread (or constructor).
+    AudioBus* m_internalOutputBus;
+    OwnPtr<AudioBus> m_monoInternalBus;
+    OwnPtr<AudioBus> m_stereoInternalBus;
+
+    // m_actualDestinationBus is set in pull() and will either point to one of our internal busses or to the in-place bus.
+    // It must only be changed in the audio thread (or constructor).
+    AudioBus* m_actualDestinationBus;
+
+    HashSet<AudioNodeInput*> m_inputs;
+    typedef HashSet<AudioNodeInput*>::iterator InputsIterator;
+    bool m_isEnabled;
+    
+    // For the purposes of rendering, keeps track of the number of inputs we're connected to.
+    // This value should only be changed at the very start or end of the rendering quantum.
+    unsigned m_renderingFanOutCount;
+};
+
+} // namespace WebCore
+
+#endif // AudioNodeOutput_h

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list