Gstreamer in ekiga

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Gstreamer in ekiga

Julien Puydt-2
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
Reply | Threaded
Open this post in threaded view
|

Re: Gstreamer in ekiga

Wim Taymans
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