On Tuesday 01 May 2007 20:53:48 Vladislav Grinchenko wrote:
> try
> gst-launch-0.10 firesrc location=FNAME.mp3 ! dspmp3sink
> that works for me except that it requires synchronous I/O to play mp3s
> reliably.

Hi,

I managed to get mp3's to play right (note to others: do not try to use 
gst_parse_launch(), but create elements yourself), but I am having problems 
with wavs. 

I have tried with two ways: I've connected directly filesrc, queue, wavparse 
and dsppcmsink. This one didn't give any sound, and playback froze. 
Even "gst-launch-0.10 filesrc=bleep.wav ! wavparse ! dsppcmsink" freezes at 
prerolling state. Consistent, but still not satisfactory. :-) The code:

GstElement* create_pipeline(char* filename)
{
  g_warning("create_pipeline for %s", filename);
  GstElement* pipeline = gst_pipeline_new("pipeline");
  GstElement* src = gst_element_factory_make("filesrc", "source");
  g_object_set (G_OBJECT (src), "location", filename, NULL);
  GstElement* queue = gst_element_factory_make("queue", "queue");
  GstElement* convert = NULL;
  GstElement* sink = NULL;

  if( strstr(filename, ".mp3") == NULL )
  {
    g_warning("create_pipeline: pcmsink");
    convert = gst_element_factory_make("wavparse", "wavparse");
    sink = gst_element_factory_make("dsppcmsink", "sink");
  } else {
    g_warning("create_pipeline: mp3sink");
    sink = gst_element_factory_make("dspmp3sink", "sink");
  }

  if(convert)
  {
    gst_bin_add_many( GST_BIN(pipeline), src, queue, convert, sink, NULL);
    gst_element_link_many(src, queue, convert, sink, NULL);
  } else {
    gst_bin_add_many( GST_BIN(pipeline), src, queue, sink, NULL);
    gst_element_link_many(src, queue, sink, NULL);
  }

  g_warning("create_pipeline end");
  return pipeline;
}

In the second way imitated from maemo-recorder-ui.c, I created only filesrc 
and wavparse. Then I asked for a "pad_added" event and in the event handler I 
created a new dsppcmsink and connected. I tried also with and without queue, 
but it didn't seem to make any difference. Now the application exits because 
gst_element_link() in new_pad_cb() fails for some reason. The code:

static void new_pad_cb (GstElement *wavparse, GstPad *new_pad, gpointer data)
{
    GstElement *sink;
    GstElement *pipeline = (GstElement*) data; 

    sink = gst_element_factory_make ("dsppcmsink", "sink");

    gst_bin_add (GST_BIN (pipeline), sink);

    if (!gst_element_link (wavparse, sink))
      g_error ("link(wavparse, sink) failed!");
    gst_element_sync_state_with_parent(sink); 
}

GstElement* create_pipeline(char* filename)
{
  g_warning("create_pipeline for %s", filename);
  GstElement* pipeline = gst_pipeline_new("pipeline");
  GstElement* src = gst_element_factory_make("filesrc", "source");
  g_object_set (G_OBJECT (src), "location", filename, NULL);
  GstElement* queue = NULL;
  GstElement* convert = NULL;
  GstElement* sink = NULL;

  if( strstr(filename, ".mp3") == NULL )
  {
    g_warning("create_pipeline: pcmsink");
    convert = gst_element_factory_make("wavparse", "wavparse");
    g_signal_connect(convert, "pad_added", G_CALLBACK(new_pad_cb), pipeline);
  } else {
    g_warning("create_pipeline: mp3sink");
    queue = gst_element_factory_make("queue", "queue");
    sink = gst_element_factory_make("dspmp3sink", "sink");
  }

  if(convert)
  {
    gst_bin_add_many( GST_BIN(pipeline), src, convert, NULL);
    gst_element_link_many(src, convert, NULL);
  } else {
    gst_bin_add_many( GST_BIN(pipeline), src, queue, sink, NULL);
    gst_element_link_many(src, queue, sink, NULL);
  }

  g_warning("create_pipeline end");
  return pipeline;
}

Any ideas?

Best regards,
Terje
_______________________________________________
maemo-users mailing list
maemo-users@maemo.org
https://maemo.org/mailman/listinfo/maemo-users

Reply via email to