Hi,
I have been fighting again to get my gstreamer code in ekiga in a less experimental state these last days, with the help of the good people of the irc channel. Today I wrote a simple program showing a similar problem to one I see in ekiga : sound events mostly work, except for a single one! So here is how to reproduce the problem: - I quote a Makefile and a test.cpp files in the post-scriptum of this mail ; - the needed gst-helper.cpp and gst-helper.h are those from http://git.gnome.org/browse/ekiga/tree/plugins/gstreamer ; - the wav files can be found here: http://git.gnome.org/browse/ekiga/tree/sounds (only ring.wav and newmessage.wav matter) ; - 'make' should build the "test" program from those. Running "./test ring.wav" plays the sound correctly, "./test newmessage.wav" doesn't. [Hit ctrl+C to get out of the main loop.] (Notice those are the two files for which the rate, channels, etc settings agree with those in the code, which is why I limit the discussion to those two.) What is wrong with my code, and how to fix it? Thanks, Snark on #gstreamer PS1: Makefile is: PKGS = glib-2.0 gstreamer-plugins-base-0.10 gio-2.0 CPPFLAGS = -Wall -O2 `pkg-config --cflags $(PKGS)` LDFLAGS = `pkg-config --libs $(PKGS)` -lgstapp-0.10 test: test.o gst-helper.o test.o: test.cpp gst-helper.o: gst-helper.h gst-helper.cpp PS2: test.cpp is: #include <gio/gio.h> #include <gst/gst.h> #include "gst-helper.h" gst_helper* helper = NULL; static void read_callback (GInputStream* stream, GAsyncResult* result, gchar* buffer) { gssize size = g_input_stream_read_finish (stream, result, NULL); gst_helper_set_frame_data (helper, buffer, size); gst_helper_close (helper); g_free (buffer); /* stupid: I'm leaking everywhere anyway */ } static void size_callback (GFileInputStream* stream, GAsyncResult* result, G_GNUC_UNUSED gpointer data) { GFileInfo* info = g_file_input_stream_query_info_finish (stream, result, NULL); if (info) { goffset size = g_file_info_get_size (info); gchar* buffer = g_new0 (gchar, size); g_input_stream_read_async (G_INPUT_STREAM (stream), buffer, size, 0, NULL, (GAsyncReadyCallback)read_callback, buffer); } } static void opened_callback(GFile* file, GAsyncResult* result, G_GNUC_UNUSED gpointer data) { GFileInputStream* stream = g_file_read_finish (file, result, NULL); if (stream) { g_file_input_stream_query_info_async (stream, G_FILE_ATTRIBUTE_STANDARD_SIZE, 0, NULL, (GAsyncReadyCallback)size_callback, NULL); } } int main (int argc, char* argv[]) { GMainLoop* loop = g_main_loop_new (NULL, FALSE); gst_init (&argc, &argv); helper = gst_helper_new ("appsrc is-live=true format=time do-timestamp=true min-latency=1 max-latency=5000000 name=ekiga_src caps=audio/x-raw-int,rate=44100,channels=2,width=16,depth=16,signed=true,endianness=1234 ! pulsesink sync=false name=ekiga_volume"); GFile* file = g_file_new_for_path (argv[1]); g_file_read_async (file, 0, NULL, (GAsyncReadyCallback)opened_callback, NULL); g_main_loop_run (loop); return 0; } _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
You are senfding a wav file through appsrc, you must use wavparse, like
this: helper = gst_helper_new ("appsrc name=ekiga_src ! wavparse ! pulsesink name=ekiga_volume"); If you don't, it sends the complete wav file to pulsesink, which complains because it is not of the expected size (it has a header that is not a multiple of the frame size). Wim On 09/30/2012 04:38 PM, Julien Puydt wrote: > Hi, > > I have been fighting again to get my gstreamer code in ekiga in a less > experimental state these last days, with the help of the good people > of the irc channel. > > Today I wrote a simple program showing a similar problem to one I see > in ekiga : sound events mostly work, except for a single one! > > So here is how to reproduce the problem: > - I quote a Makefile and a test.cpp files in the post-scriptum of this > mail ; > - the needed gst-helper.cpp and gst-helper.h are those from > http://git.gnome.org/browse/ekiga/tree/plugins/gstreamer ; > - the wav files can be found here: > http://git.gnome.org/browse/ekiga/tree/sounds (only ring.wav and > newmessage.wav matter) ; > - 'make' should build the "test" program from those. > > Running "./test ring.wav" plays the sound correctly, "./test > newmessage.wav" doesn't. [Hit ctrl+C to get out of the main loop.] > > (Notice those are the two files for which the rate, channels, etc > settings agree with those in the code, which is why I limit the > discussion to those two.) > > What is wrong with my code, and how to fix it? > > Thanks, > > Snark on #gstreamer > > PS1: Makefile is: > PKGS = glib-2.0 gstreamer-plugins-base-0.10 gio-2.0 > CPPFLAGS = -Wall -O2 `pkg-config --cflags $(PKGS)` > LDFLAGS = `pkg-config --libs $(PKGS)` -lgstapp-0.10 > > test: test.o gst-helper.o > > test.o: test.cpp > > gst-helper.o: gst-helper.h gst-helper.cpp > > PS2: test.cpp is: > #include <gio/gio.h> > #include <gst/gst.h> > > #include "gst-helper.h" > > gst_helper* helper = NULL; > > static void > read_callback (GInputStream* stream, > GAsyncResult* result, > gchar* buffer) > { > gssize size = g_input_stream_read_finish (stream, result, NULL); > > gst_helper_set_frame_data (helper, buffer, size); > > gst_helper_close (helper); > > g_free (buffer); /* stupid: I'm leaking everywhere anyway */ > } > > static void > size_callback (GFileInputStream* stream, > GAsyncResult* result, > G_GNUC_UNUSED gpointer data) > { > GFileInfo* info = g_file_input_stream_query_info_finish (stream, > result, NULL); > > if (info) { > > goffset size = g_file_info_get_size (info); > gchar* buffer = g_new0 (gchar, size); > > g_input_stream_read_async (G_INPUT_STREAM (stream), buffer, size, > 0, NULL, > (GAsyncReadyCallback)read_callback, buffer); > } > } > > static void > opened_callback(GFile* file, > GAsyncResult* result, > G_GNUC_UNUSED gpointer data) > { > GFileInputStream* stream = g_file_read_finish (file, result, NULL); > > if (stream) { > > g_file_input_stream_query_info_async (stream, > G_FILE_ATTRIBUTE_STANDARD_SIZE, 0, NULL, > (GAsyncReadyCallback)size_callback, NULL); > } > } > > int > main (int argc, > char* argv[]) > { > GMainLoop* loop = g_main_loop_new (NULL, FALSE); > > gst_init (&argc, &argv); > > helper = gst_helper_new ("appsrc is-live=true format=time > do-timestamp=true min-latency=1 max-latency=5000000 name=ekiga_src > caps=audio/x-raw-int,rate=44100,channels=2,width=16,depth=16,signed=true,endianness=1234 > ! pulsesink sync=false name=ekiga_volume"); > > GFile* file = g_file_new_for_path (argv[1]); > > g_file_read_async (file, 0, NULL, > (GAsyncReadyCallback)opened_callback, NULL); > > g_main_loop_run (loop); > > return 0; > } > _______________________________________________ > gstreamer-devel mailing list > [hidden email] > http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |