1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed flushing old data from the section handler

This commit is contained in:
Klaus Schmidinger 2021-06-08 15:10:51 +02:00
parent 7b1c097958
commit 0f6265a97f
4 changed files with 22 additions and 9 deletions

View File

@ -3659,6 +3659,7 @@ Helmut Binder <cco@aon.at>
for avoiding a lengthy lock on the Channels list when starting a recording
for preventing switching devices for pattern timers
for pointing out that cChannel::Transponder(void) is called very often
for fixing flushing old data from the section handler
Ulrich Eckhardt <uli@uli-eckhardt.de>
for reporting a problem with shutdown after user inactivity in case a plugin is

View File

@ -9716,3 +9716,4 @@ Video Disk Recorder Revision History
std::min(), std::max() and std::swap() if available (thanks to Winfried Köhler).
- No longer permanently looping through PMT PIDs, which caused problems with some
SatIP receivers (reported by André Weidemann; with help from Helmut Binder).
- Fixed flushing old data from the section handler (thanks to Helmut Binder).

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: sections.c 4.2 2020/11/24 21:19:49 kls Exp $
* $Id: sections.c 5.1 2021/06/08 15:10:51 kls Exp $
*/
#include "sections.h"
@ -48,6 +48,8 @@ cSectionHandler::cSectionHandler(cDevice *Device)
statusCount = 0;
on = false;
waitForLock = false;
flush = false;
startFilters = false;
Start();
}
@ -146,13 +148,15 @@ void cSectionHandler::SetStatus(bool On)
{
Lock();
if (on != On) {
if (!On || device->HasLock()) {
if (!On || (device->HasLock() && startFilters)) {
statusCount++;
for (cFilter *fi = filters.First(); fi; fi = filters.Next(fi)) {
fi->SetStatus(false);
if (On)
fi->SetStatus(true);
}
if (flush = On)
flushTimer.Set();
on = On;
waitForLock = false;
}
@ -162,13 +166,18 @@ void cSectionHandler::SetStatus(bool On)
Unlock();
}
#define FLUSH_TIME 100 // ms
void cSectionHandler::Action(void)
{
while (Running()) {
Lock();
if (waitForLock)
if (waitForLock) {
startFilters = true;
SetStatus(true);
startFilters = false;
}
int NumFilters = filterHandles.Count();
pollfd pfd[NumFilters];
for (cFilterHandle *fh = filterHandles.First(); fh; fh = filterHandles.Next(fh)) {
@ -180,10 +189,7 @@ void cSectionHandler::Action(void)
int oldStatusCount = statusCount;
Unlock();
if (poll(pfd, NumFilters, 1000) > 0) {
bool DeviceHasLock = device->HasLock();
if (!DeviceHasLock)
cCondWait::SleepMs(100);
if (poll(pfd, NumFilters, waitForLock ? 100 : 1000) > 0) {
for (int i = 0; i < NumFilters; i++) {
if (pfd[i].revents & POLLIN) {
cFilterHandle *fh = NULL;
@ -198,7 +204,7 @@ void cSectionHandler::Action(void)
// Read section data:
unsigned char buf[4096]; // max. allowed size for any EIT section
int r = device->ReadFilter(fh->handle, buf, sizeof(buf));
if (!DeviceHasLock)
if (flush)
continue; // we do the read anyway, to flush any data that might have come from a different transponder
if (r > 3) { // minimum number of bytes necessary to get section length
int len = (((buf[1] & 0x0F) << 8) | (buf[2] & 0xFF)) + 3;
@ -217,6 +223,8 @@ void cSectionHandler::Action(void)
}
}
}
if (flush)
flush = flushTimer.Elapsed() <= FLUSH_TIME;
}
}
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: sections.h 4.1 2020/11/24 21:19:49 kls Exp $
* $Id: sections.h 5.1 2021/06/08 15:10:51 kls Exp $
*/
#ifndef __SECTIONS_H
@ -27,6 +27,9 @@ private:
cDevice *device;
int statusCount;
bool on, waitForLock;
bool flush;
bool startFilters;
cTimeMs flushTimer;
cList<cFilter> filters;
cList<cFilterHandle> filterHandles;
void Add(const cFilterData *FilterData);