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