summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2003-05-24 10:45:27 +0000
committerWim Taymans <wim.taymans@gmail.com>2003-05-24 10:45:27 +0000
commit10bb03148d1ee34fcf508465bd6eb1b24752d45d (patch)
treeeca992634fdff67c28e73b6a7a71a02ea35b4007 /sys
parent9dc595c9b9e441c0ff6f4d3dbb550067333e03fb (diff)
- UNITS -> DEFAULT
Original commit message from CVS: - UNITS -> DEFAULT - added chunk_size option to osssink, buffers will be written to the devive in chunks of this size, this can increase the accuracy of the clock on some devices.
Diffstat (limited to 'sys')
-rw-r--r--sys/oss/gstosscommon.c12
-rw-r--r--sys/oss/gstosssink.c34
-rw-r--r--sys/oss/gstosssink.h1
-rw-r--r--sys/oss/gstosssrc.c2
4 files changed, 31 insertions, 18 deletions
diff --git a/sys/oss/gstosscommon.c b/sys/oss/gstosscommon.c
index 16539247..6d96f9c4 100644
--- a/sys/oss/gstosscommon.c
+++ b/sys/oss/gstosscommon.c
@@ -405,12 +405,10 @@ gst_osscommon_convert (GstOssCommon *common, GstFormat src_format, gint64 src_va
switch (src_format) {
case GST_FORMAT_BYTES:
switch (*dest_format) {
- case GST_FORMAT_DEFAULT:
- *dest_format = GST_FORMAT_TIME;
case GST_FORMAT_TIME:
*dest_value = src_value * GST_SECOND / common->bps;
break;
- case GST_FORMAT_UNITS:
+ case GST_FORMAT_DEFAULT:
*dest_value = src_value / (common->channels * common->width);
break;
default:
@@ -419,22 +417,18 @@ gst_osscommon_convert (GstOssCommon *common, GstFormat src_format, gint64 src_va
break;
case GST_FORMAT_TIME:
switch (*dest_format) {
- case GST_FORMAT_DEFAULT:
- *dest_format = GST_FORMAT_BYTES;
case GST_FORMAT_BYTES:
*dest_value = src_value * common->bps / GST_SECOND;
break;
- case GST_FORMAT_UNITS:
+ case GST_FORMAT_DEFAULT:
*dest_value = src_value * common->rate / GST_SECOND;
break;
default:
res = FALSE;
}
break;
- case GST_FORMAT_UNITS:
+ case GST_FORMAT_DEFAULT:
switch (*dest_format) {
- case GST_FORMAT_DEFAULT:
- *dest_format = GST_FORMAT_TIME;
case GST_FORMAT_TIME:
*dest_value = src_value * GST_SECOND / common->rate;
break;
diff --git a/sys/oss/gstosssink.c b/sys/oss/gstosssink.c
index 6a523753..1ce75397 100644
--- a/sys/oss/gstosssink.c
+++ b/sys/oss/gstosssink.c
@@ -77,7 +77,8 @@ enum {
ARG_MUTE,
ARG_FRAGMENT,
ARG_BUFFER_SIZE,
- ARG_SYNC
+ ARG_SYNC,
+ ARG_CHUNK_SIZE,
/* FILL ME */
};
@@ -193,8 +194,11 @@ gst_osssink_class_init (GstOssSinkClass *klass)
"The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)",
0, G_MAXINT, 6, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BUFFER_SIZE,
- g_param_spec_int ("buffer_size", "Buffer size", "The buffer size",
- 0, G_MAXINT, 4096, G_PARAM_READWRITE));
+ g_param_spec_uint ("buffer_size", "Buffer size", "The buffer size",
+ 0, G_MAXINT, 4096, G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHUNK_SIZE,
+ g_param_spec_uint ("chunk_size", "Chunk size", "Write data in chunk sized buffers",
+ 0, G_MAXUINT, 4096, G_PARAM_READWRITE));
gst_osssink_signals[SIGNAL_HANDOFF] =
g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
@@ -231,6 +235,7 @@ gst_osssink_init (GstOssSink *osssink)
gst_osscommon_init (&osssink->common);
osssink->bufsize = 4096;
+ osssink->chunk_size = 4096;
osssink->resync = FALSE;
osssink->sync = TRUE;
osssink->sinkpool = NULL;
@@ -402,8 +407,15 @@ gst_osssink_chain (GstPad *pad, GstBuffer *buf)
}
}
else {
- write (osssink->common.fd, data, size);
- osssink->handled += size;
+ gint to_write;
+ while (size > 0) {
+ to_write = MIN (size, osssink->chunk_size);
+
+ write (osssink->common.fd, data, to_write);
+ size -= to_write;
+ data += to_write;
+ osssink->handled += to_write;
+ }
}
}
/* no clock, try to be as fast as possible */
@@ -426,7 +438,7 @@ gst_osssink_get_formats (GstPad *pad)
{
static const GstFormat formats[] = {
GST_FORMAT_TIME,
- GST_FORMAT_UNITS,
+ GST_FORMAT_DEFAULT,
GST_FORMAT_BYTES,
0
};
@@ -525,7 +537,7 @@ gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, G
break;
case ARG_BUFFER_SIZE:
if (osssink->bufsize == g_value_get_int (value)) break;
- osssink->bufsize = g_value_get_int (value);
+ osssink->bufsize = g_value_get_uint (value);
osssink->sinkpool = gst_buffer_pool_get_default (osssink->bufsize, 6);
g_object_notify (object, "buffer_size");
break;
@@ -533,6 +545,9 @@ gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, G
osssink->sync = g_value_get_boolean (value);
g_object_notify (G_OBJECT (osssink), "sync");
break;
+ case ARG_CHUNK_SIZE:
+ osssink->chunk_size = g_value_get_uint (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -557,11 +572,14 @@ gst_osssink_get_property (GObject *object, guint prop_id, GValue *value, GParamS
g_value_set_int (value, osssink->common.fragment);
break;
case ARG_BUFFER_SIZE:
- g_value_set_int (value, osssink->bufsize);
+ g_value_set_uint (value, osssink->bufsize);
break;
case ARG_SYNC:
g_value_set_boolean (value, osssink->sync);
break;
+ case ARG_CHUNK_SIZE:
+ g_value_set_uint (value, osssink->chunk_size);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
diff --git a/sys/oss/gstosssink.h b/sys/oss/gstosssink.h
index b61243fe..689d6009 100644
--- a/sys/oss/gstosssink.h
+++ b/sys/oss/gstosssink.h
@@ -68,6 +68,7 @@ struct _GstOssSink {
gboolean mute;
guint bufsize;
+ guint chunk_size;
};
diff --git a/sys/oss/gstosssrc.c b/sys/oss/gstosssrc.c
index 5f545db0..68593d80 100644
--- a/sys/oss/gstosssrc.c
+++ b/sys/oss/gstosssrc.c
@@ -473,7 +473,7 @@ gst_osssrc_get_formats (GstPad *pad)
{
static const GstFormat formats[] = {
GST_FORMAT_TIME,
- GST_FORMAT_UNITS,
+ GST_FORMAT_DEFAULT,
GST_FORMAT_BYTES,
0
};