summaryrefslogtreecommitdiffstats
path: root/sys/oss/gstosssink.c
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/oss/gstosssink.c
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/oss/gstosssink.c')
-rw-r--r--sys/oss/gstosssink.c34
1 files changed, 26 insertions, 8 deletions
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;