diff options
-rw-r--r-- | CONTRIBUTORS | 9 | ||||
-rw-r--r-- | HISTORY | 19 | ||||
-rw-r--r-- | ci.c | 4 | ||||
-rw-r--r-- | config.h | 4 | ||||
-rw-r--r-- | device.c | 21 | ||||
-rw-r--r-- | dvbosd.c | 13 | ||||
-rw-r--r-- | eit.c | 11 | ||||
-rw-r--r-- | eitscan.c | 61 | ||||
-rw-r--r-- | eitscan.h | 5 | ||||
-rw-r--r-- | vdr.c | 12 |
10 files changed, 89 insertions, 70 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index fe70f1a..09a2bd6 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -87,6 +87,7 @@ Peter Hofmann <software@pxh.de> Axel Gruber <axel@agm.de> for his support in keeping the Premiere World channels up to date in 'channels.conf' + for helping to debug support for Viaccess CAMs Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com> for translating OSD texts to the Dutch language @@ -544,3 +545,11 @@ Jan Ekholm <chakie@infa.abo.fi> Marcel Wiesweg <marcel.wiesweg@gmx.de> for pointing out a problem with high CPU load during replay for reporting broken support for raw OSDs of plugins + +Torsten Herz <torsten.herz@web.de> + for fixing a possible deadlock when using the "Blue" button in the "Schedules" menu + to switch to an other channel + for reporting a wrong EPG bugfix code number for the MAX_USEFUL_SUBTITLE_LENGTH fix + +Steffen Becker <stbecker@rbg.informatik.tu-darmstadt.de> + for reporting a problem with CPU load peaks (in the EPG scanner) @@ -1959,7 +1959,7 @@ Video Disk Recorder Revision History 2003-02-16: Version 1.1.25 -- Fixed high CPU load during replay (thanks Marcel Wiesweg for pointing out this +- Fixed high CPU load during replay (thanks to 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 @@ -1970,3 +1970,20 @@ Video Disk Recorder Revision History - Fixed broken support for raw OSDs of plugins (thanks to Marcel Wiesweg for reporting this one). - Broken CAM connections are now restored automatically. + +2003-03-19: Version 1.1.26 + +- Removed signal handling and usleep(5000) from cDvbOsd::Cmd() (apparently this + is no longer necessary with DVB driver 1.0.0pre2 or later). +- If the primary device (as defined in setup.conf) doesn't have an MPEG decoder + (and thus can't be used as a primary device) VDR now scans all devices at + startup and uses the first one (if any) that actually has an MPEG decoder. + That way this will also work automatically if the primary device is implemented + by a plugin. +- Fixed a possible deadlock when using the "Blue" button in the "Schedules" menu + to switch to an other channel (thanks to Torsten Herz). +- Fixed the EPG bugfix code number for the MAX_USEFUL_SUBTITLE_LENGTH fix (thanks to + Torsten Herz for reporting this one). +- Modified the EPG scanner to avoid CPU load peaks (thanks to Steffen Becker for + reporting this one). +- Fixed support for Viaccess CAMs (thanks to Axel Gruber for helping to debug this). @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: ci.c 1.7 2003/02/16 11:20:55 kls Exp $ + * $Id: ci.c 1.8 2003/03/16 22:32:47 kls Exp $ */ /* XXX TODO @@ -1232,7 +1232,7 @@ cCiCaPmt::cCiCaPmt(int ProgramNumber) capmt[length++] = CPLM_ONLY; capmt[length++] = (ProgramNumber >> 8) & 0xFF; capmt[length++] = ProgramNumber & 0xFF; - capmt[length++] = 0x00; //XXX version_number, current_next_indicator - apparently may be 0x00 + capmt[length++] = 0x01; // version_number, current_next_indicator - apparently vn doesn't matter, but cni must be 1 esInfoLengthPos = length; capmt[length++] = 0x00; // program_info_length H (at program level) capmt[length++] = 0x00; // program_info_length L @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 1.149 2003/02/15 11:01:04 kls Exp $ + * $Id: config.h 1.150 2003/03/09 10:01:02 kls Exp $ */ #ifndef __CONFIG_H @@ -19,7 +19,7 @@ #include "device.h" #include "tools.h" -#define VDRVERSION "1.1.25" +#define VDRVERSION "1.1.26" #define MAXPRIORITY 99 #define MAXLIFETIME 99 @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 1.36 2003/01/03 15:41:14 kls Exp $ + * $Id: device.c 1.37 2003/03/09 14:05:23 kls Exp $ */ #include "device.h" @@ -106,14 +106,19 @@ bool cDevice::SetPrimaryDevice(int n) { n--; if (0 <= n && n < numDevices && device[n]) { - isyslog("setting primary device to %d", n + 1); - if (primaryDevice) - primaryDevice->MakePrimaryDevice(false); - primaryDevice = device[n]; - primaryDevice->MakePrimaryDevice(true); - return true; + if (device[n]->HasDecoder()) { + isyslog("setting primary device to %d", n + 1); + if (primaryDevice) + primaryDevice->MakePrimaryDevice(false); + primaryDevice = device[n]; + primaryDevice->MakePrimaryDevice(true); + return true; + } + else + esyslog("ERROR: device number %d has no MPEG decoder", n + 1); } - esyslog("invalid primary device number: %d", n + 1); + else + esyslog("ERROR: invalid primary device number: %d", n + 1); return false; } @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbosd.c 1.19 2002/08/25 09:53:51 kls Exp $ + * $Id: dvbosd.c 1.20 2003/03/09 09:59:13 kls Exp $ */ #include "dvbosd.h" @@ -60,18 +60,7 @@ void cDvbOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, co dc.x1 = x1; dc.y1 = y1; dc.data = (void *)data; - // must block all signals, otherwise the command might not be fully executed - sigset_t set, oldset; - sigfillset(&set); - sigdelset(&set, SIGALRM); - sigprocmask(SIG_BLOCK, &set, &oldset); ioctl(osdDev, OSD_SEND_CMD, &dc); - if (cmd == OSD_SetBlock) // XXX this is the only command that takes longer - usleep(5000); // XXX Workaround for a driver bug (cInterface::DisplayChannel() displayed texts at wrong places - // XXX and sometimes the OSD was no longer displayed). - // XXX Increase the value if the problem still persists on your particular system. - // TODO Check if this is still necessary with driver versions after 0.7. - sigprocmask(SIG_SETMASK, &oldset, NULL); } } @@ -16,7 +16,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: eit.c 1.65 2003/02/02 15:41:03 kls Exp $ + * $Id: eit.c 1.67 2003/03/16 11:20:05 kls Exp $ ***************************************************************************/ #include "eit.h" @@ -607,7 +607,7 @@ void cEventInfo::FixEpgBugs(void) free(pExtendedDescription); pExtendedDescription = pSubtitle; pSubtitle = NULL; - EpgBugFixStat(5, GetChannelID()); + EpgBugFixStat(6, GetChannelID()); } } @@ -1250,12 +1250,13 @@ void cSIProcessor::Action() if (seclen == r) { //dsyslog("Received pid 0x%04X with table ID 0x%02X and length of %4d\n", pid, buf[0], seclen); + cMutexLock MutexLock(&schedulesMutex); // since the xMem... stuff is not thread safe, we need to use a "global" mutex + LOCK_THREAD; switch (pid) { case 0x00: if (buf[0] == 0x00) { - LOCK_THREAD; if (pmtPid && time(NULL) - lastPmtScan > PMT_SCAN_TIMEOUT) { DelFilter(pmtPid, 0x02); pmtPid = 0; @@ -1263,7 +1264,6 @@ void cSIProcessor::Action() lastPmtScan = time(NULL); } if (!pmtPid) { - cMutexLock MutexLock(&schedulesMutex); // since the xMem... stuff is not thread safe, we need to use a "global" mutex struct LIST *pat = siParsePAT(buf); if (pat) { int Index = 0; @@ -1301,7 +1301,6 @@ void cSIProcessor::Action() case 0x12: if (buf[0] != 0x72) { - cMutexLock MutexLock(&schedulesMutex); cEIT ceit(buf, seclen, schedules); ceit.ProcessEIT(buf, currentSource); } @@ -1310,9 +1309,7 @@ void cSIProcessor::Action() break; default: { - LOCK_THREAD; if (pid == pmtPid && buf[0] == 0x02 && currentSource && currentTransponder) { - cMutexLock MutexLock(&schedulesMutex); // since the xMem... stuff is not thread safe, we need to use a "global" mutex struct Pid *pi = siParsePMT(buf); if (pi) { for (struct LIST *d = (struct LIST *)pi->Descriptors; d; d = (struct LIST *)xSucc(d)) { @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: eitscan.c 1.11 2003/01/26 16:19:24 kls Exp $ + * $Id: eitscan.c 1.12 2003/03/16 13:29:55 kls Exp $ */ #include "eitscan.h" @@ -16,7 +16,7 @@ cEITScanner::cEITScanner(void) { lastScan = lastActivity = time(NULL); currentChannel = 0; - lastChannel = 0; + memset(lastChannel, 0, sizeof(lastChannel)); numTransponders = 0; transponders = NULL; } @@ -51,42 +51,33 @@ void cEITScanner::Process(void) if (Setup.EPGScanTimeout && Channels.MaxNumber() > 1) { time_t now = time(NULL); if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) { - do { - int oldLastChannel = lastChannel; - for (int i = 0; i < cDevice::NumDevices(); i++) { - cDevice *Device = cDevice::GetDevice(i); - if (Device && Device->CardIndex() < MAXDVBDEVICES) { - if (Device != cDevice::PrimaryDevice() || (cDevice::NumDevices() == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) { - if (!(Device->Receiving(true) || Device->Replaying())) { - int oldCh = lastChannel; - int ch = oldCh + 1; - while (ch != oldCh) { - if (ch > Channels.MaxNumber()) { - ch = 1; - numTransponders = 0; - } - cChannel *Channel = Channels.GetByNumber(ch, 1); - if (Channel) { - if (!Device->ProvidesChannel(Channel)) - break; - if (Channel->Sid() && !TransponderScanned(Channel)) { - if (Device == cDevice::PrimaryDevice() && !currentChannel) - currentChannel = Device->CurrentChannel(); - Device->SwitchChannel(Channel, false); - lastChannel = ch; - break; - } - } - ch = Channel->Number() + 1; - } - } + for (int i = 0; i < cDevice::NumDevices(); i++) { + cDevice *Device = cDevice::GetDevice(i); + if (Device && Device->CardIndex() < MAXDVBDEVICES) { + if (Device != cDevice::PrimaryDevice() || (cDevice::NumDevices() == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) { + if (!(Device->Receiving(true) || Device->Replaying())) { + for (;;) { + cChannel *Channel = Channels.GetByNumber(lastChannel[Device->DeviceNumber()] + 1, 1); + if (Channel) { + lastChannel[Device->DeviceNumber()] = Channel->Number(); + if (Channel->Sid() && Device->ProvidesChannel(Channel) && !TransponderScanned(Channel)) { + if (Device == cDevice::PrimaryDevice() && !currentChannel) + currentChannel = Device->CurrentChannel(); + Device->SwitchChannel(Channel, false); + break; + } + } + else { + if (lastChannel[Device->DeviceNumber()]) + numTransponders = 0; + lastChannel[Device->DeviceNumber()] = 0; + break; + } + } } } } - if (lastChannel != oldLastChannel) - break; - lastChannel++; - } while (time(NULL) - now < 2); + } lastScan = time(NULL); } } @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: eitscan.h 1.1 2002/05/20 11:00:05 kls Exp $ + * $Id: eitscan.h 1.2 2003/03/16 13:20:40 kls Exp $ */ #ifndef __EITSCAN_H @@ -19,7 +19,8 @@ private: ScanTimeout = 20 }; time_t lastScan, lastActivity; - int currentChannel, lastChannel; + int currentChannel; + int lastChannel[MAXDEVICES]; int numTransponders, *transponders; bool TransponderScanned(cChannel *Channel); public: @@ -22,7 +22,7 @@ * * The project's page is at http://www.cadsoft.de/people/kls/vdr * - * $Id: vdr.c 1.145 2003/02/16 10:34:24 kls Exp $ + * $Id: vdr.c 1.146 2003/03/09 14:07:46 kls Exp $ */ #include <getopt.h> @@ -365,6 +365,16 @@ int main(int argc, char *argv[]) cDevice::SetPrimaryDevice(Setup.PrimaryDVB); if (!cDevice::PrimaryDevice()) { + for (int i = 0; i < cDevice::NumDevices(); i++) { + cDevice *d = cDevice::GetDevice(i); + if (d && d->HasDecoder()) { + isyslog("trying device number %d instead", i + 1); + if (cDevice::SetPrimaryDevice(i + 1)) + Setup.PrimaryDVB = i + 1; + } + } + } + if (!cDevice::PrimaryDevice()) { const char *msg = "no primary device found - giving up!"; fprintf(stderr, "vdr: %s\n", msg); esyslog("ERROR: %s", msg); |