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