summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <kls (at) cadsoft (dot) de>2003-03-19 18:00:00 +0100
committerKlaus Schmidinger <kls (at) cadsoft (dot) de>2003-03-19 18:00:00 +0100
commitb60eda5a8e8a9b9b96a90016fd27c03cd3f1ec8b (patch)
tree2249deb285b81b32994195a344e38df4ddc37be0
parentb6e4637356502e707fdfc4b97ed1856e08de3df1 (diff)
downloadvdr-patch-lnbsharing-b60eda5a8e8a9b9b96a90016fd27c03cd3f1ec8b.tar.gz
vdr-patch-lnbsharing-b60eda5a8e8a9b9b96a90016fd27c03cd3f1ec8b.tar.bz2
Version 1.1.26vdr-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).
-rw-r--r--CONTRIBUTORS9
-rw-r--r--HISTORY19
-rw-r--r--ci.c4
-rw-r--r--config.h4
-rw-r--r--device.c21
-rw-r--r--dvbosd.c13
-rw-r--r--eit.c11
-rw-r--r--eitscan.c61
-rw-r--r--eitscan.h5
-rw-r--r--vdr.c12
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)
diff --git a/HISTORY b/HISTORY
index 50e5bf5..a5c70f0 100644
--- a/HISTORY
+++ b/HISTORY
@@ -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).
diff --git a/ci.c b/ci.c
index d345a3e..62bbed7 100644
--- a/ci.c
+++ b/ci.c
@@ -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
diff --git a/config.h b/config.h
index d050516..2060458 100644
--- a/config.h
+++ b/config.h
@@ -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
diff --git a/device.c b/device.c
index 15628cd..0f99e13 100644
--- a/device.c
+++ b/device.c
@@ -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;
}
diff --git a/dvbosd.c b/dvbosd.c
index 4b0c1ea..428a3f0 100644
--- a/dvbosd.c
+++ b/dvbosd.c
@@ -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);
}
}
diff --git a/eit.c b/eit.c
index eebe82c..4274085 100644
--- a/eit.c
+++ b/eit.c
@@ -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)) {
diff --git a/eitscan.c b/eitscan.c
index 5768a42..a5c1a7b 100644
--- a/eitscan.c
+++ b/eitscan.c
@@ -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);
}
}
diff --git a/eitscan.h b/eitscan.h
index 7dacb82..5b40ddd 100644
--- a/eitscan.h
+++ b/eitscan.h
@@ -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:
diff --git a/vdr.c b/vdr.c
index 3e6a9ed..50b1a29 100644
--- a/vdr.c
+++ b/vdr.c
@@ -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);