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;