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

Zhao, Halley halley.zhao at intel.com
Mon Mar 2 10:13:58 CET 2009


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<mailto:aihua.zhao at intel.com>
Tel: +86(21)61166476
iNet: 8821-6476
SSG/OTC/UMD 3W033

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20090302/da0fb018/attachment.htm>


More information about the gstreamer-devel mailing list