Title: [124264] trunk/Source
Revision
124264
Author
[email protected]
Date
2012-07-31 16:04:48 -0700 (Tue, 31 Jul 2012)

Log Message

Allow AudioDestination to support local/live audio input
https://bugs.webkit.org/show_bug.cgi?id=90318

Reviewed by Kenneth Russell.

Source/Platform:

* chromium/public/WebAudioDevice.h:
(WebKit::WebAudioDevice::RenderCallback::render):
(RenderCallback):

Source/WebCore:

* WebCore.gypi:
* WebCore.xcodeproj/project.pbxproj:
* GNUmakefile.list.am:
Add AudioIOCallback.h to make files.

* Modules/webaudio/AudioDestinationNode.h:
* Modules/webaudio/AudioDestinationNode.cpp:
(WebCore::AudioDestinationNode::render):
Change provideInput() method to render() to support optional audio input.

(AudioDestinationNode):
(WebCore::AudioDestinationNode::localAudioInputProvider):
Expose public access to an AudioSourceProvider for local/live audio input.

(LocalAudioInputProvider):
(WebCore::AudioDestinationNode::LocalAudioInputProvider::LocalAudioInputProvider):
(WebCore::AudioDestinationNode::LocalAudioInputProvider::set):
(WebCore::AudioDestinationNode::LocalAudioInputProvider::provideInput):
Add simple AudioSourceProvider implementation which dishes out a single AudioBus each
render quantum for optional local/live audio input.

* Modules/webaudio/OfflineAudioDestinationNode.h:
* Modules/webaudio/OfflineAudioDestinationNode.cpp:
(WebCore::OfflineAudioDestinationNode::startRendering):
(WebCore::OfflineAudioDestinationNode::offlineRenderEntry):
(WebCore::OfflineAudioDestinationNode::offlineRender):
Simple name change using "offline" prefix to avoid confusion with AudioDestinationNode::render() method (implementing AudioIOCallback)

* platform/audio/AudioDestination.h:
Switch create() method to take an AudioIOCallback instead of AudioSourceProvider.

* platform/audio/AudioIOCallback.h:
(WebCore::AudioIOCallback::~AudioIOCallback):
Add new AudioIOCallback interface for audio input/output.

* platform/audio/gstreamer/AudioDestinationGStreamer.cpp:
(WebCore::AudioDestination::create):
(WebCore::AudioDestinationGStreamer::AudioDestinationGStreamer):
* platform/audio/gstreamer/AudioDestinationGStreamer.h:
(AudioDestinationGStreamer):
(WebCore::AudioDestinationGStreamer::callback):
* platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp:
(_WebKitWebAudioSourcePrivate):
(webKitWebAudioSrcSetProperty):
(webKitWebAudioSrcLoop):
Small tweaks to AudioDestinationGStreamer implementation to account for switch to AudioIOCallback.

* platform/audio/mac/AudioDestinationMac.cpp:
(WebCore::AudioDestination::create):
(WebCore::AudioDestinationMac::AudioDestinationMac):
(WebCore::AudioDestinationMac::render):
* platform/audio/mac/AudioDestinationMac.h:
(AudioDestinationMac):
Small tweaks to AudioDestinationMac implementation to account for switch to AudioIOCallback.

Source/WebKit/chromium:

* src/AudioDestinationChromium.cpp:
(WebCore::AudioDestination::create):
(WebCore::AudioDestinationChromium::AudioDestinationChromium):
(WebCore::AudioDestinationChromium::provideInput):
(WebCore):
* src/AudioDestinationChromium.h:
(AudioDestinationChromium):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/Platform/ChangeLog (124263 => 124264)


--- trunk/Source/Platform/ChangeLog	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/Platform/ChangeLog	2012-07-31 23:04:48 UTC (rev 124264)
@@ -1,3 +1,14 @@
+2012-07-31  Chris Rogers  <[email protected]>
+
+        Allow AudioDestination to support local/live audio input
+        https://bugs.webkit.org/show_bug.cgi?id=90318
+
+        Reviewed by Kenneth Russell.
+
+        * chromium/public/WebAudioDevice.h:
+        (WebKit::WebAudioDevice::RenderCallback::render):
+        (RenderCallback):
+
 2012-07-31  Ian Vollick  <[email protected]>
 
         [chromium] Use WebAnimation and related classes in GraphicsLayerChromium and AnimTranslationUtil

Modified: trunk/Source/Platform/chromium/public/WebAudioDevice.h (124263 => 124264)


