summaryrefslogtreecommitdiffstats
path: root/sys/oss
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2006-10-17 14:37:49 +0000
committerWim Taymans <wim.taymans@gmail.com>2006-10-17 14:37:49 +0000
commitbad39277cfda05fbfcd02389debc623640d54a3c (patch)
tree02effb4098b5bd35630001384f3cc6b1fdd80031 /sys/oss
parenta2b7998dad02e373db08df4cf41afa27d56393a3 (diff)
sys/oss/gstosssink.c: Some drivers do not support unsetting the non-blocking flag once the device is opened. In those...
Original commit message from CVS: * sys/oss/gstosssink.c: (gst_oss_sink_prepare): Some drivers do not support unsetting the non-blocking flag once the device is opened. In those cases, close/open the device in non-blocking mode. Fixes #362673.
Diffstat (limited to 'sys/oss')
-rw-r--r--sys/oss/gstosssink.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/oss/gstosssink.c b/sys/oss/gstosssink.c
index 7e1e32bb..1351d1b9 100644
--- a/sys/oss/gstosssink.c
+++ b/sys/oss/gstosssink.c
@@ -427,10 +427,17 @@ gst_oss_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec)
oss = GST_OSSSINK (asink);
+ /* we opened non-blocking so that we can detect if the device is available
+ * without hanging forever. We now want to remove the non-blocking flag. */
mode = fcntl (oss->fd, F_GETFL);
mode &= ~O_NONBLOCK;
- if (fcntl (oss->fd, F_SETFL, mode) == -1)
- goto non_block;
+ if (fcntl (oss->fd, F_SETFL, mode) == -1) {
+ /* some drivers do no support unsetting the non-blocking flag, try to
+ * close/open the device then. This is racy but we error out properly. */
+ gst_oss_sink_close (asink);
+ if ((oss->fd = open (oss->device, O_WRONLY, 0)) == -1)
+ goto non_block;
+ }
tmp = gst_oss_sink_get_format (spec->format);
if (tmp == 0)
@@ -458,7 +465,6 @@ gst_oss_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec)
spec->bytes_per_sample = (spec->width / 8) * spec->channels;
oss->bytes_per_sample = (spec->width / 8) * spec->channels;
- memset (spec->silence_sample, 0, spec->bytes_per_sample);
GST_DEBUG_OBJECT (oss, "got segsize: %d, segtotal: %d, value: %08x",
spec->segsize, spec->segtotal, tmp);