Screenshot instructions:
Windows
Mac
Red Hat Linux
Ubuntu
Click URL instructions:
Right-click on ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)
You can subscribe to this list here.
2002 |
Jan
|
Feb
(112) |
Mar
(315) |
Apr
(310) |
May
(306) |
Jun
(361) |
Jul
(320) |
Aug
(136) |
Sep
(427) |
Oct
(287) |
Nov
(249) |
Dec
(344) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(469) |
Feb
(215) |
Mar
(147) |
Apr
(309) |
May
(303) |
Jun
(227) |
Jul
(315) |
Aug
(160) |
Sep
(191) |
Oct
(327) |
Nov
(483) |
Dec
(418) |
2004 |
Jan
(533) |
Feb
(455) |
Mar
(548) |
Apr
(389) |
May
(395) |
Jun
(267) |
Jul
(409) |
Aug
(189) |
Sep
(136) |
Oct
(272) |
Nov
(254) |
Dec
(265) |
2005 |
Jan
(311) |
Feb
(236) |
Mar
(169) |
Apr
(316) |
May
(360) |
Jun
(379) |
Jul
(414) |
Aug
(484) |
Sep
(663) |
Oct
(733) |
Nov
(838) |
Dec
(403) |
2006 |
Jan
(340) |
Feb
(443) |
Mar
(432) |
Apr
(452) |
May
(440) |
Jun
(311) |
Jul
(316) |
Aug
(282) |
Sep
(288) |
Oct
(241) |
Nov
(195) |
Dec
(182) |
2007 |
Jan
(277) |
Feb
(252) |
Mar
(318) |
Apr
(251) |
May
(234) |
Jun
(235) |
Jul
(225) |
Aug
(178) |
Sep
(262) |
Oct
(233) |
Nov
(236) |
Dec
(264) |
2008 |
Jan
(404) |
Feb
(373) |
Mar
(202) |
Apr
(308) |
May
(419) |
Jun
(348) |
Jul
(205) |
Aug
(343) |
Sep
(127) |
Oct
(303) |
Nov
(352) |
Dec
(236) |
2009 |
Jan
(118) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2011 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
|
1
(15) |
2
(13) |
3
(17) |
4
(10) |
5
(18) |
6
|
7
(4) |
8
(18) |
9
(11) |
10
(30) |
11
(8) |
12
(4) |
13
(12) |
14
(8) |
15
(22) |
16
(21) |
17
(5) |
18
(17) |
19
(14) |
20
(15) |
21
(11) |
22
(17) |
23
(20) |
24
(48) |
25
(24) |
26
(22) |
27
(5) |
28
(6) |
29
(17) |
30
(28) |
31
(24) |
|
|
|
From: <ensonic@fr...> - 2005-08-23 21:32:46
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: ensonic Date: Tue Aug 23 2005 14:32:43 PDT Log message: * check/gst-libs/controller.c: (GST_START_TEST), (gst_controller_suite): * docs/gst/tmpl/gstcaps.sgml: * docs/gst/tmpl/gstghostpad.sgml: * docs/gst/tmpl/gstquery.sgml: * docs/gst/tmpl/gstutils.sgml: * libs/gst/controller/gst-helper.c: (gst_object_set_controller), (gst_object_sink_values), (gst_object_get_value_arrays), (gst_object_get_value_array): gracefully handle helper method calls to objects that are not beeing controlled, added test case for that Modified files: . : ChangeLog check/gst-libs : controller.c docs/gst/tmpl : gstcaps.sgml gstghostpad.sgml gstquery.sgml gstutils.sgml libs/gst/controller: gst-helper.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1386&r2=1.1387 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/check/gst-libs/controller.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/tmpl/gstcaps.sgml.diff?r1=1.50&r2=1.51 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/tmpl/gstghostpad.sgml.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/tmpl/gstquery.sgml.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/tmpl/gstutils.sgml.diff?r1=1.32&r2=1.33 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/controller/gst-helper.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1386 retrieving revision 1.1387 diff -u -d -r1.1386 -r1.1387 --- ChangeLog 23 Aug 2005 18:17:01 -0000 1.1386 +++ ChangeLog 23 Aug 2005 21:32:31 -0000 1.1387 @@ -1,3 +1,17 @@ +2005-08-24 Stefan Kost <ensonic@...> + + * check/gst-libs/controller.c: (GST_START_TEST), + (gst_controller_suite): + * docs/gst/tmpl/gstcaps.sgml: + * docs/gst/tmpl/gstghostpad.sgml: + * docs/gst/tmpl/gstquery.sgml: + * docs/gst/tmpl/gstutils.sgml: + * libs/gst/controller/gst-helper.c: (gst_object_set_controller), + (gst_object_sink_values), (gst_object_get_value_arrays), + (gst_object_get_value_array): + gracefully handle helper method calls to objects that are not beeing + controlled, added test case for that 2005-08-23 Wim Taymans <wim@...> * gst/gstevent.c: (_gst_event_copy), (gst_event_new_custom), Index: controller.c RCS file: /cvs/gstreamer/gstreamer/check/gst-libs/controller.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- controller.c 20 Aug 2005 12:14:27 -0000 1.5 +++ controller.c 23 Aug 2005 21:32:31 -0000 1.6 @@ -330,8 +330,24 @@ GST_END_TEST; -/* @TODO write more tests (using an internal element that has controlable params) - */ +/* tests if we can run helper methods against any GObject */ +GST_START_TEST (controller_helper_any_gobject) +{ + GstElement *elem; + gboolean res; + elem = gst_element_factory_make ("bin", "test_elem"); + /* that element is not controllable */ + res = gst_object_sink_values (G_OBJECT (elem), 0LL); + fail_unless (res == FALSE, NULL); + g_object_unref (elem); +} +GST_END_TEST; Suite * gst_controller_suite (void) { @@ -346,6 +362,7 @@ tcase_add_test (tc, controller_param_twice); tcase_add_test (tc, controller_finalize); tcase_add_test (tc, controller_interpolate_none); + tcase_add_test (tc, controller_helper_any_gobject); return s; } Index: gstcaps.sgml RCS file: /cvs/gstreamer/gstreamer/docs/gst/tmpl/gstcaps.sgml,v retrieving revision 1.50 retrieving revision 1.51 diff -u -d -r1.50 -r1.51 --- gstcaps.sgml 5 Aug 2005 10:02:43 -0000 1.50 +++ gstcaps.sgml 23 Aug 2005 21:32:31 -0000 1.51 @@ -160,6 +160,16 @@ @Returns: +<!-- ##### FUNCTION gst_caps_copy_nth ##### --> +<para> +</para> +@caps: +@nth: +@Returns: <!-- ##### FUNCTION gst_static_caps_get ##### --> <para> Index: gstghostpad.sgml RCS file: /cvs/gstreamer/gstreamer/docs/gst/tmpl/gstghostpad.sgml,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstghostpad.sgml 5 Aug 2005 10:02:43 -0000 1.8 +++ gstghostpad.sgml 23 Aug 2005 21:32:31 -0000 1.9 @@ -35,3 +35,13 @@ @pad: +<!-- ##### FUNCTION gst_ghost_pad_set_target ##### --> +@gpad: +@newtarget: Index: gstquery.sgml RCS file: /cvs/gstreamer/gstreamer/docs/gst/tmpl/gstquery.sgml,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstquery.sgml 5 Aug 2005 10:02:43 -0000 1.13 +++ gstquery.sgml 23 Aug 2005 21:32:31 -0000 1.14 @@ -18,6 +18,15 @@ <!-- ##### SECTION Stability_Level ##### --> +<!-- ##### STRUCT GstQuery ##### --> +@mini_object: +@type: +@structure: <!-- ##### ENUM GstQueryType ##### --> Standard predefined Query types Index: gstutils.sgml RCS file: /cvs/gstreamer/gstreamer/docs/gst/tmpl/gstutils.sgml,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gstutils.sgml 15 Aug 2005 16:57:33 -0000 1.32 +++ gstutils.sgml 23 Aug 2005 21:32:31 -0000 1.33 @@ -65,6 +65,50 @@ @element: +<!-- ##### FUNCTION gst_bin_watch_for_state_change ##### --> +@bin: +<!-- ##### MACRO GST_BOILERPLATE_WITH_INTERFACE ##### --> +@type_as_function: +@parent_type: +@\ + parent_type_as_macro: + parent_type_as_macro: +@interface_type: +@interface_type_as_macro: + interface_as_function: + interface_as_function: <!-- ##### MACRO GST_BOILERPLATE_FULL ##### --> Index: gst-helper.c RCS file: /cvs/gstreamer/gstreamer/libs/gst/controller/gst-helper.c,v --- gst-helper.c 11 Aug 2005 17:39:48 -0000 1.5 +++ gst-helper.c 23 Aug 2005 21:32:31 -0000 1.6 @@ -131,10 +131,11 @@ g_return_val_if_fail (G_IS_OBJECT (object), FALSE); g_return_val_if_fail (controller, FALSE); - ctrl = g_object_get_qdata (object, controller_key); - g_return_val_if_fail (!ctrl, FALSE); - g_object_set_qdata (object, controller_key, controller); - return (TRUE); + if (!(ctrl = g_object_get_qdata (object, controller_key))) { + g_object_set_qdata (object, controller_key, controller); + return (TRUE); + } + return (FALSE); /** @@ -155,9 +156,10 @@ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE); - g_return_val_if_fail (ctrl, FALSE); - return gst_controller_sink_values (ctrl, timestamp); + if ((ctrl = g_object_get_qdata (object, controller_key))) { + return gst_controller_sink_values (ctrl, timestamp); @@ -187,9 +189,10 @@ - return gst_controller_get_value_arrays (ctrl, timestamp, value_arrays); + return gst_controller_get_value_arrays (ctrl, timestamp, value_arrays); @@ -217,8 +220,8 @@ - - return gst_controller_get_value_array (ctrl, timestamp, value_array); + return gst_controller_get_value_array (ctrl, timestamp, value_array); |
From: <ensonic@fr...> - 2005-08-23 19:40:27
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: ensonic Date: Tue Aug 23 2005 12:40:23 PDT Log message: * ext/speex/gstspeexenc.h: Fixed include path of adapter Modified files: . : ChangeLog ext/speex : gstspeexenc.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1809&r2=1.1810 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/speex/gstspeexenc.h.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1809 retrieving revision 1.1810 diff -u -d -r1.1809 -r1.1810 --- ChangeLog 23 Aug 2005 18:24:36 -0000 1.1809 +++ ChangeLog 23 Aug 2005 19:40:11 -0000 1.1810 @@ -1,3 +1,8 @@ +2005-08-23 Stefan Kost <ensonic@...> + + * ext/speex/gstspeexenc.h: + Fixed include path of adapter 2005-08-23 Wim Taymans <wim@...> * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init): Index: gstspeexenc.h RCS file: /cvs/gstreamer/gst-plugins/ext/speex/gstspeexenc.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstspeexenc.h 23 Dec 2004 14:45:25 -0000 1.8 +++ gstspeexenc.h 23 Aug 2005 19:40:11 -0000 1.9 @@ -23,7 +23,7 @@ #include <gst/gst.h> -#include <gst/bytestream/adapter.h> +#include <gst/base/gstadapter.h> #include <speex/speex.h> #include <speex/speex_header.h> |
From: <ds@fr...> - 2005-08-23 19:29:57
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: ds Date: Tue Aug 23 2005 12:29:50 PDT Log message: * gst/audioresample/Makefile.am: Leet audioresampling code * gst/audioresample/buffer.c: * gst/audioresample/buffer.h: * gst/audioresample/debug.c: * gst/audioresample/debug.h: * gst/audioresample/functable.c: * gst/audioresample/functable.h: * gst/audioresample/gstaudioresample.c: * gst/audioresample/gstaudioresample.h: * gst/audioresample/resample.c: * gst/audioresample/resample.h: * gst/audioresample/resample_chunk.c: * gst/audioresample/resample_functable.c: * gst/audioresample/resample_ref.c: Modified files: . : ChangeLog Added files: gst/audioresample: Makefile.am buffer.c buffer.h debug.c debug.h functable.c functable.h gstaudioresample.c gstaudioresample.h resample.c resample.h resample_chunk.c resample_functable.c resample_ref.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.1846&r2=1.1847 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/Makefile.am?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/buffer.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/buffer.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/debug.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/debug.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/functable.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/functable.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/gstaudioresample.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/gstaudioresample.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/resample.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/resample.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/resample_chunk.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/resample_functable.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/audioresample/resample_ref.c?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.1846 retrieving revision 1.1847 diff -u -d -r1.1846 -r1.1847 --- ChangeLog 23 Aug 2005 18:30:06 -0000 1.1846 +++ ChangeLog 23 Aug 2005 19:29:38 -0000 1.1847 @@ -1,3 +1,20 @@ +2005-08-23 David Schleef <ds@...> + + * gst/audioresample/Makefile.am: Leet audioresampling code + * gst/audioresample/buffer.c: + * gst/audioresample/buffer.h: + * gst/audioresample/debug.c: + * gst/audioresample/debug.h: + * gst/audioresample/functable.c: + * gst/audioresample/functable.h: + * gst/audioresample/gstaudioresample.c: + * gst/audioresample/gstaudioresample.h: + * gst/audioresample/resample.c: + * gst/audioresample/resample.h: + * gst/audioresample/resample_chunk.c: + * gst/audioresample/resample_functable.c: + * gst/audioresample/resample_ref.c: 2005-08-23 Wim Taymans <wim@...> * examples/seeking/seek.c: (make_vorbis_pipeline), --- NEW FILE: Makefile.am --- plugin_LTLIBRARIES = libgstaudioresample.la resample_SOURCES = \ functable.c \ functable.h \ resample.c \ resample_functable.c \ resample_ref.c \ resample_chunk.c \ resample.h \ debug.c \ debug.h \ buffer.c \ buffer.h libgstaudioresample_la_SOURCES = gstaudioresample.c $(resample_SOURCES) libgstaudioresample_la_CFLAGS = $(GST_CFLAGS) $(LIBOIL_CFLAGS) libgstaudioresample_la_LIBADD = $(LIBOIL_LIBS) libgstaudioresample_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) --- NEW FILE: buffer.c --- #ifndef HAVE_CONFIG_H #include "config.h" #endif #include <audioresample/buffer.h> #include <glib.h> #include <string.h> #include <audioresample/debug.h> static void audioresample_buffer_free_mem (AudioresampleBuffer * buffer, void *); static void audioresample_buffer_free_subbuffer (AudioresampleBuffer * buffer, void *priv); AudioresampleBuffer * audioresample_buffer_new (void) { AudioresampleBuffer *buffer; buffer = g_new0 (AudioresampleBuffer, 1); buffer->ref_count = 1; return buffer; } audioresample_buffer_new_and_alloc (int size) AudioresampleBuffer *buffer = audioresample_buffer_new (); buffer->data = g_malloc (size); buffer->length = size; buffer->free = audioresample_buffer_free_mem; audioresample_buffer_new_with_data (void *data, int size) buffer->data = data; audioresample_buffer_new_subbuffer (AudioresampleBuffer * buffer, int offset, int length) AudioresampleBuffer *subbuffer = audioresample_buffer_new (); if (buffer->parent) { audioresample_buffer_ref (buffer->parent); subbuffer->parent = buffer->parent; } else { audioresample_buffer_ref (buffer); subbuffer->parent = buffer; } subbuffer->data = buffer->data + offset; subbuffer->length = length; subbuffer->free = audioresample_buffer_free_subbuffer; return subbuffer; void audioresample_buffer_ref (AudioresampleBuffer * buffer) buffer->ref_count++; audioresample_buffer_unref (AudioresampleBuffer * buffer) buffer->ref_count--; if (buffer->ref_count == 0) { if (buffer->free) buffer->free (buffer, buffer->priv); g_free (buffer); static void audioresample_buffer_free_mem (AudioresampleBuffer * buffer, void *priv) g_free (buffer->data); audioresample_buffer_free_subbuffer (AudioresampleBuffer * buffer, void *priv) audioresample_buffer_unref (buffer->parent); AudioresampleBufferQueue * audioresample_buffer_queue_new (void) return g_new0 (AudioresampleBufferQueue, 1); int audioresample_buffer_queue_get_depth (AudioresampleBufferQueue * queue) return queue->depth; audioresample_buffer_queue_get_offset (AudioresampleBufferQueue * queue) return queue->offset; audioresample_buffer_queue_free (AudioresampleBufferQueue * queue) GList *g; for (g = g_list_first (queue->buffers); g; g = g_list_next (g)) { audioresample_buffer_unref ((AudioresampleBuffer *) g->data); g_list_free (queue->buffers); g_free (queue); audioresample_buffer_queue_push (AudioresampleBufferQueue * queue, AudioresampleBuffer * buffer) queue->buffers = g_list_append (queue->buffers, buffer); queue->depth += buffer->length; audioresample_buffer_queue_pull (AudioresampleBufferQueue * queue, int length) AudioresampleBuffer *newbuffer; AudioresampleBuffer *subbuffer; g_return_val_if_fail (length > 0, NULL); if (queue->depth < length) { return NULL; RESAMPLE_LOG ("pulling %d, %d available", length, queue->depth); g = g_list_first (queue->buffers); buffer = g->data; if (buffer->length > length) { newbuffer = audioresample_buffer_new_subbuffer (buffer, 0, length); subbuffer = audioresample_buffer_new_subbuffer (buffer, length, buffer->length - length); g->data = subbuffer; audioresample_buffer_unref (buffer); int offset = 0; newbuffer = audioresample_buffer_new_and_alloc (length); while (offset < length) { g = g_list_first (queue->buffers); buffer = g->data; if (buffer->length > length - offset) { int n = length - offset; memcpy (newbuffer->data + offset, buffer->data, n); subbuffer = audioresample_buffer_new_subbuffer (buffer, n, buffer->length - n); g->data = subbuffer; audioresample_buffer_unref (buffer); offset += n; } else { memcpy (newbuffer->data + offset, buffer->data, buffer->length); queue->buffers = g_list_delete_link (queue->buffers, g); offset += buffer->length; } } queue->depth -= length; queue->offset += length; return newbuffer; audioresample_buffer_queue_peek (AudioresampleBufferQueue * queue, int length) int offset = 0; RESAMPLE_LOG ("peeking %d, %d available", length, queue->depth); g = g_list_next (g); --- NEW FILE: buffer.h --- #ifndef __AUDIORESAMPLE_BUFFER_H__ #define __AUDIORESAMPLE_BUFFER_H__ typedef struct _AudioresampleBuffer AudioresampleBuffer; typedef struct _AudioresampleBufferQueue AudioresampleBufferQueue; struct _AudioresampleBuffer unsigned char *data; int length; int ref_count; AudioresampleBuffer *parent; void (*free) (AudioresampleBuffer *, void *); void *priv; void *priv2; }; struct _AudioresampleBufferQueue GList *buffers; int depth; int offset; AudioresampleBuffer *audioresample_buffer_new (void); AudioresampleBuffer *audioresample_buffer_new_and_alloc (int size); AudioresampleBuffer *audioresample_buffer_new_with_data (void *data, int size); AudioresampleBuffer *audioresample_buffer_new_subbuffer (AudioresampleBuffer * buffer, int offset, int length); void audioresample_buffer_ref (AudioresampleBuffer * buffer); void audioresample_buffer_unref (AudioresampleBuffer * buffer); AudioresampleBufferQueue *audioresample_buffer_queue_new (void); void audioresample_buffer_queue_free (AudioresampleBufferQueue * queue); int audioresample_buffer_queue_get_depth (AudioresampleBufferQueue * queue); int audioresample_buffer_queue_get_offset (AudioresampleBufferQueue * queue); void audioresample_buffer_queue_push (AudioresampleBufferQueue * queue, AudioresampleBuffer * buffer); AudioresampleBuffer *audioresample_buffer_queue_pull (AudioresampleBufferQueue * queue, int len); AudioresampleBuffer *audioresample_buffer_queue_peek (AudioresampleBufferQueue * queue, int len); --- NEW FILE: debug.c --- #ifdef HAVE_CONFIG_H #include <stdio.h> #include <debug.h> static const char *resample_debug_level_names[] = { "NONE", "ERROR", "WARNING", "INFO", "DEBUG", "LOG" static int resample_debug_level = RESAMPLE_LEVEL_ERROR; resample_debug_log (int level, const char *file, const char *function, int line, const char *format, ...) #ifndef GLIB_COMPAT va_list varargs; char *s; if (level > resample_debug_level) return; va_start (varargs, format); s = g_strdup_vprintf (format, varargs); va_end (varargs); fprintf (stderr, "RESAMPLE: %s: %s(%d): %s: %s\n", resample_debug_level_names[level], file, line, function, s); g_free (s); #else char s[1000]; vsnprintf (s, 999, format, varargs); resample_debug_set_level (int level) resample_debug_level = level; resample_debug_get_level (void) return resample_debug_level; --- NEW FILE: debug.h --- #ifndef __RESAMPLE_DEBUG_H__ #define __RESAMPLE_DEBUG_H__ enum RESAMPLE_LEVEL_NONE = 0, RESAMPLE_LEVEL_ERROR, RESAMPLE_LEVEL_WARNING, RESAMPLE_LEVEL_INFO, RESAMPLE_LEVEL_DEBUG, RESAMPLE_LEVEL_LOG #define RESAMPLE_ERROR(...) \ RESAMPLE_DEBUG_LEVEL(RESAMPLE_LEVEL_ERROR, __VA_ARGS__) #define RESAMPLE_WARNING(...) \ RESAMPLE_DEBUG_LEVEL(RESAMPLE_LEVEL_WARNING, __VA_ARGS__) #define RESAMPLE_INFO(...) \ RESAMPLE_DEBUG_LEVEL(RESAMPLE_LEVEL_INFO, __VA_ARGS__) #define RESAMPLE_DEBUG(...) \ RESAMPLE_DEBUG_LEVEL(RESAMPLE_LEVEL_DEBUG, __VA_ARGS__) #define RESAMPLE_LOG(...) \ RESAMPLE_DEBUG_LEVEL(RESAMPLE_LEVEL_LOG, __VA_ARGS__) #define RESAMPLE_DEBUG_LEVEL(level,...) \ resample_debug_log ((level), __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__) void resample_debug_log (int level, const char *file, const char *function, int line, const char *format, ...); void resample_debug_set_level (int level); int resample_debug_get_level (void); --- NEW FILE: functable.c --- /* Resampling library * Copyright (C) <2001> David A. Schleef <ds@...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include <config.h> #include <math.h> #include <stdlib.h> #include <audioresample/functable.h> functable_func_sinc (double *fx, double *dfx, double x, void *closure) if (x == 0) { *fx = 1; *dfx = 0; *fx = sin (x) / x; *dfx = (cos (x) - sin (x) / x) / x; functable_func_boxcar (double *fx, double *dfx, double x, void *closure) double width = *(double *) closure; if (x < width && x > -width) { *fx = 0; *dfx = 0; functable_func_hanning (double *fx, double *dfx, double x, void *closure) x /= width; *fx = (1 - x * x) * (1 - x * x); *dfx = -2 * 2 * x / width * (1 - x * x); Functable * functable_new (void) Functable *ft; ft = malloc (sizeof (Functable)); memset (ft, 0, sizeof (Functable)); return ft; functable_free (Functable * ft) free (ft); functable_set_length (Functable * t, int length) t->length = length; functable_set_offset (Functable * t, double offset) t->offset = offset; functable_set_multiplier (Functable * t, double multiplier) t->multiplier = multiplier; functable_calculate (Functable * t, FunctableFunc func, void *closure) int i; double x; if (t->fx) free (t->fx); if (t->dfx) free (t->dfx); t->fx = malloc (sizeof (double) * (t->length + 1)); t->dfx = malloc (sizeof (double) * (t->length + 1)); t->inv_multiplier = 1.0 / t->multiplier; for (i = 0; i < t->length + 1; i++) { x = t->offset + t->multiplier * i; func (&t->fx[i], &t->dfx[i], x, closure); functable_calculate_multiply (Functable * t, FunctableFunc func, void *closure) double afx, adfx, bfx, bdfx; afx = t->fx[i]; adfx = t->dfx[i]; func (&bfx, &bdfx, x, closure); t->fx[i] = afx * bfx; t->dfx[i] = afx * bdfx + adfx * bfx; double functable_evaluate (Functable * t, double x) double f0, f1, w0, w1; double x2, x3; double w; if (x < t->offset || x > (t->offset + t->length * t->multiplier)) { RESAMPLE_DEBUG ("x out of range %g", x); x -= t->offset; x *= t->inv_multiplier; i = floor (x); x -= i; x2 = x * x; x3 = x2 * x; f1 = 3 * x2 - 2 * x3; f0 = 1 - f1; w0 = (x - 2 * x2 + x3) * t->multiplier; w1 = (-x2 + x3) * t->multiplier; w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->dfx[i] * w0 + t->dfx[i + 1] * w1; /*w = t->fx[i] * (1-x) + t->fx[i+1] * x; */ return w; functable_fir (Functable * t, double x, int n, double *data, int len) int i, j; double sum; x /= t->multiplier; sum = 0; for (j = 0; j < len; j++) { w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->dfx[i] * w0 + t->dfx[i + 1] * w1; sum += data[j * 2] * w; i += n; return sum; functable_fir2 (Functable * t, double *r0, double *r1, double x, int n, double *data, int len) double sum0, sum1; double floor_x; floor_x = floor (x); i = floor_x; x -= floor_x; sum0 = 0; sum1 = 0; sum0 += data[j * 2] * w; sum1 += data[j * 2 + 1] * w; *r0 = sum0; *r1 = sum1; --- NEW FILE: functable.h --- * Copyright (C) <2001> David Schleef <ds@...> #ifndef __FUNCTABLE_H__ #define __FUNCTABLE_H__ typedef void FunctableFunc (double *fx, double *dfx, double x, void *closure); typedef struct _Functable Functable; struct _Functable { double offset; double multiplier; double inv_multiplier; double *fx; double *dfx; Functable *functable_new (void); void functable_setup (Functable *t); void functable_free (Functable *t); void functable_set_length (Functable *t, int length); void functable_set_offset (Functable *t, double offset); void functable_set_multiplier (Functable *t, double multiplier); void functable_calculate (Functable *t, FunctableFunc func, void *closure); void functable_calculate_multiply (Functable *t, FunctableFunc func, void *closure); double functable_evaluate (Functable *t,double x); double functable_fir(Functable *t,double x0,int n,double *data,int len); void functable_fir2(Functable *t,double *r0, double *r1, double x0, int n,double *data,int len); void functable_func_sinc(double *fx, double *dfx, double x, void *closure); void functable_func_boxcar(double *fx, double *dfx, double x, void *closure); void functable_func_hanning(double *fx, double *dfx, double x, void *closure); #endif /* __PRIVATE_H__ */ --- NEW FILE: gstaudioresample.c --- /* GStreamer * Copyright (C) <1999> Erik Walthinsen <omega@...> * Copyright (C) 2003,2004 David A. Schleef <ds@...> * version 2 of the License, or (at your option) any later version. /* Element-Checklist-Version: 5 */ /*#define DEBUG_ENABLED */ #include "gstaudioresample.h" #include <gst/audio/audio.h> GST_DEBUG_CATEGORY_STATIC (audioresample_debug); #define GST_CAT_DEFAULT audioresample_debug /* elementfactory information */ static GstElementDetails gst_audioresample_details = GST_ELEMENT_DETAILS ("Audio scaler", "Filter/Converter/Audio", "Resample audio", "David Schleef <ds@...>"); /* Audioresample signals and args */ /* FILL ME */ LAST_SIGNAL ARG_0, ARG_FILTERLEN #define SUPPORTED_CAPS \ GST_STATIC_CAPS (\ "audio/x-raw-int, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, MAX ], " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "signed = (boolean) true") #if 0 /* disabled because it segfaults */ "audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 32") static GstStaticPadTemplate gst_audioresample_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, SUPPORTED_CAPS); static GstStaticPadTemplate gst_audioresample_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, SUPPORTED_CAPS); static void gst_audioresample_base_init (gpointer g_class); static void gst_audioresample_class_init (AudioresampleClass * klass); static void gst_audioresample_init (Audioresample * audioresample); static void gst_audioresample_dispose (GObject * object); static void gst_audioresample_chain (GstPad * pad, GstData * _data); static void gst_audioresample_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audioresample_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; /*static guint gst_audioresample_signals[LAST_SIGNAL] = { 0 }; */ GType audioresample_get_type (void) { static GType audioresample_type = 0; if (!audioresample_type) { static const GTypeInfo audioresample_info = { sizeof (AudioresampleClass), gst_audioresample_base_init, NULL, (GClassInitFunc) gst_audioresample_class_init, sizeof (Audioresample), 0, (GInstanceInitFunc) gst_audioresample_init,}; audioresample_type = g_type_register_static (GST_TYPE_ELEMENT, "Audioresample", &audioresample_info, 0); } return audioresample_type; } static void gst_audioresample_base_init (gpointer g_class) GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&gst_audioresample_src_template)); gst_static_pad_template_get (&gst_audioresample_sink_template)); gst_element_class_set_details (gstelement_class, &gst_audioresample_details); static void gst_audioresample_class_init (AudioresampleClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->set_property = gst_audioresample_set_property; gobject_class->get_property = gst_audioresample_get_property; gobject_class->dispose = gst_audioresample_dispose; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FILTERLEN, g_param_spec_int ("filter_length", "filter_length", "filter_length", 0, G_MAXINT, 16, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); parent_class = g_type_class_ref (GST_TYPE_ELEMENT); GST_DEBUG_CATEGORY_INIT (audioresample_debug, "audioresample", 0, "audioresample element"); static void gst_audioresample_expand_caps (GstCaps * caps) gint i; for (i = 0; i < gst_caps_get_size (caps); i++) { GstStructure *structure = gst_caps_get_structure (caps, i); const GValue *value; value = gst_structure_get_value (structure, "rate"); if (value == NULL) { GST_ERROR ("caps structure doesn't have required rate field"); return; gst_structure_set (structure, "rate", GST_TYPE_INT_RANGE, 1, G_MAXINT, 0); static GstCaps *gst_audioresample_getcaps (GstPad * pad) Audioresample *audioresample; GstCaps *caps; GstPad *otherpad; audioresample = GST_AUDIORESAMPLE (gst_pad_get_parent (pad)); otherpad = (pad == audioresample->srcpad) ? audioresample->sinkpad : audioresample->srcpad; caps = gst_pad_get_allowed_caps (otherpad); gst_audioresample_expand_caps (caps); return caps; static GstCaps *gst_audioresample_fixate (GstPad * pad, const GstCaps * caps) int rate; GstCaps *copy; GstStructure *structure; audioresample = GST_AUDIORESAMPLE (gst_pad_get_parent (pad)); if (pad == audioresample->srcpad) { otherpad = audioresample->sinkpad; rate = audioresample->i_rate; } else { otherpad = audioresample->srcpad; rate = audioresample->o_rate; if (!GST_PAD_IS_NEGOTIATING (otherpad)) if (gst_caps_get_size (caps) > 1) copy = gst_caps_copy (caps); structure = gst_caps_get_structure (copy, 0); if (rate) { if (gst_caps_structure_fixate_field_nearest_int (structure, "rate", rate)) { return copy; gst_caps_free (copy); return NULL; static GstPadLinkReturn gst_audioresample_link (GstPad * pad, const GstCaps * caps) int channels; gboolean ret; otherpad = (pad == audioresample->srcpad) ? audioresample->sinkpad : structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &rate); ret &= gst_structure_get_int (structure, "channels", &channels); if (!ret) return GST_PAD_LINK_REFUSED; if (gst_pad_is_negotiated (otherpad)) GstCaps *othercaps = gst_caps_copy (caps); int otherrate; GstPadLinkReturn linkret; if (pad == audioresample->srcpad) { otherrate = audioresample->i_rate; } else { otherrate = audioresample->o_rate; gst_caps_set_simple (othercaps, "rate", G_TYPE_INT, otherrate, NULL); linkret = gst_pad_try_set_caps (otherpad, othercaps); if (GST_PAD_LINK_FAILED (linkret)) { return GST_PAD_LINK_REFUSED; audioresample->channels = channels; resample_set_n_channels (audioresample->resample, audioresample->channels); audioresample->o_rate = rate; resample_set_output_rate (audioresample->resample, audioresample->o_rate); GST_DEBUG ("set o_rate to %d", rate); audioresample->i_rate = rate; resample_set_input_rate (audioresample->resample, audioresample->i_rate); GST_DEBUG ("set i_rate to %d", rate); return GST_PAD_LINK_OK; static void gst_audioresample_init (Audioresample * audioresample) ResampleState *r; audioresample->sinkpad = gst_pad_new_from_template (gst_static_pad_template_get (&gst_audioresample_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (audioresample), audioresample->sinkpad); gst_pad_set_chain_function (audioresample->sinkpad, gst_audioresample_chain); gst_pad_set_link_function (audioresample->sinkpad, gst_audioresample_link); gst_pad_set_getcaps_function (audioresample->sinkpad, gst_audioresample_getcaps); gst_pad_set_fixate_function (audioresample->sinkpad, gst_audioresample_fixate); audioresample->srcpad = (&gst_audioresample_src_template), "src"); gst_element_add_pad (GST_ELEMENT (audioresample), audioresample->srcpad); gst_pad_set_link_function (audioresample->srcpad, gst_audioresample_link); gst_pad_set_getcaps_function (audioresample->srcpad, gst_pad_set_fixate_function (audioresample->srcpad, gst_audioresample_fixate); r = resample_new (); audioresample->resample = r; resample_set_filter_length (r, 64); resample_set_format (r, RESAMPLE_FORMAT_S16); static void gst_audioresample_dispose (GObject * object) Audioresample *audioresample = GST_AUDIORESAMPLE (object); if (audioresample->resample) { resample_free (audioresample->resample); G_OBJECT_CLASS (parent_class)->dispose (object); static void gst_audioresample_chain (GstPad * pad, GstData * _data) GstBuffer *buf = GST_BUFFER (_data); guchar *data; gulong size; int outsize; GstBuffer *outbuf; g_return_if_fail (pad != NULL); g_return_if_fail (GST_IS_PAD (pad)); g_return_if_fail (buf != NULL); if (!GST_IS_BUFFER (_data)) { gst_pad_push (audioresample->srcpad, _data); if (audioresample->passthru) { gst_pad_push (audioresample->srcpad, GST_DATA (buf)); r = audioresample->resample; data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); GST_DEBUG ("got buffer of %ld bytes", size); resample_add_input_data (r, data, size, (ResampleCallback) gst_data_unref, buf); outsize = resample_get_output_size (r); /* FIXME this is audioresample being dumb. dunno why */ if (outsize == 0) { GST_ERROR ("overriding outbuf size"); outsize = size; outbuf = gst_buffer_new_and_alloc (outsize); outsize = resample_get_output_data (r, GST_BUFFER_DATA (outbuf), outsize); GST_BUFFER_SIZE (outbuf) = outsize; GST_BUFFER_TIMESTAMP (outbuf) = audioresample->offset * GST_SECOND / audioresample->o_rate; audioresample->offset += outsize / sizeof (gint16) / audioresample->channels; gst_pad_push (audioresample->srcpad, GST_DATA (outbuf)); gst_audioresample_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) g_return_if_fail (GST_IS_AUDIORESAMPLE (object)); audioresample = GST_AUDIORESAMPLE (object); switch (prop_id) { case ARG_FILTERLEN: audioresample->filter_length = g_value_get_int (value); GST_DEBUG_OBJECT (GST_ELEMENT (audioresample), "new filter length %d\n", audioresample->filter_length); resample_set_filter_length (audioresample->resample, break; default:G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); gst_audioresample_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) g_return_if_fail (GST_IS_AUDIORESAMPLE (object)); audioresample = GST_AUDIORESAMPLE (object); g_value_set_int (value, audioresample->filter_length); default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); static gboolean plugin_init (GstPlugin * plugin) resample_init (); if (!gst_element_register (plugin, "audioresample", GST_RANK_PRIMARY, GST_TYPE_AUDIORESAMPLE)) { return FALSE; return TRUE; GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "audioresample", "Resamples audio", plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) --- NEW FILE: gstaudioresample.h --- #ifndef __AUDIORESAMPLE_H__ #define __AUDIORESAMPLE_H__ #include <gst/gst.h> #include <audioresample/resample.h> G_BEGIN_DECLS #define GST_TYPE_AUDIORESAMPLE \ (audioresample_get_type()) #define GST_AUDIORESAMPLE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIORESAMPLE,Audioresample)) #define GST_AUDIORESAMPLE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIORESAMPLE,Audioresample)) #define GST_IS_AUDIORESAMPLE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIORESAMPLE)) #define GST_IS_AUDIORESAMPLE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIORESAMPLE)) typedef struct _Audioresample Audioresample; typedef struct _AudioresampleClass AudioresampleClass; struct _Audioresample { GstElement element; GstPad *sinkpad,*srcpad; gboolean passthru; gint64 offset; int i_rate; int o_rate; int filter_length; ResampleState * resample; struct _AudioresampleClass { GstElementClass parent_class; GType gst_audioresample_get_type(void); G_END_DECLS #endif /* __AUDIORESAMPLE_H__ */ --- NEW FILE: resample.c --- #include <limits.h> #include <liboil/liboil.h> void resample_scale_ref (ResampleState * r); void resample_scale_functable (ResampleState * r); resample_init (void) static int inited = 0; if (!inited) { oil_init (); inited = 1; ResampleState * resample_new (void) r = malloc (sizeof (ResampleState)); memset (r, 0, sizeof (ResampleState)); r->filter_length = 16; r->i_start = 0; if (r->filter_length & 1) { r->o_start = 0; r->o_start = r->o_inc * 0.5; r->queue = audioresample_buffer_queue_new (); r->out_tmp = malloc (10000 * sizeof (double)); r->need_reinit = 1; return r; resample_free (ResampleState * r) if (r->buffer) { free (r->buffer); if (r->ft) { functable_free (r->ft); if (r->queue) { audioresample_buffer_queue_free (r->queue); if (r->out_tmp) { free (r->out_tmp); free (r); resample_buffer_free (AudioresampleBuffer * buffer, void *priv) if (buffer->priv2) { ((void (*)(void *)) buffer->priv2) (buffer->priv); resample_add_input_data (ResampleState * r, void *data, int size, void (*free_func) (void *), void *closure) RESAMPLE_DEBUG ("data %p size %d", data, size); buffer = audioresample_buffer_new_with_data (data, size); buffer->free = resample_buffer_free; buffer->priv2 = free_func; buffer->priv = closure; audioresample_buffer_queue_push (r->queue, buffer); resample_input_eos (ResampleState * r) int sample_size; sample_size = r->n_channels * resample_format_size (r->format); buffer = audioresample_buffer_new_and_alloc (sample_size * (r->filter_length / 2)); memset (buffer->data, 0, buffer->length); r->eos = 1; resample_get_output_size (ResampleState * r) return floor (audioresample_buffer_queue_get_depth (r->queue) * r->o_rate / r->i_rate); resample_get_output_data (ResampleState * r, void *data, int size) r->o_buf = data; r->o_size = size; switch (r->method) { case 0: resample_scale_ref (r); case 1: resample_scale_functable (r); return size - r->o_size; resample_set_filter_length (ResampleState * r, int length) r->filter_length = length; resample_set_input_rate (ResampleState * r, double rate) r->i_rate = rate; resample_set_output_rate (ResampleState * r, double rate) r->o_rate = rate; resample_set_n_channels (ResampleState * r, int n_channels) r->n_channels = n_channels; resample_set_format (ResampleState * r, ResampleFormat format) r->format = format; resample_set_method (ResampleState * r, int method) r->method = method; resample_format_size (ResampleFormat format) switch (format) { case RESAMPLE_FORMAT_S16: return 2; case RESAMPLE_FORMAT_S32: case RESAMPLE_FORMAT_F32: return 4; case RESAMPLE_FORMAT_F64: return 8; return 0; --- NEW FILE: resample.h --- #ifndef __RESAMPLE_H__ #define __RESAMPLE_H__ typedef enum { RESAMPLE_FORMAT_S16 = 0, RESAMPLE_FORMAT_S32, RESAMPLE_FORMAT_F32, RESAMPLE_FORMAT_F64 } ResampleFormat; typedef void (*ResampleCallback) (void *); typedef struct _ResampleState ResampleState; struct _ResampleState { /* parameters */ int n_channels; ResampleFormat format; int filter_length; double i_rate; double o_rate; int method; /* internal parameters */ int need_reinit; double halftaps; /* filter state */ void *o_buf; int o_size; AudioresampleBufferQueue *queue; int eos; int started; int sample_size; void *buffer; int buffer_len; double i_start; double o_start; double i_inc; double o_inc; double sinc_scale; double i_end; double o_end; int i_samples; int o_samples; //void *i_buf; Functable *ft; double *out_tmp; void resample_init(void); void resample_cleanup(void); ResampleState *resample_new (void); void resample_free (ResampleState *state); void resample_add_input_data (ResampleState * r, void *data, int size, ResampleCallback free_func, void *closure); void resample_input_eos (ResampleState *r); int resample_get_output_size (ResampleState *r); int resample_get_output_data (ResampleState *r, void *data, int size); void resample_set_filter_length (ResampleState *r, int length); void resample_set_input_rate (ResampleState *r, double rate); void resample_set_output_rate (ResampleState *r, double rate); void resample_set_n_channels (ResampleState *r, int n_channels); void resample_set_format (ResampleState *r, ResampleFormat format); void resample_set_method (ResampleState *r, int method); int resample_format_size (ResampleFormat format); #endif /* __RESAMPLE_H__ */ --- NEW FILE: resample_chunk.c --- static double resample_sinc_window (double x, double halfwidth, double scale) double y; if (x == 0) return 1.0; if (x < -halfwidth || x > halfwidth) return 0.0; y = sin (x * M_PI * scale) / (x * M_PI * scale) * scale; x /= halfwidth; y *= (1 - x * x) * (1 - x * x); return y; resample_scale_chunk (ResampleState * r) if (r->need_reinit) { r->sample_size = r->n_channels * resample_format_size (r->format); RESAMPLE_DEBUG ("sample size %d", r->sample_size); if (r->buffer) free (r->buffer); r->buffer_len = r->sample_size * 1000; r->buffer = malloc (r->buffer_len); memset (r->buffer, 0, r->buffer_len); r->i_inc = r->o_rate / r->i_rate; r->o_inc = r->i_rate / r->o_rate; RESAMPLE_DEBUG ("i_inc %g o_inc %g", r->i_inc, r->o_inc); r->i_start = -r->i_inc * r->filter_length; r->need_reinit = 0; if (r->i_inc < 1.0) { r->sinc_scale = r->i_inc; if (r->sinc_scale == 0.5) { /* strange things happen at integer multiples */ r->sinc_scale = 1.0; r->sinc_scale = 1.0; r->sinc_scale = 1.0; while (r->o_size > 0) { double midpoint; int i; int j; RESAMPLE_DEBUG ("i_start %g", r->i_start); midpoint = r->i_start + (r->filter_length - 1) * 0.5 * r->i_inc; if (midpoint > 0.5 * r->i_inc) { RESAMPLE_ERROR ("inconsistent state"); while (midpoint < -0.5 * r->i_inc) { AudioresampleBuffer *buffer; buffer = audioresample_buffer_queue_pull (r->queue, r->sample_size); if (buffer == NULL) { RESAMPLE_ERROR ("buffer_queue_pull returned NULL"); return; r->i_start += r->i_inc; RESAMPLE_DEBUG ("pulling (i_start = %g)", r->i_start); midpoint += r->i_inc; memmove (r->buffer, r->buffer + r->sample_size, r->buffer_len - r->sample_size); memcpy (r->buffer + r->buffer_len - r->sample_size, buffer->data, r->sample_size); audioresample_buffer_unref (buffer); switch (r->format) { case RESAMPLE_FORMAT_S16: for (i = 0; i < r->n_channels; i++) { double acc = 0; double offset; double x; for (j = 0; j < r->filter_length; j++) { offset = (r->i_start + j * r->i_inc) * r->o_inc; x = *(int16_t *) (r->buffer + i * sizeof (int16_t) + j * r->sample_size); acc += resample_sinc_window (offset, r->filter_length * 0.5, r->sinc_scale) * x; } if (acc < -32768.0) acc = -32768.0; if (acc > 32767.0) acc = 32767.0; *(int16_t *) (r->o_buf + i * sizeof (int16_t)) = rint (acc); } break; case RESAMPLE_FORMAT_S32: x = *(int32_t *) (r->buffer + i * sizeof (int32_t) + if (acc < -2147483648.0) acc = -2147483648.0; if (acc > 2147483647.0) acc = 2147483647.0; *(int32_t *) (r->o_buf + i * sizeof (int32_t)) = rint (acc); case RESAMPLE_FORMAT_F32: x = *(float *) (r->buffer + i * sizeof (float) + *(float *) (r->o_buf + i * sizeof (float)) = acc; case RESAMPLE_FORMAT_F64: x = *(double *) (r->buffer + i * sizeof (double) + *(double *) (r->o_buf + i * sizeof (double)) = acc; r->i_start -= 1.0; r->o_buf += r->sample_size; r->o_size -= r->sample_size; --- NEW FILE: resample_functable.c --- func_sinc (double *fx, double *dfx, double x, void *closure) //double scale = *(double *)closure; double scale = M_PI; x *= scale; *dfx = scale * (cos (x) - sin (x) / x) / x; func_hanning (double *fx, double *dfx, double x, void *closure) functable_test (Functable * ft, double halfwidth) for (i = 0; i < 100; i++) { x = i * 0.1; printf ("%d %g %g\n", i, resample_sinc_window (x, halfwidth, 1.0), functable_evaluate (ft, x)); exit (0); resample_scale_functable (ResampleState * r) double hanning_width; r->buffer_len = r->sample_size * r->filter_length; if (r->ft) { functable_free (r->ft); r->ft = functable_new (); functable_set_length (r->ft, r->filter_length * 16); functable_set_offset (r->ft, -r->filter_length / 2); functable_set_multiplier (r->ft, 1 / 16.0); hanning_width = r->filter_length / 2; functable_calculate (r->ft, func_sinc, NULL); functable_calculate_multiply (r->ft, func_hanning, &hanning_width); //functable_test(r->ft, 0.5 * r->filter_length); acc += functable_evaluate (r->ft, offset) * x; //acc += resample_sinc_window (offset, r->filter_length * 0.5, r->sinc_scale) * x; --- NEW FILE: resample_ref.c --- resample_scale_ref (ResampleState * r) |
From: <wtay@fr...> - 2005-08-23 18:30:21
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Tue Aug 23 2005 11:30:19 PDT Log message: * examples/seeking/seek.c: (make_vorbis_pipeline), (make_theora_pipeline), (make_vorbis_theora_pipeline), (do_seek): Small seek updates. Modified files: . : ChangeLog examples/seeking: seek.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.1845&r2=1.1846 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/examples/seeking/seek.c.diff?r1=1.40&r2=1.41 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.1845 retrieving revision 1.1846 diff -u -d -r1.1845 -r1.1846 --- ChangeLog 23 Aug 2005 13:29:16 -0000 1.1845 +++ ChangeLog 23 Aug 2005 18:30:06 -0000 1.1846 @@ -1,3 +1,9 @@ +2005-08-23 Wim Taymans <wim@...> + + * examples/seeking/seek.c: (make_vorbis_pipeline), + (make_theora_pipeline), (make_vorbis_theora_pipeline), (do_seek): + Small seek updates. 2005-08-23 Andy Wingo <wingo@...> * gst-libs/gst/audio/gstbaseaudiosrc.c Index: seek.c RCS file: /cvs/gstreamer/gst-plugins-base/examples/seeking/seek.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- seek.c 16 Aug 2005 14:35:52 -0000 1.40 +++ seek.c 23 Aug 2005 18:30:07 -0000 1.41 @@ -296,7 +296,7 @@ { GstElement *pipeline, *audio_bin; GstElement *src, *demux, *decoder, *convert, *audiosink; - GstPad *seekable; + GstPad *pad, *seekable; pipeline = gst_pipeline_new ("app"); @@ -322,7 +322,12 @@ gst_element_link (decoder, convert); gst_element_link (convert, audiosink); - setup_dynamic_link (demux, NULL, gst_element_get_pad (decoder, "sink"), NULL); + pad = gst_element_get_pad (decoder, "sink"); + gst_element_add_pad (audio_bin, gst_ghost_pad_new ("sink", pad)); + gst_object_unref (pad); + setup_dynamic_link (demux, NULL, gst_element_get_pad (audio_bin, "sink"), + NULL); seekable = gst_element_get_pad (decoder, "src"); seekable_pads = g_list_prepend (seekable_pads, seekable); @@ -337,14 +342,12 @@ GstElement *pipeline, *video_bin; GstElement *src, *demux, *decoder, *convert, *videosink; - GstElement *queue; src = gst_element_factory_make_or_warn (SOURCE, "src"); demux = gst_element_factory_make_or_warn ("oggdemux", "demux"); - queue = gst_element_factory_make_or_warn ("queue", "queue"); decoder = gst_element_factory_make_or_warn ("theoradec", "decoder"); convert = gst_element_factory_make_or_warn ("ffmpegcolorspace", "convert"); videosink = gst_element_factory_make_or_warn (VSINK, "sink"); @@ -355,18 +358,21 @@ gst_bin_add (GST_BIN (pipeline), src); gst_bin_add (GST_BIN (pipeline), demux); - gst_bin_add (GST_BIN (pipeline), queue); gst_bin_add (GST_BIN (video_bin), decoder); gst_bin_add (GST_BIN (video_bin), convert); gst_bin_add (GST_BIN (video_bin), videosink); gst_bin_add (GST_BIN (pipeline), video_bin); gst_element_link (src, demux); - gst_element_link (queue, decoder); gst_element_link (convert, videosink); - setup_dynamic_link (demux, NULL, gst_element_get_pad (queue, "sink"), NULL); + gst_element_add_pad (video_bin, gst_ghost_pad_new ("sink", pad)); + setup_dynamic_link (demux, NULL, gst_element_get_pad (video_bin, "sink"), @@ -416,7 +422,7 @@ pad = gst_element_get_pad (a_queue, "sink"); gst_element_add_pad (audio_bin, gst_ghost_pad_new ("sink", pad)); - gst_object_unref (GST_OBJECT_CAST (pad)); setup_dynamic_link (demux, NULL, gst_element_get_pad (audio_bin, "sink"), NULL); @@ -439,7 +445,7 @@ pad = gst_element_get_pad (v_queue, "sink"); gst_element_add_pad (video_bin, gst_ghost_pad_new ("sink", pad)); setup_dynamic_link (demux, NULL, gst_element_get_pad (video_bin, "sink"), @@ -975,10 +981,9 @@ while (walk) { GstPad *seekable = GST_PAD (walk->data); - g_print ("seek to %" GST_TIME_FORMAT " on pad %s:%s\n", + GST_DEBUG ("seek to %" GST_TIME_FORMAT " on pad %s:%s", GST_TIME_ARGS (real), GST_DEBUG_PAD_NAME (seekable)); - s_event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, real, GST_SEEK_TYPE_NONE, 0); @@ -993,7 +998,7 @@ GstElement *seekable = GST_ELEMENT (walk->data); - g_print ("seek to %" GST_TIME_FORMAT " on element %s\n", + GST_DEBUG ("seek to %" GST_TIME_FORMAT " on element %s", GST_TIME_ARGS (real), GST_ELEMENT_NAME (seekable)); |
From: <wtay@fr...> - 2005-08-23 18:25:36
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: wtay Date: Tue Aug 23 2005 11:24:48 PDT Log message: * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init): * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): Fix property warning. Modified files: . : ChangeLog ext/speex : gstspeexdec.c gstspeexenc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1808&r2=1.1809 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/speex/gstspeexdec.c.diff?r1=1.23&r2=1.24 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/speex/gstspeexenc.c.diff?r1=1.27&r2=1.28 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1808 retrieving revision 1.1809 diff -u -d -r1.1808 -r1.1809 --- ChangeLog 23 Aug 2005 16:54:38 -0000 1.1808 +++ ChangeLog 23 Aug 2005 18:24:36 -0000 1.1809 @@ -1,5 +1,11 @@ 2005-08-23 Wim Taymans <wim@...> + * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init): + * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): + Fix property warning. + +2005-08-23 Wim Taymans <wim@...> * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain): * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), Index: gstspeexdec.c RCS file: /cvs/gstreamer/gst-plugins/ext/speex/gstspeexdec.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstspeexdec.c 23 Aug 2005 15:14:01 -0000 1.23 +++ gstspeexdec.c 23 Aug 2005 18:24:36 -0000 1.24 @@ -99,15 +99,15 @@ gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; + gobject_class->set_property = gst_speexdec_set_property; + gobject_class->get_property = gst_speexdec_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ENH, g_param_spec_boolean ("enh", "Enh", "Enable perceptual enhancement", DEFAULT_ENH, G_PARAM_READWRITE)); gstelement_class->change_state = speex_dec_change_state; - gobject_class->set_property = gst_speexdec_set_property; - gobject_class->get_property = gst_speexdec_get_property; - GST_DEBUG_CATEGORY_INIT (speexdec_debug, "speexdec", 0, "speex decoding element"); } Index: gstspeexenc.c RCS file: /cvs/gstreamer/gst-plugins/ext/speex/gstspeexenc.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- gstspeexenc.c 5 Jul 2005 10:51:37 -0000 1.27 +++ gstspeexenc.c 23 Aug 2005 18:24:36 -0000 1.28 @@ -191,6 +191,9 @@ + gobject_class->set_property = gst_speexenc_set_property; + gobject_class->get_property = gst_speexenc_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_QUALITY, g_param_spec_float ("quality", "Quality", "Encoding quality", 0.0, 10.0, DEFAULT_QUALITY, G_PARAM_READWRITE)); @@ -225,9 +228,6 @@ parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - gobject_class->set_property = gst_speexenc_set_property; - gobject_class->get_property = gst_speexenc_get_property; gstelement_class->change_state = gst_speexenc_change_state; |
From: <thomasvs@fr...> - 2005-08-23 18:19:25
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: thomasvs Date: Tue Aug 23 2005 11:19:22 PDT Log message: style fixes Modified files: gst/volume : gstvolume.c gstvolume.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/volume/gstvolume.c.diff?r1=1.57&r2=1.58 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/volume/gstvolume.h.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: gstvolume.c =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/gst/volume/gstvolume.c,v retrieving revision 1.57 retrieving revision 1.58 diff -u -d -r1.57 -r1.58 --- gstvolume.c 22 Aug 2005 09:35:57 -0000 1.57 +++ gstvolume.c 23 Aug 2005 18:19:10 -0000 1.58 @@ -67,7 +67,7 @@ PROP_VOLUME }; -static GstStaticPadTemplate volume_sink_factory = +static GstStaticPadTemplate volume_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, @@ -84,7 +84,8 @@ "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") ); -static GstStaticPadTemplate volume_src_factory = GST_STATIC_PAD_TEMPLATE ("src", +static GstStaticPadTemplate volume_src_template = GST_STATIC_PAD_TEMPLATE + ("src", GST_PAD_SRC, GST_STATIC_CAPS ("audio/x-raw-float, " @@ -248,9 +249,9 @@ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&volume_src_factory)); + gst_static_pad_template_get (&volume_src_template)); - gst_static_pad_template_get (&volume_sink_factory)); + gst_static_pad_template_get (&volume_sink_template)); gst_element_class_set_details (element_class, &volume_details); } Index: gstvolume.h RCS file: /cvs/gstreamer/gst-plugins-base/gst/volume/gstvolume.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstvolume.h 22 Aug 2005 09:35:57 -0000 1.13 +++ gstvolume.h 23 Aug 2005 18:19:10 -0000 1.14 @@ -24,6 +24,7 @@ #define __GST_VOLUME_H__ #include <gst/gst.h> +#include <gst/base/gstbasetransform.h> G_BEGIN_DECLS |
From: <wtay@fr...> - 2005-08-23 18:17:17
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Tue Aug 23 2005 11:17:13 PDT Log message: * gst/gstevent.c: (_gst_event_copy), (gst_event_new_custom), (gst_event_new_newsegment), (gst_event_parse_newsegment), (gst_event_new_tag), (gst_event_parse_tag), (gst_event_new_qos), (gst_event_parse_qos), (gst_event_new_seek), (gst_event_parse_seek): * gst/gstevent.h: Some more debugging output and doc cleanups. * gst/gstqueue.c: (gst_queue_handle_sink_event): Fix possible deadlock. Modified files: . : ChangeLog gst : gstevent.c gstevent.h gstqueue.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1385&r2=1.1386 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstevent.c.diff?r1=1.60&r2=1.61 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstevent.h.diff?r1=1.63&r2=1.64 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstqueue.c.diff?r1=1.144&r2=1.145 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1385 retrieving revision 1.1386 diff -u -d -r1.1385 -r1.1386 --- ChangeLog 23 Aug 2005 14:25:55 -0000 1.1385 +++ ChangeLog 23 Aug 2005 18:17:01 -0000 1.1386 @@ -1,3 +1,16 @@ +2005-08-23 Wim Taymans <wim@...> + + * gst/gstevent.c: (_gst_event_copy), (gst_event_new_custom), + (gst_event_new_newsegment), (gst_event_parse_newsegment), + (gst_event_new_tag), (gst_event_parse_tag), (gst_event_new_qos), + (gst_event_parse_qos), (gst_event_new_seek), + (gst_event_parse_seek): + * gst/gstevent.h: + Some more debugging output and doc cleanups. + * gst/gstqueue.c: (gst_queue_handle_sink_event): + Fix possible deadlock. 2005-08-23 Stefan Kost <ensonic@...> * docs/gst/gstreamer-docs.sgml: Index: gstevent.c RCS file: /cvs/gstreamer/gstreamer/gst/gstevent.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -d -r1.60 -r1.61 --- gstevent.c 22 Aug 2005 10:37:02 -0000 1.60 +++ gstevent.c 23 Aug 2005 18:17:01 -0000 1.61 @@ -301,6 +301,23 @@ gst_event_new_newsegment (gdouble rate, GstFormat format, gint64 start_val, gint64 stop_val, gint64 base) { + if (format == GST_FORMAT_TIME) { + GST_CAT_INFO (GST_CAT_EVENT, + "creating newsegment rate %lf, format GST_FORMAT_TIME, " + "start %" GST_TIME_FORMAT ", stop %" GST_TIME_FORMAT + ", base %" GST_TIME_FORMAT, + rate, GST_TIME_ARGS (start_val), + GST_TIME_ARGS (stop_val), GST_TIME_ARGS (base)); + } else { + "creating newsegment rate %lf, format %d, " + "start %lld, stop %lld, base %lld", + rate, format, start_val, stop_val, base); + } + if (start_val != -1 && stop_val != -1) + g_return_val_if_fail (start_val < stop_val, NULL); return gst_event_new_custom (GST_EVENT_NEWSEGMENT, gst_structure_new ("GstEventNewsegment", "rate", G_TYPE_DOUBLE, rate, "format", GST_TYPE_FORMAT, format, @@ -345,7 +362,6 @@ *base = g_value_get_int64 (gst_structure_get_value (structure, "base")); } -/* tag event */ /** * gst_event_new_tag: * @taglist: metadata list @@ -420,6 +436,11 @@ gst_event_new_qos (gdouble proportion, GstClockTimeDiff diff, GstClockTime timestamp) + GST_CAT_INFO (GST_CAT_EVENT, + "creating qos proportion %lf, diff %" GST_TIME_FORMAT + ", timestamp %" GST_TIME_FORMAT, proportion, + GST_TIME_ARGS (diff), GST_TIME_ARGS (timestamp)); return gst_event_new_custom (GST_EVENT_QOS, gst_structure_new ("GstEventQOS", "proportion", G_TYPE_DOUBLE, proportion, @@ -486,6 +507,21 @@ gst_event_new_seek (gdouble rate, GstFormat format, GstSeekFlags flags, GstSeekType cur_type, gint64 cur, GstSeekType stop_type, gint64 stop) + "creating seek rate %lf, format TIME, flags %d, " + "cur_type %d, cur %" GST_TIME_FORMAT ", " + "stop_type %d, stop %" GST_TIME_FORMAT, + rate, flags, cur_type, GST_TIME_ARGS (cur), + stop_type, GST_TIME_ARGS (stop)); + "creating seek rate %lf, format %d, flags %d, " + "cur_type %d, cur %" G_GINT64_FORMAT ", " + "stop_type %d, stop %" G_GINT64_FORMAT, + rate, format, flags, cur_type, cur, stop_type, stop); return gst_event_new_custom (GST_EVENT_SEEK, gst_structure_new ("GstEventSeek", "rate", G_TYPE_DOUBLE, rate, @@ -539,7 +575,6 @@ *stop = g_value_get_int64 (gst_structure_get_value (structure, "stop")); -/* navigation event */ * gst_event_new_navigation: * @structure: description of the event Index: gstevent.h RCS file: /cvs/gstreamer/gstreamer/gst/gstevent.h,v retrieving revision 1.63 retrieving revision 1.64 diff -u -d -r1.63 -r1.64 --- gstevent.h 23 Aug 2005 14:25:55 -0000 1.63 +++ gstevent.h 23 Aug 2005 18:17:01 -0000 1.64 @@ -197,7 +197,6 @@ * @GST_SEEK_FLAG_SEGMENT: perform a segment seek. After the playback * of the segment completes, no EOS will be emmited but a * SEGMENT_DONE message will be posted on the bus. - * */ typedef enum { GST_SEEK_FLAG_NONE = 0, Index: gstqueue.c RCS file: /cvs/gstreamer/gstreamer/gst/gstqueue.c,v retrieving revision 1.144 retrieving revision 1.145 diff -u -d -r1.144 -r1.145 --- gstqueue.c 22 Aug 2005 18:48:48 -0000 1.144 +++ gstqueue.c 23 Aug 2005 18:17:01 -0000 1.145 @@ -526,8 +526,9 @@ /* now unblock the chain function */ GST_QUEUE_MUTEX_LOCK (queue); queue->srcresult = GST_FLOW_WRONG_STATE; - /* unblock the loop function */ + /* unblock the loop and chain functions */ g_cond_signal (queue->item_add); + g_cond_signal (queue->item_del); GST_QUEUE_MUTEX_UNLOCK (queue); /* make sure it pauses */ |
From: <wtay@fr...> - 2005-08-23 16:55:25
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: wtay Date: Tue Aug 23 2005 09:54:50 PDT Log message: * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain): * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), (gst_rtpamrenc_init), (gst_rtpamrenc_chain): * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), (gst_rtph263penc_flush), (gst_rtph263penc_chain): Small updates, RFC reference to payload encoders. Modified files: . : ChangeLog gst/rtp : gstrtpamrdec.c gstrtpamrenc.c gstrtph263penc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1807&r2=1.1808 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/rtp/gstrtpamrdec.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/rtp/gstrtpamrenc.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/rtp/gstrtph263penc.c.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1807 retrieving revision 1.1808 diff -u -d -r1.1807 -r1.1808 --- ChangeLog 23 Aug 2005 15:14:01 -0000 1.1807 +++ ChangeLog 23 Aug 2005 16:54:38 -0000 1.1808 @@ -1,3 +1,13 @@ +2005-08-23 Wim Taymans <wim@...> + + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), + (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain): + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), + (gst_rtpamrenc_init), (gst_rtpamrenc_chain): + * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), + (gst_rtph263penc_flush), (gst_rtph263penc_chain): + Small updates, RFC reference to payload encoders. 2005-08-23 Ronald S. Bultje <rbultje@...> * configure.ac: Index: gstrtpamrdec.c RCS file: /cvs/gstreamer/gst-plugins/gst/rtp/gstrtpamrdec.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtpamrdec.c 19 Aug 2005 12:44:35 -0000 1.3 +++ gstrtpamrdec.c 23 Aug 2005 16:54:38 -0000 1.4 @@ -21,6 +21,13 @@ #include <string.h> #include "gstrtpamrdec.h" +/* references: + * + * RFC 3267 - Real-Time Transport Protocol (RTP) Payload Format and File Storage Format + * for the Adaptive Multi-Rate (AMR) and Adaptive Multi-Rate Wideband (AMR-WB) Audio + * Codecs. + */ /* elementfactory information */ static GstElementDetails gst_rtp_amrdec_details = { "RTP packet parser", Index: gstrtpamrenc.c RCS file: /cvs/gstreamer/gst-plugins/gst/rtp/gstrtpamrenc.c,v --- gstrtpamrenc.c 19 Aug 2005 12:44:35 -0000 1.3 +++ gstrtpamrenc.c 23 Aug 2005 16:54:38 -0000 1.4 @@ -22,6 +22,13 @@ #include "gstrtpamrenc.h" + * RFC 3267 - Real-Time Transport Protocol (RTP) Payload Format and File + * Storage Format for the Adaptive Multi-Rate (AMR) and Adaptive + * Multi-Rate Wideband (AMR-WB) Audio Codecs. static GstElementDetails gst_rtp_amrenc_details = { |
From: <rbultje@fr...> - 2005-08-23 15:14:19
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: rbultje Date: Tue Aug 23 2005 08:14:13 PDT Log message: * configure.ac: * ext/Makefile.am: * ext/speex/Makefile.am: * ext/speex/gstspeex.c: (plugin_init): * ext/speex/gstspeexdec.c: (speex_get_query_types), (gst_speex_dec_init), (speex_dec_src_query), (speex_dec_src_event), (speex_dec_event), (speex_dec_chain): Port speexdec. Leads to some unfamiliar warnings on console, but works otherwise. Modified files: . : ChangeLog configure.ac ext : Makefile.am ext/speex : Makefile.am gstspeex.c gstspeexdec.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1806&r2=1.1807 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/configure.ac.diff?r1=1.576&r2=1.577 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/Makefile.am.diff?r1=1.141&r2=1.142 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/speex/Makefile.am.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/speex/gstspeex.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/speex/gstspeexdec.c.diff?r1=1.22&r2=1.23 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1806 retrieving revision 1.1807 diff -u -d -r1.1806 -r1.1807 --- ChangeLog 23 Aug 2005 14:10:04 -0000 1.1806 +++ ChangeLog 23 Aug 2005 15:14:01 -0000 1.1807 @@ -1,3 +1,15 @@ +2005-08-23 Ronald S. Bultje <rbultje@...> + + * configure.ac: + * ext/Makefile.am: + * ext/speex/Makefile.am: + * ext/speex/gstspeex.c: (plugin_init): + * ext/speex/gstspeexdec.c: (speex_get_query_types), + (gst_speex_dec_init), (speex_dec_src_query), (speex_dec_src_event), + (speex_dec_event), (speex_dec_chain): + Port speexdec. Leads to some unfamiliar warnings on console, + but works otherwise. 2005-08-23 Andy Wingo <wingo@...> * sys/oss/gstosssrc.c (gst_oss_src_open): Set the device-name Index: configure.ac RCS file: /cvs/gstreamer/gst-plugins/configure.ac,v retrieving revision 1.576 retrieving revision 1.577 diff -u -d -r1.576 -r1.577 --- configure.ac 22 Aug 2005 11:20:18 -0000 1.576 +++ configure.ac 23 Aug 2005 15:14:01 -0000 1.577 @@ -583,7 +583,50 @@ AC_SUBST(LIBPNG_LIBS) ]) +dnl *** speex >= 1.0.4 or >= 1.1.5 *** +dnl 1.1.4 and earlier were not API/ABI compatible with 1.0 +dnl 1.1.6 is the first to use a .pc/pkg-config file *** +dnl speex_jitter.h is 1.1.x only +translit(dnm, m, l) AM_CONDITIONAL(USE_SPEEX, true) +GST_CHECK_FEATURE(SPEEX, [speex plug-in], speex, [ + PKG_CHECK_MODULES(SPEEX, speex >= 1.1.6, [ + HAVE_SPEEX="yes" + AC_SUBST(SPEEX_CFLAGS) + AC_SUBST(SPEEX_LIBS) + ], [ + GST_CHECK_LIBHEADER(SPEEX, speex, speex_bits_init, , speex/speex.h, [ + AC_CHECK_HEADER(speex/speex_jitter.h, [ + dnl speex 1.1.x : + GST_CHECK_LIBHEADER(SPEEX, speex, speex_encode_int, , speex/speex.h, [ + dnl speex 1.1.5 or + : + HAVE_SPEEX="yes" + SPEEX_LIBS="-lspeex" + AC_SUBST(SPEEX_CFLAGS) + AC_SUBST(SPEEX_LIBS) + ],[ + HAVE_SPEEX="no" + ]) + ],[ + dnl speex 1.0.x : + AC_CHECK_DECL(SPEEX_GET_LOOKAHEAD, [ + dnl speex 1.0.4 + HAVE_SPEEX="yes" + SPEEX_LIBS="-lspeex" + AC_SUBST(SPEEX_CFLAGS) + AC_SUBST(SPEEX_LIBS) + AC_DEFINE_UNQUOTED(SPEEX_1_0, 1, + [defined if speex 1.0.x API detected]) + HAVE_SPEEX="no" + AC_MSG_NOTICE(You need at least 1.0.4 to compile the speex plugin) + ], [ +#include <speex/speex.h> + ]) + ]) + ]) +]) dnl also add builddir include for enumtypes and marshal GST_CFLAGS="-I\$(top_srcdir)/gst-libs -I\$(top_builddir)/gst-libs $GST_CFLAGS $GST_ERROR" @@ -676,6 +719,7 @@ ext/raw1394/Makefile ext/shout2/Makefile ext/sidplay/Makefile +ext/speex/Makefile ext/esd/Makefile ext/mpeg2dec/Makefile ext/faad/Makefile Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins/ext/Makefile.am,v retrieving revision 1.141 retrieving revision 1.142 diff -u -d -r1.141 -r1.142 --- Makefile.am 22 Aug 2005 11:20:18 -0000 1.141 +++ Makefile.am 23 Aug 2005 15:14:01 -0000 1.142 @@ -364,11 +364,11 @@ SNAPSHOT_DIR= # endif -# if USE_SPEEX -# SPEEX_DIR=speex -# else +if USE_SPEEX +SPEEX_DIR=speex +else SPEEX_DIR= -# endif +endif # if USE_XINE # XINE_DIR=xine @@ -455,4 +455,5 @@ mpeg2dec \ jpeg \ libpng \ - lame + lame \ + speex RCS file: /cvs/gstreamer/gst-plugins/ext/speex/Makefile.am,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Makefile.am 9 Aug 2003 23:56:39 -0000 1.4 +++ Makefile.am 23 Aug 2005 15:14:01 -0000 1.5 @@ -1,7 +1,8 @@ plugin_LTLIBRARIES = libgstspeex.la -libgstspeex_la_SOURCES = gstspeex.c gstspeexdec.c gstspeexenc.c +libgstspeex_la_SOURCES = gstspeex.c gstspeexdec.c +#gstspeexenc.c libgstspeex_la_CFLAGS = $(GST_CFLAGS) $(SPEEX_CFLAGS) libgstspeex_la_LIBADD = $(SPEEX_LIBS) libgstspeex_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) Index: gstspeex.c RCS file: /cvs/gstreamer/gst-plugins/ext/speex/gstspeex.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstspeex.c 28 Sep 2004 16:44:12 -0000 1.8 +++ gstspeex.c 23 Aug 2005 15:14:01 -0000 1.9 @@ -26,16 +26,11 @@ static gboolean plugin_init (GstPlugin * plugin) { - if (!gst_library_load ("gstbytestream")) - return FALSE; - - if (!gst_library_load ("gsttags")) +#if 0 if (!gst_element_register (plugin, "speexenc", GST_RANK_NONE, GST_TYPE_SPEEXENC)) return FALSE; +#endif if (!gst_element_register (plugin, "speexdec", GST_RANK_PRIMARY, GST_TYPE_SPEEXDEC)) Index: gstspeexdec.c RCS file: /cvs/gstreamer/gst-plugins/ext/speex/gstspeexdec.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gstspeexdec.c 5 Jul 2005 10:51:37 -0000 1.22 +++ gstspeexdec.c 23 Aug 2005 15:14:01 -0000 1.23 @@ -23,7 +23,7 @@ #include "gstspeexdec.h" #include <string.h> -#include <gst/tag/tag.h> +//#include <gst/tag/tag.h> GST_DEBUG_CATEGORY (speexdec_debug); #define GST_CAT_DEFAULT speexdec_debug @@ -35,13 +35,6 @@ "Wim Taymans <wim@...>", }; -/* Filter signals and args */ -enum -{ - /* FILL ME */ - LAST_SIGNAL -}; #define DEFAULT_ENH TRUE enum @@ -70,13 +63,12 @@ GST_BOILERPLATE (GstSpeexDec, gst_speex_dec, GstElement, GST_TYPE_ELEMENT); -static void speex_dec_chain (GstPad * pad, GstData * data); +static gboolean speex_dec_event (GstPad * pad, GstEvent * event); +static GstFlowReturn speex_dec_chain (GstPad * pad, GstBuffer * buf); static GstElementStateReturn speex_dec_change_state (GstElement * element); -static const GstFormat *speex_dec_get_formats (GstPad * pad); static gboolean speex_dec_src_event (GstPad * pad, GstEvent * event); -static gboolean speex_dec_src_query (GstPad * pad, - GstQueryType query, GstFormat * format, gint64 * value); +static gboolean speex_dec_src_query (GstPad * pad, GstQuery * query); static gboolean speex_dec_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); @@ -120,41 +112,10 @@ "speex decoding element"); } -static const GstFormat * -speex_dec_get_formats (GstPad * pad) - static GstFormat src_formats[] = { - GST_FORMAT_BYTES, - GST_FORMAT_DEFAULT, /* samples in the audio case */ - GST_FORMAT_TIME, - 0 - }; - static GstFormat sink_formats[] = { - GST_FORMAT_DEFAULT, /* samples */ - return (GST_PAD_IS_SRC (pad) ? src_formats : sink_formats); -} -static const GstEventMask * -speex_get_event_masks (GstPad * pad) - static const GstEventMask speex_dec_src_event_masks[] = { - {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH}, - {0,} - return speex_dec_src_event_masks; static const GstQueryType * speex_get_query_types (GstPad * pad) static const GstQueryType speex_dec_src_query_types[] = { - GST_QUERY_TOTAL, GST_QUERY_POSITION, 0 }; @@ -169,25 +130,19 @@ gst_pad_new_from_template (gst_static_pad_template_get (&speex_dec_sink_factory), "sink"); gst_pad_set_chain_function (dec->sinkpad, speex_dec_chain); - gst_pad_set_formats_function (dec->sinkpad, speex_dec_get_formats); - gst_pad_set_convert_function (dec->sinkpad, speex_dec_convert); + gst_pad_set_event_function (dec->sinkpad, speex_dec_event); gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); dec->srcpad = (&speex_dec_src_factory), "src"); - gst_pad_use_explicit_caps (dec->srcpad); - gst_pad_set_event_mask_function (dec->srcpad, speex_get_event_masks); + gst_pad_use_fixed_caps (dec->srcpad); gst_pad_set_event_function (dec->srcpad, speex_dec_src_event); gst_pad_set_query_type_function (dec->srcpad, speex_get_query_types); gst_pad_set_query_function (dec->srcpad, speex_dec_src_query); - gst_pad_set_formats_function (dec->srcpad, speex_dec_get_formats); - gst_pad_set_convert_function (dec->srcpad, speex_dec_convert); gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); dec->enh = DEFAULT_ENH; - GST_FLAG_SET (dec, GST_ELEMENT_EVENT_AWARE); @@ -253,29 +208,26 @@ -speex_dec_src_query (GstPad * pad, GstQueryType query, GstFormat * format, - gint64 * value) +speex_dec_src_query (GstPad * pad, GstQuery * query) - gint64 samples_out = 0; - GstSpeexDec *dec = GST_SPEEXDEC (gst_pad_get_parent (pad)); - GstFormat my_format = GST_FORMAT_DEFAULT; - if (query == GST_QUERY_POSITION) { - samples_out = dec->samples_out; - } else { - /* query peer in default format */ - if (!gst_pad_query (GST_PAD_PEER (dec->sinkpad), query, &my_format, - &samples_out)) - return FALSE; - } + gint64 samples_out = 0, total_samples; + GstSpeexDec *dec = GST_SPEEXDEC (GST_OBJECT_PARENT (pad)); + GstFormat my_format = GST_FORMAT_TIME; + GstPad *peer; - /* and convert to the final format */ - if (!gst_pad_convert (pad, GST_FORMAT_DEFAULT, samples_out, format, value)) + if (GST_QUERY_TYPE (query) != GST_QUERY_POSITION) + return FALSE; + if (!(peer = gst_pad_get_peer (dec->sinkpad))) + gst_pad_query_position (peer, &my_format, NULL, &total_samples); + gst_object_unref (peer); + samples_out = dec->samples_out; + speex_dec_convert (dec->srcpad, GST_FORMAT_DEFAULT, samples_out, + &my_format, &samples_out); + speex_dec_convert (dec->srcpad, GST_FORMAT_DEFAULT, total_samples, + &my_format, &total_samples); + gst_query_set_position (query, GST_FORMAT_TIME, samples_out, total_samples); - GST_LOG_OBJECT (dec, - "query %u: peer returned samples_out: %llu - we return %llu (format %u)\n", - query, samples_out, *value, *format); return TRUE; @@ -287,20 +239,24 @@ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK:{ - guint64 value; - GstFormat my_format = GST_FORMAT_DEFAULT; + gint64 cur, stop; + GstFormat format, my_format = GST_FORMAT_DEFAULT; + GstSeekType cur_type, stop_type; + GstSeekFlags flags; + gst_event_parse_seek (event, NULL, &format, &flags, &cur_type, &cur, + &stop_type, &stop); /* convert to samples_out */ - res = speex_dec_convert (pad, GST_EVENT_SEEK_FORMAT (event), - GST_EVENT_SEEK_OFFSET (event), &my_format, &value); - if (res) { - GstEvent *real_seek = gst_event_new_seek ( - (GST_EVENT_SEEK_TYPE (event) & ~GST_SEEK_FORMAT_MASK) | - GST_FORMAT_DEFAULT, - value); + if (speex_dec_convert (pad, format, cur, &my_format, &cur) && + (stop == -1 || + speex_dec_convert (pad, format, stop, &my_format, &stop))) { + GstEvent *real_seek = gst_event_new_seek (1.0, GST_FORMAT_DEFAULT, + flags, cur_type, cur, stop_type, stop); res = gst_pad_send_event (GST_PAD_PEER (dec->sinkpad), real_seek); - } + } else + res = FALSE; gst_event_unref (event); break; } @@ -312,16 +268,18 @@ return res; -static void -speex_dec_event (GstSpeexDec * dec, GstEvent * event) +static gboolean +speex_dec_event (GstPad * pad, GstEvent * event) - guint64 value, time, bytes; + gint64 value, time; + GstFormat fmt; GST_LOG_OBJECT (dec, "handling event"); - case GST_EVENT_DISCONTINUOUS: - if (gst_event_discont_get_value (event, GST_FORMAT_DEFAULT, - (gint64 *) & value)) { + case GST_EVENT_NEWSEGMENT: + gst_event_parse_newsegment (event, NULL, &fmt, &value, NULL, NULL); + if (fmt == GST_FORMAT_DEFAULT) { dec->samples_out = value; GST_DEBUG_OBJECT (dec, "setting samples_out to %" G_GUINT64_FORMAT " after discont", @@ -329,77 +287,66 @@ } else { GST_WARNING_OBJECT (dec, "discont event didn't include offset, we might set it wrong now"); + value = 0; } if (dec->packetno < 2) { if (dec->samples_out != 0) GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("can't handle discont before parsing first 2 packets")); dec->packetno = 0; - gst_pad_push (dec->srcpad, GST_DATA (gst_event_new_discontinuous (FALSE, - GST_FORMAT_TIME, (guint64) 0, GST_FORMAT_DEFAULT, - (guint64) 0, GST_FORMAT_BYTES, (guint64) 0, 0))); + gst_pad_push_event (dec->srcpad, + gst_event_new_newsegment (1.0, GST_FORMAT_TIME, + 0, GST_CLOCK_TIME_NONE, 0)); - GstFormat time_format, default_format, bytes_format; - time_format = GST_FORMAT_TIME; - default_format = GST_FORMAT_DEFAULT; - bytes_format = GST_FORMAT_BYTES; + GstFormat time_format = GST_FORMAT_TIME; dec->packetno = 2; /* if one of them works, all of them work */ if (speex_dec_convert (dec->srcpad, GST_FORMAT_DEFAULT, - dec->samples_out, &time_format, &time) - && speex_dec_convert (dec->srcpad, GST_FORMAT_DEFAULT, - dec->samples_out, &bytes_format, &bytes)) { - gst_pad_push (dec->srcpad, - GST_DATA (gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, - time, GST_FORMAT_DEFAULT, dec->samples_out, - GST_FORMAT_BYTES, bytes, 0))); + dec->samples_out, &time_format, &time)) { + gst_pad_push_event (dec->srcpad, + gst_event_new_newsegment (1.0, GST_FORMAT_TIME, + time, GST_CLOCK_TIME_NONE, 0)); } else { GST_ERROR_OBJECT (dec, "failed to parse data for DISCONT event, not sending any"); } - gst_data_unref (GST_DATA (event)); + gst_event_unref (event); default: - gst_pad_event_default (dec->sinkpad, event); - break; + return gst_pad_event_default (dec->sinkpad, event); } + return TRUE; -speex_dec_chain (GstPad * pad, GstData * data) +static GstFlowReturn +speex_dec_chain (GstPad * pad, GstBuffer * buf) - GstBuffer *buf; + GstFlowReturn res; GstSpeexDec *dec; dec = GST_SPEEXDEC (gst_pad_get_parent (pad)); - if (GST_IS_EVENT (data)) { - speex_dec_event (dec, GST_EVENT (data)); - return; - buf = GST_BUFFER (data); if (dec->packetno == 0) { GstCaps *caps; /* get the header */ - dec->header = - speex_packet_to_header (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - gst_data_unref (data); + dec->header = speex_packet_to_header ((char *) GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + gst_buffer_unref (buf); if (!dec->header) { GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, (NULL), ("couldn't read header")); - return; + return GST_FLOW_ERROR; if (dec->header->mode >= SPEEX_NB_MODES) { (NULL), ("Mode number %d does not (yet/any longer) exist in this version", dec->header->mode)); dec->mode = (SpeexMode *) speex_mode_list[dec->header->mode]; @@ -409,8 +356,8 @@ if (!dec->state) { (NULL), ("couldn't initialize decoder")); - gst_data_unref (data); + gst_buffer_unref (buf); speex_decoder_ctl (dec->state, SPEEX_SET_ENH, &dec->enh); @@ -435,19 +382,23 @@ "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, NULL); - if (!gst_pad_set_explicit_caps (dec->srcpad, caps)) { - gst_caps_free (caps); + if (!gst_pad_set_caps (dec->srcpad, caps)) { + gst_caps_unref (caps); + return GST_FLOW_NOT_NEGOTIATED; - gst_caps_free (caps); + gst_caps_unref (caps); + gst_pad_push_event (dec->srcpad, + gst_event_new_newsegment (1.0, GST_FORMAT_TIME, + 0, GST_CLOCK_TIME_NONE, 0)); } else if (dec->packetno == 1) { gchar *encoder = NULL; /* FIXME parse comments */ - GstTagList *list = gst_tag_list_from_vorbiscomment_buffer (buf, "", 1, - &encoder); + GstTagList *list = gst_tag_list_new (); //gst_tag_list_from_vorbiscomment_buffer (buf, "", 1, +// &encoder); if (!list) { GST_WARNING_OBJECT (dec, "couldn't decode comments"); @@ -474,14 +425,14 @@ gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_MINIMUM_BITRATE, (guint) vd->vi.bitrate_lower, NULL); */ - gst_element_found_tags_for_pad (GST_ELEMENT (dec), dec->srcpad, 0, list); + gst_element_found_tags_for_pad (GST_ELEMENT (dec), dec->srcpad, list); } else { gint i; /* send data to the bitstream */ - speex_bits_read_from (&dec->bits, GST_BUFFER_DATA (buf), + speex_bits_read_from (&dec->bits, (char *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); /* now decode each frame */ for (i = 0; i < dec->header->frames_per_packet; i++) { @@ -505,8 +456,10 @@ if (dec->header->nb_channels == 2) speex_decode_stereo (dec->output, dec->frame_size, &dec->stereo); - outbuf = gst_pad_alloc_buffer (dec->srcpad, GST_BUFFER_OFFSET_NONE, - dec->frame_size * dec->header->nb_channels * 2); + if ((res = gst_pad_alloc_buffer (dec->srcpad, GST_BUFFER_OFFSET_NONE, + dec->frame_size * dec->header->nb_channels * 2, + GST_PAD_CAPS (dec->srcpad), &outbuf)) != GST_FLOW_OK) + return res; out_data = (gint16 *) GST_BUFFER_DATA (outbuf); /*PCM saturation (just in case) */ @@ -525,11 +478,15 @@ dec->samples_out * GST_SECOND / dec->header->rate; GST_BUFFER_DURATION (outbuf) = dec->frame_size * GST_SECOND / dec->header->rate; - gst_pad_push (dec->srcpad, GST_DATA (outbuf)); + res = gst_pad_push (dec->srcpad, outbuf); + if (res != GST_FLOW_OK && res != GST_FLOW_NOT_LINKED) dec->samples_out += dec->frame_size; dec->packetno++; + return GST_FLOW_OK; static void |
From: <ensonic@fr...> - 2005-08-23 14:26:14
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: ensonic Date: Tue Aug 23 2005 07:26:08 PDT Log message: * docs/gst/gstreamer-docs.sgml: * docs/gst/gstreamer-sections.txt: * docs/gst/gstreamer.types: * docs/gst/tmpl/.cvsignore: * gst/gstbin.h: * gst/gstbus.c: * gst/gstelement.c: * gst/gstevent.h: added about 100 symbols from gstreamer-unused.txt to the right sections fixed more broken comments added GstBus to docs Modified files: . : ChangeLog docs/gst : gstreamer-docs.sgml gstreamer-sections.txt gstreamer.types docs/gst/tmpl : .cvsignore gst : gstbin.h gstbus.c gstelement.c gstevent.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1384&r2=1.1385 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/gstreamer-docs.sgml.diff?r1=1.73&r2=1.74 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/gstreamer-sections.txt.diff?r1=1.155&r2=1.156 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/gstreamer.types.diff?r1=1.20&r2=1.21 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/tmpl/.cvsignore.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.h.diff?r1=1.75&r2=1.76 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbus.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstelement.c.diff?r1=1.355&r2=1.356 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstevent.h.diff?r1=1.62&r2=1.63 ====Begin Diffs==== Index: gstreamer-docs.sgml =================================================================== RCS file: /cvs/gstreamer/gstreamer/docs/gst/gstreamer-docs.sgml,v retrieving revision 1.73 retrieving revision 1.74 diff -u -d -r1.73 -r1.74 --- gstreamer-docs.sgml 22 Aug 2005 21:03:33 -0000 1.73 +++ gstreamer-docs.sgml 23 Aug 2005 14:25:55 -0000 1.74 @@ -6,6 +6,7 @@ <!ENTITY Gst SYSTEM "xml/gst.xml"> <!ENTITY GstBin SYSTEM "xml/gstbin.xml"> <!ENTITY GstBuffer SYSTEM "xml/gstbuffer.xml"> +<!ENTITY GstBus SYSTEM "xml/gstbus.xml"> <!ENTITY GstCaps SYSTEM "xml/gstcaps.xml"> <!ENTITY GstChildProxy SYSTEM "xml/gstchildproxy.xml"> <!ENTITY GstClock SYSTEM "xml/gstclock.xml"> @@ -102,6 +103,7 @@ &Gst; &GstBin; &GstBuffer; + &GstBus; &GstCaps; &GstChildProxy; &GstClock; Index: gstreamer-sections.txt RCS file: /cvs/gstreamer/gstreamer/docs/gst/gstreamer-sections.txt,v retrieving revision 1.155 retrieving revision 1.156 diff -u -d -r1.155 -r1.156 --- gstreamer-sections.txt 23 Aug 2005 11:53:58 -0000 1.155 +++ gstreamer-sections.txt 23 Aug 2005 14:25:55 -0000 1.156 @@ -22,6 +22,7 @@ gst_init_with_popt_table gst_init_check_with_popt_table gst_init_get_popt_table +gst_deinit <SUBSECTION Private> #GstPoptOption </SECTION> @@ -46,6 +47,9 @@ gst_bin_iterate_sinks gst_bin_iterate_all_by_interface +GST_BIN_CHILDREN +GST_BIN_CHILDREN_COOKIE +GST_BIN_NUMCHILDREN <SUBSECTION> gst_bin_add_many gst_bin_remove_many @@ -59,7 +63,7 @@ GST_IS_BIN_CLASS GST_BIN_GET_CLASS GST_TYPE_BIN_FLAGS - +GST_BIN_CAST gst_bin_get_type gst_bin_flags_get_type @@ -67,6 +71,41 @@ <SECTION> +<FILE>gstbus</FILE> +<TITLE>GstBus</TITLE> +GstBus +GstBusFlags +GstBusSyncReply +GstBusHandler +GstBusSyncHandler +gst_bus_new +gst_bus_post +gst_bus_have_pending +gst_bus_peek +gst_bus_pop +gst_bus_set_flushing +gst_bus_set_sync_handler +gst_bus_create_watch +gst_bus_add_watch_full +gst_bus_add_watch +gst_bus_poll +<SUBSECTION Standard> +GstBusClass +GST_BUS +GST_IS_BUS +GST_TYPE_BUS +GST_BUS_CLASS +GST_IS_BUS_CLASS +GST_BUS_GET_CLASS +GST_TYPE_BUS_FLAGS +GST_BUS_CAST +<SUBSECTION Private> +gst_bus_get_type +gst_bus_flags_get_type +gst_bus_sync_reply_get_type +</SECTION> + +<SECTION> <FILE>gstbuffer</FILE> <TITLE>GstBuffer</TITLE> GstBuffer @@ -117,8 +156,10 @@ gst_buffer_merge <SUBSECTION Standard> +GstBufferClass GST_BUFFER GST_BUFFER_CLASS +GST_BUFFER_GET_CLASS GST_IS_BUFFER GST_IS_BUFFER_CLASS GST_TYPE_BUFFER @@ -149,6 +190,7 @@ gst_caps_new_full gst_caps_new_full_valist gst_caps_copy +gst_caps_copy_nth gst_static_caps_get gst_caps_append gst_caps_append_structure @@ -354,6 +396,7 @@ gst_element_get_manager gst_element_no_more_pads +GstEventClass GST_ELEMENT GST_IS_ELEMENT GST_ELEMENT_CLASS @@ -444,6 +487,9 @@ GST_EVENT_TIMESTAMP GST_EVENT_SRC GST_EVENT_IS_INTERRUPT +GST_EVENT_IS_DOWNSTREAM +GST_EVENT_IS_SERIALIZED +GST_EVENT_IS_UPSTREAM GstEventFlag GST_EVENT_MASK_FUNCTION GstSeekType @@ -460,6 +506,7 @@ GST_EVENT_SIZE_FORMAT GST_EVENT_SIZE_VALUE GST_EVENT_RATE_VALUE +GST_EVENT_MAKE_TYPE gst_event_ref gst_event_unref gst_event_copy @@ -481,6 +528,9 @@ GST_EVENT GST_IS_EVENT +GST_IS_EVENT_CLASS +GST_EVENT_CLASS +GST_EVENT_GET_CLASS GST_TYPE_EVENT GST_TYPE_EVENT_FLAG GST_TYPE_EVENT_TYPE @@ -524,6 +574,7 @@ <TITLE>GstGhostPad</TITLE> GstGhostPad gst_ghost_pad_new +gst_ghost_pad_set_target GstGhostPadClass GST_GHOST_PAD @@ -1185,6 +1236,7 @@ <FILE>gstquery</FILE> <TITLE>GstQuery</TITLE> +GstQuery GstQueryType GST_QUERY_TYPE_RATE_DEN GstQueryTypeDefinition @@ -1194,8 +1246,15 @@ gst_query_types_contains gst_query_type_get_details +GstQueryClass +GST_QUERY +GST_IS_QUERY +GST_QUERY_CLASS +GST_IS_QUERY_CLASS +GST_TYPE_QUERY GST_TYPE_QUERY_TYPE +gst_query_get_type gst_query_type_get_type @@ -1621,6 +1680,8 @@ gst_util_dump_mem gst_print_pad_caps gst_print_element_args +gst_bin_watch_for_state_change +GST_BOILERPLATE_WITH_INTERFACE GST_BOILERPLATE_FULL GST_BOILERPLATE GST_CALL_PARENT @@ -1772,15 +1833,16 @@ gst_adapter_flush gst_adapter_available gst_adapter_available_fast +gst_adapter_take -GST_ADAPTER_SRC -GST_IS_ADAPTER_SRC -GST_TYPE_ADAPTER_SRC -GST_ADAPTER_SRC_CLASS -GST_IS_ADAPTER_SRC_CLASS -GST_ADAPTER_SRC_GET_CLASS +GST_ADAPTER +GST_IS_ADAPTER +GST_TYPE_ADAPTER +GST_ADAPTER_CLASS +GST_IS_ADAPTER_CLASS +GST_ADAPTER_GET_CLASS -gst_adapter_src_get_type +gst_adapter_get_type @@ -1837,6 +1899,13 @@ <INCLUDE>gst/base/gstbasetransform.h</INCLUDE> GstBaseTransform GstBaseTransformClass +gst_base_transform_is_passthrough +gst_base_transform_set_passthrough +GST_BASE_TRANSFORM_SINK_NAME +GST_BASE_TRANSFORM_SRC_NAME GST_BASE_TRANSFORM GST_IS_BASE_TRANSFORM @@ -1856,6 +1925,7 @@ GstCollectPads GstCollectPadsClass GstCollectData +GstCollectPadsFunction gst_collectpads_new gst_collectpads_set_function gst_collectpads_add_pad @@ -1870,6 +1940,10 @@ gst_collectpads_available gst_collectpads_read gst_collectpads_flush +GST_COLLECTPADS_BROADCAST +GST_COLLECTPADS_GET_COND +GST_COLLECTPADS_SIGNAL +GST_COLLECTPADS_WAIT GST_COLLECTPADS GST_IS_COLLECTPADS @@ -1907,13 +1981,17 @@ <TITLE>GstFakeSrc</TITLE> <INCLUDE>gst/elements/gstfakesrc.h</INCLUDE> GstFakeSrc +GstFakeSrcDataType +GstFakeSrcFillType +GstFakeSrcOutputType +GstFakeSrcSizeType GstFakeSrcClass -GST_FAKESRC -GST_IS_FAKESRC -GST_TYPE_FAKESRC -GST_FAKESRC_CLASS -GST_IS_FAKESRC_CLASS +GST_FAKE_SRC +GST_IS_FAKE_SRC +GST_TYPE_FAKE_SRC +GST_FAKE_SRC_CLASS +GST_IS_FAKE_SRC_CLASS gst_fake_src_get_type @@ -1923,13 +2001,14 @@ <TITLE>GstFakeSink</TITLE> <INCLUDE>gst/elements/gstfakesink.h</INCLUDE> GstFakeSink +GstFakeSinkStateError GstFakeSinkClass -GST_FAKESINK -GST_IS_FAKESINK -GST_TYPE_FAKESINK -GST_FAKESINK_CLASS -GST_IS_FAKESINK_CLASS +GST_FAKE_SINK +GST_IS_FAKE_SINK +GST_TYPE_FAKE_SINK +GST_FAKE_SINK_CLASS +GST_IS_FAKE_SINK_CLASS gst_fake_sink_get_type @@ -1942,10 +2021,10 @@ GstFileSrcClass GST_FILE_SRC -GST_IS_FILESRC -GST_TYPE_FILESRC +GST_IS_FILE_SRC +GST_TYPE_FILE_SRC GST_FILE_SRC_CLASS -GST_IS_FILESRC_CLASS +GST_IS_FILE_SRC_CLASS gst_file_src_get_type @@ -1958,10 +2037,10 @@ GstFileSinkClass GST_FILE_SINK -GST_IS_FILESINK -GST_TYPE_FILESINK +GST_IS_FILE_SINK +GST_TYPE_FILE_SINK GST_FILE_SINK_CLASS -GST_IS_FILESINK_CLASS +GST_IS_FILE_SINK_CLASS gst_file_sink_get_type Index: gstreamer.types RCS file: /cvs/gstreamer/gstreamer/docs/gst/gstreamer.types,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstreamer.types 5 Aug 2005 12:59:45 -0000 1.20 +++ gstreamer.types 23 Aug 2005 14:25:55 -0000 1.21 @@ -10,6 +10,7 @@ #include <gst/gstqueue.h> gst_clock_get_type gst_element_factory_get_type gst_element_get_type Index: .cvsignore RCS file: /cvs/gstreamer/gstreamer/docs/gst/tmpl/.cvsignore,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- .cvsignore 23 Aug 2005 11:53:58 -0000 1.4 +++ .cvsignore 23 Aug 2005 14:25:55 -0000 1.5 @@ -7,6 +7,7 @@ gstbasetransform.sgml gstbin.sgml gstbuffer.sgml +gstbus.sgml gstcollectpads.sgml gstevent.sgml gstfakesrc.sgml Index: ChangeLog RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1384 retrieving revision 1.1385 diff -u -d -r1.1384 -r1.1385 --- ChangeLog 23 Aug 2005 11:53:57 -0000 1.1384 +++ ChangeLog 23 Aug 2005 14:25:55 -0000 1.1385 @@ -1,5 +1,19 @@ 2005-08-23 Stefan Kost <ensonic@...> + * docs/gst/gstreamer-docs.sgml: + * docs/gst/gstreamer-sections.txt: + * docs/gst/gstreamer.types: + * docs/gst/tmpl/.cvsignore: + * gst/gstbin.h: + * gst/gstbus.c: + * gst/gstelement.c: + * gst/gstevent.h: + added about 100 symbols from gstreamer-unused.txt to the right sections + fixed more broken comments + added GstBus to docs +2005-08-23 Stefan Kost <ensonic@...> * docs/gst/gstreamer-sections.txt: * docs/gst/tmpl/.cvsignore: * docs/gst/tmpl/gstbin.sgml: Index: gstbin.h RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.h,v retrieving revision 1.75 retrieving revision 1.76 diff -u -d -r1.75 -r1.76 --- gstbin.h 18 Jul 2005 12:49:52 -0000 1.75 +++ gstbin.h 23 Aug 2005 14:25:55 -0000 1.76 @@ -57,8 +57,32 @@ typedef struct _GstBin GstBin; typedef struct _GstBinClass GstBinClass; +/** + * GST_BIN_NUMCHILDREN: + * @bin: the bin to get the number of children from + * + * Gets the number of children a bin manages. + * Returns: the number of child objects + */ #define GST_BIN_NUMCHILDREN(bin) (GST_BIN_CAST(bin)->numchildren); + * GST_BIN_CHILDREN: + * @bin: the bin to get the list with children from + * Gets the list with children a bin manages. + * Returns: the children list #define GST_BIN_CHILDREN(bin) (GST_BIN_CAST(bin)->children); + * GST_BIN_CHILDREN_COOKIE: + * @bin: the bin to get the children cookie from + * Gets the children cookie that watches the children list. + * Returns: the children cookie #define GST_BIN_CHILDREN_COOKIE(bin) (GST_BIN_CAST(bin)->children_cookie); struct _GstBin { Index: gstbus.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbus.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstbus.c 18 Aug 2005 15:31:28 -0000 1.18 +++ gstbus.c 23 Aug 2005 14:25:55 -0000 1.19 @@ -18,7 +18,10 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ + * SECTION:gstbus + * @short_description: Asynchronous message bus subsystem #include <errno.h> #include <unistd.h> @@ -151,6 +154,13 @@ } } + * gst_bus_new: + * Creates a new #GstBuus instance. + * Returns: a new #GstBus instance GstBus * gst_bus_new (void) { Index: gstelement.c RCS file: /cvs/gstreamer/gstreamer/gst/gstelement.c,v retrieving revision 1.355 retrieving revision 1.356 diff -u -d -r1.355 -r1.356 --- gstelement.c 22 Aug 2005 14:35:42 -0000 1.355 +++ gstelement.c 23 Aug 2005 14:25:55 -0000 1.356 @@ -1140,10 +1140,13 @@ /** * gst_element_seek: * @element: a #GstElement to send the event to. - * @seek_method: the method to use for seeking (GST_SEEK_METHOD_*). - * @seek_format: the #GstFormat to use for seeking (GST_FORMAT_*). - * @seek_flags: the flags to use for seeking (GST_SEEK_FLAG_*). - * @offset: the offset to seek to (in the given seek_format). + * @rate: the rate of the seek + * @format: the #GstFormat to use for seeking (GST_FORMAT_*). + * @flags: the flags to use for seeking (GST_SEEK_FLAG_*). + * @cur_type: the #GstSeekType for the start offset + * @cur: the start offset to seek to (in the given seek_format). + * @stop_type: the #GstSeekType for the end offset + * @stop: the end offset to seek to (in the given seek_format). * * Sends a seek event to an element. Index: gstevent.h RCS file: /cvs/gstreamer/gstreamer/gst/gstevent.h,v retrieving revision 1.62 retrieving revision 1.63 diff -u -d -r1.62 -r1.63 --- gstevent.h 22 Aug 2005 10:37:02 -0000 1.62 +++ gstevent.h 23 Aug 2005 14:25:55 -0000 1.63 @@ -98,6 +98,7 @@ * GST_EVENT_TRACE_NAME: * The name used for memory allocation tracing #define GST_EVENT_TRACE_NAME "GstEvent" |
From: <wingo@fr...> - 2005-08-23 14:10:20
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: wingo Date: Tue Aug 23 2005 07:10:17 PDT Log message: 2005-08-23 Andy Wingo <wingo@...> * sys/oss/gstosssrc.c (gst_oss_src_open): Set the device-name property after opening the mixer. Modified files: . : ChangeLog sys/oss : gstosssrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1805&r2=1.1806 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.60&r2=1.61 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1805 retrieving revision 1.1806 diff -u -d -r1.1805 -r1.1806 --- ChangeLog 23 Aug 2005 13:59:22 -0000 1.1805 +++ ChangeLog 23 Aug 2005 14:10:04 -0000 1.1806 @@ -1,5 +1,8 @@ 2005-08-23 Andy Wingo <wingo@...> + * sys/oss/gstosssrc.c (gst_oss_src_open): Set the device-name + property after opening the mixer. + * sys/oss/gstosssrc.c: * sys/oss/gstosssrc.h: Easy to implement a mixer, eh... Index: gstosssrc.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -d -r1.60 -r1.61 --- gstosssrc.c 23 Aug 2005 13:59:22 -0000 1.60 +++ gstosssrc.c 23 Aug 2005 14:10:05 -0000 1.61 @@ -306,9 +306,17 @@ return FALSE; } - if (!oss->mixer) + if (!oss->mixer) { oss->mixer = gst_ossmixer_new ("/dev/mixer", GST_OSS_MIXER_CAPTURE); + if (oss->mixer) { + if (oss->device_name) { + g_free (oss->device_name); + } + oss->device_name = g_strdup (oss->mixer->cardname); + } + } return TRUE; } |
From: <wingo@fr...> - 2005-08-23 13:59:36
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: wingo Date: Tue Aug 23 2005 06:59:34 PDT Log message: 2005-08-23 Andy Wingo <wingo@...> * sys/oss/gstosssrc.c: * sys/oss/gstosssrc.h: Easy to implement a mixer, eh... Modified files: . : ChangeLog sys/oss : gstosssrc.c gstosssrc.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1804&r2=1.1805 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.59&r2=1.60 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.h.diff?r1=1.16&r2=1.17 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1804 retrieving revision 1.1805 diff -u -d -r1.1804 -r1.1805 --- ChangeLog 23 Aug 2005 13:53:17 -0000 1.1804 +++ ChangeLog 23 Aug 2005 13:59:22 -0000 1.1805 @@ -1,5 +1,8 @@ 2005-08-23 Andy Wingo <wingo@...> + * sys/oss/gstosssrc.c: + * sys/oss/gstosssrc.h: Easy to implement a mixer, eh... + * sys/oss/gstossmixerelement.h: * sys/oss/gstossmixerelement.c: Added mixer element like alsamixer. Index: gstosssrc.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -d -r1.59 -r1.60 --- gstosssrc.c 23 Aug 2005 13:53:17 -0000 1.59 +++ gstosssrc.c 23 Aug 2005 13:59:22 -0000 1.60 @@ -47,13 +47,10 @@ PROP_DEVICE_NAME, }; -GST_BOILERPLATE (GstOssSrc, gst_oss_src, GstAudioSrc, GST_TYPE_AUDIO_SRC); +GST_BOILERPLATE_WITH_INTERFACE (GstOssSrc, gst_oss_src, GstAudioSrc, + GST_TYPE_AUDIO_SRC, GstMixer, GST_TYPE_MIXER, gst_oss_src_mixer); -/* -GST_BOILERPLATE_WITH_INTERFACE (GstOssSrc, gst_oss_src, GstAudioSrc, GST_TYPE_AUDIO_SRC, - GstMixer, GST_TYPE_MIXER, gst_oss_src_mixer); GST_IMPLEMENT_OSS_MIXER_METHODS (GstOssSrc, gst_oss_src_mixer); -*/ static void gst_oss_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); @@ -309,13 +306,26 @@ return FALSE; } + if (!oss->mixer) + oss->mixer = gst_ossmixer_new ("/dev/mixer", GST_OSS_MIXER_CAPTURE); return TRUE; } static gboolean gst_oss_src_close (GstAudioSrc * asrc) { - close (GST_OSS_SRC (asrc)->fd); + GstOssSrc *oss; + oss = GST_OSS_SRC (asrc); + close (oss->fd); + if (oss->mixer) { + gst_ossmixer_free (oss->mixer); + oss->mixer = NULL; + } Index: gstosssrc.h RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosssrc.h,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstosssrc.h 23 Aug 2005 13:26:21 -0000 1.16 +++ gstosssrc.h 23 Aug 2005 13:59:22 -0000 1.17 @@ -29,6 +29,7 @@ #include <gst/audio/gstaudiosrc.h> #include "gstosshelper.h" +#include "gstossmixer.h" G_BEGIN_DECLS @@ -49,6 +50,8 @@ gchar *device; gchar *device_name; + GstOssMixer *mixer; struct _GstOssSrcClass { |
From: <wingo@fr...> - 2005-08-23 13:53:32
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: wingo Date: Tue Aug 23 2005 06:53:29 PDT Log message: 2005-08-23 Andy Wingo <wingo@...> * sys/oss/gstossmixerelement.h: * sys/oss/gstossmixerelement.c: Added mixer element like alsamixer. * sys/oss/Makefile.am: * sys/oss/gstossaudio.c: Register the ossmixer element. Modified files: . : ChangeLog sys/oss : Makefile.am gstossaudio.c gstossmixer.c gstosssrc.c Added files: sys/oss : gstossmixerelement.c gstossmixerelement.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1803&r2=1.1804 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/Makefile.am.diff?r1=1.29&r2=1.30 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossaudio.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixer.c.diff?r1=1.20&r2=1.21 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixerelement.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixerelement.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.58&r2=1.59 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1803 retrieving revision 1.1804 diff -u -d -r1.1803 -r1.1804 --- ChangeLog 23 Aug 2005 13:27:30 -0000 1.1803 +++ ChangeLog 23 Aug 2005 13:53:17 -0000 1.1804 @@ -1,5 +1,12 @@ 2005-08-23 Andy Wingo <wingo@...> + * sys/oss/gstossmixerelement.h: + * sys/oss/gstossmixerelement.c: Added mixer element like + alsamixer. + + * sys/oss/Makefile.am: + * sys/oss/gstossaudio.c: Register the ossmixer element. + * sys/oss/gstossmixer.h: * sys/oss/gstossmixer.c: Refactored to be more like alsamixer. Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins/sys/oss/Makefile.am,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- Makefile.am 23 Aug 2005 13:26:21 -0000 1.29 +++ Makefile.am 23 Aug 2005 13:53:17 -0000 1.30 @@ -1,10 +1,11 @@ plugin_LTLIBRARIES = libgstossaudio.la -libgstossaudio_la_SOURCES = gstossaudio.c \ - gstosshelper.c \ - gstossmixer.c \ - gstossmixertrack.c \ - gstosssink.c \ +libgstossaudio_la_SOURCES = gstossaudio.c \ + gstosshelper.c \ + gstossmixer.c \ + gstossmixerelement.c \ + gstossmixertrack.c \ + gstosssink.c \ gstosssrc.c # gstossdmabuffer.c @@ -15,11 +16,12 @@ -lgstaudio-@...@ libgstossaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -noinst_HEADERS = gstosssink.h \ - gstosssrc.h \ - gstosshelper.h \ - gstossdmabuffer.h \ - gstossmixer.h \ +noinst_HEADERS = gstosssink.h \ + gstosssrc.h \ + gstosshelper.h \ + gstossdmabuffer.h \ + gstossmixer.h \ + gstossmixerelement.h \ gstossmixertrack.h # noinst_PROGRAMS = #oss_probe Index: gstossaudio.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstossaudio.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstossaudio.c 23 Aug 2005 13:26:21 -0000 1.18 +++ gstossaudio.c 23 Aug 2005 13:53:17 -0000 1.19 @@ -23,6 +23,7 @@ #include "gst/gst-i18n-plugin.h" +#include "gstossmixerelement.h" #include "gstosssink.h" #include "gstosssrc.h" @@ -33,8 +34,8 @@ static gboolean plugin_init (GstPlugin * plugin) { - if ( /*!gst_element_register (plugin, "ossmixer", GST_RANK_PRIMARY, - GST_TYPE_OSSELEMENT) || */ + if (!gst_element_register (plugin, "ossmixer", GST_RANK_NONE, + GST_TYPE_OSS_MIXER_ELEMENT) || !gst_element_register (plugin, "osssrc", GST_RANK_PRIMARY, GST_TYPE_OSS_SRC) || !gst_element_register (plugin, "osssink", GST_RANK_SECONDARY, Index: gstossmixer.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstossmixer.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstossmixer.c 23 Aug 2005 13:26:21 -0000 1.20 +++ gstossmixer.c 23 Aug 2005 13:53:17 -0000 1.21 @@ -143,6 +143,7 @@ ret->device = g_strdup (device); ret->dir = dir; + ret->mixer_fd = -1; if (!gst_ossmixer_open (ret)) goto error; --- NEW FILE: gstossmixerelement.c --- /* OSS mixer interface element. * Copyright (C) 2005 Andrew Vander Wingo <wingo@...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstossmixerelement.h" static GstElementDetails gst_oss_mixer_element_details = GST_ELEMENT_DETAILS ("OSS Mixer", "Generic/Audio", "Control sound input and output levels with OSS", "Andrew Vander Wingo <wingo@...>"); GST_BOILERPLATE_WITH_INTERFACE (GstOssMixerElement, gst_oss_mixer_element, GstElement, GST_TYPE_ELEMENT, GstMixer, GST_TYPE_MIXER, gst_oss_mixer_element); GST_IMPLEMENT_OSS_MIXER_METHODS (GstOssMixerElement, gst_oss_mixer_element); static GstElementStateReturn gst_oss_mixer_element_change_state (GstElement * element); static void gst_oss_mixer_element_base_init (gpointer klass) { gst_element_class_set_details (GST_ELEMENT_CLASS (klass), &gst_oss_mixer_element_details); } gst_oss_mixer_element_class_init (GstOssMixerElementClass * klass) GstElementClass *element_class; element_class = (GstElementClass *) klass; element_class->change_state = gst_oss_mixer_element_change_state; gst_oss_mixer_element_init (GstOssMixerElement * this) this->mixer = NULL; static GstElementStateReturn gst_oss_mixer_element_change_state (GstElement * element) GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (element); switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: if (!this->mixer) { this->mixer = gst_ossmixer_new ("/dev/mixer", GST_OSS_MIXER_ALL); } break; case GST_STATE_READY_TO_NULL: if (this->mixer) { gst_ossmixer_free (this->mixer); this->mixer = NULL; default: } if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); return GST_STATE_SUCCESS; --- NEW FILE: gstossmixerelement.h --- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef __GST_OSS_MIXER_ELEMENT_H__ #define __GST_OSS_MIXER_ELEMENT_H__ #include "gstossmixer.h" G_BEGIN_DECLS #define GST_OSS_MIXER_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS_MIXER_ELEMENT,GstOssMixerElement)) #define GST_OSS_MIXER_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS_MIXER_ELEMENT,GstOssMixerElementClass)) #define GST_IS_OSS_MIXER_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS_MIXER_ELEMENT)) #define GST_IS_OSS_MIXER_ELEMENT_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS_MIXER_ELEMENT)) #define GST_TYPE_OSS_MIXER_ELEMENT (gst_oss_mixer_element_get_type()) typedef struct _GstOssMixerElement GstOssMixerElement; typedef struct _GstOssMixerElementClass GstOssMixerElementClass; struct _GstOssMixerElement { GstElement parent; GstOssMixer *mixer; }; struct _GstOssMixerElementClass { GstElementClass parent; GType gst_oss_mixer_element_get_type (void); G_END_DECLS #endif /* __GST_OSS_MIXER_ELEMENT_H__ */ |
From: <wingo@fr...> - 2005-08-23 13:29:33
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wingo Date: Tue Aug 23 2005 06:29:29 PDT Log message: 2005-08-23 Andy Wingo <wingo@...> * gst-libs/gst/audio/gstbaseaudiosrc.c (gst_base_audio_src_fixate): Only fixate endianness if it is present in the caps. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.1844&r2=1.1845 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosrc.c.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.1844 retrieving revision 1.1845 diff -u -d -r1.1844 -r1.1845 --- ChangeLog 22 Aug 2005 16:50:59 -0000 1.1844 +++ ChangeLog 23 Aug 2005 13:29:16 -0000 1.1845 @@ -1,3 +1,9 @@ +2005-08-23 Andy Wingo <wingo@...> + + * gst-libs/gst/audio/gstbaseaudiosrc.c + (gst_base_audio_src_fixate): Only fixate endianness if it is + present in the caps. 2005-08-22 Andy Wingo <wingo@...> * ext/alsa/gstalsasink.c (gst_alsasink_get_property): Index: gstbaseaudiosrc.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosrc.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstbaseaudiosrc.c 16 Aug 2005 15:53:59 -0000 1.6 +++ gstbaseaudiosrc.c 23 Aug 2005 13:29:17 -0000 1.7 @@ -211,7 +211,8 @@ gst_caps_structure_fixate_field_nearest_int (s, "depth", 16); gst_caps_structure_fixate_field_nearest_int (s, "width", 16); gst_structure_set (s, "signed", G_TYPE_BOOLEAN, TRUE, NULL); - gst_caps_structure_fixate_field_nearest_int (s, "endianness", G_BYTE_ORDER); + if (gst_structure_has_field (s, "endianness")) + gst_caps_structure_fixate_field_nearest_int (s, "endianness", G_BYTE_ORDER); } static gboolean |
From: <wingo@fr...> - 2005-08-23 13:27:54
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: wingo Date: Tue Aug 23 2005 06:27:42 PDT Log message: changelog Modified files: . : ChangeLog Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1802&r2=1.1803 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1802 retrieving revision 1.1803 diff -u -d -r1.1802 -r1.1803 --- ChangeLog 23 Aug 2005 09:46:29 -0000 1.1802 +++ ChangeLog 23 Aug 2005 13:27:30 -0000 1.1803 @@ -1,5 +1,29 @@ 2005-08-23 Andy Wingo <wingo@...> + * sys/oss/gstossmixer.h: + * sys/oss/gstossmixer.c: Refactored to be more like alsamixer. + + * sys/oss/gstossmixertrack.h: + * sys/oss/gstossmixertrack.c: Split out from gstossmixer.[ch], + like gstalsamixer. + * sys/oss/gstosssrc.c: + * sys/oss/gstosssink.c: Where before we used a gstosselement + object as a helper library, now just call functions from + gstosshelper. + * sys/oss/gstosshelper.h: + * sys/oss/gstosshelper.c: Made a real library. Removed + propertyprobe for now, should add it back later. + + * sys/oss/gstosselement.h: + * sys/oss/gstosselement.c: Removed, we don't have a shared base + class. + * sys/oss/gstosshelper.c (gst_oss_helper_probe_caps): Search + higher-to-lower, makes 16 bit appear earlier in the caps, which + makes it preferred. * sys/oss/gstosssrc.h: * sys/oss/gstosssrc.c: Totally ported, dude. |
From: <wingo@fr...> - 2005-08-23 13:26:36
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: wingo Date: Tue Aug 23 2005 06:26:33 PDT Log message: 2005-08-23 Andy Wingo <wingo@...> * sys/oss/gstossmixer.h: * sys/oss/gstossmixer.c: Refactored to be more like alsamixer. * sys/oss/gstossmixertrack.h: * sys/oss/gstossmixertrack.c: Split out from gstossmixer.[ch], like gstalsamixer. * sys/oss/gstosssrc.c: * sys/oss/gstosssink.c: Where before we used a gstosselement object as a helper library, now just call functions from gstosshelper. * sys/oss/gstosshelper.h: * sys/oss/gstosshelper.c: Made a real library. Removed propertyprobe for now, should add it back later. * sys/oss/gstosselement.h: * sys/oss/gstosselement.c: Removed, we don't have a shared base class. * sys/oss/gstosshelper.c (gst_oss_helper_probe_caps): Search higher-to-lower, makes 16 bit appear earlier in the caps, which makes it preferred. Modified files: sys/oss : Makefile.am gstossaudio.c gstossdmabuffer.h gstosshelper.c gstosshelper.h gstossmixer.c gstossmixer.h gstosssink.c gstosssink.h gstosssrc.c gstosssrc.h Added files: sys/oss : gstossmixertrack.c gstossmixertrack.h Removed files: sys/oss : gstosselement.c gstosselement.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/Makefile.am.diff?r1=1.28&r2=1.29 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossaudio.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossdmabuffer.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.c http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosselement.h http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosshelper.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosshelper.h.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixer.c.diff?r1=1.19&r2=1.20 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixer.h.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixertrack.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossmixertrack.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.104&r2=1.105 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.h.diff?r1=1.22&r2=1.23 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.57&r2=1.58 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.h.diff?r1=1.15&r2=1.16 ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvs/gstreamer/gst-plugins/sys/oss/Makefile.am,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- Makefile.am 23 Aug 2005 09:46:29 -0000 1.28 +++ Makefile.am 23 Aug 2005 13:26:21 -0000 1.29 @@ -1,9 +1,9 @@ plugin_LTLIBRARIES = libgstossaudio.la libgstossaudio_la_SOURCES = gstossaudio.c \ - gstosselement.c \ gstosshelper.c \ gstossmixer.c \ + gstossmixertrack.c \ gstosssink.c \ gstosssrc.c @@ -17,10 +17,10 @@ noinst_HEADERS = gstosssink.h \ gstosssrc.h \ - gstosselement.h \ gstosshelper.h \ gstossdmabuffer.h \ - gstossmixer.h + gstossmixer.h \ + gstossmixertrack.h # noinst_PROGRAMS = #oss_probe Index: gstossaudio.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstossaudio.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstossaudio.c 23 Aug 2005 09:46:29 -0000 1.17 +++ gstossaudio.c 23 Aug 2005 13:26:21 -0000 1.18 @@ -23,7 +23,6 @@ #include "gst/gst-i18n-plugin.h" -#include "gstosselement.h" #include "gstosssink.h" #include "gstosssrc.h" Index: gstossdmabuffer.h RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstossdmabuffer.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstossdmabuffer.h 8 Jul 2005 11:19:19 -0000 1.2 +++ gstossdmabuffer.h 23 Aug 2005 13:26:21 -0000 1.3 @@ -25,7 +25,7 @@ #include <gst/gst.h> +#include "gstosshelper.h" #include <gst/audio/gstringbuffer.h> G_BEGIN_DECLS --- gstosselement.c DELETED --- --- gstosselement.h DELETED --- Index: gstosshelper.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosshelper.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstosshelper.c 8 Jul 2005 13:19:16 -0000 1.6 +++ gstosshelper.c 23 Aug 2005 13:26:21 -0000 1.7 @@ -2,8 +2,7 @@ * Copyright (C) 1999,2000 Erik Walthinsen <omega@...> * 2000 Wim Taymans <wim.taymans@...> * - * gstosshelper.c: helper functions for easy OSS device handling. - * See gstosshelper.h for details. + * gstosshelper.c: OSS helper routines * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -33,6 +32,7 @@ #include <unistd.h> [...1034 lines suppressed...] - gst_oss_rate_add_rate (probe->rates, rate); + gst_oss_helper_rate_add_rate (probe->rates, rate); return rate; } static void -gst_oss_rate_add_rate (GArray * array, int rate) +gst_oss_helper_rate_add_rate (GArray * array, int rate) { int i; int val; @@ -1212,7 +395,7 @@ static int -gst_oss_rate_int_compare (gconstpointer a, gconstpointer b) +gst_oss_helper_rate_int_compare (gconstpointer a, gconstpointer b) const int *va = (const int *) a; const int *vb = (const int *) b; Index: gstosshelper.h RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosshelper.h,v retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstosshelper.h 8 Jul 2005 13:19:16 -0000 1.3 +++ gstosshelper.h 23 Aug 2005 13:26:21 -0000 1.4 @@ -2,11 +2,7 @@ - * gstosshelper.h: helper functions for OSS Device handling. This - * set of functions takes care of device setting/getting, - * opening/closing devices, parsing caps to OSS formats/settings - * or the other way around, device probing, supported format - * probing and mixer integration. + * gstosshelper.h: OSS helper routines. @@ -24,128 +20,24 @@ * Boston, MA 02111-1307, USA. */ + #ifndef __GST_OSS_HELPER_H__ #define __GST_OSS_HELPER_H__ #include <sys/types.h> -/* debugging category */ -GST_DEBUG_CATEGORY_EXTERN (oss_debug); -#define GST_CAT_DEFAULT oss_debug - -G_BEGIN_DECLS -enum { - ARG_0, - OSS_ARG_DEVICE, - OSS_ARG_MIXER_DEVICE, - OSS_ARG_DEVICE_NAME, - OSS_ARG_0 -}; -typedef enum { - GST_OSS_MODE_READ, - GST_OSS_MODE_WRITE, - GST_OSS_MODE_VOLUME, - GST_OSS_MODE_MIXER -} GstOssOpenMode; -/* - * Embed those two in whatever object you're creating. - */ -typedef struct _GstOssDeviceCombination { - gchar *dsp, *mixer; - dev_t dev; -} GstOssDeviceCombination; -typedef struct _GstOssDevice { - /* device state */ - int fd; - int caps; /* the capabilities */ - gint format; - gint fragment; - guint64 fragment_time; - gint fragment_size; - GstOssOpenMode mode; - GstCaps *probed_caps; - /* stats bytes per *second* */ - guint bps; - /* sample width in bytes */ - guint sample_width; - /* parameters */ - gint law; - gint endianness; - gboolean sign; - gint width; - gint depth; - gint channels; - gint rate; - /* mixer stuff */ - GList *tracklist; - guint32 stereomask, - recdevs, - recmask, - mixcaps; - gint mixer_fd; - gchar *device_name; -} GstOssDevice; - * class/type/interface handling for mixer/device handling. -void gst_oss_add_mixer_type (GType type); -void gst_oss_add_device_properties (GstElementClass * klass); -void gst_oss_set_device_property (GstElement * element, - GstOssDeviceCombination * c, - GstOssDevice * dev, - guint prop_id, - GParamSpec * pspec, - const GValue * value); -void gst_oss_get_device_property (GstElement * element, - GstOssDevice * d, - GValue * value); - * device open/close. -void gst_oss_init (GObject * obj, - GstOssDeviceCombination * c, - GstOssDevice * dev, - GstOssOpenMode mode); -void gst_oss_dispose (GstOssDeviceCombination * c, - GstOssDevice * dev); -gboolean gst_oss_open (GstElement * element, -void gst_oss_close (GstOssDevice * dev); +G_BEGIN_DECLS - * caps parsing/probing. -gboolean gst_oss_parse_caps (GstOssDevice * dev, - const GstCaps * caps); -gboolean gst_oss_merge_fixed_caps (GstOssDevice * dev, - GstCaps * caps); -gboolean gst_oss_sync_parms (GstOssDevice * dev); -void gst_oss_reset (GstOssDevice * dev); +GstCaps* gst_oss_helper_probe_caps (gint fd); -gboolean gst_oss_convert (GstOssDevice * dev, - GstFormat src_format, - gint64 src_value, - GstFormat * dest_format, - gint64 * dest_value); -void gst_oss_probe_caps (GstOssDevice * dev); G_END_DECLS #endif /* __GST_OSS_HELPER_H__ */ Index: gstossmixer.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstossmixer.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gstossmixer.c 8 Jul 2005 11:19:19 -0000 1.19 +++ gstossmixer.c 23 Aug 2005 13:26:21 -0000 1.20 @@ -35,257 +35,186 @@ #include <gst/gst-i18n-plugin.h> #include "gstossmixer.h" +#include "gstossmixertrack.h" #define MASK_BIT_IS_SET(mask, bit) \ (mask & (1 << bit)) -static void gst_ossmixer_track_class_init (GstOssMixerTrackClass * klass); -static void gst_ossmixer_track_init (GstOssMixerTrack * track); +static gboolean +gst_ossmixer_open (GstOssMixer * mixer) +{ +#ifdef SOUND_MIXER_INFO + struct mixer_info minfo; +#endif -static gboolean gst_ossmixer_supported (GstImplementsInterface * iface, - GType iface_type); -static const GList *gst_ossmixer_list_tracks (GstMixer * ossmixer); + g_return_val_if_fail (mixer->mixer_fd == -1, FALSE); -static void gst_ossmixer_set_volume (GstMixer * ossmixer, - GstMixerTrack * track, gint * volumes); -static void gst_ossmixer_get_volume (GstMixer * ossmixer, + mixer->mixer_fd = open (mixer->device, O_RDWR); + if (mixer->mixer_fd == -1) { + /* this is valid. OSS devices don't need to expose a mixer */ + GST_DEBUG ("Failed to open mixer device %s, mixing disabled: %s", + mixer->device, strerror (errno)); + return FALSE; + } -static void gst_ossmixer_set_record (GstMixer * ossmixer, - GstMixerTrack * track, gboolean record); -static void gst_ossmixer_set_mute (GstMixer * ossmixer, - GstMixerTrack * track, gboolean mute); + /* get masks */ + if (ioctl (mixer->mixer_fd, SOUND_MIXER_READ_RECMASK, &mixer->recmask) < 0 + || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_RECSRC, &mixer->recdevs) < 0 + || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_STEREODEVS, + &mixer->stereomask) < 0 + || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_DEVMASK, &mixer->devmask) < 0 + || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_CAPS, &mixer->mixcaps) < 0) { + GST_DEBUG ("Failed to get device masks"); + close (mixer->mixer_fd); + mixer->mixer_fd = -1; -static const gchar **labels = NULL; -static GstMixerTrackClass *parent_class = NULL; + /* get name */ + if (ioctl (mixer->mixer_fd, SOUND_MIXER_INFO, &minfo) == 0) { + mixer->cardname = g_strdup (minfo.name); +#else + oss->cardname = g_strdup ("Unknown"); -/* three functions: firstly, OSS has the nasty habit of inserting - * spaces in the labels, we want to get rid of them. Secondly, - * i18n is impossible with OSS' way of providing us with mixer - * labels, so we make a 'given' list of i18n'ed labels. Thirdly, I - * personally don't like the "1337" names that OSS gives to their - * labels ("Vol", "Mic", "Rec"), I'd rather see full names. */ + return TRUE; +} -fill_labels (void) +gst_ossmixer_ensure_track_list (GstOssMixer * mixer) - gint i, pos; - gchar *origs[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; - struct - { - gchar *given, *wanted; - } - cases[] = { - /* Note: this list is simply ripped from soundcard.h. For - * some people, some values might be missing (3D surround, - * etc.) - feel free to add them. That's the reason why - * I'm doing this in such a horribly complicated way. */ - { - "Vol ", _("Volume")} - , { - "Bass ", _("Bass")} - "Trebl", _("Treble")} - "Synth", _("Synth")} - "Pcm ", _("PCM")} - "Spkr ", _("Speaker")} - "Line ", _("Line-in")} - "Mic ", _("Microphone")} - "CD ", _("CD")} - "Mix ", _("Mixer")} - "Pcm2 ", _("PCM-2")} - "Rec ", _("Record")} - "IGain", _("In-gain")} - "OGain", _("Out-gain")} - "Line1", _("Line-1")} - "Line2", _("Line-2")} - "Line3", _("Line-3")} - "Digital1", _("Digital-1")} - "Digital2", _("Digital-2")} - "Digital3", _("Digital-3")} - "PhoneIn", _("Phone-in")} - "PhoneOut", _("Phone-out")} - "Video", _("Video")} - "Radio", _("Radio")} - "Monitor", _("Monitor")} - NULL, NULL} - }; + gint i, master = -1; - labels = g_malloc (sizeof (gchar *) * SOUND_MIXER_NRDEVICES); + g_return_if_fail (mixer->mixer_fd != -1); + if (mixer->tracklist) + return; + /* find master volume */ + if (mixer->devmask & SOUND_MASK_VOLUME) + master = SOUND_MIXER_VOLUME; + else if (mixer->devmask & SOUND_MASK_PCM) + master = SOUND_MIXER_PCM; + else if (mixer->devmask & SOUND_MASK_SPEAKER) + master = SOUND_MIXER_SPEAKER; /* doubtful... */ + /* else: no master, so we won't set any */ + /* build track list */ for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { - for (pos = 0; cases[pos].given != NULL; pos++) { - if (!strcmp (cases[pos].given, origs[i])) { - labels[i] = g_strdup (cases[pos].wanted); - break; - } - } - if (cases[pos].given == NULL) - labels[i] = g_strdup (origs[i]); -} + if (mixer->devmask & (1 << i)) { + GstMixerTrack *track; + gboolean input = FALSE, stereo = FALSE, record = FALSE; -GType -gst_ossmixer_track_get_type (void) -{ - static GType gst_ossmixer_track_type = 0; + /* track exists, make up capabilities */ + if (MASK_BIT_IS_SET (mixer->stereomask, i)) + stereo = TRUE; + if (MASK_BIT_IS_SET (mixer->recmask, i)) + input = TRUE; + if (MASK_BIT_IS_SET (mixer->recdevs, i)) + record = TRUE; - if (!gst_ossmixer_track_type) { - static const GTypeInfo ossmixer_track_info = { - sizeof (GstOssMixerTrackClass), - NULL, - (GClassInitFunc) gst_ossmixer_track_class_init, - sizeof (GstOssMixerTrack), - 0, - (GInstanceInitFunc) gst_ossmixer_track_init, - NULL - }; + /* do we want this in our list? */ + if (!((mixer->dir & GST_OSS_MIXER_CAPTURE && input == TRUE) || + (mixer->dir & GST_OSS_MIXER_PLAYBACK && i != SOUND_MIXER_PCM))) + /* the PLAYBACK case seems hacky, but that's how 0.8 had it */ + continue; - gst_ossmixer_track_type = - g_type_register_static (GST_TYPE_MIXER_TRACK, - "GstOssMixerTrack", &ossmixer_track_info, 0); + /* add track to list */ + track = gst_ossmixer_track_new (mixer->mixer_fd, i, stereo ? 2 : 1, + (record ? GST_MIXER_TRACK_RECORD : 0) | + (input ? GST_MIXER_TRACK_INPUT : + GST_MIXER_TRACK_OUTPUT) | + ((master != i) ? 0 : GST_MIXER_TRACK_MASTER)); + mixer->tracklist = g_list_append (mixer->tracklist, track); + } } - return gst_ossmixer_track_type; -static void -gst_ossmixer_track_class_init (GstOssMixerTrackClass * klass) +GstOssMixer * +gst_ossmixer_new (const char *device, GstOssMixerDirection dir) - parent_class = g_type_class_ref (GST_TYPE_MIXER_TRACK); + GstOssMixer *ret = NULL; -gst_ossmixer_track_init (GstOssMixerTrack * track) - track->lvol = track->rvol = 0; - track->track_num = 0; + g_return_val_if_fail (device != NULL, NULL); -GstMixerTrack * -gst_ossmixer_track_new (GstOssDevice * oss, - gint track_num, gint max_chans, gint flags) - GstOssMixerTrack *osstrack; - GstMixerTrack *track; - gint volume; + ret = g_new0 (GstOssMixer, 1); - if (!labels) - fill_labels (); + ret->device = g_strdup (device); + ret->dir = dir; - osstrack = g_object_new (GST_TYPE_OSSMIXER_TRACK, NULL); - track = GST_MIXER_TRACK (osstrack); - track->label = g_strdup (labels[track_num]); - track->num_channels = max_chans; - track->flags = flags; - track->min_volume = 0; - track->max_volume = 100; - osstrack->track_num = track_num; + if (!gst_ossmixer_open (ret)) + goto error; - /* volume */ - if (ioctl (oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { - g_warning ("Error getting device (%d) volume: %s", - osstrack->track_num, strerror (errno)); - volume = 0; - osstrack->lvol = (volume & 0xff); - if (track->num_channels == 2) { - osstrack->rvol = ((volume >> 8) & 0xff); + return ret; - return track; +error: + if (ret) + gst_ossmixer_free (ret); -void -gst_oss_interface_init (GstImplementsInterfaceClass * klass) - /* default virtual functions */ - klass->supported = gst_ossmixer_supported; + return NULL; void -gst_ossmixer_interface_init (GstMixerClass * klass) +gst_ossmixer_free (GstOssMixer * mixer) - GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; + g_return_if_fail (mixer != NULL); - klass->list_tracks = gst_ossmixer_list_tracks; - klass->set_volume = gst_ossmixer_set_volume; - klass->get_volume = gst_ossmixer_get_volume; - klass->set_mute = gst_ossmixer_set_mute; - klass->set_record = gst_ossmixer_set_record; + if (mixer->device) { + g_free (mixer->device); + mixer->device = NULL; -static gboolean -gst_ossmixer_supported (GstImplementsInterface * iface, GType iface_type) - GstOssDevice *oss = g_object_get_data (G_OBJECT (iface), "oss-data"); + if (mixer->cardname) { + g_free (mixer->cardname); + mixer->cardname = NULL; - g_return_val_if_fail (oss != NULL, FALSE); - g_assert (iface_type == GST_TYPE_MIXER); + if (mixer->tracklist) { + g_list_foreach (mixer->tracklist, (GFunc) g_object_unref, NULL); + g_list_free (mixer->tracklist); + mixer->tracklist = NULL; - return (oss->mixer_fd != -1); + if (mixer->mixer_fd != -1) { + g_free (mixer); /* unused with G_DISABLE_* */ static G_GNUC_UNUSED gboolean -gst_ossmixer_contains_track (GstOssDevice * oss, GstOssMixerTrack * osstrack) +gst_ossmixer_contains_track (GstOssMixer * mixer, GstOssMixerTrack * osstrack) const GList *item; - for (item = oss->tracklist; item != NULL; item = item->next) + for (item = mixer->tracklist; item != NULL; item = item->next) if (item->data == osstrack) return TRUE; return FALSE; -static const GList * -gst_ossmixer_list_tracks (GstMixer * mixer) +const GList * +gst_ossmixer_list_tracks (GstOssMixer * mixer) - GstOssDevice *oss = g_object_get_data (G_OBJECT (mixer), "oss-data"); + gst_ossmixer_ensure_track_list (mixer); - return (const GList *) oss->tracklist; + return (const GList *) mixer->tracklist; -gst_ossmixer_get_volume (GstMixer * mixer, +void +gst_ossmixer_get_volume (GstOssMixer * mixer, GstMixerTrack * track, gint * volumes) gint volume; GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); - /* assert that we're opened and that we're using a known item */ - g_return_if_fail (oss != NULL); - g_return_if_fail (oss->mixer_fd != -1); - g_return_if_fail (gst_ossmixer_contains_track (oss, osstrack)); + g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); if (track->flags & GST_MIXER_TRACK_MUTE) { volumes[0] = osstrack->lvol; @@ -294,7 +223,7 @@ } } else { /* get */ - if (ioctl (oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { + if (ioctl (mixer->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { g_warning ("Error getting recording device (%d) volume: %s", osstrack->track_num, strerror (errno)); volume = 0; @@ -307,18 +236,15 @@ -gst_ossmixer_set_volume (GstMixer * mixer, +gst_ossmixer_set_volume (GstOssMixer * mixer, /* prepare the value for ioctl() */ if (!(track->flags & GST_MIXER_TRACK_MUTE)) { @@ -328,7 +254,7 @@ /* set */ - if (ioctl (oss->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { + if (ioctl (mixer->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { g_warning ("Error setting recording device (%d) volume (0x%x): %s", osstrack->track_num, volume, strerror (errno)); return; @@ -341,28 +267,26 @@ -gst_ossmixer_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute) +gst_ossmixer_set_mute (GstOssMixer * mixer, GstMixerTrack * track, + gboolean mute) int volume; if (mute) { volume = 0; volume = (osstrack->lvol & 0xff); - if (MASK_BIT_IS_SET (oss->stereomask, osstrack->track_num)) { + if (MASK_BIT_IS_SET (mixer->stereomask, osstrack->track_num)) { volume |= ((osstrack->rvol & 0xff) << 8); - if (ioctl (oss->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { + if (ioctl (mixer->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { g_warning ("Error setting mixer recording device volume (0x%x): %s", volume, strerror (errno)); return; @@ -375,17 +299,14 @@ -gst_ossmixer_set_record (GstMixer * mixer, +gst_ossmixer_set_record (GstOssMixer * mixer, GstMixerTrack * track, gboolean record) /* if there's nothing to do... */ if ((record && GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD)) || @@ -393,28 +314,28 @@ /* if we're exclusive, then we need to unset the current one(s) */ - if (oss->mixcaps & SOUND_CAP_EXCL_INPUT) { + if (mixer->mixcaps & SOUND_CAP_EXCL_INPUT) { GList *track; - for (track = oss->tracklist; track != NULL; track = track->next) { + for (track = mixer->tracklist; track != NULL; track = track->next) { GstMixerTrack *turn = (GstMixerTrack *) track->data; turn->flags &= ~GST_MIXER_TRACK_RECORD; - oss->recdevs = 0; + mixer->recdevs = 0; /* set new record bit, if needed */ if (record) { - oss->recdevs |= (1 << osstrack->track_num); + mixer->recdevs |= (1 << osstrack->track_num); - oss->recdevs &= ~(1 << osstrack->track_num); + mixer->recdevs &= ~(1 << osstrack->track_num); /* set it to the device */ - if (ioctl (oss->mixer_fd, SOUND_MIXER_WRITE_RECSRC, &oss->recdevs) < 0) { + if (ioctl (mixer->mixer_fd, SOUND_MIXER_WRITE_RECSRC, &mixer->recdevs) < 0) { g_warning ("Error setting mixer recording devices (0x%x): %s", - oss->recdevs, strerror (errno)); + mixer->recdevs, strerror (errno)); @@ -424,101 +345,3 @@ track->flags &= ~GST_MIXER_TRACK_RECORD; -gst_ossmixer_build_list (GstOssDeviceCombination * c, GstOssDevice * oss) - gint i, devmask, master = -1; -#ifdef SOUND_MIXER_INFO - struct mixer_info minfo; -#endif - g_return_if_fail (oss->mixer_fd == -1); - oss->mixer_fd = open (c->mixer, O_RDWR); - if (oss->mixer_fd == -1) { - /* this is valid. OSS devices don't need to expose a mixer */ - GST_DEBUG ("Failed to open mixer device %s, mixing disabled: %s", - c->mixer, strerror (errno)); - return; - /* get masks */ - if (ioctl (oss->mixer_fd, SOUND_MIXER_READ_RECMASK, &oss->recmask) < 0 || - ioctl (oss->mixer_fd, SOUND_MIXER_READ_RECSRC, &oss->recdevs) < 0 || - ioctl (oss->mixer_fd, SOUND_MIXER_READ_STEREODEVS, &oss->stereomask) < 0 - || ioctl (oss->mixer_fd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0 - || ioctl (oss->mixer_fd, SOUND_MIXER_READ_CAPS, &oss->mixcaps) < 0) { - GST_DEBUG ("Failed to get device masks - disabling mixer"); - close (oss->mixer_fd); - oss->mixer_fd = -1; - /* get name */ - if (ioctl (oss->mixer_fd, SOUND_MIXER_INFO, &minfo) == 0) { - oss->device_name = g_strdup (minfo.name); -#else - oss->device_name = g_strdup ("Unknown"); - /* find master volume */ - if (devmask & SOUND_MASK_VOLUME) - master = SOUND_MIXER_VOLUME; - else if (devmask & SOUND_MASK_PCM) - master = SOUND_MIXER_PCM; - else if (devmask & SOUND_MASK_SPEAKER) - master = SOUND_MIXER_SPEAKER; /* doubtful... */ - /* else: no master, so we won't set any */ - /* build track list */ - for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { - if (devmask & (1 << i)) { - GstMixerTrack *track; - gboolean input = FALSE, stereo = FALSE, record = FALSE; - /* track exists, make up capabilities */ - if (MASK_BIT_IS_SET (oss->stereomask, i)) - stereo = TRUE; - if (MASK_BIT_IS_SET (oss->recmask, i)) - input = TRUE; - if (MASK_BIT_IS_SET (oss->recdevs, i)) - record = TRUE; - /* do we want this in our list? */ - if ((oss->mode == GST_OSS_MODE_READ && input == FALSE) || - (oss->mode == GST_OSS_MODE_WRITE && i != SOUND_MIXER_PCM)) - continue; - /* add track to list */ - track = gst_ossmixer_track_new (oss, i, stereo ? 2 : 1, - (record ? GST_MIXER_TRACK_RECORD : 0) | - (input ? GST_MIXER_TRACK_INPUT : - GST_MIXER_TRACK_OUTPUT) | - ((master != i) ? 0 : GST_MIXER_TRACK_MASTER)); - oss->tracklist = g_list_append (oss->tracklist, track); -gst_ossmixer_free_list (GstOssDevice * oss) - if (oss->mixer_fd == -1) - g_list_foreach (oss->tracklist, (GFunc) g_object_unref, NULL); - g_list_free (oss->tracklist); - oss->tracklist = NULL; - if (oss->device_name) { - g_free (oss->device_name); - oss->device_name = NULL; - close (oss->mixer_fd); - oss->mixer_fd = -1; Index: gstossmixer.h RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstossmixer.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstossmixer.h 8 Jul 2005 11:19:19 -0000 1.8 +++ gstossmixer.h 23 Aug 2005 13:26:21 -0000 1.9 @@ -19,48 +19,153 @@ #ifndef __GST_OSS_MIXER_H__ #define __GST_OSS_MIXER_H__ #include <gst/interfaces/mixer.h> #include "gstosshelper.h" -#define GST_TYPE_OSSMIXER_TRACK \ - (gst_ossmixer_track_get_type ()) -#define GST_OSSMIXER_TRACK(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OSSMIXER_TRACK, \ - GstOssMixerTrack)) -#define GST_OSSMIXER_TRACK_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OSSMIXER_TRACK, \ - GstOssMixerTrackClass)) -#define GST_IS_OSSMIXER_TRACK(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OSSMIXER_TRACK)) -#define GST_IS_OSSMIXER_TRACK_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OSSMIXER_TRACK)) -typedef struct _GstOssMixerTrack { - GstMixerTrack parent; +#define GST_OSS_MIXER(obj) ((GstOssMixer*)(obj)) - gint lvol, rvol; - gint track_num; -} GstOssMixerTrack; -typedef struct _GstOssMixerTrackClass { - GstMixerTrackClass parent; -} GstOssMixerTrackClass; +typedef enum { + GST_OSS_MIXER_CAPTURE = 1<<0, + GST_OSS_MIXER_PLAYBACK = 1<<1, + GST_OSS_MIXER_ALL = GST_OSS_MIXER_CAPTURE | GST_OSS_MIXER_PLAYBACK +} GstOssMixerDirection; -GType gst_ossmixer_track_get_type (void); -void gst_ossmixer_interface_init (GstMixerClass *klass); -void gst_oss_interface_init (GstImplementsInterfaceClass *klass); -void gst_ossmixer_build_list (GstOssDeviceCombination * c, - GstOssDevice *oss); -void gst_ossmixer_free_list (GstOssDevice *oss); +typedef struct _GstOssMixer GstOssMixer; +struct _GstOssMixer { + GList * tracklist; /* list of available tracks */ + gint mixer_fd; + gchar * device; + gchar * cardname; + gint recmask; + gint recdevs; + gint stereomask; + gint devmask; + gint mixcaps; + GstOssMixerDirection dir; +}; +GstOssMixer* gst_ossmixer_new (const gchar *device, + GstOssMixerDirection dir); +void gst_ossmixer_free (GstOssMixer *mixer); +const GList* gst_ossmixer_list_tracks (GstOssMixer * mixer); +void gst_ossmixer_set_volume (GstOssMixer * mixer, + GstMixerTrack * track, + gint * volumes); +void gst_ossmixer_get_volume (GstOssMixer * mixer, +void gst_ossmixer_set_record (GstOssMixer * mixer, + gboolean record); +void gst_ossmixer_set_mute (GstOssMixer * mixer, + gboolean mute); +#define GST_IMPLEMENT_OSS_MIXER_METHODS(Type, interface_as_function) \ +static gboolean \ +interface_as_function ## _supported (Type *this, GType iface_type) \ +{ \ + g_assert (iface_type == GST_TYPE_MIXER); \ + \ + return (this->mixer != NULL); \ +} \ +static const GList* \ +interface_as_function ## _list_tracks (GstMixer * mixer) \ + Type *this = (Type*) mixer; \ + g_return_val_if_fail (this != NULL, NULL); \ + g_return_val_if_fail (this->mixer != NULL, NULL); \ + return gst_ossmixer_list_tracks (this->mixer); \ +static void \ +interface_as_function ## _set_volume (GstMixer * mixer, GstMixerTrack * track, \ + gint * volumes) \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + gst_ossmixer_set_volume (this->mixer, track, volumes); \ +interface_as_function ## _get_volume (GstMixer * mixer, GstMixerTrack * track, \ + gst_ossmixer_get_volume (this->mixer, track, volumes); \ +interface_as_function ## _set_record (GstMixer * mixer, GstMixerTrack * track, \ + gboolean record) \ + gst_ossmixer_set_record (this->mixer, track, record); \ +interface_as_function ## _set_mute (GstMixer * mixer, GstMixerTrack * track, \ + gboolean mute) \ + gst_ossmixer_set_mute (this->mixer, track, mute); \ +interface_as_function ## _interface_init (GstMixerClass * klass) \ + GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; \ + /* set up the interface hooks */ \ + klass->list_tracks = interface_as_function ## _list_tracks; \ + klass->set_volume = interface_as_function ## _set_volume; \ + klass->get_volume = interface_as_function ## _get_volume; \ + klass->set_mute = interface_as_function ## _set_mute; \ + klass->set_record = interface_as_function ## _set_record; \ #endif /* __GST_OSS_MIXER_H__ */ --- NEW FILE: gstossmixertrack.c --- /* GStreamer OSS Mixer implementation * Copyright (C) 2003 Ronald Bultje <rbultje@...> * * gstossmixer.c: mixer interface implementation for OSS * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <sys/ioctl.h> #include <sys/soundcard.h> #include <gst/gst-i18n-plugin.h> #include "gstossmixertrack.h" #define MASK_BIT_IS_SET(mask, bit) \ (mask & (1 << bit)) G_DEFINE_TYPE (GstOssMixerTrack, gst_ossmixer_track, GST_TYPE_MIXER_TRACK); static void gst_ossmixer_track_class_init (GstOssMixerTrackClass * klass) { /* nop */ } gst_ossmixer_track_init (GstOssMixerTrack * track) track->lvol = track->rvol = 0; track->track_num = 0; static const gchar **labels = NULL; /* three functions: firstly, OSS has the nasty habit of inserting * spaces in the labels, we want to get rid of them. Secondly, * i18n is impossible with OSS' way of providing us with mixer * labels, so we make a 'given' list of i18n'ed labels. Thirdly, I * personally don't like the "1337" names that OSS gives to their * labels ("Vol", "Mic", "Rec"), I'd rather see full names. */ fill_labels (void) gint i, pos; gchar *origs[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; struct { gchar *given, *wanted; } cases[] = { /* Note: this list is simply ripped from soundcard.h. For * some people, some values might be missing (3D surround, * etc.) - feel free to add them. That's the reason why * I'm doing this in such a horribly complicated way. */ { "Vol ", _("Volume")} , { "Bass ", _("Bass")} "Trebl", _("Treble")} "Synth", _("Synth")} "Pcm ", _("PCM")} "Spkr ", _("Speaker")} "Line ", _("Line-in")} "Mic ", _("Microphone")} "CD ", _("CD")} "Mix ", _("Mixer")} "Pcm2 ", _("PCM-2")} "Rec ", _("Record")} "IGain", _("In-gain")} "OGain", _("Out-gain")} "Line1", _("Line-1")} "Line2", _("Line-2")} "Line3", _("Line-3")} "Digital1", _("Digital-1")} "Digital2", _("Digital-2")} "Digital3", _("Digital-3")} "PhoneIn", _("Phone-in")} "PhoneOut", _("Phone-out")} "Video", _("Video")} "Radio", _("Radio")} "Monitor", _("Monitor")} NULL, NULL} }; labels = g_malloc (sizeof (gchar *) * SOUND_MIXER_NRDEVICES); for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { for (pos = 0; cases[pos].given != NULL; pos++) { if (!strcmp (cases[pos].given, origs[i])) { labels[i] = g_strdup (cases[pos].wanted); break; } } if (cases[pos].given == NULL) labels[i] = g_strdup (origs[i]); GstMixerTrack * gst_ossmixer_track_new (gint mixer_fd, gint track_num, gint max_chans, gint flags) GstOssMixerTrack *osstrack; GstMixerTrack *track; gint volume; if (!labels) fill_labels (); osstrack = g_object_new (GST_TYPE_OSSMIXER_TRACK, NULL); track = GST_MIXER_TRACK (osstrack); track->label = g_strdup (labels[track_num]); track->num_channels = max_chans; track->flags = flags; track->min_volume = 0; track->max_volume = 100; osstrack->track_num = track_num; /* volume */ if (ioctl (mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { g_warning ("Error getting device (%d) volume: %s", osstrack->track_num, strerror (errno)); volume = 0; osstrack->lvol = (volume & 0xff); if (track->num_channels == 2) { osstrack->rvol = ((volume >> 8) & 0xff); return track; --- NEW FILE: gstossmixertrack.h --- * gstossmixertrack.h: OSS mixer tracks #ifndef __GST_OSS_MIXER_TRACK_H__ #define __GST_OSS_MIXER_TRACK_H__ #include <gst/gst.h> #include <gst/interfaces/mixer.h> #include "gstosshelper.h" G_BEGIN_DECLS #define GST_TYPE_OSSMIXER_TRACK \ (gst_ossmixer_track_get_type ()) #define GST_OSSMIXER_TRACK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OSSMIXER_TRACK, \ GstOssMixerTrack)) #define GST_OSSMIXER_TRACK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OSSMIXER_TRACK, \ GstOssMixerTrackClass)) #define GST_IS_OSSMIXER_TRACK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OSSMIXER_TRACK)) #define GST_IS_OSSMIXER_TRACK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OSSMIXER_TRACK)) typedef struct _GstOssMixerTrack { GstMixerTrack parent; gint lvol, rvol; gint track_num; } GstOssMixerTrack; typedef struct _GstOssMixerTrackClass { GstMixerTrackClass parent; } GstOssMixerTrackClass; GType gst_ossmixer_track_get_type (void); GstMixerTrack* gst_ossmixer_track_new (gint mixer_fd, gint track_num, gint max_chans, gint flags); G_END_DECLS #endif /* __GST_OSS_MIXER_TRACK_H__ */ Index: gstosssink.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.104 retrieving revision 1.105 diff -u -d -r1.104 -r1.105 --- gstosssink.c 23 Aug 2005 09:46:29 -0000 1.104 +++ gstosssink.c 23 Aug 2005 13:26:21 -0000 1.105 @@ -162,27 +162,22 @@ GST_DEBUG ("initializing osssink"); - osssink->element = g_object_new (GST_TYPE_OSSELEMENT, NULL); + osssink->fd = -1; static GstCaps * gst_oss_sink_getcaps (GstBaseSink * bsink) GstOssSink *osssink; - GstOssElement *element; GstCaps *caps; osssink = GST_OSSSINK (bsink); - element = osssink->element; - gst_osselement_probe_caps (element); - if (element->probed_caps == NULL) { - caps = - gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD + if (osssink->fd == -1) { + caps = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD (bsink))); - caps = gst_caps_ref (element->probed_caps); + caps = gst_oss_helper_probe_caps (osssink->fd); return caps; Index: gstosssink.h RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosssink.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gstosssink.h 10 Jul 2005 12:52:20 -0000 1.22 +++ gstosssink.h 23 Aug 2005 13:26:21 -0000 1.23 @@ -28,7 +28,7 @@ #include <gst/audio/gstaudiosink.h> @@ -44,8 +44,6 @@ struct _GstOssSink { GstAudioSink sink; gint fd; gint bytes_per_sample; }; Index: gstosssrc.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.57 retrieving revision 1.58 diff -u -d -r1.57 -r1.58 --- gstosssrc.c 23 Aug 2005 09:46:29 -0000 1.57 +++ gstosssrc.c 23 Aug 2005 13:26:21 -0000 1.58 @@ -192,27 +192,23 @@ GST_DEBUG ("initializing osssrc"); + osssrc->fd = -1; osssrc->device = g_strdup ("/dev/dsp"); - osssrc->element = g_object_new (GST_TYPE_OSSELEMENT, NULL); gst_oss_src_getcaps (GstBaseSrc * bsrc) GstOssSrc *osssrc; osssrc = GST_OSS_SRC (bsrc); - element = osssrc->element; - gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (bsrc))); + if (osssrc->fd == -1) { + caps = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD + (bsrc))); + caps = gst_oss_helper_probe_caps (osssrc->fd); Index: gstosssrc.h RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosssrc.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gstosssrc.h 23 Aug 2005 09:46:29 -0000 1.15 +++ gstosssrc.h 23 Aug 2005 13:26:21 -0000 1.16 #include <gst/audio/gstaudiosrc.h> struct _GstOssSrc { GstAudioSrc src; |
From: <ensonic@fr...> - 2005-08-23 11:54:15
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: ensonic Date: Tue Aug 23 2005 04:54:10 PDT Log message: * docs/gst/gstreamer-sections.txt: * docs/gst/tmpl/.cvsignore: * docs/gst/tmpl/gstbin.sgml: * docs/gst/tmpl/gstbuffer.sgml: * gst/base/gstbasesrc.c: * gst/gstbin.c: (gst_bin_get_type), (gst_bin_class_init): * gst/gstbuffer.c: * gst/gstbuffer.h: * tools/gst-launch.1.in: inlined more doc comments, added missing comments and fixed comments fixed typos Modified files: . : ChangeLog docs/gst : gstreamer-sections.txt docs/gst/tmpl : .cvsignore gst : gstbin.c gstbuffer.c gstbuffer.h gst/base : gstbasesrc.c tools : gst-launch.1.in Removed files: docs/gst/tmpl : gstbin.sgml gstbuffer.sgml Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1383&r2=1.1384 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/gstreamer-sections.txt.diff?r1=1.154&r2=1.155 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/tmpl/.cvsignore.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/tmpl/gstbin.sgml http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/docs/gst/tmpl/gstbuffer.sgml http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbin.c.diff?r1=1.252&r2=1.253 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbuffer.c.diff?r1=1.103&r2=1.104 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbuffer.h.diff?r1=1.89&r2=1.90 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/base/gstbasesrc.c.diff?r1=1.46&r2=1.47 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/tools/gst-launch.1.in.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1383 retrieving revision 1.1384 diff -u -d -r1.1383 -r1.1384 --- ChangeLog 23 Aug 2005 11:38:28 -0000 1.1383 +++ ChangeLog 23 Aug 2005 11:53:57 -0000 1.1384 @@ -1,3 +1,17 @@ +2005-08-23 Stefan Kost <ensonic@...> + + * docs/gst/gstreamer-sections.txt: + * docs/gst/tmpl/.cvsignore: + * docs/gst/tmpl/gstbin.sgml: + * docs/gst/tmpl/gstbuffer.sgml: + * gst/base/gstbasesrc.c: + * gst/gstbin.c: (gst_bin_get_type), (gst_bin_class_init): + * gst/gstbuffer.c: + * gst/gstbuffer.h: + * tools/gst-launch.1.in: + inlined more doc comments, added missing comments and fixed comments + fixed typos 2005-08-23 Thomas Vander Stichele <thomas at apestaart dot org> * gst/gstbuffer.c: (gst_buffer_new_and_alloc): Index: gstreamer-sections.txt RCS file: /cvs/gstreamer/gstreamer/docs/gst/gstreamer-sections.txt,v retrieving revision 1.154 retrieving revision 1.155 diff -u -d -r1.154 -r1.155 --- gstreamer-sections.txt 22 Aug 2005 21:03:33 -0000 1.154 +++ gstreamer-sections.txt 23 Aug 2005 11:53:58 -0000 1.155 @@ -85,6 +85,7 @@ GST_BUFFER_SIZE GST_BUFFER_TIMESTAMP GST_BUFFER_DURATION +GST_BUFFER_CAPS GST_BUFFER_OFFSET GST_BUFFER_OFFSET_END @@ -109,17 +110,20 @@ GST_BUFFER_TIMESTAMP_IS_VALID GST_BUFFER_OFFSET_IS_VALID GST_BUFFER_OFFSET_END_IS_VALID +GST_BUFFER_MALLOCDATA -<SUBSECTION> gst_buffer_stamp gst_buffer_join gst_buffer_merge <SUBSECTION Standard> GST_BUFFER +GST_BUFFER_CLASS GST_IS_BUFFER +GST_IS_BUFFER_CLASS GST_TYPE_BUFFER GST_TYPE_BUFFER_FLAG +GST_BUFFER_CAST <SUBSECTION Private> gst_buffer_get_type gst_buffer_flag_get_type Index: .cvsignore RCS file: /cvs/gstreamer/gstreamer/docs/gst/tmpl/.cvsignore,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- .cvsignore 5 Aug 2005 13:42:09 -0000 1.3 +++ .cvsignore 23 Aug 2005 11:53:58 -0000 1.4 @@ -1,10 +1,14 @@ *.bak unused-build.stamp +gst.sgml gstadapter.sgml gstbasesink.sgml gstbasesrc.sgml gstbasetransform.sgml +gstbin.sgml +gstbuffer.sgml gstcollectpads.sgml +gstevent.sgml gstfakesrc.sgml gstfakesink.sgml gstfilesrc.sgml --- gstbin.sgml DELETED --- --- gstbuffer.sgml DELETED --- Index: gstbasesrc.c RCS file: /cvs/gstreamer/gstreamer/gst/base/gstbasesrc.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -d -r1.46 -r1.47 --- gstbasesrc.c 22 Aug 2005 19:22:34 -0000 1.46 +++ gstbasesrc.c 23 Aug 2005 11:53:58 -0000 1.47 @@ -251,7 +251,7 @@ } /** - * gst_base_src_get_live: + * gst_base_src_is_live: * @src: base source instance * * Check if an element is in live mode. Index: gstbin.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbin.c,v retrieving revision 1.252 retrieving revision 1.253 diff -u -d -r1.252 -r1.253 --- gstbin.c 22 Aug 2005 21:03:33 -0000 1.252 +++ gstbin.c 23 Aug 2005 11:53:58 -0000 1.253 @@ -22,6 +22,46 @@ * MT safe. */ +/** + * SECTION:gstbin + * @short_description: Base class for elements that contain other elements + * + * GstBin is the simplest of the container elements, allowing elements to + * become children of itself. Pads from the child elements can be ghosted to + * the bin, making the bin itself look transparently like any other element, + * allowing for deep nesting of predefined sub-pipelines. + * A new GstBin is created with gst_bin_new(). Use a #GstPipeline instead if you + * want to create a toplevel bin because a normal bin doesn't have a scheduler + * of its own. + * + * After the bin has been created you will typically add elements to it with + * gst_bin_add(). You can remove elements with gst_bin_remove(). + * An element can be retrieved from a bin with gst_bin_get_by_name(), using the + * elements name. gst_bin_get_by_name_recurse_up() is mainly used for internal + * purposes and will query the parent bins when the element is not found in the + * current bin. + * The list of elements in a bin can be retrieved with gst_bin_get_list(). + * After the bin has been set to the PLAYING state (with gst_element_set_state()), + * gst_bin_iterate() is used to process the elements in the bin. + * The "element_added" signal is fired whenever a new element is added to the + * bin. Likewise the "element_removed" signal is fired whenever an element is + * removed from the bin. + * gst_bin_destroy() is used to destroy the bin. + * To control the selection of the clock in a bin, you can use the following + * methods: + * gst_bin_auto_clock() to let the bin select a clock automatically, + * gst_bin_get_clock() to get the current clock of the bin and + * gst_bin_use_clock() to specify a clock explicitly. + * Note that the default behaviour is to automatically select a clock from one + * of the clock providers in the bin. + */ #include "gst_private.h" @@ -183,10 +223,24 @@ parent_class = g_type_class_ref (GST_TYPE_ELEMENT); + /** + * GstBin::element-added: + * @bin: the object which emitted the signal. + * @element: the element that was added to the bin + * + * Will be emitted if a new element was removed/added to this bin. + */ gst_bin_signals[ELEMENT_ADDED] = g_signal_new ("element-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GstBinClass, element_added), NULL, NULL, gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_ELEMENT); + * GstBin::element-removed: + * @element: the element that was removed from the bin + * Will be emitted if an element was removed from this bin. gst_bin_signals[ELEMENT_REMOVED] = g_signal_new ("element-removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GstBinClass, element_removed), NULL, @@ -1688,7 +1742,7 @@ - * gst_bin_get_all_by_interface: + * gst_bin_iterate_all_by_interface: * @bin: bin to find elements in * @interface: interface to be implemented by interface Index: gstbuffer.c RCS file: /cvs/gstreamer/gstreamer/gst/gstbuffer.c,v retrieving revision 1.103 retrieving revision 1.104 diff -u -d -r1.103 -r1.104 --- gstbuffer.c 14 Aug 2005 22:29:07 -0000 1.103 +++ gstbuffer.c 23 Aug 2005 11:53:58 -0000 1.104 @@ -19,7 +19,74 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. - + * SECTION:gstbuffer + * @short_description: Data-passing buffer type, supporting sub-buffers. + * @see_also: #GstPad, #GstMiniObject + * Buffers are the basic unit of data transfer in GStreamer. The GstBuffer type + * provides all the state necessary to define a region of memory as part of a + * stream. Sub-buffers are also supported, allowing a smaller region of a + * buffer to become its own buffer, with mechanisms in place to ensure that + * neither memory space goes away. + * Buffers are usually created with gst_buffer_new(). After a buffer has been + * created one will typically allocate memory for it and set the size of the + * buffer data. The following example creates a buffer that can hold a given + * video frame with a given width, height and bits per plane. + * <example> + * <title>Creating a buffer for a video frame</title> + * <programlisting> + * GstBuffer *buffer; + * gint size, width, height, bpp; + * + * ... + * size = width * height * bpp; + * buffer = gst_buffer_new (); + * GST_BUFFER_SIZE (buffer) = size; + * GST_BUFFER_MALLOCDATA (buffer) = g_alloc (size); + * GST_BUFFER_DATA (buffer) = GST_BUFFER_MALLOCDATA (buffer); + * </programlisting> + * </example> + * Alternatively, use gst_buffer_new_and_alloc() + * to create a buffer with preallocated data of a given size. + * If an element knows what pad you will push the buffer out on, it should use + * gst_pad_alloc_buffer() instead to create a buffer. This allows downstream + * elements to provide special buffers to write in, like hardware buffers. + * gst_buffer_ref() is used to increase the refcount of a buffer. This must be + * done when you want to keep a handle to the buffer after pushing it to the + * next element. + * To efficiently create a smaller buffer out of an existing one, you can + * use gst_buffer_create_sub(). + * If the plug-in wants to modify the buffer in-place, it should first obtain + * a buffer that is safe to modify by using gst_buffer_make_writable(). This + * function is optimized so that a copy will only be made when it is necessary. + * Several flags of the buffer can be set and unset with the GST_BUFFER_FLAG_SET() + * and GST_BUFFER_FLAG_UNSET() macros. Use GST_BUFFER_FLAG_IS_SET() to test it + * a certain #GstBufferFlag is set. + * Buffers can be efficiently merged into a larger buffer with gst_buffer_merge() + * and gst_buffer_span() if the gst_buffer_is_span_fast() function returns TRUE. + * An element should either unref the buffer or push it out on a src pad + * using gst_pad_push() (see #GstPad). + * Buffers usually are freed by unreffing them with gst_buffer_unref(). + * Do not use gst_buffer_free() : this function effectively frees the buffer + * regardless of the refcount, which is dangerous. + * Last reviewed on August 12th, 2004 (0.8.5) #include "gstbuffer.h" @@ -320,7 +387,7 @@ - * gst_buffer_create_subbuffer: + * gst_buffer_create_sub: * @parent: a parent #GstBuffer to create a subbuffer from. * @offset: the offset into parent #GstBuffer. * @size: the size of the new #GstBuffer sub-buffer (with size > 0). Index: gstbuffer.h RCS file: /cvs/gstreamer/gstreamer/gst/gstbuffer.h,v retrieving revision 1.89 retrieving revision 1.90 diff -u -d -r1.89 -r1.90 --- gstbuffer.h 27 Jul 2005 18:33:02 -0000 1.89 +++ gstbuffer.h 23 Aug 2005 11:53:58 -0000 1.90 @@ -33,6 +33,11 @@ typedef struct _GstBuffer GstBuffer; typedef struct _GstBufferClass GstBufferClass; + * GST_BUFFER_TRACE_NAME: + * The name used for tracing memory allocations. #define GST_BUFFER_TRACE_NAME "GstBuffer" #define GST_TYPE_BUFFER (gst_buffer_get_type()) @@ -43,25 +48,157 @@ #define GST_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_BUFFER, GstBufferClass)) #define GST_BUFFER_CAST(obj) ((GstBuffer *)(obj)) + * GST_BUFFER_FLAGS: + * @buf: a #GstBuffer to retrieve the flags from. + * Gets the flags from this buffer. + * Returns: the set of #GstBufferFlag items #define GST_BUFFER_FLAGS(buf) GST_MINI_OBJECT_FLAGS(buf) + * GST_BUFFER_FLAG_IS_SET: + * @buf: a #GstBuffer to query flags of. + * @flag: the #GstBufferFlag to check. + * Gives the status of a given flag of a buffer. + * Returns: %TRUE if flag is set. #define GST_BUFFER_FLAG_IS_SET(buf,flag) GST_MINI_OBJECT_FLAG_IS_SET (buf, flag) + * GST_BUFFER_FLAG_SET: + * @buf: a #GstBuffer to modify flags of. + * @flag: the #GstBufferFlag to set. + * Sets a buffer flag. #define GST_BUFFER_FLAG_SET(buf,flag) GST_MINI_OBJECT_FLAG_SET (buf, flag) + * GST_BUFFER_FLAG_UNSET: + * @flag: the #GstBufferFlag to clear. + * Clears a buffer flag. #define GST_BUFFER_FLAG_UNSET(buf,flag) GST_MINI_OBJECT_FLAG_UNSET (buf, flag) + * GST_BUFFER_DATA: + * @buf: a #GstBuffer to get data pointer of. + * Retrieves a pointer to the data element of this buffer. + * Returns: the pointer to the actual data contents of the buffer. #define GST_BUFFER_DATA(buf) (GST_BUFFER_CAST(buf)->data) + * GST_BUFFER_SIZE: + * @buf: a #GstBuffer to get data size of. + * Gets the size of the data in this buffer. + * Returns: the buffer size in bytes #define GST_BUFFER_SIZE(buf) (GST_BUFFER_CAST(buf)->size) + * GST_BUFFER_TIMESTAMP: + * @buf: a #GstBuffer to get the timestamp of.: + * Gets the timestamp for this buffer. + * Returns: the timestamp for this buffer #define GST_BUFFER_TIMESTAMP(buf) (GST_BUFFER_CAST(buf)->timestamp) + * GST_BUFFER_DURATION: + * @buf: a #GstBuffer to get the duration from. + * Gets the duration in nanoseconds of the data in the buffer. + * Value will be %GST_CLOCK_TIME_NONE if the duration is unknown. + * Returns: the duration of the buffer #define GST_BUFFER_DURATION(buf) (GST_BUFFER_CAST(buf)->duration) + * GST_BUFFER_CAPS: + * @buf: a #GstBuffer to get the caps of. + * Gets the caps for this buffer. + * Returns: the #GstCaps for this buffer #define GST_BUFFER_CAPS(buf) (GST_BUFFER_CAST(buf)->caps) + * GST_BUFFER_OFFSET: + * @buf: a #GstBuffer to get the offset of. + * Gets the offset in the source file of the beginning of this buffer. + * Returns: the start offset for this buffer #define GST_BUFFER_OFFSET(buf) (GST_BUFFER_CAST(buf)->offset) + * GST_BUFFER_OFFSET_END: + * Gets the offset in the source file of the end of this buffer. + * Returns: the end offset for this buffer #define GST_BUFFER_OFFSET_END(buf) (GST_BUFFER_CAST(buf)->offset_end) + * GST_BUFFER_MALLOCDATA: + * @buf: a #GstBuffer to get access to the malloc_data field + * If the buffers data should be automatically freed by buffer management at the + * end of the buffers lifecycle, also set the data to the mallocdata field. #define GST_BUFFER_MALLOCDATA(buf) (GST_BUFFER_CAST(buf)->malloc_data) + * GST_BUFFER_OFFSET_NONE: + * Constant for no-offset return results. #define GST_BUFFER_OFFSET_NONE ((guint64)-1) + * GST_BUFFER_DURATION_IS_VALID: + * @buffer: the #GstBuffer to check for the duration + * Tests if the duration is known. + * Returns: %TRUE for success #define GST_BUFFER_DURATION_IS_VALID(buffer) (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DURATION (buffer))) + * GST_BUFFER_TIMESTAMP_IS_VALID: + * @buffer: the #GstBuffer to check for the timestamp + * Tests if the timestamp is known. #define GST_BUFFER_TIMESTAMP_IS_VALID(buffer) (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer))) + * GST_BUFFER_OFFSET_IS_VALID: + * @buffer: the #GstBuffer to check for the start offset + * Tests if the start offset is known. #define GST_BUFFER_OFFSET_IS_VALID(buffer) (GST_BUFFER_OFFSET (buffer) != GST_BUFFER_OFFSET_NONE) + * GST_BUFFER_OFFSET_END_IS_VALID: + * @buffer: the #GstBuffer to check for the end offset + * Tests if the end offset is known. #define GST_BUFFER_OFFSET_END_IS_VALID(buffer) (GST_BUFFER_OFFSET_END (buffer) != GST_BUFFER_OFFSET_NONE) @@ -115,9 +252,9 @@ guint64 offset; guint64 offset_end; - /*< private >*/ guint8 *malloc_data; + /*< private >*/ gpointer _gst_reserved[GST_PADDING]; }; @@ -131,6 +268,14 @@ GstBuffer* gst_buffer_new (void); GstBuffer* gst_buffer_new_and_alloc (guint size); + * gst_buffer_set_data: + * @buf: The buffer to modify + * @data: The data to set on the buffer + * @size: The size to set on the buffer + * A convenience function to set the data and size on a buffer. #define gst_buffer_set_data(buf, data, size) \ G_STMT_START { \ GST_BUFFER_DATA (buf) = data; \ @@ -138,13 +283,59 @@ } G_STMT_END /* refcounting */ + * gst_buffer_ref: + * @buf: a #GstBuffer to increase the refcount of. + * Increases the refcount of the given buffer by one. #define gst_buffer_ref(buf) GST_BUFFER_CAST (gst_mini_object_ref (GST_MINI_OBJECT (buf))) + * gst_buffer_unref: + * @buf: a #GstBuffer to decrease the refcount of. + * Decreases the refcount of the buffer. If the refcount reaches 0, the buffer + * will be freed. #define gst_buffer_unref(buf) gst_mini_object_unref (GST_MINI_OBJECT (buf)) /* copy buffer */ + * gst_buffer_copy: + * @buf: a #GstBuffer to copy. + * Copies the given buffer using the copy function of the parent #GstData + * structure. + * Returns: a new #GstBuffer copy of the buffer. #define gst_buffer_copy(buf) GST_BUFFER_CAST (gst_mini_object_copy (GST_MINI_OBJECT (buf))) + * gst_buffer_is_writable: + * @buf: a #GstBuffer to check + * Tests if you can safely write data into a buffer's data array. + * Returns: %TRUE if buffer is writable #define gst_buffer_is_writable(buf) gst_mini_object_is_writable (GST_MINI_OBJECT (buf)) + * gst_buffer_make_writable: + * @buf: a #GstBuffer to make writable + * Makes a buffer writable. + * Returns: a #GstBuffer that is writable #define gst_buffer_make_writable(buf) GST_BUFFER_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT (buf))) + * gst_buffer_replace: + * @obuf: a #GstBuffer to receive the data + * @nbuf: a #GstBuffer to take the data from + * Replaces the data in @obuf with the one in @nbuf #define gst_buffer_replace(obuf,nbuf) gst_mini_object_replace ((GstMiniObject **)(obuf), GST_MINI_OBJECT (nbuf)) GstCaps* gst_buffer_get_caps (GstBuffer *buffer); Index: gst-launch.1.in RCS file: /cvs/gstreamer/gstreamer/tools/gst-launch.1.in,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gst-launch.1.in 8 Feb 2005 18:05:29 -0000 1.7 +++ gst-launch.1.in 23 Aug 2005 11:53:58 -0000 1.8 @@ -135,7 +135,7 @@ (second line) is a short cut for using the first line and "thread" as the BINTYPE. .br -Please not the dot that has to be used after the BINTYPE. +Please note the dot that has to be used after the BINTYPE. .B Links |
From: <thomasvs@fr...> - 2005-08-23 11:38:44
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: thomasvs Date: Tue Aug 23 2005 04:38:40 PDT Log message: * gst/gstbuffer.c: (gst_buffer_new_and_alloc): some debugging * gst/gstcaps.h: whitespace fixes * gst/gstpad.c: (gst_pad_activate_push), (gst_pad_alloc_buffer): more debugging * gst/gststructure.c: (gst_caps_structure_fixate_field_boolean): * gst/gststructure.h: add a fixate function for booleans; add a FIXME that these func names should probably be gst_structure_fixate_* Modified files: . : ChangeLog gst : gstcaps.h gstpad.c gststructure.c gststructure.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1382&r2=1.1383 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstcaps.h.diff?r1=1.89&r2=1.90 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstpad.c.diff?r1=1.426&r2=1.427 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gststructure.c.diff?r1=1.48&r2=1.49 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gststructure.h.diff?r1=1.23&r2=1.24 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1382 retrieving revision 1.1383 diff -u -d -r1.1382 -r1.1383 --- ChangeLog 22 Aug 2005 21:03:32 -0000 1.1382 +++ ChangeLog 23 Aug 2005 11:38:28 -0000 1.1383 @@ -1,3 +1,16 @@ +2005-08-23 Thomas Vander Stichele <thomas at apestaart dot org> + + * gst/gstbuffer.c: (gst_buffer_new_and_alloc): + some debugging + * gst/gstcaps.h: + whitespace fixes + * gst/gstpad.c: (gst_pad_activate_push), (gst_pad_alloc_buffer): + more debugging + * gst/gststructure.c: (gst_caps_structure_fixate_field_boolean): + * gst/gststructure.h: + add a fixate function for booleans; add a FIXME that these func + names should probably be gst_structure_fixate_* 2005-08-23 Stefan Kost <ensonic@...> * docs/gst/gstreamer-docs.sgml: Index: gstcaps.h RCS file: /cvs/gstreamer/gstreamer/gst/gstcaps.h,v retrieving revision 1.89 retrieving revision 1.90 diff -u -d -r1.89 -r1.90 --- gstcaps.h 15 Jul 2005 16:10:41 -0000 1.89 +++ gstcaps.h 23 Aug 2005 11:38:28 -0000 1.90 @@ -92,10 +92,10 @@ va_list var_args); /* reference counting */ -GstCaps * gst_caps_ref (GstCaps* caps); +GstCaps * gst_caps_ref (GstCaps* caps); GstCaps * gst_caps_copy (const GstCaps * caps); -GstCaps * gst_caps_make_writable (GstCaps *caps); -void gst_caps_unref (GstCaps* caps); +GstCaps * gst_caps_make_writable (GstCaps *caps); +void gst_caps_unref (GstCaps* caps); GstCaps * gst_static_caps_get (GstStaticCaps *static_caps); @@ -107,7 +107,7 @@ int gst_caps_get_size (const GstCaps *caps); GstStructure * gst_caps_get_structure (const GstCaps *caps, int index); -GstCaps * gst_caps_copy_nth (const GstCaps * caps, gint nth); +GstCaps * gst_caps_copy_nth (const GstCaps * caps, gint nth); void gst_caps_truncate (GstCaps * caps); void gst_caps_set_simple (GstCaps *caps, char *field, ...); @@ -120,11 +120,11 @@ gboolean gst_caps_is_empty (const GstCaps *caps); gboolean gst_caps_is_fixed (const GstCaps *caps); gboolean gst_caps_is_always_compatible (const GstCaps *caps1, - const GstCaps *caps2); + const GstCaps *caps2); gboolean gst_caps_is_subset (const GstCaps *subset, const GstCaps *superset); gboolean gst_caps_is_equal (const GstCaps *caps1, + const GstCaps *caps2); /* operations */ GstCaps * gst_caps_intersect (const GstCaps *caps1, Index: gstpad.c RCS file: /cvs/gstreamer/gstreamer/gst/gstpad.c,v retrieving revision 1.426 retrieving revision 1.427 diff -u -d -r1.426 -r1.427 --- gstpad.c 21 Aug 2005 15:01:18 -0000 1.426 +++ gstpad.c 23 Aug 2005 11:38:28 -0000 1.427 @@ -2302,9 +2302,9 @@ * @buf: a newly allocated buffer * * Allocates a new, empty buffer optimized to push to pad @pad. This - * function only works if @pad is a source pad and has a peer. + * function only works if @pad is a source pad and has a peer. - * You need to check the caps of the buffer after performing this + * You need to check the caps of the buffer after performing this * function and renegotiate to the format if needed. * A new, empty #GstBuffer will be put in the @buf argument. @@ -2346,9 +2346,9 @@ goto flushing; GST_CAT_DEBUG (GST_CAT_PADS, - "calling bufferallocfunc &%s (@%p) of peer pad %s:%s", + "calling bufferallocfunc &%s (@%p) of peer pad %s:%s for size %d", GST_DEBUG_FUNCPTR_NAME (bufferallocfunc), - &bufferallocfunc, GST_DEBUG_PAD_NAME (peer)); + &bufferallocfunc, GST_DEBUG_PAD_NAME (peer), size); GST_UNLOCK (peer); ret = bufferallocfunc (peer, offset, size, caps, buf); Index: gststructure.c RCS file: /cvs/gstreamer/gstreamer/gst/gststructure.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- gststructure.c 31 Jul 2005 11:59:32 -0000 1.48 +++ gststructure.c 23 Aug 2005 11:38:28 -0000 1.49 @@ -1592,6 +1592,7 @@ * Returns: TRUE if the structure could be fixated */ +/* FIXME: rename to gst_structure_... */ gboolean gst_caps_structure_fixate_field_nearest_int (GstStructure * structure, const char *field_name, int target) @@ -1709,3 +1710,57 @@ return FALSE; } +/** + * gst_caps_structure_fixate_field_boolean: + * @structure: a #GstStructure + * @field_name: a field in @structure + * @target: the target value of the fixation + * + * Fixates a #GstStructure by changing the given @field_name field to the given + * @target boolean if that field is not fixed yet. + * Returns: TRUE if the structure could be fixated + */ +gboolean +gst_caps_structure_fixate_field_boolean (GstStructure * structure, + const char *field_name, gboolean target) +{ + const GValue *value; + g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE); + g_return_val_if_fail (IS_MUTABLE (structure), FALSE); + value = gst_structure_get_value (structure, field_name); + if (G_VALUE_TYPE (value) == G_TYPE_BOOLEAN) { + /* already fixed */ + return FALSE; + } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) { + const GValue *list_value; + int i, n; + int best = 0; + int best_index = -1; + n = gst_value_list_get_size (value); + for (i = 0; i < n; i++) { + list_value = gst_value_list_get_value (value, i); + if (G_VALUE_TYPE (list_value) == G_TYPE_BOOLEAN) { + gboolean x = g_value_get_boolean (list_value); + if (best_index == -1 || x == target) { + best_index = i; + best = x; + } + } + } + if (best_index != -1) { + gst_structure_set (structure, field_name, G_TYPE_BOOLEAN, best, NULL); + return TRUE; + } + return FALSE; +} Index: gststructure.h RCS file: /cvs/gstreamer/gstreamer/gst/gststructure.h,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gststructure.h 31 Jul 2005 11:59:32 -0000 1.23 +++ gststructure.h 23 Aug 2005 11:38:28 -0000 1.24 @@ -144,6 +144,10 @@ const char *field_name, double target); +gboolean gst_caps_structure_fixate_field_boolean (GstStructure *structure, + const char *field_name, + gboolean target); G_END_DECLS |
From: <wingo@fr...> - 2005-08-23 09:46:44
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: wingo Date: Tue Aug 23 2005 02:46:41 PDT Log message: 2005-08-23 Andy Wingo <wingo@...> * sys/oss/gstosssrc.h: * sys/oss/gstosssrc.c: Totally ported, dude. * sys/oss/Makefile.am: * sys/oss/gstossaudio.c: Add osssrc. * sys/oss/gstosssink.c: We do native byte order. Modified files: . : ChangeLog sys/oss : Makefile.am gstossaudio.c gstosssink.c gstosssrc.c gstosssrc.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1801&r2=1.1802 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/Makefile.am.diff?r1=1.27&r2=1.28 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstossaudio.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssink.c.diff?r1=1.103&r2=1.104 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.c.diff?r1=1.56&r2=1.57 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/oss/gstosssrc.h.diff?r1=1.14&r2=1.15 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1801 retrieving revision 1.1802 diff -u -d -r1.1801 -r1.1802 --- ChangeLog 23 Aug 2005 07:54:31 -0000 1.1801 +++ ChangeLog 23 Aug 2005 09:46:29 -0000 1.1802 @@ -1,3 +1,13 @@ +2005-08-23 Andy Wingo <wingo@...> + + * sys/oss/gstosssrc.h: + * sys/oss/gstosssrc.c: Totally ported, dude. + * sys/oss/Makefile.am: + * sys/oss/gstossaudio.c: Add osssrc. + + * sys/oss/gstosssink.c: We do native byte order. 2005-08-23 Owen Fraser-Green <owen@...> * gst/realmedia/rmdemux.c (gst_rmdemux_src_event): Fixed bug Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins/sys/oss/Makefile.am,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- Makefile.am 8 Jul 2005 11:19:19 -0000 1.27 +++ Makefile.am 23 Aug 2005 09:46:29 -0000 1.28 @@ -4,7 +4,8 @@ gstosselement.c \ gstosshelper.c \ gstossmixer.c \ - gstosssink.c + gstosssink.c \ + gstosssrc.c # gstossdmabuffer.c Index: gstossaudio.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstossaudio.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstossaudio.c 4 Aug 2005 20:05:51 -0000 1.16 +++ gstossaudio.c 23 Aug 2005 09:46:29 -0000 1.17 @@ -35,9 +35,9 @@ plugin_init (GstPlugin * plugin) { if ( /*!gst_element_register (plugin, "ossmixer", GST_RANK_PRIMARY, - GST_TYPE_OSSELEMENT) || - !gst_element_register (plugin, "osssrc", GST_RANK_PRIMARY, - GST_TYPE_OSSSRC) || */ + GST_TYPE_OSSELEMENT) || */ + !gst_element_register (plugin, "osssrc", GST_RANK_PRIMARY, + GST_TYPE_OSS_SRC) || !gst_element_register (plugin, "osssink", GST_RANK_SECONDARY, GST_TYPE_OSSSINK)) { return FALSE; Index: gstosssink.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosssink.c,v retrieving revision 1.103 retrieving revision 1.104 diff -u -d -r1.103 -r1.104 --- gstosssink.c 8 Aug 2005 16:43:47 -0000 1.103 +++ gstosssink.c 23 Aug 2005 09:46:29 -0000 1.104 @@ -69,10 +69,8 @@ GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " - //"endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " - //"signed = (boolean) { TRUE, FALSE }, " - "endianness = (int) LITTLE_ENDIAN, " - "signed = (boolean) TRUE, " + "endianness = (int) { " G_STRINGIFY (G_BYTE_ORDER) " }, " + "signed = (boolean) { TRUE, FALSE }, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " Index: gstosssrc.c RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosssrc.c,v retrieving revision 1.56 retrieving revision 1.57 diff -u -d -r1.56 -r1.57 --- gstosssrc.c 10 Jul 2005 12:52:20 -0000 1.56 +++ gstosssrc.c 23 Aug 2005 09:46:29 -0000 1.57 @@ -1,6 +1,6 @@ /* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen <omega@...> - * 2000 Wim Taymans <wtay@...> + * 2000,2005 Wim Taymans <wim@...> * * gstosssrc.c: @@ -23,62 +23,66 @@ #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> #include <sys/ioctl.h> +#include <fcntl.h> #include <errno.h> #include <unistd.h> #include <string.h> - -#ifdef HAVE_OSS_INCLUDE_IN_SYS #include <sys/soundcard.h> -#else -#ifdef HAVE_OSS_INCLUDE_IN_ROOT -#include <soundcard.h> -#include <machine/soundcard.h> -#endif /* HAVE_OSS_INCLUDE_IN_ROOT */ -#endif /* HAVE_OSS_INCLUDE_IN_SYS */ +#include "gstosssrc.h" -#include <gstosssrc.h> -#include <gstosselement.h> -#include <gst/audio/audioclock.h> -/* elementfactory information */ static GstElementDetails gst_oss_src_details = GST_ELEMENT_DETAILS ("Audio Source (OSS)", "Source/Audio", - "Read from the sound card", - "Erik Walthinsen <omega@...>"); + "Capture from a sound card via OSS", + "Erik Walthinsen <omega@...>, " "Wim Taymans <wim@...>"); -/* OssSrc signals and args */ enum - /* FILL ME */ - LAST_SIGNAL + PROP_0, + PROP_DEVICE, + PROP_DEVICE_NAME, }; -enum -{ - ARG_0, - ARG_BUFFERSIZE, - ARG_FRAGMENT -}; +GST_BOILERPLATE (GstOssSrc, gst_oss_src, GstAudioSrc, GST_TYPE_AUDIO_SRC); +/* +GST_BOILERPLATE_WITH_INTERFACE (GstOssSrc, gst_oss_src, GstAudioSrc, GST_TYPE_AUDIO_SRC, + GstMixer, GST_TYPE_MIXER, gst_oss_src_mixer); +GST_IMPLEMENT_OSS_MIXER_METHODS (GstOssSrc, gst_oss_src_mixer); +*/ +static void gst_oss_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_oss_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_oss_src_dispose (GObject * object); +static GstCaps *gst_oss_src_getcaps (GstBaseSrc * bsrc); +static gboolean gst_oss_src_open (GstAudioSrc * asrc); +static gboolean gst_oss_src_close (GstAudioSrc * asrc); +static gboolean gst_oss_src_prepare (GstAudioSrc * asrc, + GstRingBufferSpec * spec); +static gboolean gst_oss_src_unprepare (GstAudioSrc * asrc); +static guint gst_oss_src_read (GstAudioSrc * asrc, gpointer data, guint length); +static guint gst_oss_src_delay (GstAudioSrc * asrc); +static void gst_oss_src_reset (GstAudioSrc * asrc); static GstStaticPadTemplate osssrc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, - "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " "signed = (boolean) { TRUE, FALSE }, " - "depth = (int) { 8, 16 }, " + "depth = (int) 16, " "audio/x-raw-int, " @@ -87,64 +91,11 @@ "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]") ); -static void gst_oss_src_base_init (gpointer g_class); -static void gst_oss_src_class_init (GstOssSrcClass * klass); -static void gst_oss_src_init (GstOssSrc * osssrc); -static void gst_oss_src_dispose (GObject * object); -static GstPadLinkReturn gst_oss_src_src_link (GstPad * pad, GstPad * peer); -static GstCaps *gst_oss_src_getcaps (GstPad * pad); -static const GstFormat *gst_oss_src_get_formats (GstPad * pad); -static gboolean gst_oss_src_convert (GstPad * pad, - GstFormat src_format, gint64 src_value, - GstFormat * dest_format, gint64 * dest_value); -static void gst_oss_src_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_oss_src_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstElementStateReturn gst_oss_src_change_state (GstElement * element); -static void gst_oss_src_set_clock (GstElement * element, GstClock * clock); -static GstClock *gst_oss_src_get_clock (GstElement * element); -static GstClockTime gst_oss_src_get_time (GstClock * clock, gpointer data); -static const GstEventMask *gst_oss_src_get_event_masks (GstPad * pad); -static gboolean gst_oss_src_src_event (GstPad * pad, GstEvent * event); -static gboolean gst_oss_src_send_event (GstElement * element, GstEvent * event); -static const GstQueryType *gst_oss_src_get_query_types (GstPad * pad); -static gboolean gst_oss_src_src_query (GstPad * pad, GstQueryType type, - GstFormat * format, gint64 * value); -static void gst_oss_src_loop (GstPad * pad); -static GstElementClass *parent_class = NULL; -/*static guint gst_oss_src_signals[LAST_SIGNAL] = { 0 }; */ -GType -gst_oss_src_get_type (void) +static void +gst_oss_src_dispose (GObject * object) - static GType osssrc_type = 0; - if (!osssrc_type) { - static const GTypeInfo osssrc_info = { - sizeof (GstOssSrcClass), - gst_oss_src_base_init, - NULL, - (GClassInitFunc) gst_oss_src_class_init, - sizeof (GstOssSrc), - 0, - (GInstanceInitFunc) gst_oss_src_init, - }; - osssrc_type = - g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSrc", &osssrc_info, - 0); - } - return osssrc_type; + G_OBJECT_CLASS (parent_class)->dispose (object); } static void @@ -153,6 +104,7 @@ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details (element_class, &gst_oss_src_details); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&osssrc_src_factory)); @@ -161,435 +113,336 @@ GObjectClass *gobject_class; GstElementClass *gstelement_class; + GstBaseSrcClass *gstbasesrc_class; + GstBaseAudioSrcClass *gstbaseaudiosrc_class; + GstAudioSrcClass *gstaudiosrc_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass; + gstaudiosrc_class = (GstAudioSrcClass *) klass; - parent_class = g_type_class_ref (GST_TYPE_OSSELEMENT); - gobject_class->set_property = gst_oss_src_set_property; - gobject_class->get_property = gst_oss_src_get_property; + gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_oss_src_dispose); + gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_oss_src_get_property); + gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_oss_src_set_property); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BUFFERSIZE, - g_param_spec_ulong ("buffersize", "Buffer Size", - "The size of the buffers with samples", 0, G_MAXULONG, 0, - G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAGMENT, - g_param_spec_int ("fragment", "Fragment", - "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", - 0, G_MAXINT, 6, G_PARAM_READWRITE)); + gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_oss_src_getcaps); - gobject_class->dispose = gst_oss_src_dispose; + gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_oss_src_open); + gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_oss_src_prepare); + gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_oss_src_unprepare); + gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_oss_src_close); + gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_oss_src_read); + gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_oss_src_delay); + gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_oss_src_reset); - gstelement_class->change_state = gst_oss_src_change_state; - gstelement_class->send_event = gst_oss_src_send_event; + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "OSS device (usually /dev/dspN)", "/dev/dsp", G_PARAM_READWRITE)); - gstelement_class->set_clock = gst_oss_src_set_clock; - gstelement_class->get_clock = gst_oss_src_get_clock; + g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Human-readable name of the sound device", "", G_PARAM_READABLE)); -gst_oss_src_init (GstOssSrc * osssrc) +gst_oss_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) - osssrc->srcpad = - gst_pad_new_from_template (gst_static_pad_template_get - (&osssrc_src_factory), "src"); - gst_pad_set_loop_function (osssrc->srcpad, gst_oss_src_loop); - gst_pad_set_getcaps_function (osssrc->srcpad, gst_oss_src_getcaps); - gst_pad_set_link_function (osssrc->srcpad, gst_oss_src_src_link); - gst_pad_set_convert_function (osssrc->srcpad, gst_oss_src_convert); - gst_pad_set_formats_function (osssrc->srcpad, gst_oss_src_get_formats); - gst_pad_set_event_function (osssrc->srcpad, gst_oss_src_src_event); - gst_pad_set_event_mask_function (osssrc->srcpad, gst_oss_src_get_event_masks); - gst_pad_set_query_function (osssrc->srcpad, gst_oss_src_src_query); - gst_pad_set_query_type_function (osssrc->srcpad, gst_oss_src_get_query_types); - gst_element_add_pad (GST_ELEMENT (osssrc), osssrc->srcpad); - osssrc->buffersize = 4096; - osssrc->curoffset = 0; + GstOssSrc *src; - osssrc->provided_clock = - gst_audio_clock_new ("ossclock", gst_oss_src_get_time, osssrc); - gst_object_set_parent (GST_OBJECT (osssrc->provided_clock), - GST_OBJECT (osssrc)); + src = GST_OSS_SRC (object); - osssrc->clock = NULL; + switch (prop_id) { + case PROP_DEVICE: + if (src->device) + g_free (src->device); + src->device = g_strdup (g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } -gst_oss_src_dispose (GObject * object) +gst_oss_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) - GstOssSrc *osssrc = (GstOssSrc *) object; - if (osssrc->provided_clock != NULL) { - gst_object_unparent (GST_OBJECT (osssrc->provided_clock)); - osssrc->provided_clock = NULL; + g_value_set_string (value, src->device); + case PROP_DEVICE_NAME: + g_value_set_string (value, src->device_name); } +} - G_OBJECT_CLASS (parent_class)->dispose (object); +gst_oss_src_init (GstOssSrc * osssrc) +{ + GST_DEBUG ("initializing osssrc"); + osssrc->device = g_strdup ("/dev/dsp"); + osssrc->element = g_object_new (GST_TYPE_OSSELEMENT, NULL); static GstCaps * -gst_oss_src_getcaps (GstPad * pad) +gst_oss_src_getcaps (GstBaseSrc * bsrc) - GstOssSrc *src; + GstOssSrc *osssrc; + GstOssElement *element; GstCaps *caps; - src = GST_OSSSRC (GST_PAD_PARENT (pad)); + osssrc = GST_OSS_SRC (bsrc); + element = osssrc->element; - gst_osselement_probe_caps (GST_OSSELEMENT (src)); + gst_osselement_probe_caps (element); - if (GST_OSSELEMENT (src)->probed_caps == NULL) { - caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + if (element->probed_caps == NULL) { + caps = + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (bsrc))); } else { - caps = gst_caps_copy (GST_OSSELEMENT (src)->probed_caps); + caps = gst_caps_ref (element->probed_caps); return caps; -static GstPadLinkReturn -gst_oss_src_src_link (GstPad * pad, GstPad * peer) +static gint +ilog2 (gint x) - return GST_RPAD_LINKFUNC (peer) (peer, pad); + /* well... hacker's delight explains... */ + x = x | (x >> 1); + x = x | (x >> 2); + x = x | (x >> 4); + x = x | (x >> 8); + x = x | (x >> 16); + x = x - ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0f0f0f0f; + x = x + (x >> 8); + x = x + (x >> 16); + return (x & 0x0000003f) - 1; -static gboolean -gst_oss_src_negotiate (GstPad * pad) - GstCaps *allowed; - //allowed = gst_pad_get_allowed_caps (pad); - allowed = NULL; - if (!gst_osselement_merge_fixed_caps (GST_OSSELEMENT (src), allowed)) - return FALSE; +#define SET_PARAM(_oss, _label, _name, _val) \ +G_STMT_START { \ + int _tmp = _val; \ + if (ioctl(_oss->fd, _name, &_tmp) == -1) { \ + perror(_label); \ + return FALSE; \ + } \ + GST_DEBUG_OBJECT (_oss, _label " %d", _tmp); \ +} G_STMT_END - if (!gst_osselement_sync_parms (GST_OSSELEMENT (src))) +#define GET_PARAM(oss, label, name, val) \ + if (ioctl(oss->fd, name, val) == -1) { \ + perror(label); \ - /* set caps on src pad */ - GST_PAD_CAPS (src->srcpad) = - gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, GST_OSSELEMENT (src)->endianness, - "signed", G_TYPE_BOOLEAN, GST_OSSELEMENT (src)->sign, - "width", G_TYPE_INT, GST_OSSELEMENT (src)->width, - "depth", G_TYPE_INT, GST_OSSELEMENT (src)->depth, - "rate", G_TYPE_INT, GST_OSSELEMENT (src)->rate, - "channels", G_TYPE_INT, GST_OSSELEMENT (src)->channels, NULL); +gst_oss_src_get_format (GstBufferFormat fmt) + gint result; - return TRUE; + switch (fmt) { + case GST_MU_LAW: + result = AFMT_MU_LAW; + case GST_A_LAW: + result = AFMT_A_LAW; + case GST_IMA_ADPCM: + result = AFMT_IMA_ADPCM; + case GST_U8: + result = AFMT_U8; + case GST_S16_LE: + result = AFMT_S16_LE; + case GST_S16_BE: + result = AFMT_S16_BE; + case GST_S8: + result = AFMT_S8; + case GST_U16_LE: + result = AFMT_U16_LE; + case GST_U16_BE: + result = AFMT_U16_BE; + case GST_MPEG: + result = AFMT_MPEG; + result = 0; + return result; -static GstClockTime -gst_oss_src_get_time (GstClock * clock, gpointer data) +static gboolean +gst_oss_src_open (GstAudioSrc * asrc) - GstOssSrc *osssrc = GST_OSSSRC (data); - audio_buf_info info; - if (!GST_OSSELEMENT (osssrc)->bps) - return 0; - if (ioctl (GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_GETISPACE, &info) < 0) + GstOssSrc *oss; + int mode; - return (osssrc->curoffset * GST_OSSELEMENT (osssrc)->sample_width + - info.bytes) * GST_SECOND / GST_OSSELEMENT (osssrc)->bps; -} + oss = GST_OSS_SRC (asrc); -static GstClock * -gst_oss_src_get_clock (GstElement * element) - GstOssSrc *osssrc; + mode = O_RDONLY; + mode |= O_NONBLOCK; - osssrc = GST_OSSSRC (element); + oss->fd = open (oss->device, mode, 0); + if (oss->fd == -1) { + perror (oss->device); + return FALSE; - return GST_CLOCK (osssrc->provided_clock); + return TRUE; -static void -gst_oss_src_set_clock (GstElement * element, GstClock * clock) +gst_oss_src_close (GstAudioSrc * asrc) - osssrc->clock = clock; + close (GST_OSS_SRC (asrc)->fd); -gst_oss_src_loop (GstPad * pad) +gst_oss_src_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) - GstBuffer *buf; - glong readbytes; - glong readsamples; - GST_DEBUG ("attempting to read something from the soundcard"); - if (src->need_eos) { - src->need_eos = FALSE; - gst_pad_push_event (pad, gst_event_new (GST_EVENT_EOS)); - return; - buf = gst_buffer_new_and_alloc (src->buffersize); - if (!GST_PAD_CAPS (pad)) { - /* nothing was negotiated, we can decide on a format */ - if (!gst_oss_src_negotiate (pad)) { - gst_buffer_unref (buf); - GST_ELEMENT_ERROR (src, CORE, NEGOTIATION, (NULL), (NULL)); - return; - } - if (GST_OSSELEMENT (src)->bps == 0) { - gst_buffer_unref (buf); - GST_ELEMENT_ERROR (src, CORE, NEGOTIATION, (NULL), - ("format wasn't negotiated before chain function")); + struct audio_buf_info info; + int tmp; - readbytes = read (GST_OSSELEMENT (src)->fd, GST_BUFFER_DATA (buf), - src->buffersize); - if (readbytes < 0) { - GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); - if (readbytes == 0) { + mode = fcntl (oss->fd, F_GETFL); + mode &= ~O_NONBLOCK; + if (fcntl (oss->fd, F_SETFL, mode) == -1) { - readsamples = readbytes * GST_OSSELEMENT (src)->rate / - GST_OSSELEMENT (src)->bps; + tmp = gst_oss_src_get_format (spec->format); + if (tmp == 0) + goto wrong_format; - GST_BUFFER_SIZE (buf) = readbytes; - GST_BUFFER_OFFSET (buf) = src->curoffset; - GST_BUFFER_OFFSET_END (buf) = src->curoffset + readsamples; - GST_BUFFER_DURATION (buf) = - readsamples * GST_SECOND / GST_OSSELEMENT (src)->rate; + tmp = ilog2 (spec->segsize); + tmp = ((spec->segtotal & 0x7fff) << 16) | tmp; + GST_DEBUG ("set segsize: %d, segtotal: %d, value: %08x", spec->segsize, + spec->segtotal, tmp); - /* if we have a clock */ - if (src->clock) { - if (src->clock == src->provided_clock) { - /* if it's our own clock, we can be very accurate */ - GST_BUFFER_TIMESTAMP (buf) = - src->curoffset * GST_SECOND / GST_OSSELEMENT (src)->rate; - } else { - /* somebody elses clock, timestamp with that clock, no discontinuity in - * the stream since the OFFSET is updated correctly. Elements can stretch - * to match timestamps */ - gst_element_get_time (GST_ELEMENT (src)) - GST_BUFFER_DURATION (buf); - } else { - /* no clock, no timestamp */ - GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE; + SET_PARAM (oss, "SETFRAGMENT", SNDCTL_DSP_SETFRAGMENT, tmp); - src->curoffset += readsamples; + SET_PARAM (oss, "RESET", SNDCTL_DSP_RESET, 0); - GST_DEBUG ("pushed buffer from soundcard of %ld bytes, timestamp %" - G_GINT64_FORMAT, readbytes, GST_BUFFER_TIMESTAMP (buf)); + SET_PARAM (oss, "SETFMT", SNDCTL_DSP_SETFMT, tmp); + if (spec->channels == 2) + SET_PARAM (oss, "STEREO", SNDCTL_DSP_STEREO, 1); + SET_PARAM (oss, "CHANNELS", SNDCTL_DSP_CHANNELS, spec->channels); + SET_PARAM (oss, "SPEED", SNDCTL_DSP_SPEED, spec->rate); - gst_pad_push (pad, buf); + GET_PARAM (oss, "GETISPACE", SNDCTL_DSP_GETISPACE, &info); - return; + spec->segsize = info.fragsize; + spec->segtotal = info.fragstotal; + spec->bytes_per_sample = 4; + oss->bytes_per_sample = 4; + memset (spec->silence_sample, 0, spec->bytes_per_sample); -gst_oss_src_set_property (GObject * object, guint prop_id, const GValue * value, - GParamSpec * pspec) + GST_DEBUG ("got segsize: %d, segtotal: %d, value: %08x", spec->segsize, - src = GST_OSSSRC (object); - switch (prop_id) { - case ARG_BUFFERSIZE: - src->buffersize = g_value_get_ulong (value); - break; - case ARG_FRAGMENT: - GST_OSSELEMENT (src)->fragment = g_value_get_int (value); - gst_osselement_sync_parms (GST_OSSELEMENT (src)); - default: +wrong_format: + { + GST_DEBUG ("wrong format %d\n", spec->format); -gst_oss_src_get_property (GObject * object, guint prop_id, GValue * value, +gst_oss_src_unprepare (GstAudioSrc * asrc) + /* could do a SNDCTL_DSP_RESET, but the OSS manual recommends a close/open */ - g_value_set_ulong (value, src->buffersize); - g_value_set_int (value, GST_OSSELEMENT (src)->fragment); - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + if (!gst_oss_src_close (asrc)) + goto couldnt_close; -static GstElementStateReturn -gst_oss_src_change_state (GstElement * element) - GstOssSrc *osssrc = GST_OSSSRC (element); + if (!gst_oss_src_open (asrc)) + goto couldnt_reopen; - GST_DEBUG ("osssrc: state change"); - switch (GST_STATE_TRANSITION (element)) { - case GST_STATE_READY_TO_PAUSED: - osssrc->curoffset = 0; - case GST_STATE_PAUSED_TO_PLAYING: - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssrc->provided_clock), - TRUE); - case GST_STATE_PLAYING_TO_PAUSED: - FALSE); - case GST_STATE_PAUSED_TO_READY: - if (GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) - ioctl (GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_RESET, 0); +couldnt_close: + GST_DEBUG ("Could not close the audio device"); +couldnt_reopen: + GST_DEBUG ("Could not reopen the audio device"); - if (GST_ELEMENT_CLASS (parent_class)->change_state) - return GST_ELEMENT_CLASS (parent_class)->change_state (element); - return GST_STATE_SUCCESS; -static const GstFormat * -gst_oss_src_get_formats (GstPad * pad) - static const GstFormat formats[] = { - GST_FORMAT_TIME, - GST_FORMAT_DEFAULT, - GST_FORMAT_BYTES, - 0 - }; - return formats; -gst_oss_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, - GstFormat * dest_format, gint64 * dest_value) - osssrc = GST_OSSSRC (GST_PAD_PARENT (pad)); - return gst_osselement_convert (GST_OSSELEMENT (osssrc), src_format, src_value, - dest_format, dest_value); -static const GstEventMask * -gst_oss_src_get_event_masks (GstPad * pad) +static guint +gst_oss_src_read (GstAudioSrc * asrc, gpointer data, guint length) - static const GstEventMask gst_oss_src_src_event_masks[] = { - {GST_EVENT_EOS, 0}, - {GST_EVENT_SIZE, 0}, - {0,} - return gst_oss_src_src_event_masks; + return read (GST_OSS_SRC (asrc)->fd, data, length); -gst_oss_src_src_event (GstPad * pad, GstEvent * event) +gst_oss_src_delay (GstAudioSrc * asrc) - gboolean retval = FALSE; + gint delay = 0; + gint ret; - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - osssrc->need_eos = TRUE; - retval = TRUE; - case GST_EVENT_SIZE: - { - GstFormat format; - gint64 value; +#ifdef SNDCTL_DSP_GETODELAY + ret = ioctl (oss->fd, SNDCTL_DSP_GETODELAY, &delay); +#else + ret = -1; +#endif + if (ret < 0) { + audio_buf_info info; - format = GST_FORMAT_BYTES; + ret = ioctl (oss->fd, SNDCTL_DSP_GETOSPACE, &info); - /* convert to bytes */ - if (gst_osselement_convert (GST_OSSELEMENT (osssrc), - GST_EVENT_SIZE_FORMAT (event), - GST_EVENT_SIZE_VALUE (event), &format, &value)) { - osssrc->buffersize = GST_EVENT_SIZE_VALUE (event); - g_object_notify (G_OBJECT (osssrc), "buffersize"); - retval = TRUE; - } + delay = (ret < 0 ? 0 : (info.fragstotal * info.fragsize) - info.bytes); - gst_event_unref (event); - return retval; -gst_oss_src_send_event (GstElement * element, GstEvent * event) - return gst_oss_src_src_event (osssrc->srcpad, event); + return delay / oss->bytes_per_sample; -static const GstQueryType * -gst_oss_src_get_query_types (GstPad * pad) +gst_oss_src_reset (GstAudioSrc * asrc) - static const GstQueryType query_types[] = { - GST_QUERY_POSITION, - 0, - return query_types; -gst_oss_src_src_query (GstPad * pad, GstQueryType type, GstFormat * format, - gint64 * value) - gboolean res = FALSE; + //gint ret; - switch (type) { - case GST_QUERY_POSITION: - res = gst_osselement_convert (GST_OSSELEMENT (osssrc), - GST_FORMAT_DEFAULT, osssrc->curoffset, format, value); - return res; + /* deadlocks on my machine... */ + //ret = ioctl (oss->fd, SNDCTL_DSP_RESET, 0); Index: gstosssrc.h RCS file: /cvs/gstreamer/gst-plugins/sys/oss/gstosssrc.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gstosssrc.h 10 Jul 2005 12:52:20 -0000 1.14 +++ gstosssrc.h 23 Aug 2005 09:46:29 -0000 1.15 @@ -21,58 +21,44 @@ */ -#ifndef __GST_OSSSRC_H__ -#define __GST_OSSSRC_H__ +#ifndef __GST_OSS_SRC_H__ +#define __GST_OSS_SRC_H__ #include <gst/gst.h> +#include <gst/audio/gstaudiosrc.h> #include "gstosselement.h" G_BEGIN_DECLS -#define GST_TYPE_OSSSRC \ - (gst_oss_src_get_type()) -#define GST_OSSSRC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSSSRC,GstOssSrc)) -#define GST_OSSSRC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSSSRC,GstOssSrcClass)) -#define GST_IS_OSSSRC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSSRC)) -#define GST_IS_OSSSRC_CLASS(obj) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSSRC)) -typedef enum { - GST_OSSSRC_OPEN = GST_ELEMENT_FLAG_LAST, - GST_OSSSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2, -} GstOssSrcFlags; +#define GST_TYPE_OSS_SRC (gst_oss_src_get_type()) +#define GST_OSS_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS_SRC,GstOssSrc)) +#define GST_OSS_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS_SRC,GstOssSrcClass)) +#define GST_IS_OSS_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS_SRC)) +#define GST_IS_OSS_SRC_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS_SRC)) typedef struct _GstOssSrc GstOssSrc; typedef struct _GstOssSrcClass GstOssSrcClass; struct _GstOssSrc { - GstOssElement element; + GstAudioSrc src; - /* pads */ - GstPad *srcpad; - gboolean need_eos; /* Do we need to emit an EOS? */ - - /* blocking. - * curoffset is in *samples*. */ - gulong curoffset; - gulong buffersize; + gint fd; + gint bytes_per_sample; - /* clocks */ - GstClock *provided_clock, *clock; + gchar *device; + gchar *device_name; struct _GstOssSrcClass { - GstOssElementClass parent_class; + GstAudioSrcClass parent_class; GType gst_oss_src_get_type(void); G_END_DECLS -#endif /* __GST_OSSSRC_H__ */ +#endif /* __GST_OSS_SRC_H__ */ |
From: <ow3n@fr...> - 2005-08-23 07:54:46
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: ow3n Date: Tue Aug 23 2005 00:54:43 PDT Log message: Fixed mishandling events and incorrect audio skipping after seek. Modified files: . : ChangeLog gst/realmedia : rmdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.1800&r2=1.1801 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/realmedia/rmdemux.c.diff?r1=1.37&r2=1.38 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.1800 retrieving revision 1.1801 diff -u -d -r1.1800 -r1.1801 --- ChangeLog 22 Aug 2005 19:58:57 -0000 1.1800 +++ ChangeLog 23 Aug 2005 07:54:31 -0000 1.1801 @@ -1,3 +1,9 @@ +2005-08-23 Owen Fraser-Green <owen@...> + + * gst/realmedia/rmdemux.c (gst_rmdemux_src_event): Fixed bug + causing events to be passed wrong way. + (gst_rmdemux_parse_packet): Avoid accidentally skipping audio. 2005-08-22 Jan Schmidt <thaytan@...> * ext/mad/gstid3tag.c: (gst_id3_tag_init), Index: rmdemux.c RCS file: /cvs/gstreamer/gst-plugins/gst/realmedia/rmdemux.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -d -r1.37 -r1.38 --- rmdemux.c 22 Aug 2005 07:33:00 -0000 1.37 +++ rmdemux.c 23 Aug 2005 07:54:31 -0000 1.38 @@ -264,7 +264,7 @@ default: GST_LOG_OBJECT (rmdemux, "Event on sink: type=%d", GST_EVENT_TYPE (event)); - ret = gst_pad_event_default (rmdemux->sinkpad, event); + ret = gst_pad_event_default (pad, event); break; } @@ -331,7 +331,7 @@ } GST_LOG_OBJECT (rmdemux, "Event on src: type=%d", GST_EVENT_TYPE (event)); @@ -1460,7 +1460,7 @@ stream = gst_rmdemux_get_stream_by_id (rmdemux, id); - if (rmdemux->offset >= stream->seek_offset) { + if ((rmdemux->offset + packet_size) > stream->seek_offset) { if (gst_pad_alloc_buffer (stream->pad, GST_BUFFER_OFFSET_NONE, packet_size, stream->caps, &buffer) != GST_FLOW_OK) { GST_WARNING_OBJECT (rmdemux, "failed to alloc src buffer for stream %d", @@ -1478,7 +1478,7 @@ } else { GST_DEBUG_OBJECT (rmdemux, - "Stream %d is skipping: seek_offset=%d, offset=%d", stream->id, - stream->seek_offset, rmdemux->offset); + "Stream %d is skipping: seek_offset=%d, offset=%d, packet_size", + stream->id, stream->seek_offset, rmdemux->offset, packet_size); } |