Go to the documentation of this file.
13 #include <sys/ioctl.h>
45 if (cDevice::PrimaryDevice())
46 cDevice::PrimaryDevice()->PlayTs(Data, Length);
64 #define MIN_PRE_1_3_19_PRIVATESTREAM 10
112 esyslog(
"ERROR: too many devices!");
128 for (time_t t0 = time(NULL); time(NULL) - t0 < Timeout; ) {
156 esyslog(
"ERROR: invalid value in nextCardIndex(%d)", n);
191 isyslog(
"setting primary device to %d", n + 1);
201 esyslog(
"ERROR: invalid primary device number: %d", n + 1);
230 int MaxNumProvidedSystems = (1 << AvailableBits) - 1;
232 if (NumProvidedSystems > MaxNumProvidedSystems) {
233 esyslog(
"ERROR: device %d supports %d modulation systems but cDevice::GetDevice() currently only supports %d delivery systems which should be fixed", Device->
DeviceNumber() + 1, NumProvidedSystems, MaxNumProvidedSystems);
234 NumProvidedSystems = MaxNumProvidedSystems;
236 else if (NumProvidedSystems <= 0) {
237 esyslog(
"ERROR: device %d reported an invalid number (%d) of supported delivery systems - assuming 1", Device->
DeviceNumber() + 1, NumProvidedSystems);
238 NumProvidedSystems = 1;
240 return NumProvidedSystems;
247 int SlotPriority[NumCamSlots];
248 int NumUsableSlots = 0;
249 bool InternalCamNeeded =
false;
253 if (CamSlot->ModuleStatus() ==
msReady) {
254 if (CamSlot->ProvidesCa(Channel->
Caids())) {
256 SlotPriority[CamSlot->Index()] = CamSlot->MtdActive() ?
IDLEPRIORITY : CamSlot->Priority();
263 InternalCamNeeded =
true;
266 bool NeedsDetachReceivers =
false;
270 uint32_t Impact = 0xFFFFFFFF;
271 for (
int j = 0; j < NumCamSlots || !NumUsableSlots; j++) {
272 if (NumUsableSlots && SlotPriority[j] >
MAXPRIORITY)
277 bool HasInternalCam =
device[i]->HasInternalCam();
278 if (InternalCamNeeded && !HasInternalCam)
280 if (NumUsableSlots && !HasInternalCam && !
CamSlots.
Get(j)->Assign(
device[i],
true))
284 if (NumUsableSlots && !HasInternalCam) {
287 if ((csj->MtdActive() ? csi->MasterSlot() : csi) != csj)
306 imp <<= 1; imp |= ndr;
307 imp <<= 1; imp |= (NumUsableSlots || InternalCamNeeded) ? 0 :
device[i]->
HasCi();
308 imp <<= 1; imp |=
device[i]->AvoidRecording();
315 NeedsDetachReceivers = ndr;
316 if (NumUsableSlots && !HasInternalCam)
325 if (!Query && NeedsDetachReceivers)
331 if (s->MtdActive()) {
332 if (s == d->CamSlot()->MasterSlot()) {
338 d->CamSlot()->Assign(NULL);
346 if (s->Device() != d) {
350 d->CamSlot()->Assign(NULL);
364 if (s != d->CamSlot()) {
367 d->CamSlot()->Assign(NULL);
379 if (s->MtdActive()) {
392 s->Device()->DetachAllReceivers();
409 else if (d->CamSlot() && !d->CamSlot()->IsDecrypting())
410 d->CamSlot()->Assign(NULL);
418 for (
int i = 0; i < cDevice::NumDevices(); i++) {
420 if (d->IsTunedToTransponder(Channel))
422 if (d->ProvidesTransponder(Channel)) {
423 if (d->MaySwitchTransponder(Channel))
425 else if (!d->Occupied() && d->MaySwitchTransponder(Channel)) {
463 int fd = open(FileName, O_WRONLY | O_CREAT | O_NOFOLLOW | O_TRUNC, DEFFILEMODE);
468 if (
safe_write(fd, Image, ImageSize) == ImageSize)
469 isyslog(
"grabbed image to %s", FileName);
494 switch (VideoDisplayFormat) {
504 default:
esyslog(
"ERROR: invalid value for VideoDisplayFormat '%d'", VideoDisplayFormat);
544 if (Pid || PidType ==
ptPcr) {
547 if (PidType !=
ptPcr) {
609 if (Pid || PidType ==
ptPcr) {
611 if (PidType ==
ptPcr)
685 return safe_read(Handle, Buffer, Length);
755 bool cDevice::SignalStats(
int &Valid,
double *Strength,
double *Cnr,
double *BerPre,
double *BerPost,
double *Per,
int *Status)
const
792 for (
int i = 3; i--;) {
794 case scrOk:
return true;
800 default:
esyslog(
"ERROR: invalid return value from SetChannel");
810 Direction =
sgn(Direction);
814 int n = CurrentChannel() + Direction;
818 while ((Channel = Channels->GetByNumber(n, Direction)) != NULL) {
822 n = Channel->
Number() + Direction;
827 dsyslog(
"skipped channel %d", first);
829 dsyslog(
"skipped channels %d..%d", first, n -
sgn(d));
852 bool NeedsTransferMode = LiveView && Device != PrimaryDevice();
854 if (!NeedsTransferMode && LiveView &&
IsPrimaryDevice() && CamSlot() && CamSlot()->WantsTsData())
855 NeedsTransferMode =
true;
862 if (NeedsTransferMode) {
863 if (Device && PrimaryDevice()->
CanReplay()) {
898 if (Result ==
scrOk) {
911 if (!NeedsTransferMode)
925 if (
const cChannel *Channel = Channels->GetByNumber(CurrentChannel()))
933 return Seconds > 0 ? Seconds : 0;
1003 return (0 <= c && c <= 2) ? c : 0;
1008 if (0 <= AudioChannel && AudioChannel <= 2)
1031 if (DescriptionsOnly) {
1075 esyslog(
"ERROR: SetAvailableTrack called with invalid Type/Index (%d/%d)", Type, Index);
1087 for (
int i = FirstTrack; i <= LastTrack; i++) {
1140 if (TrackId && TrackId->
id) {
1156 int PreferredAudioChannel = 0;
1157 int LanguagePreference = -1;
1160 for (
int i = StartCheck; i <= EndCheck; i++) {
1165 PreferredAudioChannel = pos;
1176 dsyslog(
"setting audio track to %d (%d)", PreferredTrack, PreferredAudioChannel);
1189 int LanguagePreference = INT_MAX;
1252 if (Data[0] == 0x47) {
1258 int Pid =
TsPid(Data);
1268 int NewSize = Size + l;
1269 if (
uchar *NewBuffer = (
uchar *)realloc(buf, NewSize)) {
1272 memcpy(buf + Offset, p, l);
1290 int NewSize = Size + l;
1291 if (
uchar *NewBuffer = (
uchar *)realloc(buf, NewSize)) {
1294 memcpy(buf + Offset, p, l);
1297 esyslog(
"ERROR: out of memory");
1340 if (Player &&
player == Player) {
1395 bool FirstLoop =
true;
1399 while (
Start < End) {
1400 int d = End -
Start;
1417 int PayloadOffset = Data[8] + 9;
1420 if ((Data[7] & 0x01) && (Data[PayloadOffset - 3] & 0x81) == 0x01 && Data[PayloadOffset - 2] == 0x81)
1423 uchar SubStreamId = Data[PayloadOffset];
1424 uchar SubStreamType = SubStreamId & 0xF0;
1425 uchar SubStreamIndex = SubStreamId & 0x1F;
1428 pre_1_3_19_PrivateStreamDetected:
1431 SubStreamType = 0x80;
1436 switch (SubStreamType) {
1467 dsyslog(
"switching to pre 1.3.19 Dolby Digital compatibility mode - substream id = %02X", SubStreamId);
1470 goto pre_1_3_19_PrivateStreamDetected;
1483 esyslog(
"ERROR: incomplete PES packet write!");
1499 while (i <= Length - 6) {
1500 if (Data[i] == 0x00 && Data[i + 1] == 0x00 && Data[i + 2] == 0x01) {
1502 if (i + l > Length) {
1503 esyslog(
"ERROR: incomplete PES packet!");
1510 return i == 0 ? w : i;
1516 esyslog(
"ERROR: leftover PES data!");
1578 esyslog(
"ERROR: skipped %d bytes of TS fragment", Length);
1583 if (
int Skipped =
TS_SYNC(Data, Length))
1584 return Played + Skipped;
1585 int Pid =
TsPid(Data);
1588 if (PayloadOffset <
TS_SIZE) {
1597 return Played ? Played : w;
1602 if (!VideoOnly || HasIBPTrickSpeed()) {
1605 return Played ? Played : w;
1612 if (!VideoOnly || HasIBPTrickSpeed())
1620 return Played ? Played : w;
1660 #define TS_SCRAMBLING_TIMEOUT 3 // seconds to wait until a TS becomes unscrambled
1661 #define TS_SCRAMBLING_TIME_OK 3 // seconds before a Channel/CAM combination is marked as known to decrypt
1662 #define EIT_INJECTION_TIME 10 // seconds for which to inject EIT event
1682 if (Receiver && Receiver->
WantsPid(Pid)) {
1687 int CamSlotNumber = cs->MasterSlotNumber();
1690 time_t Now = time(NULL);
1714 time_t Now = time(NULL);
1754 if (Receiver->
device ==
this)
1758 #ifdef WAIT_FOR_TUNER_LOCK
1759 #define TUNER_LOCK_TIMEOUT 5000 // ms
1760 if (!
HasLock(TUNER_LOCK_TIMEOUT)) {
1768 for (
int n = 0; n < Receiver->
numPids; n++) {
1775 Receiver->Activate(
true);
1798 esyslog(
"ERROR: no free receiver slot!");
1804 if (!Receiver || Receiver->
device !=
this)
1806 bool receiversLeft =
false;
1812 Receiver->Activate(
false);
1813 for (
int n = 0; n < Receiver->
numPids; n++)
1817 receiversLeft =
true;
1837 if (Receiver && Receiver->
WantsPid(Pid))
1873 bool firstRead =
true;
1876 if (firstRead || Poller.
Poll(100)) {
1880 if (errno == EOVERFLOW)
1905 for (
int i = 1; i < Count; i++) {
1912 esyslog(
"ERROR: skipped %d bytes to sync on TS packet on device %d", Count,
deviceNumber);
const int * Caids(void) const
virtual void SetVolumeDevice(int Volume)
Sets the audio volume on this device (Volume = 0...255).
bool Poll(int TimeoutMs=0)
virtual bool ProvidesEIT(void) const
Returns true if this device provides EIT data and thus wants to be tuned to the channels it can recei...
int SubtitleLanguages[I18N_MAX_LANGUAGES+1]
bool Replaying(void) const
Returns true if we are currently replaying.
#define TS_SYNC(Data, Length)
bool Transferring(void) const
Returns true if we are currently in Transfer Mode.
void PlayTsAudio(const uchar *Data, int Length)
friend class cLiveSubtitle
virtual void SetAudioChannelDevice(int AudioChannel)
Sets the audio channel to stereo (0), mono left (1) or mono right (2).
virtual void CloseDvr(void)
Shuts down the DVR.
static int GetClippedNumProvidedSystems(int AvailableBits, cDevice *Device)
cSectionHandler * sectionHandler
bool CamDecrypt(tChannelID ChannelID, int CamSlotNumber)
cTSBuffer(int File, int Size, int DeviceNumber)
static bool WaitForAllDevicesReady(int Timeout=0)
Waits until all devices have become ready, or the given Timeout (seconds) has expired.
int currentAudioTrackMissingCount
virtual bool HasProgramme(void) const
Returns true if the device is currently showing any programme to the user, either through replaying o...
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView)
Sets the device to the given channel (actual physical setup).
const char * Name(void) const
void EnsureSubtitleTrack(void)
Makes sure one of the preferred language subtitle tracks is selected.
virtual cString DeviceName(void) const
Returns a string identifying the name of this device.
void SetTimeouts(int PutTimeout, int GetTimeout)
virtual bool GetTSPacket(uchar *&Data)
Gets exactly one TS packet from the DVR of this device and returns a pointer to it in Data.
virtual void Activate(bool On)
eKeys Message(eMessageType Type, const char *s, int Seconds=0)
Displays the given message, either through a currently visible display object that is capable of doin...
void SetChannel(const cChannel *Channel)
#define LOCK_CHANNELS_READ
void AttachFilter(cFilter *Filter)
Attaches the given filter to this device.
virtual int64_t GetSTC(void)
Gets the current System Time Counter, which can be used to synchronize audio, video and subtitles.
int NumTracks(eTrackType FirstTrack, eTrackType LastTrack) const
Returns the number of tracks in the given range that are currently available.
virtual int Available(void)
const char * Alang(int i) const
bool I18nIsPreferredLanguage(int *PreferredLanguages, const char *LanguageCode, int &OldPreference, int *Position)
Checks the given LanguageCode (which may be something like "eng" or "eng+deu") against the PreferredL...
virtual bool IsTunedToTransponder(const cChannel *Channel) const
Returns true if this device is currently tuned to the given Channel's transponder.
int Convert(const uchar *Data, int Length)
virtual void SetDigitalAudioDevice(bool On)
Tells the output device that the current audio track is Dolby Digital.
virtual void setScaleMode(cSpuDecoder::eScaleMode ScaleMode)=0
#define MIN_PRE_1_3_19_PRIVATESTREAM
virtual cString DeviceType(void) const
Returns a string identifying the type of this device (like "DVB-S").
virtual const cPositioner * Positioner(void) const
Returns a pointer to the positioner (if any) this device has used to move the satellite dish to the r...
virtual bool OpenDvr(void)
Opens the DVR of this device and prepares it to deliver a Transport Stream for use in a cReceiver.
void EnsureAudioTrack(bool Force=false)
Makes sure an audio track is selected that is actually available.
char language[MAXLANGCODE2]
cLiveSubtitle * liveSubtitle
int Priority(void) const
Returns the priority of the current receiving session (-MAXPRIORITY..MAXPRIORITY),...
eTrackType GetCurrentAudioTrack(void) const
#define MAXOCCUPIEDTIMEOUT
virtual bool MaySwitchTransponder(const cChannel *Channel) const
Returns true if it is ok to switch to the Channel's transponder on this device, without disturbing an...
virtual void StartDecrypting(void)
Sends all CA_PMT entries to the CAM that have been modified since the last call to this function.
static void MsgSetVolume(int Volume, bool Absolute)
eSetChannelResult SetChannel(const cChannel *Channel, bool LiveView)
Sets the device to the given channel (general setup).
void SetDecrypt(tChannelID ChannelID, int CamSlotNumber)
bool AddPid(int Pid, ePidType PidType=ptOther, int StreamType=0)
Adds a PID to the set of PIDs this device shall receive.
bool SetCurrentSubtitleTrack(eTrackType Type, bool Manual=false)
Sets the current subtitle track to the given Type.
cDeviceHook(void)
Creates a new device hook object.
void Add(cListObject *Object, cListObject *After=NULL)
bool Receiving(bool Dummy=false) const
Returns true if we are currently receiving. The parameter has no meaning (for backwards compatibility...
cMutex mutexCurrentAudioTrack
void SetChecked(tChannelID ChannelID, int CamSlotNumber)
virtual int NumProvidedSystems(void) const
Returns the number of individual "delivery systems" this device provides.
static int NextCardIndex(int n=0)
Calculates the next card index.
virtual bool Flush(int TimeoutMs=0)
Returns true if the device's output buffers are empty, i.
virtual int PlayVideo(const uchar *Data, int Length)
Plays the given data block as video.
virtual void DetachAllReceivers(void)
Detaches all receivers from this device.
virtual void Action(void)
A derived cThread class must implement the code it wants to execute as a separate thread in this func...
bool SetCurrentAudioTrack(eTrackType Type)
Sets the current audio track to the given Type.
void Cancel(int WaitSeconds=0)
Cancels the thread by first setting 'running' to false, so that the Action() loop can finish in an or...
eTrackType GetCurrentSubtitleTrack(void) const
virtual void CloseFilter(int Handle)
Closes a file handle that has previously been opened by OpenFilter().
int Read(int FileHandle, int Max=0)
Reads at most Max bytes from FileHandle and stores them in the ring buffer.
bool HasPid(int Pid) const
Returns true if this device is currently receiving the given PID.
int QueueMessage(eMessageType Type, const char *s, int Seconds=0, int Timeout=0)
Like Message(), but this function may be called from a background thread.
bool CamChecked(tChannelID ChannelID, int CamSlotNumber)
virtual int PlayAudio(const uchar *Data, int Length, uchar Id)
Plays the given data block as audio.
virtual bool ProvidesTransponder(const cChannel *Channel) const
Returns true if this device can provide the transponder of the given Channel (which implies that it c...
virtual void TrickSpeed(int Speed, bool Forward)
Sets the device into a mode where replay is done slower.
virtual void SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat)
Sets the video display format to the given one (only useful if this device has an MPEG decoder).
void ParsePat(const uchar *Data, int Length)
Parses the PAT data from the single TS packet in Data.
void StopReplay(void)
Stops the current replay session (if any).
virtual bool HasCi(void)
Returns true if this device has a Common Interface.
uchar * Get(int *Available=NULL, bool CheckAvailable=false)
Returns a pointer to the first TS packet in the buffer.
static cDevice * GetDevice(int Index)
Gets the device with the given Index.
void DetachAll(int Pid)
Detaches all receivers from this device for this pid.
virtual void SetPid(int Pid, bool Active)
Sets the given Pid (which has previously been added through a call to AddPid()) to Active.
virtual void Receive(const uchar *Data, int Length)
This function is called from the cDevice we are attached to, and delivers one TS packet from the set ...
cDvbSubtitleConverter * dvbSubtitleConverter
cRingBufferLinear * ringBuffer
virtual bool Assign(cDevice *Device, bool Query=false)
Assigns this CAM slot to the given Device, if this is possible.
void SetCamSlot(cCamSlot *CamSlot)
Sets the given CamSlot to be used with this device.
#define TS_SCRAMBLING_TIME_OK
virtual void MakePrimaryDevice(bool On)
Informs a device that it will be the primary device.
int TsPayloadOffset(const uchar *p)
int TsPid(const uchar *p)
virtual void SetSubtitleTrack(eTrackType Type, const tTrackId *TrackId)
void Detach(cFilter *Filter)
Detaches the given filter from this device.
virtual bool CanReplay(void) const
Returns true if this device can currently start a replay session.
void Detach(cFilter *Filter)
virtual bool ProvidesTransponderExclusively(const cChannel *Channel) const
Returns true if this is the only device that is able to provide the given channel's transponder.
virtual void SetVideoFormat(bool VideoFormat16_9)
Sets the output video format to either 16:9 or 4:3 (only useful if this device has an MPEG decoder).
void SetAudioChannel(int AudioChannel)
Sets the audio channel to stereo (0), mono left (1) or mono right (2).
bool IsPrimaryDevice(void) const
bool ToggleMute(void)
Turns the volume off or on and returns the new mute state.
eTrackType currentAudioTrack
virtual int PlaySubtitle(const uchar *Data, int Length)
Plays the given data block as a subtitle.
bool GrabImageFile(const char *FileName, bool Jpeg=true, int Quality=-1, int SizeX=-1, int SizeY=-1)
Calls GrabImage() and stores the resulting image in a file with the given name.
void Skip(int Count)
If after a call to Get() more or less than TS_SIZE of the available data has been processed,...
bool AttachPlayer(cPlayer *Player)
Attaches the given player to this device.
static void Launch(cControl *Control)
virtual bool DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const
Returns true if the given Device can provide the given Channel's transponder.
static void Shutdown(void)
Closes down all devices.
virtual void GetVideoSize(int &Width, int &Height, double &VideoAspect)
Returns the Width, Height and VideoAspect ratio of the currently displayed video material.
#define EIT_INJECTION_TIME
static bool SetPrimaryDevice(int n)
Sets the primary device to 'n'.
const char * Dlang(int i) const
void Del(int Count)
Deletes at most Count bytes from the ring buffer.
virtual bool SetPid(cPidHandle *Handle, int Type, bool On)
Does the actual PID setting on this device.
virtual int PlayTsSubtitle(const uchar *Data, int Length)
Plays the given data block as a subtitle.
virtual bool IsActivating(void)
Returns true if this CAM slot is currently activating a smart card.
virtual void StillPicture(const uchar *Data, int Length)
Displays the given I-frame as a still picture.
A steerable satellite dish generally points to the south on the northern hemisphere,...
int PesLength(const uchar *p)
bool TsHasPayload(const uchar *p)
bool AddPid(int Pid)
Adds the given Pid to the list of PIDs of this receiver.
virtual void SetAudioTrack(eTrackType Type, const tTrackId *TrackId)
bool TsIsScrambled(const uchar *p)
time_t startScrambleDetection
cString ToString(void) const
void DelPid(int Pid, ePidType PidType=ptOther)
Deletes a PID from the set of PIDs this device shall receive.
tChannelID ChannelID(void)
void SetVolume(int Volume, bool Absolute=false)
Sets the volume to the given value, either absolutely or relative to the current volume.
bool SetAvailableTrack(eTrackType Type, int Index, uint16_t Id, const char *Language=NULL, const char *Description=NULL)
Sets the track of the given Type and Index to the given values.
virtual int PlayTsVideo(const uchar *Data, int Length)
Plays the given data block as video.
static cDevice * ReceiverDevice(void)
virtual void Freeze(void)
Puts the device into "freeze frame" mode.
virtual bool TsPostProcess(uchar *Data)
If there is a cCiSession that needs to do additional processing on TS packets (after the CAM has done...
#define IS_AUDIO_TRACK(t)
virtual void Action(void)
A derived cThread class must implement the code it wants to execute as a separate thread in this func...
cPidHandle pidHandles[MAXPIDHANDLES]
void StopSectionHandler(void)
A device that has called StartSectionHandler() must call this function (typically in its destructor) ...
bool AttachReceiver(cReceiver *Receiver)
Attaches the given receiver to this device.
void DelLivePids(void)
Deletes the live viewing PIDs.
bool TsPayloadStart(const uchar *p)
virtual int PlayTs(const uchar *Data, int Length, bool VideoOnly=false)
Plays the given TS packet.
cCamSlot * MtdSpawn(void)
If this CAM slot can do MTD ("Multi Transponder Decryption"), a call to this function returns a cMtdC...
cChannelCamRelations ChannelCamRelations
uchar * Get(int &Count)
Gets data from the ring buffer.
void Attach(cFilter *Filter)
void SetOccupied(int Seconds)
Sets the occupied timeout for this device to the given number of Seconds, This can be used to tune a ...
cMutex mutexCurrentSubtitleTrack
virtual void SetAudioTrackDevice(eTrackType Type)
Sets the current audio track to the given value.
virtual void GetOsdSize(int &Width, int &Height, double &PixelAspect)
Returns the Width, Height and PixelAspect ratio the OSD should use to best fit the resolution of the ...
void Reset(void)
Resets the parser.
const tTrackId * GetTrack(eTrackType Type)
Returns a pointer to the given track id, or NULL if Type is not less than ttMaxTrackTypes.
int NumReadyMasterSlots(void)
Returns the number of master CAM slots in the system that are ready to decrypt.
void PutTs(const uchar *Data, int Length)
Puts the payload data of the single TS packet at Data into the converter.
bool DeviceHooksProvidesTransponder(const cChannel *Channel) const
virtual void Mute(void)
Turns off audio while replaying.
static cDevice * primaryDevice
int NumAudioTracks(void) const
Returns the number of audio tracks that are currently available.
virtual void AddChannel(const cChannel *Channel)
Adds all PIDs of the given Channel to the current list of PIDs.
int GetAudioChannel(void)
Gets the current audio channel, which is stereo (0), mono left (1) or mono right (2).
const cListObject * Get(int Index) const
const char * Slang(int i) const
virtual bool IsDecrypting(void)
Returns true if the CAM in this slot is currently used for decrypting.
virtual bool Poll(cPoller &Poller, int TimeoutMs=0)
Returns true if the device itself or any of the file handles in Poller is ready for further action.
virtual bool SetPlayMode(ePlayMode PlayMode)
Sets the device into the given play mode.
cReceiver * receiver[MAXRECEIVERS]
int ConvertFragments(const uchar *Data, int Length)
static void SleepMs(int TimeoutMs)
Creates a cCondWait object and uses it to sleep for TimeoutMs milliseconds, immediately giving up the...
static cDevice * ActualDevice(void)
Returns the actual receiving device in case of Transfer Mode, or the primary device otherwise.
virtual bool ProvidesSource(int Source) const
Returns true if this device can provide the given source.
int Ca(int Index=0) const
virtual int PlayTsAudio(const uchar *Data, int Length)
Plays the given data block as audio.
virtual int PlayPesPacket(const uchar *Data, int Length, bool VideoOnly=false)
Plays the single PES packet in Data with the given Length.
virtual int GetAudioChannelDevice(void)
Gets the current audio channel, which is stereo (0), mono left (1) or mono right (2).
void ForceTransferMode(void)
Forces the device into transfermode for the current channel.
static cDevice * GetDeviceForTransponder(const cChannel *Channel, int Priority)
Returns a device that is not currently "occupied" and can be tuned to the transponder of the given Ch...
virtual void SetSubtitleTrackDevice(eTrackType Type)
Sets the current subtitle track to the given value.
bool SwitchChannel(const cChannel *Channel, bool LiveView)
Switches the device to the given Channel, initiating transfer mode if necessary.
void ParsePmt(const uchar *Data, int Length)
Parses the PMT data from the single TS packet in Data.
tChannelID GetChannelID(void) const
void SetDescription(const char *Description,...) __attribute__((format(printf
void StartSectionHandler(void)
A derived device that provides section data must call this function (typically in its constructor) to...
virtual void Clear(void)
Clears all video and audio data from the device.
virtual void Play(void)
Sets the device into play mode (after a previous trick mode).
bool autoSelectPreferredSubtitleLanguage
int DeviceNumber(void) const
Returns the number of this device (0 ... numDevices - 1).
virtual void Receive(const uchar *Data, int Length)=0
This function is called from the cDevice we are attached to, and delivers one TS packet from the set ...
void PlayAudio(const uchar *Data, int Length, uchar Id)
virtual int SignalStrength(void) const
Returns the "strength" of the currently received signal.
int Occupied(void) const
Returns the number of seconds this device is still occupied for.
static void SetUseDevice(int n)
Sets the 'useDevice' flag of the given device.
virtual cSpuDecoder * GetSpuDecoder(void)
Returns a pointer to the device's SPU decoder (or NULL, if this device doesn't have an SPU decoder).
const T * Next(const T *Object) const
< Returns the element immediately before Object in this list, or NULL if Object is the first element ...
int pre_1_3_19_PrivateStream
virtual int SignalQuality(void) const
Returns the "quality" of the currently received signal.
virtual uchar * GrabImage(int &Size, bool Jpeg=true, int Quality=-1, int SizeX=-1, int SizeY=-1)
Grabs the currently visible screen image.
void bool Start(void)
Sets the description of this thread, which will be used when logging starting or stopping of the thre...
virtual bool ProvidesChannel(const cChannel *Channel, int Priority=IDLEPRIORITY, bool *NeedsDetachReceivers=NULL) const
Returns true if this device can provide the given channel.
tTrackId availableTracks[ttMaxTrackTypes]
void Reset(void)
Resets the converter.
virtual void InjectEit(int Sid)
Injects a generated EIT with a "present event" for the given Sid into the TS data stream sent to the ...
int NumSubtitleTracks(void) const
Returns the number of subtitle tracks that are currently available.
virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask)
Opens a file handle for the given filter data.
static int currentChannel
static void MsgChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
static cList< cDeviceHook > deviceHooks
virtual bool HasLock(int TimeoutMs=0) const
Returns true if the device has a lock on the requested transponder.
void SetRepeatLast(void)
Makes the next call to GetPes() return exactly the same data as the last one (provided there was no c...
static cDevice * device[MAXDEVICES]
virtual bool HasDecoder(void) const
Tells whether this device has an MPEG decoder.
void ClrAvailableTracks(bool DescriptionsOnly=false, bool IdsOnly=false)
Clears the list of currently available tracks.
virtual int PlayPes(const uchar *Data, int Length, bool VideoOnly=false)
Plays all valid PES packets in Data with the given Length.
#define IS_SUBTITLE_TRACK(t)
virtual int ReadFilter(int Handle, void *Buffer, size_t Length)
Reads data from a handle for the given filter.
int AudioLanguages[I18N_MAX_LANGUAGES+1]
virtual bool SignalStats(int &Valid, double *Strength=NULL, double *Cnr=NULL, double *BerPre=NULL, double *BerPost=NULL, double *Per=NULL, int *Status=NULL) const
Returns statistics about the currently received signal (if available).
const uchar * GetPes(int &Length)
Gets a pointer to the complete PES packet, or NULL if the packet is not complete yet.
cPatPmtParser patPmtParser
int Priority(void)
Returns the priority of the device this slot is currently assigned to, or IDLEPRIORITY if it is not a...
#define TS_SCRAMBLING_TIMEOUT
static void Shutdown(void)
eTrackType currentSubtitleTrack
time_t lastScrambledPacket
virtual const cChannel * GetCurrentlyTunedTransponder(void) const
Returns a pointer to the currently tuned transponder.
#define IS_DOLBY_TRACK(t)
virtual bool Ready(void)
Returns true if this device is ready.