From ea01358b3bca9d55402ba632c95cdd6458abfdb3 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 22 Nov 2009 15:58:00 +0100 Subject: Version 1.7.10 - Updated the Italian OSD texts (thanks to Diego Pierotto). - Fixed wrong bracketing in cChannel::SubtitlingType() etc. (thanks to Rolf Ahrenberg). - Fixed not logging changes for channels that have no number (reported by Timothy D. Lenz). - Changed the project's URLs and email to tvdr.de. - Added Lithuanian language translations (thanks to Valdemaras Pipiras). - Updated Chinese language texts (thanks to Nan Feng). - Only checking DVB_API_VERSION to be >=5 in order to stay compileable in case the DVB API version number is increased (the API claims to always be backward compatible). - Fixed saving terminal settings when running in background (thanks to Manuel Reimer). - Fixed cFrameDetector::Analyze() to handle video streams where the frame type is not detectable from the first TS packet of a frame. - Fixed writing the PCR pid into the PMT in cPatPmtGenerator::GeneratePmt() (reported by Rene van den Braken). - Added Slovakian language texts (thanks to Milan Hrala). - Fixed EntriesOnSameFileSystem() to avoid using f_fsid, which may be 0 (thanks to Frank Schmirler). - Fixed starting a recording at an I-frame. - Fixed generating the index for recordings from channels that put a whole GOP into one payload unit. - The index file for TS recordings is now regenerated on-the-fly if a recording is replayed that has no index. This can also be used to re-create a broken index file by manually deleting the index file and then replaying the recording (at least until the index file has been generated). - The cRingBufferLinear::Read() function now returns -1 and sets errno to EAGAIN if the buffer is already full. - Fixed handling DVB subtitles for PES recordings (thanks to Rolf Ahrenberg). - Added the audio id to the call of PlayAudio() in cDevice::PlayTsAudio() (thanks to Andreas Schaefers). - Fixed references to old *.vdr file names in MANUAL (reported by Arthur Konovalov). - Reverted "Removed limitation to PAL resolution from SPU handling" because it cause nothing but trouble. Besides, the core VDR doesn't use this, anyway. - Fixed the default value for "Pause key handling" in the MANUAL (reported by Diego Pierotto). --- ringbuffer.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'ringbuffer.c') diff --git a/ringbuffer.c b/ringbuffer.c index fd8123e..1bdeacc 100644 --- a/ringbuffer.c +++ b/ringbuffer.c @@ -7,7 +7,7 @@ * Parts of this file were inspired by the 'ringbuffy.c' from the * LinuxDVB driver (see linuxtv.org). * - * $Id: ringbuffer.c 2.2 2009/05/17 10:05:17 kls Exp $ + * $Id: ringbuffer.c 2.3 2009/11/22 11:14:36 kls Exp $ */ #include "ringbuffer.h" @@ -200,7 +200,7 @@ int cRingBufferLinear::Available(void) void cRingBufferLinear::Clear(void) { - tail = head; + tail = head = margin; #ifdef DEBUGRINGBUFFERS lastHead = head; lastTail = tail; @@ -217,7 +217,8 @@ int cRingBufferLinear::Read(int FileHandle, int Max) int free = (diff > 0) ? diff - 1 : Size() - head; if (Tail <= margin) free--; - int Count = 0; + int Count = -1; + errno = EAGAIN; if (free > 0) { if (0 < Max && Max < free) free = Max; @@ -247,6 +248,44 @@ int cRingBufferLinear::Read(int FileHandle, int Max) return Count; } +int cRingBufferLinear::Read(cUnbufferedFile *File, int Max) +{ + int Tail = tail; + int diff = Tail - head; + int free = (diff > 0) ? diff - 1 : Size() - head; + if (Tail <= margin) + free--; + int Count = -1; + errno = EAGAIN; + if (free > 0) { + if (0 < Max && Max < free) + free = Max; + Count = File->Read(buffer + head, free); + if (Count > 0) { + int Head = head + Count; + if (Head >= Size()) + Head = margin; + head = Head; + if (statistics) { + int fill = head - Tail; + if (fill < 0) + fill = Size() + fill; + else if (fill >= Size()) + fill = Size() - 1; + UpdatePercentage(fill); + } + } + } +#ifdef DEBUGRINGBUFFERS + lastHead = head; + lastPut = Count; +#endif + EnableGet(); + if (free == 0) + WaitForPut(); + return Count; +} + int cRingBufferLinear::Put(const uchar *Data, int Count) { if (Count > 0) { -- cgit v1.2.3