mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Now polling the output device in 'Transfer Mode' and retrying to put packets into the ring buffer
This commit is contained in:
parent
05e2966b35
commit
f721c85b46
2
HISTORY
2
HISTORY
@ -1962,3 +1962,5 @@ Video Disk Recorder Revision History
|
||||
- Fixed high CPU load during replay (thanks Marcel Wiesweg for pointing out this
|
||||
one).
|
||||
- Fixed margin handling in cRingBufferLinear.
|
||||
- Now polling the output device in 'Transfer Mode' and retrying to put packets
|
||||
into the ring buffer.
|
||||
|
16
transfer.c
16
transfer.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: transfer.c 1.9 2003/01/26 09:59:35 kls Exp $
|
||||
* $Id: transfer.c 1.10 2003/02/15 14:12:41 kls Exp $
|
||||
*/
|
||||
|
||||
#include "transfer.h"
|
||||
@ -50,9 +50,16 @@ void cTransfer::Activate(bool On)
|
||||
void cTransfer::Receive(uchar *Data, int Length)
|
||||
{
|
||||
if (IsAttached()) {
|
||||
int i = 0;
|
||||
while (active && Length > 0) {
|
||||
if (i++ > 10) {
|
||||
esyslog("ERROR: ring buffer overflow (%d bytes dropped)", Length);
|
||||
break;
|
||||
}
|
||||
int p = ringBuffer->Put(Data, Length);
|
||||
if (p != Length && active)
|
||||
esyslog("ERROR: ring buffer overflow (%d bytes dropped)", Length - p);
|
||||
Length -= p;
|
||||
Data += p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,6 +97,8 @@ void cTransfer::Action(void)
|
||||
if (p) {
|
||||
StripAudioPackets(p, Result, audioTrack);
|
||||
while (Result > 0 && active) {
|
||||
cPoller Poller;
|
||||
if (DevicePoll(Poller, 100)) {
|
||||
int w = PlayVideo(p, Result);
|
||||
if (w > 0) {
|
||||
p += w;
|
||||
@ -102,6 +111,7 @@ void cTransfer::Action(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
usleep(1); // this keeps the CPU load low
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user