summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp')
-rw-r--r--Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp37
1 files changed, 17 insertions, 20 deletions
diff --git a/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp b/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp
index c3bcbbeea..20b02b0ed 100644
--- a/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp
+++ b/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp
@@ -49,7 +49,6 @@ struct _WebKitWebAudioSourcePrivate {
AudioBus* bus;
AudioIOCallback* provider;
guint framesToPull;
- guint64 currentBufferOffset;
GRefPtr<GstElement> interleave;
GRefPtr<GstElement> wavEncoder;
@@ -185,7 +184,6 @@ static void webkit_web_audio_src_init(WebKitWebAudioSrc* src)
priv->provider = 0;
priv->bus = 0;
- priv->currentBufferOffset = 0;
priv->mutex = g_new(GStaticRecMutex, 1);
g_static_rec_mutex_init(priv->mutex);
@@ -219,7 +217,6 @@ static void webKitWebAudioSrcConstructed(GObject* object)
gst_bin_add_many(GST_BIN(src), priv->interleave.get(), priv->wavEncoder.get(), NULL);
gst_element_link_pads_full(priv->interleave.get(), "src", priv->wavEncoder.get(), "sink", GST_PAD_LINK_CHECK_NOTHING);
-
// For each channel of the bus create a new upstream branch for interleave, like:
// queue ! capsfilter ! audioconvert. which is plugged to a new interleave request sinkpad.
for (unsigned channelIndex = 0; channelIndex < priv->bus->numberOfChannels(); channelIndex++) {
@@ -247,7 +244,6 @@ static void webKitWebAudioSrcConstructed(GObject* object)
}
priv->pads = g_slist_reverse(priv->pads);
-
// wavenc's src pad is the only visible pad of our element.
GRefPtr<GstPad> targetPad = adoptGRef(gst_element_get_static_pad(priv->wavEncoder.get(), "src"));
gst_ghost_pad_set_target(GST_GHOST_PAD(priv->sourcePad), targetPad.get());
@@ -323,32 +319,33 @@ static void webKitWebAudioSrcLoop(WebKitWebAudioSrc* src)
if (!priv->provider || !priv->bus)
return;
- // FIXME: Add support for local/live audio input.
- priv->provider->render(0, priv->bus, priv->framesToPull);
-
+ GSList* channelBufferList = 0;
unsigned bufferSize = priv->framesToPull * sizeof(float);
- for (unsigned index = 0; index < g_slist_length(priv->pads); index++) {
- GstPad* pad = static_cast<GstPad*>(g_slist_nth_data(priv->pads, index));
+ for (unsigned i = 0; i < g_slist_length(priv->pads); i++) {
+ GstBuffer* channelBuffer = gst_buffer_new_and_alloc(bufferSize);
+ ASSERT(channelBuffer);
+ channelBufferList = g_slist_prepend(channelBufferList, channelBuffer);
+ priv->bus->setChannelMemory(i, reinterpret_cast<float*>(GST_BUFFER_DATA(channelBuffer)), priv->framesToPull);
+ }
+ channelBufferList = g_slist_reverse(channelBufferList);
- GstBuffer* buffer = gst_buffer_new();
- ASSERT(buffer);
- ASSERT(!GST_BUFFER_MALLOCDATA(buffer));
+ // FIXME: Add support for local/live audio input.
+ priv->provider->render(0, priv->bus, priv->framesToPull);
- GST_BUFFER_DATA(buffer) = reinterpret_cast<guint8*>(const_cast<float*>(priv->bus->channel(index)->data()));
- GST_BUFFER_SIZE(buffer) = bufferSize;
- GST_BUFFER_OFFSET(buffer) = priv->currentBufferOffset;
- GST_BUFFER_OFFSET_END(buffer) = priv->currentBufferOffset + priv->framesToPull;
+ for (unsigned i = 0; i < g_slist_length(priv->pads); i++) {
+ GstPad* pad = static_cast<GstPad*>(g_slist_nth_data(priv->pads, i));
+ GstBuffer* channelBuffer = static_cast<GstBuffer*>(g_slist_nth_data(channelBufferList, i));
GRefPtr<GstCaps> monoCaps = adoptGRef(getGStreamerMonoAudioCaps(priv->sampleRate));
GstStructure* structure = gst_caps_get_structure(monoCaps.get(), 0);
- GstAudioChannelPosition channelPosition = webKitWebAudioGStreamerChannelPosition(index);
+ GstAudioChannelPosition channelPosition = webKitWebAudioGStreamerChannelPosition(i);
gst_audio_set_channel_positions(structure, &channelPosition);
- gst_buffer_set_caps(buffer, monoCaps.get());
+ gst_buffer_set_caps(channelBuffer, monoCaps.get());
- gst_pad_chain(pad, buffer);
+ gst_pad_chain(pad, channelBuffer);
}
- priv->currentBufferOffset += priv->framesToPull;
+ g_slist_free(channelBufferList);
}
static GstStateChangeReturn webKitWebAudioSrcChangeState(GstElement* element, GstStateChange transition)