summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorStefan Kost <ensonic@users.sf.net>2009-10-12 00:51:27 +0300
committerStefan Kost <ensonic@users.sf.net>2009-10-12 00:51:27 +0300
commit0b08651664ef171e03e802773acc5b9c2965524c (patch)
tree7633bdec46f7198d4c0eee77c1f3d888b236e1be /ext
parentc1c0a4b143ceb10161e12e6c3141bc9e155f3ef6 (diff)
jack: don't crash in ringbuffer with SIGFPE on small buffer-times
Jack overrides user-specified latency-time with the one it gets from jack itself. It also needs to adjust buffer-time somewhat to avoid segtotal being 0
Diffstat (limited to 'ext')
-rw-r--r--ext/jack/gstjackaudiosink.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/ext/jack/gstjackaudiosink.c b/ext/jack/gstjackaudiosink.c
index 58a699d0c..4c48ab982 100644
--- a/ext/jack/gstjackaudiosink.c
+++ b/ext/jack/gstjackaudiosink.c
@@ -440,11 +440,21 @@ gst_jack_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
spec->segsize = buffer_size * sizeof (gfloat) * channels;
spec->latency_time = gst_util_uint64_scale (spec->segsize,
(GST_SECOND / GST_USECOND), spec->rate * spec->bytes_per_sample);
- /* segtotal based on buffer-time latency */
- spec->segtotal = spec->buffer_time / spec->latency_time;
+ if (spec->latency_time < spec->buffer_time) {
+ /* segtotal based on buffer-time latency */
+ spec->segtotal = spec->buffer_time / spec->latency_time;
+ } else {
+ spec->segtotal = 2;
+ spec->buffer_time = spec->latency_time * spec->segtotal;
+ }
+
+ GST_DEBUG_OBJECT (sink, "buffer time: %" G_GINT64_FORMAT " usec",
+ spec->buffer_time);
+ GST_DEBUG_OBJECT (sink, "latency time: %" G_GINT64_FORMAT " usec",
+ spec->latency_time);
- GST_DEBUG_OBJECT (sink, "segsize %d, segtotal %d", spec->segsize,
- spec->segtotal);
+ GST_DEBUG_OBJECT (sink, "buffer_size %d, segsize %d, segtotal %d",
+ buffer_size, spec->segsize, spec->segtotal);
/* allocate the ringbuffer memory now */
buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize);