Gstreamer in ekiga
Julien Puydt
julien.puydt at laposte.net
Sun Sep 30 07:38:46 PDT 2012
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;
}
More information about the gstreamer-devel
mailing list