--- trunk/Source/Platform/chromium/public/WebAudioDevice.h	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/Platform/chromium/public/WebAudioDevice.h	2012-07-31 23:04:48 UTC (rev 124264)
@@ -39,7 +39,11 @@
 public:
     class RenderCallback {
     public:
+        virtual void render(const WebVector<float*>& sourceData, const WebVector<float*>& destinationData, size_t numberOfFrames) { };
+
+        // FIXME: to be removed once we switch over to newer render() method handling both audio output and (optional) input.
         virtual void render(const WebVector<float*>& audioData, size_t numberOfFrames) = 0;
+
     protected:
         virtual ~RenderCallback() { }
     };

Modified: trunk/Source/WebCore/ChangeLog (124263 => 124264)


--- trunk/Source/WebCore/ChangeLog	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/ChangeLog	2012-07-31 23:04:48 UTC (rev 124264)
@@ -1,3 +1,65 @@
+2012-07-31  Chris Rogers  <[email protected]>
+
+        Allow AudioDestination to support local/live audio input
+        https://bugs.webkit.org/show_bug.cgi?id=90318
+
+        Reviewed by Kenneth Russell.
+
+        * WebCore.gypi:
+        * WebCore.xcodeproj/project.pbxproj:
+        * GNUmakefile.list.am:
+        Add AudioIOCallback.h to make files.
+
+        * Modules/webaudio/AudioDestinationNode.h:
+        * Modules/webaudio/AudioDestinationNode.cpp:
+        (WebCore::AudioDestinationNode::render):
+        Change provideInput() method to render() to support optional audio input.
+
+        (AudioDestinationNode):
+        (WebCore::AudioDestinationNode::localAudioInputProvider):
+        Expose public access to an AudioSourceProvider for local/live audio input.
+
+        (LocalAudioInputProvider):
+        (WebCore::AudioDestinationNode::LocalAudioInputProvider::LocalAudioInputProvider):
+        (WebCore::AudioDestinationNode::LocalAudioInputProvider::set):
+        (WebCore::AudioDestinationNode::LocalAudioInputProvider::provideInput):
+        Add simple AudioSourceProvider implementation which dishes out a single AudioBus each
+        render quantum for optional local/live audio input.
+
+        * Modules/webaudio/OfflineAudioDestinationNode.h:
+        * Modules/webaudio/OfflineAudioDestinationNode.cpp:
+        (WebCore::OfflineAudioDestinationNode::startRendering):
+        (WebCore::OfflineAudioDestinationNode::offlineRenderEntry):
+        (WebCore::OfflineAudioDestinationNode::offlineRender):
+        Simple name change using "offline" prefix to avoid confusion with AudioDestinationNode::render() method (implementing AudioIOCallback)
+
+        * platform/audio/AudioDestination.h:
+        Switch create() method to take an AudioIOCallback instead of AudioSourceProvider.
+
+        * platform/audio/AudioIOCallback.h:
+        (WebCore::AudioIOCallback::~AudioIOCallback):
+        Add new AudioIOCallback interface for audio input/output.
+
+        * platform/audio/gstreamer/AudioDestinationGStreamer.cpp:
+        (WebCore::AudioDestination::create):
+        (WebCore::AudioDestinationGStreamer::AudioDestinationGStreamer):
+        * platform/audio/gstreamer/AudioDestinationGStreamer.h:
+        (AudioDestinationGStreamer):
+        (WebCore::AudioDestinationGStreamer::callback):
+        * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp:
+        (_WebKitWebAudioSourcePrivate):
+        (webKitWebAudioSrcSetProperty):
+        (webKitWebAudioSrcLoop):
+        Small tweaks to AudioDestinationGStreamer implementation to account for switch to AudioIOCallback.
+
+        * platform/audio/mac/AudioDestinationMac.cpp:
+        (WebCore::AudioDestination::create):
+        (WebCore::AudioDestinationMac::AudioDestinationMac):
+        (WebCore::AudioDestinationMac::render):
+        * platform/audio/mac/AudioDestinationMac.h:
+        (AudioDestinationMac):
+        Small tweaks to AudioDestinationMac implementation to account for switch to AudioIOCallback.
+
 2012-07-31  Kwang Yul Seo  <[email protected]>
 
         Read tag names and attributes from the saved tokens in HTMLTreeBuilder::processEndTag(AtomicHTMLToken*)

Modified: trunk/Source/WebCore/GNUmakefile.list.am (124263 => 124264)


--- trunk/Source/WebCore/GNUmakefile.list.am	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/GNUmakefile.list.am	2012-07-31 23:04:48 UTC (rev 124264)
@@ -5776,6 +5776,7 @@
 	Source/WebCore/platform/audio/AudioDSPKernelProcessor.cpp \
 	Source/WebCore/platform/audio/AudioDSPKernelProcessor.h \
 	Source/WebCore/platform/audio/AudioFileReader.h \
+	Source/WebCore/platform/audio/AudioIOCallback.h \
 	Source/WebCore/platform/audio/AudioProcessor.h \
 	Source/WebCore/platform/audio/AudioResampler.cpp \
 	Source/WebCore/platform/audio/AudioResampler.h \

Modified: trunk/Source/WebCore/Modules/webaudio/AudioDestinationNode.cpp (124263 => 124264)


--- trunk/Source/WebCore/Modules/webaudio/AudioDestinationNode.cpp	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/Modules/webaudio/AudioDestinationNode.cpp	2012-07-31 23:04:48 UTC (rev 124264)
@@ -28,7 +28,6 @@
 
 #include "AudioDestinationNode.h"
 
-#include "AudioBus.h"
 #include "AudioContext.h"
 #include "AudioNodeInput.h"
 #include "AudioNodeOutput.h"
@@ -51,8 +50,7 @@
     uninitialize();
 }
 
