void AudioFileReader::decodeAudioForBusCreation() { // Build the pipeline (giostreamsrc | filesrc) ! decodebin2 // A deinterleave element is added once a src pad becomes available in decodebin. m_pipeline = gst_pipeline_new(0); GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_pipeline)); ASSERT(bus); gst_bus_add_signal_watch(bus.get()); g_signal_connect(bus.get(), "message", G_CALLBACK(messageCallback), this); GstElement* source; if (m_data) { ASSERT(m_dataSize); source = gst_element_factory_make("giostreamsrc", 0); GRefPtr<GInputStream> memoryStream = adoptGRef(g_memory_input_stream_new_from_data(m_data, m_dataSize, 0)); g_object_set(source, "stream", memoryStream.get(), NULL); } else { source = gst_element_factory_make("filesrc", 0); g_object_set(source, "location", m_filePath, NULL); } m_decodebin = gst_element_factory_make(gDecodebinName, "decodebin"); g_signal_connect(m_decodebin.get(), "pad-added", G_CALLBACK(onGStreamerDecodebinPadAddedCallback), this); gst_bin_add_many(GST_BIN(m_pipeline), source, m_decodebin.get(), NULL); gst_element_link_pads_full(source, "src", m_decodebin.get(), "sink", GST_PAD_LINK_CHECK_NOTHING); gst_element_set_state(m_pipeline, GST_STATE_PAUSED); }
AudioFileReader::~AudioFileReader() { if (m_pipeline) { GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_pipeline)); ASSERT(bus); g_signal_handlers_disconnect_by_func(bus.get(), reinterpret_cast<gpointer>(messageCallback), this); gst_bus_remove_signal_watch(bus.get()); gst_element_set_state(m_pipeline, GST_STATE_NULL); gst_object_unref(GST_OBJECT(m_pipeline)); } if (m_decodebin) { g_signal_handlers_disconnect_by_func(m_decodebin.get(), reinterpret_cast<gpointer>(onGStreamerDecodebinPadAddedCallback), this); m_decodebin.clear(); } if (m_deInterleave) { g_signal_handlers_disconnect_by_func(m_deInterleave.get(), reinterpret_cast<gpointer>(onGStreamerDeinterleavePadAddedCallback), this); g_signal_handlers_disconnect_by_func(m_deInterleave.get(), reinterpret_cast<gpointer>(onGStreamerDeinterleaveReadyCallback), this); m_deInterleave.clear(); } #ifndef GST_API_VERSION_1 gst_buffer_list_iterator_free(m_frontLeftBuffersIterator); gst_buffer_list_iterator_free(m_frontRightBuffersIterator); #endif gst_buffer_list_unref(m_frontLeftBuffers); gst_buffer_list_unref(m_frontRightBuffers); }
AudioDestinationGStreamer::~AudioDestinationGStreamer() { GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_pipeline)); ASSERT(bus); g_signal_handlers_disconnect_by_func(bus.get(), reinterpret_cast<gpointer>(messageCallback), this); gst_bus_remove_signal_watch(bus.get()); gst_element_set_state(m_pipeline, GST_STATE_NULL); gst_object_unref(m_pipeline); }
GStreamerGWorld::GStreamerGWorld(GstElement* pipeline) : m_pipeline(pipeline) { // XOverlay messages need to be handled synchronously. GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_pipeline)); #ifndef GST_API_VERSION_1 gst_bus_set_sync_handler(bus.get(), gst_bus_sync_signal_handler, this); #else gst_bus_set_sync_handler(bus.get(), gst_bus_sync_signal_handler, this, 0); #endif g_signal_connect(bus.get(), "sync-message::element", G_CALLBACK(gstGWorldSyncMessageCallback), this); }
GStreamerGWorld::~GStreamerGWorld() { exitFullscreen(); GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_pipeline)); g_signal_handlers_disconnect_by_func(bus.get(), reinterpret_cast<gpointer>(gstGWorldSyncMessageCallback), this); #ifndef GST_API_VERSION_1 gst_bus_set_sync_handler(bus.get(), 0, this); #else gst_bus_set_sync_handler(bus.get(), 0, this, 0); #endif m_pipeline = 0; }
AudioDestinationGStreamer::AudioDestinationGStreamer(AudioIOCallback& callback, float sampleRate) : m_callback(callback) , m_renderBus(2, framesToPull, false) , m_sampleRate(sampleRate) , m_isPlaying(false) { m_pipeline = gst_pipeline_new("play"); GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_pipeline)); ASSERT(bus); gst_bus_add_signal_watch(bus.get()); g_signal_connect(bus.get(), "message", G_CALLBACK(messageCallback), this); GstElement* webkitAudioSrc = reinterpret_cast<GstElement*>(g_object_new(WEBKIT_TYPE_WEB_AUDIO_SRC, "rate", sampleRate, "bus", &m_renderBus, "provider", &m_callback, "frames", framesToPull, NULL)); GstElement* wavParser = gst_element_factory_make("wavparse", 0); m_wavParserAvailable = wavParser; ASSERT_WITH_MESSAGE(m_wavParserAvailable, "Failed to create GStreamer wavparse element"); if (!m_wavParserAvailable) return; #ifndef GST_API_VERSION_1 g_signal_connect(wavParser, "pad-added", G_CALLBACK(onGStreamerWavparsePadAddedCallback), this); #endif gst_bin_add_many(GST_BIN(m_pipeline), webkitAudioSrc, wavParser, NULL); gst_element_link_pads_full(webkitAudioSrc, "src", wavParser, "sink", GST_PAD_LINK_CHECK_NOTHING); #ifdef GST_API_VERSION_1 GRefPtr<GstPad> srcPad = adoptGRef(gst_element_get_static_pad(wavParser, "src")); finishBuildingPipelineAfterWavParserPadReady(srcPad.get()); #endif }