[gst-devel] I tried to replace audio sink at runtime, but failed
Zhao, Halley
halley.zhao at intel.com
Tue Mar 3 09:13:23 CET 2009
After I added block for the src pad of previous element (mp3 decoder), I still got some warning of the new audio sink.
" <pulse_play_audio> warning: Internal data flow problem."
"<pulse_play_audio> warning: Received buffer without a new-segment.Assuming timestamps start from 0."
>-----Original Message-----
>From: Antonio Marqués [mailto:amm at tid.es]
>Sent: 2009年3月2日 18:43
>To: Discussion of the development of GStreamer
>Subject: Re: [gst-devel] I tried to replace audio sink at runtime, but failed
>
>I think you should first block the src pad of the previous element, and
>then unlink the element.
>It's explained in:
>http://www.sfr-fresh.com/unix/privat/gstreamer-0.10.22.tar.gz:a/gstream
>er-0.10.22/docs/design/part-block.txt
>Regards
>On Mon, 2009-03-02 at 10:13 +0100, Zhao, Halley wrote:
>> Hi all:
>>
>> I try to replace audio sink as following, but failed, could you give
>> me some advice
>>
>>
>>
>> /* pause */
>>
>> gst_element_set_state (pipeline, GST_STATE_PAUSED);
>>
>> /* unlink and remove former alsa sink */
>>
>> gst_element_unlink(decoder, alsaaudiosink);
>>
>> gst_bin_remove (GST_BIN (pipeline), alsaaudiosink);
>>
>> /* link to pulse audio sink */
>>
>> pulseaudiosink = gst_element_factory_make ("pulsesink",
>> "pulse_play_audio");
>>
>> gst_bin_add (GST_BIN (pipeline), pulseaudiosink);
>>
>> gst_element_link(decoder, pulseaudiosink);
>>
>> /* start playing */
>>
>> gst_element_set_state (pipeline, GST_STATE_PLAYING);
>>
>>
>>
>>
>>
>>
>>
>> ====complete source code====
>>
>> /* example-begin helloworld.c */
>>
>> #include <gst/gst.h>
>>
>>
>>
>> int
>>
>> main (int argc, char *argv[])
>>
>> {
>>
>> GstElement *pipeline, *filesrc, *decoder, *alsaaudiosink = NULL,
>> *pulseaudiosink = NULL;
>>
>>
>>
>> gst_init(&argc, &argv);
>>
>>
>>
>> if (argc != 2) {
>>
>> g_print ("usage: %s <mp3 filename>\n", argv[0]);
>>
>> exit (-1);
>>
>> }
>>
>>
>>
>> /* create a new pipeline to hold the elements */
>>
>> pipeline = gst_pipeline_new ("pipeline");
>>
>>
>>
>> /* create a disk reader */
>>
>> filesrc = gst_element_factory_make ("filesrc", "disk_source");
>>
>> g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
>>
>>
>>
>> /* now it's time to get the decoder */
>>
>> decoder = gst_element_factory_make ("mad", "decoder");
>>
>>
>>
>>
>>
>> /* and an audio sink */
>>
>> alsaaudiosink = gst_element_factory_make ("alsasink",
>> "alsa_play_audio");
>>
>>
>>
>> /* add objects to the main pipeline */
>>
>> gst_bin_add_many (GST_BIN (pipeline), filesrc, decoder,
>> alsaaudiosink, NULL);
>>
>>
>>
>> /* link src to sink */
>>
>> gst_element_link(filesrc, decoder);
>>
>> gst_element_link(decoder,alsaaudiosink);
>>
>>
>>
>> /* start playing */
>>
>> gst_element_set_state (pipeline, GST_STATE_PLAYING);
>>
>>
>>
>> static int is_playing = 1;
>>
>> static int is_quiting = 0;
>>
>> static int is_alsasink = 1;
>>
>>
>>
>> while (1) {
>>
>> if(!(gst_bin_iterate_elements (GST_BIN (pipeline)))) break;
>>
>>
>>
>> printf(" q:Quit, p:Pause/Play, t:Test: ");
>>
>> char ch =0 ;
>>
>> ch=getchar();
>>
>>
>>
>> switch (ch) {
>>
>> case 'p':
>>
>> if(is_playing) {
>>
>> /* pause */
>>
>> gst_element_set_state (pipeline, GST_STATE_PAUSED);
>>
>>
>>
>> }
>>
>> else {
>>
>> /* start playing */
>>
>> gst_element_set_state (pipeline, GST_STATE_PLAYING);
>>
>>
>>
>> }
>>
>> is_playing = !is_playing;
>>
>> break;
>>
>> case 't':
>>
>>
>>
>printf("===============================================================
>=\n");
>>
>> if(is_alsasink) {
>>
>> /* pause */
>>
>> gst_element_set_state (pipeline, GST_STATE_PAUSED);
>>
>> // gst_element_set_state (pipeline, GST_STATE_NULL);
>>
>> sleep(1);
>>
>>
>>
>> gst_element_unlink(decoder, alsaaudiosink);
>>
>> gst_bin_remove (GST_BIN (pipeline), alsaaudiosink);
>>
>> gst_element_set_state (alsaaudiosink, GST_STATE_NULL);
>>
>> gst_object_unref (GST_OBJECT (alsaaudiosink));
>>
>>
>>
>> pulseaudiosink = gst_element_factory_make ("pulsesink",
>> "pulse_play_audio");
>>
>> gst_bin_add (GST_BIN (pipeline), pulseaudiosink);
>>
>> gst_element_link(decoder, pulseaudiosink);
>>
>> sleep(1);
>>
>>
>>
>> /* start playing */
>>
>> printf("pulse sink prepare to play:\n");
>>
>> gst_element_set_state (pipeline, GST_STATE_PLAYING);
>>
>> }
>>
>> else {
>>
>> /* pause */
>>
>> gst_element_set_state (pipeline, GST_STATE_PAUSED);
>>
>> // gst_element_set_state (pipeline, GST_STATE_NULL);
>>
>> sleep(1);
>>
>>
>>
>> gst_element_unlink(decoder, pulseaudiosink);
>>
>> gst_bin_remove (GST_BIN (pipeline), pulseaudiosink);
>>
>> gst_element_set_state (pulseaudiosink, GST_STATE_NULL);
>>
>> gst_object_unref (GST_OBJECT (pulseaudiosink));
>>
>>
>>
>> alsaaudiosink = gst_element_factory_make ("alsasink",
>> "alsa_play_audio");
>>
>> gst_bin_add (GST_BIN (pipeline), alsaaudiosink);
>>
>> gst_element_link(decoder, alsaaudiosink);
>>
>> sleep(1);
>>
>>
>>
>> /* start playing */
>>
>> printf("alsa sink prepare to play:\n");
>>
>> gst_element_set_state (pipeline, GST_STATE_PLAYING);
>>
>> }
>>
>>
>>
>> is_alsasink = !is_alsasink;
>>
>>
>>
>> break;
>>
>> case 'q':
>>
>> is_quiting = 1;
>>
>> break;
>>
>> default:
>>
>> break;
>>
>> }
>>
>>
>>
>> if(is_quiting) break;
>>
>>
>>
>>
>>
>> GstFormat fmt = GST_FORMAT_TIME;
>>
>> gint64 pos, len;
>>
>>
>>
>> if (gst_element_query_position (pipeline, &fmt, &pos)
>>
>> && gst_element_query_duration (pipeline, &fmt, &len)) {
>>
>> g_print ("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT
>> "\n",
>>
>> GST_TIME_ARGS (pos), GST_TIME_ARGS (len));
>>
>> }
>>
>>
>>
>> sleep(2);
>>
>> }
>>
>>
>>
>>
>>
>> /* stop the pipeline */
>>
>> gst_element_set_state (pipeline, GST_STATE_NULL);
>>
>>
>>
>> /* we don't need a reference to these objects anymore */
>>
>> gst_object_unref (GST_OBJECT (pipeline));
>>
>> /* unreffing the pipeline unrefs the contained elements as well */
>>
>>
>>
>> exit (0);
>>
>> }
>>
>> /* example-end helloworld.c */
>>
>> ZHAO, Halley (Aihua)
>>
>> Email: halley.zhao at intel.com
>>
>> Tel: +86(21)61166476
>>
>> iNet: 8821-6476
>>
>> SSG/OTC/UMD 3W033
>>
>>
>>
>>
>>
>--
>Toni Marqués Marqués
>Telefónica I+D
>División de Tecnologías de Video
>amm at tid.es
>933653188
>
>
>
>
>
>-----------------------------------------------------------------------
>-------
>Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco,
>CA
>-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
>-Strategies to boost innovation and cut costs with open source participation
>-Receive a $600 discount off the registration fee with the source code: SFAD
>http://p.sf.net/sfu/XcvMzF8H
>_______________________________________________
>gstreamer-devel mailing list
>gstreamer-devel at lists.sourceforge.net
>https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: mp3.c
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20090303/c5dc769b/attachment.txt>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: log.txt
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20090303/c5dc769b/attachment-0001.txt>
More information about the gstreamer-devel
mailing list