[maemo-users] gcompris port to Maemo --- help needed with gstreamer
From: Terje Bergström terje at terje.fiDate: Sat May 5 21:40:01 EEST 2007
- Previous message: gcompris port to Maemo --- help needed with gstreamer
- Next message: bluetooth GPS receiver
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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
- Previous message: gcompris port to Maemo --- help needed with gstreamer
- Next message: bluetooth GPS receiver
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
