baseaudiovisualizer: fix last block condition
authorStefan Kost <ensonic@users.sf.net>
Mon, 6 Jun 2011 12:20:30 +0000 (15:20 +0300)
committerStefan Kost <ensonic@users.sf.net>
Mon, 6 Jun 2011 12:25:14 +0000 (15:25 +0300)
Also push out the last frame if we have exact amount of samples. Fix the adapter
flushing to not cause endless loops. Drop a redundant avail() check.

gst/audiovisualizers/gstbaseaudiovisualizer.c

index 3171bc1f8ca1a1ef7357fef32677cecf5b91a2de..52fe5acd425eb3fd098fafdb23a8c41842e58950 100644 (file)
@@ -727,7 +727,8 @@ gst_base_audio_visualizer_chain (GstPad * pad, GstBuffer * buffer)
 
   /* this is what we have */
   avail = gst_adapter_available (scope->adapter);
-  while (avail > sbpf) {
+  GST_LOG_OBJECT (scope, "avail: %u, bpf: %u", avail, sbpf);
+  while (avail >= sbpf) {
     GstBuffer *outbuf;
 
     ret = gst_pad_alloc_buffer_and_set_caps (scope->srcpad,
@@ -770,10 +771,13 @@ gst_base_audio_visualizer_chain (GstPad * pad, GstBuffer * buffer)
 
     GST_LOG_OBJECT (scope, "avail: %u, bpf: %u", avail, sbpf);
     /* we want to take less or more, depending on spf : req_spf */
-    if (avail - sbpf > sbpf)
+    if (avail - sbpf >= sbpf) {
       gst_adapter_flush (scope->adapter, sbpf);
-    else if (avail - sbpf > 0)
+    } else if (avail - sbpf >= 0) {
+      /* just flush a bit and stop */
       gst_adapter_flush (scope->adapter, (avail - sbpf));
+      break;
+    }
     avail = gst_adapter_available (scope->adapter);
 
     if (ret != GST_FLOW_OK)
@@ -781,8 +785,6 @@ gst_base_audio_visualizer_chain (GstPad * pad, GstBuffer * buffer)
 
     if (scope->next_ts != GST_CLOCK_TIME_NONE)
       scope->next_ts += scope->frame_duration;
-
-    avail = gst_adapter_available (scope->adapter);
   }
 
   gst_object_unref (scope);