jack: don't crash in ringbuffer with SIGFPE on small buffer-times
authorStefan Kost <ensonic@users.sf.net>
Sun, 11 Oct 2009 21:51:27 +0000 (00:51 +0300)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Sun, 2 Jan 2011 14:30:07 +0000 (14:30 +0000)
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

ext/jack/gstjackaudiosink.c

index 58a699d..4c48ab9 100644 (file)
@@ -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);