[gst-devel] I tried to replace audio sink at runtime, but failed

Zhao, Halley halley.zhao at intel.com
Wed Mar 4 03:03:21 CET 2009


  I tried the same logic for mad<-->flump3dec.
  It works smoothly.
  
  So I think the gst_pad_set_blocked() --> unlink/link element is ok, but there may be something wrong in pulse audio sink or alsa audio sink.
  
  Thanks all
  >-----Original Message-----
  >From: Zhao, Halley [mailto:halley.zhao at intel.com]
  >Sent: 2009年3月3日 17:17
  >To: Discussion of the development of GStreamer
  >Subject: Re: [gst-devel] I tried to replace audio sink at runtime, but failed
  >
  >  1. alsa audio sink --> pulse audio sink will have the following error:
  >    " <pulse_play_audio> warning: Internal data flow problem."
  >    "<pulse_play_audio> warning: Received buffer without a
  >new-segment.Assuming timestamps start from 0."
  >
  >  2. pulse audio --> alsa audio will have the following error:
  >  "alsa pcm_hw.c:1099:snd_pcm_hw_open: alsalib error: open
  >/dev/snd/pcmC0D0p failed: Device or resource busy
  >  alsa pcm_dmix.c:874:snd_pcm_dmix_open: alsalib error: unable to open
  >slave
  >  alsa gstalsasink.c:692:gst_alsasink_open:<alsa_play_audio> error:
  >Could not open audio device for playback. Device is being used by another
  >application.
  >  alsa gstalsasink.c:692:gst_alsasink_open:<alsa_play_audio> error:
  >Device 'default' is busy"
  >
  >  3. pulse-->pulse or alsa-->alsa seems work but with some noise, try a
  >pause/play will remove the noise
  >  " baseaudiosink
  >gstbaseaudiosink.c:895:gst_base_audio_sink_skew_slaving:<pulse_play_aud
  >io> correct clock skew 465298808 > 10657500"
  >
  >  >-----Original Message-----
  >  >From: Zhao, Halley [mailto:halley.zhao at intel.com]
  >  >Sent: 2009年3月3日 16:13
  >  >To: Discussion of the development of GStreamer
  >  >Subject: Re: [gst-devel] I tried to replace audio sink at runtime, but
  >failed
  >  >
  >  >  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/gstre
  >a
  >  >m
  >  >  >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
  >-----------------------------------------------------------------------
  >-------
  >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


More information about the gstreamer-devel mailing list