> void cRecorder::Receive(uchar *Data, int Length)
> {
>   if (Running()) {
>      int p = ringBuffer->Put(Data, Length);
>      if (p != Length && Running())
>         ringBuffer->ReportOverflow(Length - p);
>      }
> }
> 
> it simply drops any data that does not fit into the buffer, which would be 
> fine
> for live viewing, but isn't ideal when recording.
> 
> Can we try harder not to loose data here? IOW can this function sleep (and 
> retry)?

It took a while to trigger the condition again, but now it happened and trying 
a bit
harder payed off. Running vdr /w following patch resulted in this log (and no 
overflow):

20:31:35 vdr: [16328] buffer usage: 70% (tid=16327)
20:31:35 vdr: [16328] buffer usage: 80% (tid=16327)
20:31:35 vdr: [16328] buffer usage: 90% (tid=16327)
20:31:35 vdr: [16328] buffer usage: 100% (tid=16327)
20:31:35 vdr: [16327] Enlarging ring buffer "Result": 262144 bytes (trigger 3)
20:31:35 vdr: [16329] Enlarging ring buffer "TS": 262144 bytes (trigger 2)
20:31:35 vdr: [16328] Enlarging ring buffer "Recorder": 262144 bytes (trigger 3)
20:31:35 vdr: [16328] buffer usage: 0% (tid=16327)
20:31:35 vdr: [16328] saved extra 153 bytes in recorder ring buffer after 80 ms 
delay

artur

diff --git a/recorder.c b/recorder.c
index 8bb1621..3c0e002 100644
--- a/recorder.c
+++ b/recorder.c
@@ -157,8 +157,20 @@ void cRecorder::Receive(uchar *Data, int Length)
 {
   if (Running()) {
      int p = ringBuffer->Put(Data, Length);
-     if (p != Length && Running())
+     if (p != Length && Running()) {
+        for (int ms=20; ms<1000; ms+=ms) {
+           cCondWait::SleepMs(ms);
+           if (!Running())
+              return;
+           int r = ringBuffer->Put(Data+p, Length-p);
+           p += r;
+           if (r)
+              dsyslog("saved extra %d bytes in recorder ring buffer after %d 
ms delay", r, ms);
+           if (p == Length || !Running())
+              return;
+           }
         ringBuffer->ReportOverflow(Length - p);
+        }
      }
 }


_______________________________________________
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr

Reply via email to