-// The audio hardware calls us back here to gets its input stream.
-void AudioDestinationNode::provideInput(AudioBus* destinationBus, size_t numberOfFrames)
+void AudioDestinationNode::render(AudioBus* sourceBus, AudioBus* destinationBus, size_t numberOfFrames)
 {
     // We don't want denormals slowing down any of the audio processing
     // since they can very seriously hurt performance.
@@ -69,6 +67,10 @@
     // Let the context take care of any business at the start of each render quantum.
     context()->handlePreRenderTasks();
 
+    // Prepare the local audio input provider for this render quantum.
+    if (sourceBus)
+        m_localAudioInputProvider.set(sourceBus);
+
     // This will cause the node(s) connected to us to process, which in turn will pull on their input(s),
     // all the way backwards through the rendering graph.
     AudioBus* renderedBus = input(0)->pull(destinationBus, numberOfFrames);

Modified: trunk/Source/WebCore/Modules/webaudio/AudioDestinationNode.h (124263 => 124264)


--- trunk/Source/WebCore/Modules/webaudio/AudioDestinationNode.h	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/Modules/webaudio/AudioDestinationNode.h	2012-07-31 23:04:48 UTC (rev 124264)
@@ -26,6 +26,8 @@
 #define AudioDestinationNode_h
 
 #include "AudioBuffer.h"
+#include "AudioBus.h"
+#include "AudioIOCallback.h"
 #include "AudioNode.h"
 #include "AudioSourceProvider.h"
 
@@ -34,7 +36,7 @@
 class AudioBus;
 class AudioContext;
     
-class AudioDestinationNode : public AudioNode, public AudioSourceProvider {
+class AudioDestinationNode : public AudioNode, public AudioIOCallback {
 public:
     AudioDestinationNode(AudioContext*, float sampleRate);
     virtual ~AudioDestinationNode();
@@ -43,8 +45,9 @@
     virtual void process(size_t) { }; // we're pulled by hardware so this is never called
     virtual void reset() { m_currentSampleFrame = 0; };
     
-    // The audio hardware calls here periodically to gets its input stream.
-    virtual void provideInput(AudioBus*, size_t numberOfFrames);
+    // The audio hardware calls render() to get the next render quantum of audio into destinationBus.
+    // It will optionally give us local/live audio input in sourceBus (if it's not 0).
+    virtual void render(AudioBus* sourceBus, AudioBus* destinationBus, size_t numberOfFrames);
 
     size_t currentSampleFrame() const { return m_currentSampleFrame; }
     double currentTime() const { return currentSampleFrame() / static_cast<double>(sampleRate()); }
@@ -52,13 +55,45 @@
     virtual unsigned numberOfChannels() const { return 2; } // FIXME: update when multi-channel (more than stereo) is supported
 
     virtual void startRendering() = 0;
+
+    AudioSourceProvider* localAudioInputProvider() { return &m_localAudioInputProvider; }
     
 protected:
+    // LocalAudioInputProvider allows us to expose an AudioSourceProvider for local/live audio input.
+    // If there is local/live audio input, we call set() with the audio input data every render quantum.
+    class LocalAudioInputProvider : public AudioSourceProvider {
+    public:
+        LocalAudioInputProvider()
+            : m_sourceBus(2, AudioNode::ProcessingSizeInFrames) // FIXME: handle non-stereo local input.
+        {
+        }
+
+        void set(AudioBus* bus)
+        {
+            if (bus)
+                m_sourceBus.copyFrom(*bus);
+        }
+
+        // AudioSourceProvider.
+        virtual void provideInput(AudioBus* destinationBus, size_t numberOfFrames)
+        {
+            bool isGood = destinationBus && destinationBus->length() == numberOfFrames && m_sourceBus.length() == numberOfFrames;
+            ASSERT(isGood);
+            if (isGood)
+                destinationBus->copyFrom(m_sourceBus);
+        }
+
+    private:
+        AudioBus m_sourceBus;
+    };
+
     virtual double tailTime() const OVERRIDE { return 0; }
     virtual double latencyTime() const OVERRIDE { return 0; }
 
     // Counts the number of sample-frames processed by the destination.
     size_t m_currentSampleFrame;
+
+    LocalAudioInputProvider m_localAudioInputProvider;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/webaudio/OfflineAudioDestinationNode.cpp (124263 => 124264)


--- trunk/Source/WebCore/Modules/webaudio/OfflineAudioDestinationNode.cpp	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/Modules/webaudio/OfflineAudioDestinationNode.cpp	2012-07-31 23:04:48 UTC (rev 124264)
@@ -85,19 +85,19 @@
     if (!m_startedRendering) {
         m_startedRendering = true;
         ref(); // See corresponding deref() call in notifyCompleteDispatch().
-        m_renderThread = createThread(OfflineAudioDestinationNode::renderEntry, this, "offline renderer");
+        m_renderThread = createThread(OfflineAudioDestinationNode::offlineRenderEntry, this, "offline renderer");
     }
 }
 
 // Do offline rendering in this thread.
-void OfflineAudioDestinationNode::renderEntry(void* threadData)
+void OfflineAudioDestinationNode::offlineRenderEntry(void* threadData)
 {
     OfflineAudioDestinationNode* destinationNode = reinterpret_cast<OfflineAudioDestinationNode*>(threadData);
     ASSERT(destinationNode);
-    destinationNode->render();
+    destinationNode->offlineRender();
 }
 
-void OfflineAudioDestinationNode::render()
+void OfflineAudioDestinationNode::offlineRender()
 {
     ASSERT(!isMainThread());
     ASSERT(m_renderBus.get());
@@ -131,7 +131,7 @@
     unsigned n = 0;
     while (framesToProcess > 0) {
         // Render one render quantum.
-        provideInput(m_renderBus.get(), renderQuantumSize);
+        render(0, m_renderBus.get(), renderQuantumSize);
         
         size_t framesAvailableToCopy = min(framesToProcess, renderQuantumSize);
         

Modified: trunk/Source/WebCore/Modules/webaudio/OfflineAudioDestinationNode.h (124263 => 124264)


--- trunk/Source/WebCore/Modules/webaudio/OfflineAudioDestinationNode.h	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/Modules/webaudio/OfflineAudioDestinationNode.h	2012-07-31 23:04:48 UTC (rev 124264)
@@ -64,8 +64,8 @@
     // Rendering thread.
     volatile ThreadIdentifier m_renderThread;
     bool m_startedRendering;
-    static void renderEntry(void* threadData);
-    void render();
+    static void offlineRenderEntry(void* threadData);
+    void offlineRender();
     
     // For completion callback on main thread.
     static void notifyCompleteDispatch(void* userData);

Modified: trunk/Source/WebCore/WebCore.gypi (124263 => 124264)


--- trunk/Source/WebCore/WebCore.gypi	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/WebCore.gypi	2012-07-31 23:04:48 UTC (rev 124264)
@@ -3292,6 +3292,7 @@
             'platform/audio/AudioFIFO.cpp',
             'platform/audio/AudioFIFO.h',
             'platform/audio/AudioFileReader.h',
+            'platform/audio/AudioIOCallback.h',
             'platform/audio/AudioProcessor.h',
             'platform/audio/AudioPullFIFO.cpp',
             'platform/audio/AudioPullFIFO.h',

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (124263 => 124264)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2012-07-31 23:04:48 UTC (rev 124264)
@@ -6490,6 +6490,7 @@
 		FDE6860215B0A93B00BB480C /* WrapShapeFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD7E95A215ACD6090039E3D0 /* WrapShapeFunctions.cpp */; };
 		FDE6860315B0A96100BB480C /* WrapShapeFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = FD7E95A015ACD5620039E3D0 /* WrapShapeFunctions.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		FDE6860415B0A96100BB480C /* WrapShapes.h in Headers */ = {isa = PBXBuildFile; fileRef = FDB51CF4159CD70300E227C5 /* WrapShapes.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		FDE2D55B159E66EB00DCCCF8 /* AudioIOCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = FDE2D55A159E66EB00DCCCF8 /* AudioIOCallback.h */; };
 		FDEA6242152102E200479DF0 /* JSOscillator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDEA6240152102E200479DF0 /* JSOscillator.cpp */; };
 		FDEA6243152102E200479DF0 /* JSOscillator.h in Headers */ = {isa = PBXBuildFile; fileRef = FDEA6241152102E200479DF0 /* JSOscillator.h */; };
 		FDEA6246152102FC00479DF0 /* JSWaveTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDEA6244152102FC00479DF0 /* JSWaveTable.cpp */; };
@@ -13874,6 +13875,7 @@
 		FDC54F011399B0DA008D9117 /* BiquadFilterNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BiquadFilterNode.cpp; sourceTree = "<group>"; };
 		FDC54F021399B0DA008D9117 /* BiquadFilterNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BiquadFilterNode.h; sourceTree = "<group>"; };
 		FDC54F031399B0DA008D9117 /* BiquadFilterNode.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = BiquadFilterNode.idl; sourceTree = "<group>"; };
+		FDE2D55A159E66EB00DCCCF8 /* AudioIOCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioIOCallback.h; sourceTree = "<group>"; };
 		FDEA6240152102E200479DF0 /* JSOscillator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSOscillator.cpp; sourceTree = "<group>"; };
 		FDEA6241152102E200479DF0 /* JSOscillator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSOscillator.h; sourceTree = "<group>"; };
 		FDEA6244152102FC00479DF0 /* JSWaveTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWaveTable.cpp; sourceTree = "<group>"; };
@@ -21948,6 +21950,7 @@
 				FD31604B12B026F700C1A359 /* AudioDSPKernelProcessor.cpp */,
 				FD31604C12B026F700C1A359 /* AudioDSPKernelProcessor.h */,
 				FD31604D12B026F700C1A359 /* AudioFileReader.h */,
+				FDE2D55A159E66EB00DCCCF8 /* AudioIOCallback.h */,
 				FD31604E12B026F700C1A359 /* AudioProcessor.h */,
 				FD31604F12B026F700C1A359 /* AudioResampler.cpp */,
 				FD31605012B026F700C1A359 /* AudioResampler.h */,
@@ -25369,6 +25372,7 @@
 				49B3760D15C6C6840059131D /* ArrayValue.h in Headers */,
 				FD671A78159BB07000197559 /* MediaStreamAudioSourceNode.h in Headers */,
 				FDBD480D159BC6870093EB4F /* JSMediaStreamAudioSourceNode.h in Headers */,
+				FDE2D55B159E66EB00DCCCF8 /* AudioIOCallback.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: trunk/Source/WebCore/platform/audio/AudioDestination.h (124263 => 124264)


--- trunk/Source/WebCore/platform/audio/AudioDestination.h	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/platform/audio/AudioDestination.h	2012-07-31 23:04:48 UTC (rev 124264)
@@ -34,14 +34,15 @@
 
 namespace WebCore {
 
-class AudioSourceProvider;
+class AudioIOCallback;
 
-// Abstraction for an audio output to the audio hardware
-// An AudioSourceProvider is called back periodically to provide the rendered audio stream.
+// AudioDestination is an abstraction for audio hardware I/O.
+// The audio hardware periodically calls the AudioIOCallback render() method asking it to render/output the next render quantum of audio.
+// It optionally will pass in local/live audio input when it calls render().
 
 class AudioDestination {
 public:
-    static PassOwnPtr<AudioDestination> create(AudioSourceProvider&, float sampleRate);
+    static PassOwnPtr<AudioDestination> create(AudioIOCallback&, float sampleRate);
 
     virtual ~AudioDestination() { }
 

Copied: trunk/Source/WebCore/platform/audio/AudioIOCallback.h (from rev 124263, trunk/Source/Platform/chromium/public/WebAudioDevice.h) (0 => 124264)


--- trunk/Source/WebCore/platform/audio/AudioIOCallback.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/audio/AudioIOCallback.h	2012-07-31 23:04:48 UTC (rev 124264)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 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.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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 AudioIOCallback_h
+#define AudioIOCallback_h
+
+namespace WebCore {
+
+class AudioBus;
+
+// Abstract base-class for isochronous audio I/O client.
+class AudioIOCallback {
+public:
+    // render() is called periodically to get the next render quantum of audio into destinationBus.
+    // Optional audio input is given in sourceBus (if it's not 0).
+    virtual void render(AudioBus* sourceBus, AudioBus* destinationBus, size_t framesToProcess) = 0;
+
+    virtual ~AudioIOCallback() { }
+};
+
+} // WebCore
+
+#endif // AudioIOCallback_h

Modified: trunk/Source/WebCore/platform/audio/gstreamer/AudioDestinationGStreamer.cpp (124263 => 124264)


--- trunk/Source/WebCore/platform/audio/gstreamer/AudioDestinationGStreamer.cpp	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/platform/audio/gstreamer/AudioDestinationGStreamer.cpp	2012-07-31 23:04:48 UTC (rev 124264)
@@ -36,9 +36,9 @@
 // needs to handle this number of frames per cycle as well.
 const unsigned framesToPull = 128;
 
-PassOwnPtr<AudioDestination> AudioDestination::create(AudioSourceProvider& provider, float sampleRate)
+PassOwnPtr<AudioDestination> AudioDestination::create(AudioIOCallback& callback, float sampleRate)
 {
-    return adoptPtr(new AudioDestinationGStreamer(provider, sampleRate));
+    return adoptPtr(new AudioDestinationGStreamer(callback, sampleRate));
 }
 
 float AudioDestination::hardwareSampleRate()
@@ -51,8 +51,8 @@
     destination->finishBuildingPipelineAfterWavParserPadReady(pad);
 }
 
-AudioDestinationGStreamer::AudioDestinationGStreamer(AudioSourceProvider& provider, float sampleRate)
-    : m_provider(provider)
+AudioDestinationGStreamer::AudioDestinationGStreamer(AudioIOCallback& callback, float sampleRate)
+    : m_callback(callback)
     , m_renderBus(2, framesToPull, true)
     , m_sampleRate(sampleRate)
     , m_isPlaying(false)
@@ -62,7 +62,7 @@
     GstElement* webkitAudioSrc = reinterpret_cast<GstElement*>(g_object_new(WEBKIT_TYPE_WEB_AUDIO_SRC,
                                                                             "rate", sampleRate,
                                                                             "bus", &m_renderBus,
-                                                                            "provider", &m_provider,
+                                                                            "provider", &m_callback,
                                                                             "frames", framesToPull, NULL));
 
     GstElement* wavParser = gst_element_factory_make("wavparse", 0);

Modified: trunk/Source/WebCore/platform/audio/gstreamer/AudioDestinationGStreamer.h (124263 => 124264)


--- trunk/Source/WebCore/platform/audio/gstreamer/AudioDestinationGStreamer.h	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/platform/audio/gstreamer/AudioDestinationGStreamer.h	2012-07-31 23:04:48 UTC (rev 124264)
@@ -29,7 +29,7 @@
 
 class AudioDestinationGStreamer : public AudioDestination {
 public:
-    AudioDestinationGStreamer(AudioSourceProvider&, float sampleRate);
+    AudioDestinationGStreamer(AudioIOCallback&, float sampleRate);
     virtual ~AudioDestinationGStreamer();
 
     virtual void start();
@@ -37,12 +37,12 @@
 
     bool isPlaying() { return m_isPlaying; }
     float sampleRate() const { return m_sampleRate; }
-    AudioSourceProvider& sourceProvider() const { return m_provider; }
+    AudioIOCallback& callback() const { return m_callback; }
 
     void finishBuildingPipelineAfterWavParserPadReady(GstPad*);
 
 private:
-    AudioSourceProvider& m_provider;
+    AudioIOCallback& m_callback;
     AudioBus m_renderBus;
 
     float m_sampleRate;

Modified: trunk/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp (124263 => 124264)


--- trunk/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp	2012-07-31 23:04:48 UTC (rev 124264)
@@ -23,7 +23,7 @@
 #if ENABLE(WEB_AUDIO) && USE(GSTREAMER)
 
 #include "AudioBus.h"
-#include "AudioSourceProvider.h"
+#include "AudioIOCallback.h"
 #include <wtf/gobject/GOwnPtr.h>
 #include "GRefPtrGStreamer.h"
 #include <gst/audio/multichannel.h>
@@ -47,7 +47,7 @@
 struct _WebKitWebAudioSourcePrivate {
     gfloat sampleRate;
     AudioBus* bus;
-    AudioSourceProvider* provider;
+    AudioIOCallback* provider;
     guint framesToPull;
     guint64 currentBufferOffset;
 
@@ -279,7 +279,7 @@
         priv->bus = static_cast<AudioBus*>(g_value_get_pointer(value));
         break;
     case PROP_PROVIDER:
-        priv->provider = static_cast<AudioSourceProvider*>(g_value_get_pointer(value));
+        priv->provider = static_cast<AudioIOCallback*>(g_value_get_pointer(value));
         break;
     case PROP_FRAMES:
         priv->framesToPull = g_value_get_uint(value);
@@ -323,7 +323,8 @@
     if (!priv->provider || !priv->bus)
         return;
 
-    priv->provider->provideInput(priv->bus, priv->framesToPull);
+    // FIXME: Add support for local/live audio input.
+    priv->provider->render(0, priv->bus, priv->framesToPull);
 
     unsigned bufferSize = priv->framesToPull * sizeof(float);
     for (unsigned index = 0; index < g_slist_length(priv->pads); index++) {

Modified: trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.cpp (124263 => 124264)


--- trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.cpp	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.cpp	2012-07-31 23:04:48 UTC (rev 124264)
@@ -32,7 +32,7 @@
 
 #include "AudioDestinationMac.h"
 
-#include "AudioSourceProvider.h"
+#include "AudioIOCallback.h"
 #include "FloatConversion.h"
 #include <CoreAudio/AudioHardware.h>
 
@@ -41,9 +41,9 @@
 const int kBufferSize = 128;
 
 // Factory method: Mac-implementation
-PassOwnPtr<AudioDestination> AudioDestination::create(AudioSourceProvider& provider, float sampleRate)
+PassOwnPtr<AudioDestination> AudioDestination::create(AudioIOCallback& callback, float sampleRate)
 {
-    return adoptPtr(new AudioDestinationMac(provider, sampleRate));
+    return adoptPtr(new AudioDestinationMac(callback, sampleRate));
 }
 
 float AudioDestination::hardwareSampleRate()
@@ -68,9 +68,9 @@
     return narrowPrecisionToFloat(nominalSampleRate);
 }
 
-AudioDestinationMac::AudioDestinationMac(AudioSourceProvider& provider, float sampleRate)
+AudioDestinationMac::AudioDestinationMac(AudioIOCallback& callback, float sampleRate)
     : m_outputUnit(0)
-    , m_provider(provider)
+    , m_callback(callback)
     , m_renderBus(2, kBufferSize, false)
     , m_sampleRate(sampleRate)
     , m_isPlaying(false)
@@ -155,7 +155,8 @@
     m_renderBus.setChannelMemory(0, (float*)buffers[0].mData, numberOfFrames);
     m_renderBus.setChannelMemory(1, (float*)buffers[1].mData, numberOfFrames);
 
-    m_provider.provideInput(&m_renderBus, numberOfFrames);
+    // FIXME: Add support for local/live audio input.
+    m_callback.render(0, &m_renderBus, numberOfFrames);
 
     return noErr;
 }

Modified: trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.h (124263 => 124264)


--- trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.h	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.h	2012-07-31 23:04:48 UTC (rev 124264)
@@ -39,7 +39,7 @@
 
 class AudioDestinationMac : public AudioDestination {
 public:
-    AudioDestinationMac(AudioSourceProvider&, float sampleRate);
+    AudioDestinationMac(AudioIOCallback&, float sampleRate);
     virtual ~AudioDestinationMac();
 
     virtual void start();
@@ -57,7 +57,7 @@
     OSStatus render(UInt32 numberOfFrames, AudioBufferList* ioData);
 
     AudioUnit m_outputUnit;
-    AudioSourceProvider& m_provider;
+    AudioIOCallback& m_callback;
     AudioBus m_renderBus;
 
     float m_sampleRate;

Modified: trunk/Source/WebKit/chromium/ChangeLog (124263 => 124264)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-07-31 23:04:48 UTC (rev 124264)
@@ -1,3 +1,18 @@
+2012-07-31  Chris Rogers  <[email protected]>
+
+        Allow AudioDestination to support local/live audio input
+        https://bugs.webkit.org/show_bug.cgi?id=90318
+
+        Reviewed by Kenneth Russell.
+
+        * src/AudioDestinationChromium.cpp:
+        (WebCore::AudioDestination::create):
+        (WebCore::AudioDestinationChromium::AudioDestinationChromium):
+        (WebCore::AudioDestinationChromium::provideInput):
+        (WebCore):
+        * src/AudioDestinationChromium.h:
+        (AudioDestinationChromium):
+
 2012-07-31  Adam Barth  <[email protected]>
 
         [Chromium-Android] We should hueristically detect content intents on touch

Modified: trunk/Source/WebKit/chromium/src/AudioDestinationChromium.cpp (124263 => 124264)


--- trunk/Source/WebKit/chromium/src/AudioDestinationChromium.cpp	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebKit/chromium/src/AudioDestinationChromium.cpp	2012-07-31 23:04:48 UTC (rev 124264)
@@ -52,13 +52,14 @@
 const unsigned numberOfChannels = 2;
 
 // Factory method: Chromium-implementation
-PassOwnPtr<AudioDestination> AudioDestination::create(AudioSourceProvider& provider, float sampleRate)
+PassOwnPtr<AudioDestination> AudioDestination::create(AudioIOCallback& callback, float sampleRate)
 {
-    return adoptPtr(new AudioDestinationChromium(provider, sampleRate));
+    return adoptPtr(new AudioDestinationChromium(callback, sampleRate));
 }
 
-AudioDestinationChromium::AudioDestinationChromium(AudioSourceProvider& provider, float sampleRate)
-    : m_renderBus(numberOfChannels, renderBufferSize, false)
+AudioDestinationChromium::AudioDestinationChromium(AudioIOCallback& callback, float sampleRate)
+    : m_callback(callback)
+    , m_renderBus(numberOfChannels, renderBufferSize, false)
     , m_sampleRate(sampleRate)
     , m_isPlaying(false)
 {
@@ -78,7 +79,7 @@
     // contains enough data, the data will be provided directly.
     // Otherwise, the FIFO will call the provider enough times to
     // satisfy the request for data.
-    m_fifo = adoptPtr(new AudioPullFIFO(provider, numberOfChannels, fifoSize, renderBufferSize));
+    m_fifo = adoptPtr(new AudioPullFIFO(*this, numberOfChannels, fifoSize, renderBufferSize));
 }
 
 AudioDestinationChromium::~AudioDestinationChromium()
@@ -127,6 +128,12 @@
     m_fifo->consume(&m_renderBus, numberOfFrames);
 }
 
+void AudioDestinationChromium::provideInput(AudioBus* bus, size_t framesToProcess)
+{
+    // FIXME: Add support for local/live audio input.
+    m_callback.render(0, bus, framesToProcess);
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(WEB_AUDIO)

Modified: trunk/Source/WebKit/chromium/src/AudioDestinationChromium.h (124263 => 124264)


--- trunk/Source/WebKit/chromium/src/AudioDestinationChromium.h	2012-07-31 23:00:53 UTC (rev 124263)
+++ trunk/Source/WebKit/chromium/src/AudioDestinationChromium.h	2012-07-31 23:04:48 UTC (rev 124264)
@@ -31,6 +31,7 @@
 
 #include "AudioBus.h"
 #include "AudioDestination.h"
+#include "AudioIOCallback.h"
 #include "AudioSourceProvider.h"
 #include "platform/WebAudioDevice.h"
 #include "platform/WebVector.h"
@@ -43,9 +44,9 @@
 
 // An AudioDestination using Chromium's audio system
 
-class AudioDestinationChromium : public AudioDestination, public WebKit::WebAudioDevice::RenderCallback {
+class AudioDestinationChromium : public AudioDestination, public WebKit::WebAudioDevice::RenderCallback, public AudioSourceProvider {
 public:
-    AudioDestinationChromium(AudioSourceProvider&, float sampleRate);
+    AudioDestinationChromium(AudioIOCallback&, float sampleRate);
     virtual ~AudioDestinationChromium();
 
     virtual void start();
@@ -57,7 +58,11 @@
     // WebKit::WebAudioDevice::RenderCallback
     virtual void render(const WebKit::WebVector<float*>& audioData, size_t numberOfFrames);
 
+    // WebCore::AudioSourceProvider
+    virtual void provideInput(AudioBus*, size_t framesToProcess);
+
 private:
+    AudioIOCallback& m_callback;
     AudioBus m_renderBus;
     float m_sampleRate;
     bool m_isPlaying;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to