mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Version 1.1.10
- Removed a superfluous error message from cLockFile::Unlock() (reported by Helmut Auer). - Fixed starting a recording of the current channel with only one DVB card (thanks to Stefan Huelswitt for his help). - A previous 'Transfer Mode' is now automatically re-started after a replay stops. - Only calling cStatus::MsgChannelSwitch() if a channel is actually going to be switched or has actually been switched successfully (thanks to Stefan Huelswitt). - The EPG now drops events from "other" streams that have a duration of 86400 seconds or more (this avoids bogus entries like "PROGRAMMES ALLEMANDS"). - Fixed opening /dev/video in cDvbDevice::GrabImage() in case of NEWSTRUCT driver (thanks to Andreas Schultz). - Added a missing StripAudioPackets() to cDvbPlayer::Action() (thanks to Stefan Huelswitt). - Added an EPG bugfix for the latest VOX EPG data format.
This commit is contained in:
parent
523c4a07aa
commit
346f4cd142
@ -147,6 +147,10 @@ Stefan Huelswitt <huels@iname.com>
|
|||||||
for improving cCondVar::Wait() and implementing cCondVar::TimedWait()
|
for improving cCondVar::Wait() and implementing cCondVar::TimedWait()
|
||||||
for reporting a bug when entering an integer value outside the limit
|
for reporting a bug when entering an integer value outside the limit
|
||||||
for adding play mode pmAudioOnlyBlack
|
for adding play mode pmAudioOnlyBlack
|
||||||
|
for helping to fix starting a recording of the current channel with only one DVB card
|
||||||
|
for making cStatus::MsgChannelSwitch() only be called if a channel is actually going to
|
||||||
|
be switched or has actually been switched successfully
|
||||||
|
for adding a missing StripAudioPackets() to cDvbPlayer::Action()
|
||||||
|
|
||||||
Ulrich Röder <roeder@efr-net.de>
|
Ulrich Röder <roeder@efr-net.de>
|
||||||
for pointing out that there are channels that have a symbol rate higher than
|
for pointing out that there are channels that have a symbol rate higher than
|
||||||
@ -169,6 +173,7 @@ Andreas Schultz <aschultz@warp10.net>
|
|||||||
for adding cDevice::NewOsd() to allow a derived cDevice class to implement its own
|
for adding cDevice::NewOsd() to allow a derived cDevice class to implement its own
|
||||||
OSD capabilities
|
OSD capabilities
|
||||||
for implementing an SPU decoder
|
for implementing an SPU decoder
|
||||||
|
for fixing opening /dev/video in cDvbDevice::GrabImage() in case of NEWSTRUCT driver
|
||||||
|
|
||||||
Aaron Holtzman
|
Aaron Holtzman
|
||||||
for writing 'ac3dec'
|
for writing 'ac3dec'
|
||||||
@ -391,3 +396,6 @@ Holger W
|
|||||||
|
|
||||||
Jürgen Zimmermann <jnzimmer@informatik.uni-kl.de>
|
Jürgen Zimmermann <jnzimmer@informatik.uni-kl.de>
|
||||||
for adding some missing #includes to files in libdtv for gcc 3.2
|
for adding some missing #includes to files in libdtv for gcc 3.2
|
||||||
|
|
||||||
|
Helmut Auer <vdr@helmutauer.de>
|
||||||
|
for reporting a superfluous error message in cLockFile.
|
||||||
|
19
HISTORY
19
HISTORY
@ -1459,3 +1459,22 @@ Video Disk Recorder Revision History
|
|||||||
- Fixed a crash when entering an integer value outside the limits (thanks to
|
- Fixed a crash when entering an integer value outside the limits (thanks to
|
||||||
Stefan Huelswitt for reporting this one).
|
Stefan Huelswitt for reporting this one).
|
||||||
- Added play mode pmAudioOnlyBlack (thanks to Stefan Huelswitt).
|
- Added play mode pmAudioOnlyBlack (thanks to Stefan Huelswitt).
|
||||||
|
|
||||||
|
2002-09-15: Version 1.1.10
|
||||||
|
|
||||||
|
- Removed a superfluous error message from cLockFile::Unlock() (reported by
|
||||||
|
Helmut Auer).
|
||||||
|
- Fixed starting a recording of the current channel with only one DVB card
|
||||||
|
(thanks to Stefan Huelswitt for his help).
|
||||||
|
- A previous 'Transfer Mode' is now automatically re-started after a replay
|
||||||
|
stops.
|
||||||
|
- Only calling cStatus::MsgChannelSwitch() if a channel is actually going to
|
||||||
|
be switched or has actually been switched successfully (thanks to Stefan
|
||||||
|
Huelswitt).
|
||||||
|
- The EPG now drops events from "other" streams that have a duration of 86400
|
||||||
|
seconds or more (this avoids bogus entries like "PROGRAMMES ALLEMANDS").
|
||||||
|
- Fixed opening /dev/video in cDvbDevice::GrabImage() in case of NEWSTRUCT
|
||||||
|
driver (thanks to Andreas Schultz).
|
||||||
|
- Added a missing StripAudioPackets() to cDvbPlayer::Action() (thanks to
|
||||||
|
Stefan Huelswitt).
|
||||||
|
- Added an EPG bugfix for the latest VOX EPG data format.
|
||||||
|
@ -7,7 +7,7 @@ BR3:11837:h:0:27500:201:202:204:0:28107
|
|||||||
Hessen-3:11837:h:0:27500:301:302:304:0:28108
|
Hessen-3:11837:h:0:27500:301:302:304:0:28108
|
||||||
N3:12110:h:0:27500:2401:2402:2404:0:28224
|
N3:12110:h:0:27500:2401:2402:2404:0:28224
|
||||||
SR3:11837:h:0:27500:501:502:504:0:28110
|
SR3:11837:h:0:27500:501:502:504:0:28110
|
||||||
WDR:11837:h:0:27500:601:602:0:0:28111
|
WDR:11837:h:0:27500:601:602:604:0:28111
|
||||||
BR-alpha:11837:h:0:27500:701:702:704:0:28112
|
BR-alpha:11837:h:0:27500:701:702:704:0:28112
|
||||||
SWR BW:11837:h:0:27500:801:802:804:0:28113
|
SWR BW:11837:h:0:27500:801:802:804:0:28113
|
||||||
Phoenix:11837:h:0:27500:901:902:904:0:28114
|
Phoenix:11837:h:0:27500:901:902:904:0:28114
|
||||||
@ -21,10 +21,10 @@ ORF Sat:11954:h:0:27500:506:507:0:0:28010
|
|||||||
ZDF.info:11954:h:0:27500:610:620:0:0:28011
|
ZDF.info:11954:h:0:27500:610:620:0:0:28011
|
||||||
CNN:12168:v:0:27500:165:100:0:0:28512
|
CNN:12168:v:0:27500:165:100:0:0:28512
|
||||||
Super RTL:12188:h:0:27500:165:120:65:0:12040
|
Super RTL:12188:h:0:27500:165:120:65:0:12040
|
||||||
VOX:12188:h:0:27500:167:136:0:0:12060
|
VOX:12188:h:0:27500:167:136:71:0:12060
|
||||||
DW TV:10788:v:0:22000:305:306:0:0:8905
|
DW TV:10788:v:0:22000:305:306:0:0:8905
|
||||||
Kabel 1:12480:v:0:27500:511:512:33:0:899
|
Kabel 1:12480:v:0:27500:511:512:33:0:899
|
||||||
Neun Live:12480:v:0:27500:767:768:0:0:897
|
Neun Live:12480:v:0:27500:767:768:35:0:897
|
||||||
DSF:12480:v:0:27500:1023:1024:0:0:900
|
DSF:12480:v:0:27500:1023:1024:0:0:900
|
||||||
HOT:12480:v:0:27500:1279:1280:0:0:40
|
HOT:12480:v:0:27500:1279:1280:0:0:40
|
||||||
Bloomberg TV Germany:12551:v:0:22000:162:99:0:0:12160
|
Bloomberg TV Germany:12551:v:0:22000:162:99:0:0:12160
|
||||||
@ -46,7 +46,7 @@ MDR:12110:h:0:27500:401:402:404:0:28204
|
|||||||
NICK-PARAMOUNT:12246:v:0:27500:167:108:0:0:29312
|
NICK-PARAMOUNT:12246:v:0:27500:167:108:0:0:29312
|
||||||
ORB:12110:h:0:27500:501:502:504:0:28205
|
ORB:12110:h:0:27500:501:502:504:0:28205
|
||||||
B1:12110:h:0:27500:601:602:604:0:28206
|
B1:12110:h:0:27500:601:602:604:0:28206
|
||||||
ARD Online-Kanal:12722:h:0:22000:700:701:0:0:0
|
ARD Online-Kanal:12722:h:0:22000:0:701:0:0:0
|
||||||
:Premiere World
|
:Premiere World
|
||||||
Premiere Start:11797:h:0:27500:255:256:0:101:8
|
Premiere Start:11797:h:0:27500:255:256:0:101:8
|
||||||
Premiere 1:11797:h:0:27500:511:512,513;515:0:101:10
|
Premiere 1:11797:h:0:27500:511:512,513;515:0:101:10
|
||||||
@ -78,7 +78,7 @@ Premiere Direkt 2B:11719:h:0:27500:767:768;769:0:101:181
|
|||||||
Premiere Direkt 3A:11719:h:0:27500:511:512;515:0:101:180
|
Premiere Direkt 3A:11719:h:0:27500:511:512;515:0:101:180
|
||||||
Premiere Direkt 3B:11719:h:0:27500:1279:1280;1283:0:101:183
|
Premiere Direkt 3B:11719:h:0:27500:1279:1280;1283:0:101:183
|
||||||
Premiere Direkt 4A:12031:h:0:27500:2815:2816:0:101:18
|
Premiere Direkt 4A:12031:h:0:27500:2815:2816:0:101:18
|
||||||
Premiere Direkt 4B:12070:h:0:27500:1535:1536:0:101:216
|
:#Premiere Direkt 4B:12070:h:0:27500:1535:1536:0:101:216
|
||||||
:PW Erotic
|
:PW Erotic
|
||||||
Beate-Uhse.TV:11758:h:0:27500:1023:1024:0:101:21
|
Beate-Uhse.TV:11758:h:0:27500:1023:1024:0:101:21
|
||||||
Premiere Erotik 1:12031:h:0:27500:1279:1280:0:101:513
|
Premiere Erotik 1:12031:h:0:27500:1279:1280:0:101:513
|
||||||
@ -89,11 +89,11 @@ Premiere Erotik 4:11719:h:0:27500:3583:3584:0:101:780
|
|||||||
Premiere Sport 1:11720:h:0:27500:255:256,257:0:101:17
|
Premiere Sport 1:11720:h:0:27500:255:256,257:0:101:17
|
||||||
Premiere Sport 2:12031:h:0:27500:3839:3840:0:101:27
|
Premiere Sport 2:12031:h:0:27500:3839:3840:0:101:27
|
||||||
:Formel 1
|
:Formel 1
|
||||||
Supersignal:12070:h:0:27500:255:256:0:101:211
|
:#Supersignal:12070:h:0:27500:255:256:0:101:211
|
||||||
Cockpitkanal:12070:h:0:27500:511:512:0:101:212
|
:#Cockpitkanal:12070:h:0:27500:511:512:0:101:212
|
||||||
Boxengasse:12070:h:0:27500:767:768:0:101:213
|
:#Boxengasse:12070:h:0:27500:767:768:0:101:213
|
||||||
Verfolgerfeld:12070:h:0:27500:1023:1024:0:101:214
|
:#Verfolgerfeld:12070:h:0:27500:1023:1024:0:101:214
|
||||||
Infokanal:12070:h:0:27500:1279:1280:0:101:215
|
:#Infokanal:12070:h:0:27500:1279:1280:0:101:215
|
||||||
Multikanal:11720:h:0:27500:255:256:0:101:17
|
Multikanal:11720:h:0:27500:255:256:0:101:17
|
||||||
:Beta Digital
|
:Beta Digital
|
||||||
N24:12480:v:0:27500:2047:2048:0:0:47
|
N24:12480:v:0:27500:2047:2048:0:0:47
|
||||||
@ -111,7 +111,7 @@ BuLi 7:11719:h:0:27500:3327:3328,3329:0:101:245
|
|||||||
BuLi 8:12031:h:0:27500:3071:3072,3073:0:101:208
|
BuLi 8:12031:h:0:27500:3071:3072,3073:0:101:208
|
||||||
BuLi 9:12031:h:0:27500:3327:3328,3329:0:101:209
|
BuLi 9:12031:h:0:27500:3327:3328,3329:0:101:209
|
||||||
:
|
:
|
||||||
TV Niepokalanow:11876:h:0:27500:305:321:0:0:20601
|
:#TV Niepokalanow:11876:h:0:27500:305:321:0:0:20601
|
||||||
Mosaico:11934:v:0:27500:165:100:0:0:29010
|
Mosaico:11934:v:0:27500:165:100:0:0:29010
|
||||||
Andalucia TV:11934:v:0:27500:166:104:0:0:29011
|
Andalucia TV:11934:v:0:27500:166:104:0:0:29011
|
||||||
TVC Internacional:11934:v:0:27500:167:108:0:0:0
|
TVC Internacional:11934:v:0:27500:167:108:0:0:0
|
||||||
|
4
config.h
4
config.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: config.h 1.126 2002/09/04 11:04:55 kls Exp $
|
* $Id: config.h 1.127 2002/09/09 21:35:55 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CONFIG_H
|
#ifndef __CONFIG_H
|
||||||
@ -20,7 +20,7 @@
|
|||||||
#include "eit.h"
|
#include "eit.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
|
||||||
#define VDRVERSION "1.1.9"
|
#define VDRVERSION "1.1.10"
|
||||||
|
|
||||||
#define MAXPRIORITY 99
|
#define MAXPRIORITY 99
|
||||||
#define MAXLIFETIME 99
|
#define MAXLIFETIME 99
|
||||||
|
43
device.c
43
device.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: device.c 1.19 2002/09/08 14:03:43 kls Exp $
|
* $Id: device.c 1.21 2002/09/15 11:50:19 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
@ -47,6 +47,8 @@ cDevice::cDevice(void)
|
|||||||
|
|
||||||
player = NULL;
|
player = NULL;
|
||||||
|
|
||||||
|
playerDetached = false;
|
||||||
|
|
||||||
for (int i = 0; i < MAXRECEIVERS; i++)
|
for (int i = 0; i < MAXRECEIVERS; i++)
|
||||||
receiver[i] = NULL;
|
receiver[i] = NULL;
|
||||||
ca = -1;
|
ca = -1;
|
||||||
@ -108,6 +110,13 @@ bool cDevice::HasDecoder(void) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool cDevice::PlayerDetached(void)
|
||||||
|
{
|
||||||
|
bool result = playerDetached;
|
||||||
|
playerDetached = false;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
cOsdBase *cDevice::NewOsd(int x, int y)
|
cOsdBase *cDevice::NewOsd(int x, int y)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -317,8 +326,6 @@ bool cDevice::SwitchChannel(int Direction)
|
|||||||
|
|
||||||
eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
||||||
{
|
{
|
||||||
cStatus::MsgChannelSwitch(this, 0);
|
|
||||||
|
|
||||||
if (LiveView)
|
if (LiveView)
|
||||||
StopReplay();
|
StopReplay();
|
||||||
|
|
||||||
@ -335,6 +342,7 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
|||||||
if (NeedsTransferMode) {
|
if (NeedsTransferMode) {
|
||||||
cDevice *CaDevice = GetDevice(Channel, 0);
|
cDevice *CaDevice = GetDevice(Channel, 0);
|
||||||
if (CaDevice) {
|
if (CaDevice) {
|
||||||
|
cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel
|
||||||
if (CaDevice->SetChannel(Channel, false) == scrOk) // calling SetChannel() directly, not SwitchChannel()!
|
if (CaDevice->SetChannel(Channel, false) == scrOk) // calling SetChannel() directly, not SwitchChannel()!
|
||||||
cControl::Launch(new cTransferControl(CaDevice, Channel->vpid, Channel->apid1, 0, 0, 0));//XXX+
|
cControl::Launch(new cTransferControl(CaDevice, Channel->vpid, Channel->apid1, 0, 0, 0));//XXX+
|
||||||
else
|
else
|
||||||
@ -343,15 +351,19 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
|||||||
else
|
else
|
||||||
Result = scrNotAvailable;
|
Result = scrNotAvailable;
|
||||||
}
|
}
|
||||||
else if (!SetChannelDevice(Channel, LiveView))
|
else {
|
||||||
Result = scrFailed;
|
cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel
|
||||||
|
if (!SetChannelDevice(Channel, LiveView))
|
||||||
if (Result == scrOk && LiveView && IsPrimaryDevice()) {
|
Result = scrFailed;
|
||||||
cSIProcessor::SetCurrentServiceID(Channel->pnr);
|
|
||||||
currentChannel = Channel->number;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cStatus::MsgChannelSwitch(this, Channel->number);
|
if (Result == scrOk) {
|
||||||
|
if (LiveView && IsPrimaryDevice()) {
|
||||||
|
cSIProcessor::SetCurrentServiceID(Channel->pnr);
|
||||||
|
currentChannel = Channel->number;
|
||||||
|
}
|
||||||
|
cStatus::MsgChannelSwitch(this, Channel->number); // only report status if channel switch successfull
|
||||||
|
}
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
@ -438,6 +450,7 @@ void cDevice::Detach(cPlayer *Player)
|
|||||||
player->device = NULL;
|
player->device = NULL;
|
||||||
player = NULL;
|
player = NULL;
|
||||||
SetPlayMode(pmNone);
|
SetPlayMode(pmNone);
|
||||||
|
playerDetached = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -447,16 +460,6 @@ void cDevice::StopReplay(void)
|
|||||||
Detach(player);
|
Detach(player);
|
||||||
if (IsPrimaryDevice())
|
if (IsPrimaryDevice())
|
||||||
cControl::Shutdown();
|
cControl::Shutdown();
|
||||||
/*XXX+
|
|
||||||
if (IsPrimaryDevice()) {
|
|
||||||
// let's explicitly switch the channel back in case it was in Transfer Mode:
|
|
||||||
cChannel *Channel = Channels.GetByNumber(currentChannel);
|
|
||||||
if (Channel) {
|
|
||||||
Channel->Switch(this, false);
|
|
||||||
usleep(100000); // allow driver to sync in case a new replay will start immediately
|
|
||||||
}
|
|
||||||
}
|
|
||||||
XXX*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
7
device.h
7
device.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: device.h 1.16 2002/09/08 14:56:21 kls Exp $
|
* $Id: device.h 1.18 2002/09/14 15:24:47 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __DEVICE_H
|
#ifndef __DEVICE_H
|
||||||
@ -177,7 +177,7 @@ private:
|
|||||||
bool active;
|
bool active;
|
||||||
virtual void Action(void);
|
virtual void Action(void);
|
||||||
protected:
|
protected:
|
||||||
enum ePidType { ptVideo, ptAudio, ptTeletext, ptDolby, ptOther };
|
enum ePidType { ptAudio, ptVideo, ptTeletext, ptDolby, ptOther };
|
||||||
class cPidHandle {
|
class cPidHandle {
|
||||||
public:
|
public:
|
||||||
int pid;
|
int pid;
|
||||||
@ -236,6 +236,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
cPlayer *player;
|
cPlayer *player;
|
||||||
|
bool playerDetached;
|
||||||
protected:
|
protected:
|
||||||
virtual bool SetPlayMode(ePlayMode PlayMode);
|
virtual bool SetPlayMode(ePlayMode PlayMode);
|
||||||
// Sets the device into the given play mode.
|
// Sets the device into the given play mode.
|
||||||
@ -276,6 +277,8 @@ public:
|
|||||||
// Attaches the given player to this device.
|
// Attaches the given player to this device.
|
||||||
void Detach(cPlayer *Player);
|
void Detach(cPlayer *Player);
|
||||||
// Detaches the given player from this device.
|
// Detaches the given player from this device.
|
||||||
|
bool PlayerDetached(void);
|
||||||
|
// Returns true if a player has been detached and resets the 'playerDetached' flag.
|
||||||
|
|
||||||
// Receiver facilities
|
// Receiver facilities
|
||||||
|
|
||||||
|
125
dvbdevice.c
125
dvbdevice.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: dvbdevice.c 1.13 2002/09/08 15:00:46 kls Exp $
|
* $Id: dvbdevice.c 1.19 2002/09/15 13:12:25 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dvbdevice.h"
|
#include "dvbdevice.h"
|
||||||
@ -200,7 +200,11 @@ cSpuDecoder *cDvbDevice::GetSpuDecoder(void)
|
|||||||
|
|
||||||
bool cDvbDevice::GrabImage(const char *FileName, bool Jpeg, int Quality, int SizeX, int SizeY)
|
bool cDvbDevice::GrabImage(const char *FileName, bool Jpeg, int Quality, int SizeX, int SizeY)
|
||||||
{
|
{
|
||||||
int videoDev = DvbOpen(DEV_VIDEO, CardIndex(), O_RDWR, true);
|
char buffer[PATH_MAX];
|
||||||
|
snprintf(buffer, sizeof(buffer), "%s%d", DEV_VIDEO, CardIndex());
|
||||||
|
int videoDev = open(buffer, O_RDWR);
|
||||||
|
if (videoDev < 0)
|
||||||
|
LOG_ERROR_STR(buffer);
|
||||||
if (videoDev >= 0) {
|
if (videoDev >= 0) {
|
||||||
int result = 0;
|
int result = 0;
|
||||||
struct video_mbuf mbuf;
|
struct video_mbuf mbuf;
|
||||||
@ -297,51 +301,44 @@ void cDvbDevice::SetVideoFormat(bool VideoFormat16_9)
|
|||||||
CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3));
|
CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ptVideo ptAudio ptTeletext ptDolby ptOther
|
// ptAudio ptVideo ptTeletext ptDolby ptOther
|
||||||
dmxPesType_t PesTypes[] = { DMX_PES_VIDEO, DMX_PES_AUDIO, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
|
dmxPesType_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
|
||||||
|
|
||||||
bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
|
bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
|
||||||
{
|
{
|
||||||
if (Handle->pid) {
|
if (Handle->pid) {
|
||||||
|
dmxPesFilterParams pesFilterParams;
|
||||||
|
memset(&pesFilterParams, 0, sizeof(pesFilterParams));
|
||||||
if (On) {
|
if (On) {
|
||||||
if (Handle->handle < 0) {
|
if (Handle->handle < 0) {
|
||||||
Handle->handle = DvbOpen(DEV_DVB_DEMUX, CardIndex(), O_RDWR | O_NONBLOCK, true);
|
Handle->handle = DvbOpen(DEV_DVB_DEMUX, CardIndex(), O_RDWR | O_NONBLOCK, true);
|
||||||
if (Handle->handle < 0)
|
if (Handle->handle < 0)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else {
|
|
||||||
CHECK(ioctl(Handle->handle, DMX_STOP));
|
|
||||||
if (Handle->used == 0) {
|
|
||||||
dmxPesFilterParams pesFilterParams;
|
|
||||||
memset(&pesFilterParams, 0, sizeof(pesFilterParams));
|
|
||||||
pesFilterParams.pid = 0x1FFF;
|
|
||||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
|
||||||
pesFilterParams.output = DMX_OUT_DECODER;
|
|
||||||
pesFilterParams.pesType = PesTypes[Type < ptOther ? Type : ptOther];
|
|
||||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
|
||||||
CHECK(ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams));
|
|
||||||
close(Handle->handle);
|
|
||||||
Handle->handle = -1;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Handle->pid != 0x1FFF) {
|
|
||||||
dmxPesFilterParams pesFilterParams;
|
|
||||||
memset(&pesFilterParams, 0, sizeof(pesFilterParams));
|
|
||||||
pesFilterParams.pid = Handle->pid;
|
pesFilterParams.pid = Handle->pid;
|
||||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
pesFilterParams.input = DMX_IN_FRONTEND;
|
||||||
pesFilterParams.output = (Type <= ptTeletext && Handle->used <= 1) ? DMX_OUT_DECODER : DMX_OUT_TS_TAP;
|
pesFilterParams.output = (Type <= ptTeletext && Handle->used <= 1) ? DMX_OUT_DECODER : DMX_OUT_TS_TAP;
|
||||||
pesFilterParams.pesType = PesTypes[Type < ptOther ? Type : ptOther];
|
pesFilterParams.pesType = PesTypes[Type < ptOther ? Type : ptOther];
|
||||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
||||||
//XXX+ pesFilterParams.flags = DMX_CHECK_CRC;//XXX
|
|
||||||
if (ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
|
if (ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
|
||||||
LOG_ERROR;
|
LOG_ERROR;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//XXX+ CHECK(ioctl(Handle->handle, DMX_SET_BUFFER_SIZE, KILOBYTE(32)));//XXX
|
}
|
||||||
//XXX+ CHECK(ioctl(Handle->handle, DMX_START));//XXX
|
else if (!Handle->used) {
|
||||||
|
CHECK(ioctl(Handle->handle, DMX_STOP));
|
||||||
|
if (Type <= ptTeletext) {
|
||||||
|
pesFilterParams.pid = 0x1FFF;
|
||||||
|
pesFilterParams.input = DMX_IN_FRONTEND;
|
||||||
|
pesFilterParams.output = DMX_OUT_DECODER;
|
||||||
|
pesFilterParams.pesType = PesTypes[Type];
|
||||||
|
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
||||||
|
CHECK(ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams));
|
||||||
|
close(Handle->handle);
|
||||||
|
Handle->handle = -1;
|
||||||
|
if (PesTypes[Type] == DMX_PES_VIDEO) // let's only do this once
|
||||||
|
SetPlayMode(pmNone); // necessary to switch a PID from DMX_PES_VIDEO/AUDIO to DMX_PES_OTHER
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -362,8 +359,8 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
|
|||||||
needsDetachReceivers = true;
|
needsDetachReceivers = true;
|
||||||
result = hasPriority;
|
result = hasPriority;
|
||||||
}
|
}
|
||||||
else if (!HasDecoder())
|
else if (!IsPrimaryDevice())
|
||||||
result = true; // if it has no decoder it can't be the primary device
|
result = true;
|
||||||
else {
|
else {
|
||||||
#define DVB_DRIVER_VERSION 2002090101 //XXX+
|
#define DVB_DRIVER_VERSION 2002090101 //XXX+
|
||||||
#define MIN_DVB_DRIVER_VERSION_FOR_TIMESHIFT 2002090101
|
#define MIN_DVB_DRIVER_VERSION_FOR_TIMESHIFT 2002090101
|
||||||
@ -397,30 +394,52 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
|||||||
LiveView = true;
|
LiveView = true;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Avoid noise while switching:
|
bool DoTune = frequency != Channel->frequency; // TODO will be changed when DiSEqC handling is revised
|
||||||
|
|
||||||
if (HasDecoder()) {
|
bool TurnOffLivePIDs = HasDecoder()
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
|
&& (DoTune
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
|
|| Channel->ca > CACONFBASE && pidHandles[ptVideo].pid != Channel->vpid // CA channels can only be decrypted in "live" mode
|
||||||
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
|
|| IsPrimaryDevice()
|
||||||
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
|
&& (LiveView // for a new live view the old PIDs need to be turned off
|
||||||
}
|
|| pidHandles[ptVideo].pid == Channel->vpid // for recording the PIDs must be shifted from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
bool StartTransferMode = IsPrimaryDevice() && !DoTune
|
||||||
|
&& (LiveView && HasPid(Channel->vpid) && pidHandles[ptVideo].pid != Channel->vpid // the PID is already set as DMX_PES_OTHER
|
||||||
|
|| !LiveView && pidHandles[ptVideo].pid == Channel->vpid // a recording is going to shift the PIDs from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
|
||||||
|
);
|
||||||
|
|
||||||
|
bool TurnOnLivePIDs = HasDecoder() && !StartTransferMode
|
||||||
|
&& (Channel->ca > CACONFBASE // CA channels can only be decrypted in "live" mode
|
||||||
|
|| LiveView
|
||||||
|
);
|
||||||
|
|
||||||
// Stop setting system time:
|
// Stop setting system time:
|
||||||
|
|
||||||
if (siProcessor)
|
if (siProcessor)
|
||||||
siProcessor->SetCurrentTransponder(0);
|
siProcessor->SetCurrentTransponder(0);
|
||||||
|
|
||||||
// Turn off current PIDs:
|
// Turn off live PIDs if necessary:
|
||||||
|
|
||||||
|
if (TurnOffLivePIDs) {
|
||||||
|
|
||||||
|
// Avoid noise while switching:
|
||||||
|
|
||||||
|
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
|
||||||
|
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
|
||||||
|
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
|
||||||
|
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
|
||||||
|
|
||||||
|
// Turn off live PIDs:
|
||||||
|
|
||||||
if (HasDecoder() && (LiveView || pidHandles[ptVideo].pid == Channel->vpid)) {
|
|
||||||
DelPid(pidHandles[ptVideo].pid);
|
|
||||||
DelPid(pidHandles[ptAudio].pid);
|
DelPid(pidHandles[ptAudio].pid);
|
||||||
|
DelPid(pidHandles[ptVideo].pid);
|
||||||
DelPid(pidHandles[ptTeletext].pid);
|
DelPid(pidHandles[ptTeletext].pid);
|
||||||
DelPid(pidHandles[ptDolby].pid);
|
DelPid(pidHandles[ptDolby].pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frequency != Channel->frequency || Channel->ca > CACONFBASE) { // CA channels can only be decrypted in "live" mode
|
if (DoTune) {
|
||||||
|
|
||||||
#ifdef NEWSTRUCT
|
#ifdef NEWSTRUCT
|
||||||
dvb_frontend_parameters Frontend;
|
dvb_frontend_parameters Frontend;
|
||||||
@ -602,21 +621,19 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
|||||||
|
|
||||||
// PID settings:
|
// PID settings:
|
||||||
|
|
||||||
if (HasDecoder() && (LiveView || Channel->ca > CACONFBASE)) { // CA channels can only be decrypted in "live" mode
|
if (TurnOnLivePIDs) {
|
||||||
if (!HasPid(Channel->vpid)) {
|
if (!(AddPid(Channel->apid1, ptAudio) && AddPid(Channel->vpid, ptVideo))) {//XXX+ dolby dpid1!!! (if audio plugins are attached)
|
||||||
if (!(AddPid(Channel->vpid, ptVideo) && AddPid(Channel->apid1, ptAudio))) {//XXX+ dolby dpid1!!! (if audio plugins are attached)
|
esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->number, CardIndex() + 1);
|
||||||
esyslog("ERROR: failed to set PIDs for channel %d", Channel->number);
|
return false;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (IsPrimaryDevice())
|
|
||||||
AddPid(Channel->tpid, ptTeletext);
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false));
|
|
||||||
}
|
}
|
||||||
else
|
if (IsPrimaryDevice())
|
||||||
cControl::Launch(new cTransferControl(this, Channel->vpid, Channel->apid1, 0, 0, 0));
|
AddPid(Channel->tpid, ptTeletext);
|
||||||
|
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
|
||||||
|
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false));
|
||||||
|
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false));
|
||||||
}
|
}
|
||||||
|
else if (StartTransferMode)
|
||||||
|
cControl::Launch(new cTransferControl(this, Channel->vpid, Channel->apid1, 0, 0, 0));
|
||||||
|
|
||||||
// Start setting system time:
|
// Start setting system time:
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: dvbplayer.c 1.12 2002/08/24 14:59:35 kls Exp $
|
* $Id: dvbplayer.c 1.13 2002/09/15 13:33:31 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dvbplayer.h"
|
#include "dvbplayer.h"
|
||||||
@ -353,6 +353,7 @@ void cDvbPlayer::Action(void)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
r = ReadFrame(replayFile, b, Length, sizeof(b));
|
r = ReadFrame(replayFile, b, Length, sizeof(b));
|
||||||
|
StripAudioPackets(b, r, 0xC0); //XXX+ audioTrack
|
||||||
}
|
}
|
||||||
else // allows replay even if the index file is missing
|
else // allows replay even if the index file is missing
|
||||||
r = read(replayFile, b, sizeof(b));
|
r = read(replayFile, b, sizeof(b));
|
||||||
|
43
eit.c
43
eit.c
@ -16,7 +16,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: eit.c 1.49 2002/08/25 10:43:36 kls Exp $
|
* $Id: eit.c 1.51 2002/09/15 14:35:32 kls Exp $
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "eit.h"
|
#include "eit.h"
|
||||||
@ -405,7 +405,7 @@ bool cEventInfo::Read(FILE *f, cSchedule *Schedule)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAXEPGBUGFIXSTATS 5
|
#define MAXEPGBUGFIXSTATS 6
|
||||||
#define MAXEPGBUGFIXCHANS 50
|
#define MAXEPGBUGFIXCHANS 50
|
||||||
struct tEpgBugFixStats {
|
struct tEpgBugFixStats {
|
||||||
int hits;
|
int hits;
|
||||||
@ -485,6 +485,32 @@ void cEventInfo::FixEpgBugs(void)
|
|||||||
// EPG data. Let's fix their bugs as good as we can:
|
// EPG data. Let's fix their bugs as good as we can:
|
||||||
if (pTitle) {
|
if (pTitle) {
|
||||||
|
|
||||||
|
// VOX puts too much information into the Subtitle and leaves the Extended
|
||||||
|
// Description empty:
|
||||||
|
//
|
||||||
|
// Title
|
||||||
|
// (NAT, Year Min')[ ["Subtitle". ]Extended Description]
|
||||||
|
//
|
||||||
|
if (pSubtitle && !pExtendedDescription) {
|
||||||
|
if (*pSubtitle == '(') {
|
||||||
|
char *e = strchr(pSubtitle + 1, ')');
|
||||||
|
if (e) {
|
||||||
|
if (*(e + 1)) {
|
||||||
|
if (*++e == ' ')
|
||||||
|
if (*(e + 1) == '"')
|
||||||
|
e++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
e = NULL;
|
||||||
|
char *s = e ? strdup(e) : NULL;
|
||||||
|
free(pSubtitle);
|
||||||
|
pSubtitle = s;
|
||||||
|
EpgBugFixStat(0, GetServiceID());
|
||||||
|
// now the fixes #1 and #2 below will handle the rest
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// VOX and VIVA put the Subtitle in quotes and use either the Subtitle
|
// VOX and VIVA put the Subtitle in quotes and use either the Subtitle
|
||||||
// or the Extended Description field, depending on how long the string is:
|
// or the Extended Description field, depending on how long the string is:
|
||||||
//
|
//
|
||||||
@ -504,7 +530,7 @@ void cEventInfo::FixEpgBugs(void)
|
|||||||
free(pExtendedDescription);
|
free(pExtendedDescription);
|
||||||
pSubtitle = s;
|
pSubtitle = s;
|
||||||
pExtendedDescription = d;
|
pExtendedDescription = d;
|
||||||
EpgBugFixStat(0, GetServiceID());
|
EpgBugFixStat(1, GetServiceID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -521,7 +547,7 @@ void cEventInfo::FixEpgBugs(void)
|
|||||||
memmove(pSubtitle, pSubtitle + 1, strlen(pSubtitle));
|
memmove(pSubtitle, pSubtitle + 1, strlen(pSubtitle));
|
||||||
pExtendedDescription = pSubtitle;
|
pExtendedDescription = pSubtitle;
|
||||||
pSubtitle = NULL;
|
pSubtitle = NULL;
|
||||||
EpgBugFixStat(1, GetServiceID());
|
EpgBugFixStat(2, GetServiceID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -533,7 +559,7 @@ void cEventInfo::FixEpgBugs(void)
|
|||||||
if (pSubtitle && strcmp(pTitle, pSubtitle) == 0) {
|
if (pSubtitle && strcmp(pTitle, pSubtitle) == 0) {
|
||||||
free(pSubtitle);
|
free(pSubtitle);
|
||||||
pSubtitle = NULL;
|
pSubtitle = NULL;
|
||||||
EpgBugFixStat(2, GetServiceID());
|
EpgBugFixStat(3, GetServiceID());
|
||||||
}
|
}
|
||||||
|
|
||||||
// ZDF.info puts the Subtitle between double quotes, which is nothing
|
// ZDF.info puts the Subtitle between double quotes, which is nothing
|
||||||
@ -549,7 +575,7 @@ void cEventInfo::FixEpgBugs(void)
|
|||||||
char *p = strrchr(pSubtitle, '"');
|
char *p = strrchr(pSubtitle, '"');
|
||||||
if (p)
|
if (p)
|
||||||
*p = 0;
|
*p = 0;
|
||||||
EpgBugFixStat(3, GetServiceID());
|
EpgBugFixStat(4, GetServiceID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -570,7 +596,7 @@ void cEventInfo::FixEpgBugs(void)
|
|||||||
if (*p == '-' && *(p + 1) == ' ' && *(p + 2) && islower(*(p - 1)) && islower(*(p + 2))) {
|
if (*p == '-' && *(p + 1) == ' ' && *(p + 2) && islower(*(p - 1)) && islower(*(p + 2))) {
|
||||||
if (!startswith(p + 2, "und ")) { // special case in German, as in "Lach- und Sachgeschichten"
|
if (!startswith(p + 2, "und ")) { // special case in German, as in "Lach- und Sachgeschichten"
|
||||||
memmove(p, p + 2, strlen(p + 2) + 1);
|
memmove(p, p + 2, strlen(p + 2) + 1);
|
||||||
EpgBugFixStat(4, GetServiceID());
|
EpgBugFixStat(5, GetServiceID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p++;
|
p++;
|
||||||
@ -895,6 +921,9 @@ int cEIT::ProcessEIT(unsigned char *buffer)
|
|||||||
|
|
||||||
if (VdrProgramInfos) {
|
if (VdrProgramInfos) {
|
||||||
for (VdrProgramInfo = (struct VdrProgramInfo *) VdrProgramInfos->Head; VdrProgramInfo; VdrProgramInfo = (struct VdrProgramInfo *) xSucc (VdrProgramInfo)) {
|
for (VdrProgramInfo = (struct VdrProgramInfo *) VdrProgramInfos->Head; VdrProgramInfo; VdrProgramInfo = (struct VdrProgramInfo *) xSucc (VdrProgramInfo)) {
|
||||||
|
// Drop events that belong to an "other TS" and are very long (some stations broadcast bogus data for "other" channels):
|
||||||
|
if (VdrProgramInfo->Duration >= 86400 && (tid == 0x4F || tid == 0x60 || tid == 0x61))
|
||||||
|
continue;
|
||||||
pSchedule = (cSchedule *)schedules->GetSchedule(VdrProgramInfo->ServiceID);
|
pSchedule = (cSchedule *)schedules->GetSchedule(VdrProgramInfo->ServiceID);
|
||||||
if (!pSchedule) {
|
if (!pSchedule) {
|
||||||
schedules->Add(new cSchedule(VdrProgramInfo->ServiceID));
|
schedules->Add(new cSchedule(VdrProgramInfo->ServiceID));
|
||||||
|
4
tools.c
4
tools.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: tools.c 1.70 2002/08/16 13:43:40 kls Exp $
|
* $Id: tools.c 1.71 2002/09/09 21:35:49 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
@ -739,8 +739,6 @@ void cLockFile::Unlock(void)
|
|||||||
remove(fileName);
|
remove(fileName);
|
||||||
f = -1;
|
f = -1;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
esyslog("ERROR: attempt to unlock %s without holding a lock!", fileName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- cListObject -----------------------------------------------------------
|
// --- cListObject -----------------------------------------------------------
|
||||||
|
5
vdr.c
5
vdr.c
@ -22,7 +22,7 @@
|
|||||||
*
|
*
|
||||||
* The project's page is at http://www.cadsoft.de/people/kls/vdr
|
* The project's page is at http://www.cadsoft.de/people/kls/vdr
|
||||||
*
|
*
|
||||||
* $Id: vdr.c 1.122 2002/09/08 11:19:01 kls Exp $
|
* $Id: vdr.c 1.123 2002/09/15 11:08:35 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -400,6 +400,9 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
// Attach launched player control:
|
// Attach launched player control:
|
||||||
cControl::Attach();
|
cControl::Attach();
|
||||||
|
// Make sure Transfer-Mode is re-started after detaching a player:
|
||||||
|
if (cDevice::PrimaryDevice()->PlayerDetached() && !cDevice::PrimaryDevice()->Replaying())
|
||||||
|
Channels.SwitchTo(cDevice::CurrentChannel());
|
||||||
// Restart the Watchdog timer:
|
// Restart the Watchdog timer:
|
||||||
if (WatchdogTimeout > 0) {
|
if (WatchdogTimeout > 0) {
|
||||||
int LatencyTime = WatchdogTimeout - alarm(WatchdogTimeout);
|
int LatencyTime = WatchdogTimeout - alarm(WatchdogTimeout);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user