I tried to replace audio sink at runtime, but failed

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

I tried to replace audio sink at runtime, but failed

Zhao, Halley

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[hidden email]

Tel: +86(21)61166476

iNet: 8821-6476

SSG/OTC/UMD 3W033

 


------------------------------------------------------------------------------
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
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel