summaryrefslogtreecommitdiffstats
path: root/sys/oss
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2002-07-24 21:46:03 +0000
committerWim Taymans <wim.taymans@gmail.com>2002-07-24 21:46:03 +0000
commitba4646de1f886504e9789adc45fddd092e241960 (patch)
tree34eb8025e4dff3adb03cfb7932ecbf0849c0958b /sys/oss
parentc44396be678491715e7624775d9a5092f4fcaa0f (diff)
- eventmask/query/format functions
Original commit message from CVS: - eventmask/query/format functions - expose oss format as an enum - moved default_pool allocation to where it is needed.
Diffstat (limited to 'sys/oss')
-rw-r--r--sys/oss/gstosssink.c66
1 files changed, 59 insertions, 7 deletions
diff --git a/sys/oss/gstosssink.c b/sys/oss/gstosssink.c
index e47328a4..2905977f 100644
--- a/sys/oss/gstosssink.c
+++ b/sys/oss/gstosssink.c
@@ -53,8 +53,10 @@ static void gst_osssink_set_clock (GstElement *element, GstClock *clock);
static GstClock* gst_osssink_get_clock (GstElement *element);
static GstClockTime gst_osssink_get_time (GstClock *clock, gpointer data);
+static const GstFormat* gst_osssink_get_formats (GstPad *pad);
static gboolean gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value,
GstFormat *dest_format, gint64 *dest_value);
+static const GstPadQueryType* gst_osssink_get_query_types (GstPad *pad);
static gboolean gst_osssink_query (GstElement *element, GstPadQueryType type,
GstFormat *format, gint64 *value);
static gboolean gst_osssink_sink_query (GstPad *pad, GstPadQueryType type,
@@ -131,6 +133,29 @@ gst_osssink_channels_get_type(void) {
return osssink_channels_type;
}
+#define GST_TYPE_OSSSINK_FORMAT (gst_osssink_format_get_type())
+static GType
+gst_osssink_format_get_type(void) {
+ static GType osssink_format_type = 0;
+ static GEnumValue osssink_format[] = {
+ {AFMT_MU_LAW, G_STRINGIFY(AFMT_MU_LAW), "mulaw"},
+ {AFMT_A_LAW, G_STRINGIFY(AFMT_A_LAW), "alaw"},
+ {AFMT_IMA_ADPCM, G_STRINGIFY(AFMT_IMA_ADPCM), "IMA ADPCM"},
+ {AFMT_U8, G_STRINGIFY(AFMT_U8), "Unsigned 8 bits"},
+ {AFMT_S16_LE, G_STRINGIFY(AFMT_S16_LE), "Signed 16 bits little endian"},
+ {AFMT_S16_BE, G_STRINGIFY(AFMT_S16_BE), "Signed 16 bits big endian"},
+ {AFMT_S8, G_STRINGIFY(AFMT_S8), "Signed 8 bits"},
+ {AFMT_U16_LE, G_STRINGIFY(AFMT_U16_LE), "Unsigned 16 bits little endian"},
+ {AFMT_U16_BE, G_STRINGIFY(AFMT_U16_BE), "Unsigned 16 bits big endian"},
+ {AFMT_MPEG, G_STRINGIFY(AFMT_MPEG), "MPEG"},
+ {AFMT_AC3, G_STRINGIFY(AFMT_AC3), "AC3"},
+ {0, NULL, NULL},
+ };
+ if (!osssink_format_type) {
+ osssink_format_type = g_enum_register_static("GstAudiosinkFormat", osssink_format);
+ }
+ return osssink_format_type;
+}
static GstElementClass *parent_class = NULL;
static guint gst_osssink_signals[LAST_SIGNAL] = { 0 };
@@ -165,6 +190,10 @@ gst_osssink_get_bufferpool (GstPad *pad)
oss = GST_OSSSINK (gst_pad_get_parent(pad));
+ /* 6 buffers per chunk by default */
+ if (!oss->sinkpool)
+ oss->sinkpool = gst_buffer_pool_get_default (oss->bufsize, 6);
+
return oss->sinkpool;
}
@@ -199,10 +228,9 @@ gst_osssink_class_init (GstOssSinkClass *klass)
g_param_spec_boolean("sync","Sync","If syncing on timestamps should be enabled",
TRUE, G_PARAM_READWRITE));
- /* it would be nice to show format in symbolic form, oh well */
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FORMAT,
- g_param_spec_int ("format","format","format",
- 0, G_MAXINT, AFMT_S16_LE, G_PARAM_READWRITE));
+ g_param_spec_enum ("format","format","format",
+ GST_TYPE_OSSSINK_FORMAT, AFMT_S16_LE, G_PARAM_READWRITE));
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_CHANNELS,
g_param_spec_enum("channels","channels","channels",
@@ -240,6 +268,8 @@ gst_osssink_init (GstOssSink *osssink)
gst_pad_set_bufferpool_function (osssink->sinkpad, gst_osssink_get_bufferpool);
gst_pad_set_convert_function (osssink->sinkpad, gst_osssink_convert);
gst_pad_set_query_function (osssink->sinkpad, gst_osssink_sink_query);
+ gst_pad_set_query_type_function (osssink->sinkpad, gst_osssink_get_query_types);
+ gst_pad_set_formats_function (osssink->sinkpad, gst_osssink_get_formats);
gst_pad_set_chain_function (osssink->sinkpad, gst_osssink_chain);
@@ -258,8 +288,7 @@ gst_osssink_init (GstOssSink *osssink)
osssink->bps = 0;
osssink->resync = FALSE;
osssink->sync = TRUE;
- /* 6 buffers per chunk by default */
- osssink->sinkpool = gst_buffer_pool_get_default (osssink->bufsize, 6);
+ osssink->sinkpool = NULL;
osssink->provided_clock = GST_CLOCK (gst_oss_clock_new ("ossclock", gst_osssink_get_time, osssink));
osssink->handled = 0;
@@ -573,6 +602,18 @@ gst_osssink_chain (GstPad *pad, GstBuffer *buf)
gst_buffer_unref (buf);
}
+static const GstFormat*
+gst_osssink_get_formats (GstPad *pad)
+{
+ static const GstFormat formats[] = {
+ GST_FORMAT_TIME,
+ GST_FORMAT_UNITS,
+ GST_FORMAT_BYTES,
+ 0
+ };
+ return formats;
+}
+
static gboolean
gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value,
GstFormat *dest_format, gint64 *dest_value)
@@ -641,6 +682,17 @@ gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value,
return res;
}
+static const GstPadQueryType*
+gst_osssink_get_query_types (GstPad *pad)
+{
+ static const GstPadQueryType query_types[] = {
+ GST_PAD_QUERY_LATENCY,
+ GST_PAD_QUERY_POSITION,
+ 0,
+ };
+ return query_types;
+}
+
static gboolean
gst_osssink_sink_query (GstPad *pad, GstPadQueryType type, GstFormat *format, gint64 *value)
{
@@ -708,7 +760,7 @@ gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, G
g_object_notify (G_OBJECT (osssink), "mute");
break;
case ARG_FORMAT:
- osssink->format = g_value_get_int (value);
+ osssink->format = g_value_get_enum (value);
gst_osssink_sync_parms (osssink);
break;
case ARG_CHANNELS:
@@ -755,7 +807,7 @@ gst_osssink_get_property (GObject *object, guint prop_id, GValue *value, GParamS
g_value_set_boolean (value, osssink->mute);
break;
case ARG_FORMAT:
- g_value_set_int (value, osssink->format);
+ g_value_set_enum (value, osssink->format);
break;
case ARG_CHANNELS:
g_value_set_enum (value, osssink->channels);