summaryrefslogtreecommitdiff
path: root/device.h
diff options
context:
space:
mode:
Diffstat (limited to 'device.h')
-rw-r--r--device.h147
1 files changed, 102 insertions, 45 deletions
diff --git a/device.h b/device.h
index 16ec2c0..2099a22 100644
--- a/device.h
+++ b/device.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: device.h 1.46 2004/10/30 14:49:56 kls Exp $
+ * $Id: device.h 1.51 2005/01/07 14:57:01 kls Exp $
*/
#ifndef __DEVICE_H
@@ -56,10 +56,37 @@ enum eVideoSystem { vsPAL,
vsNTSC
};
+enum eTrackType { ttNone,
+ ttAudio,
+ ttAudioFirst = ttAudio,
+ ttAudioLast = ttAudioFirst + 31/*XXX MAXAPIDS - 1*/,
+ ttDolby,
+ ttDolbyFirst = ttDolby,
+ ttDolbyLast = ttDolbyFirst + 31/*XXX MAXAPIDS - 1*/,
+ /* future...
+ ttSubtitle,
+ ttSubtitleFirst = ttSubtitle,
+ ttSubtitleLast = ttSubtitleFirst + 31,
+ */
+ ttMaxTrackTypes
+ };
+
+#define IS_AUDIO_TRACK(t) (ttAudioFirst <= (t) && (t) <= ttAudioLast)
+#define IS_DOLBY_TRACK(t) (ttDolbyFirst <= (t) && (t) <= ttDolbyLast)
+
+struct tTrackId {
+ uint16_t id; // The PES packet id or the PID.
+ char language[8]; // something like either "eng" or "deu/eng"
+ char description[32]; // something like "Dolby Digital 5.1"
+ // for future use:
+ uint32_t flags; // Used to further identify the actual track.
+ };
+
class cChannel;
class cPlayer;
class cReceiver;
class cSpuDecoder;
+class cPesAssembler;
/// The cDevice class is the base from which actual devices can be derived.
@@ -283,69 +310,96 @@ public:
///< Returns the video system of the currently displayed material
///< (default is PAL).
+// Track facilities
+
+private:
+ tTrackId availableTracks[ttMaxTrackTypes];
+ eTrackType currentAudioTrack;
+protected:
+ virtual void SetAudioTrackDevice(eTrackType Type);
+ ///< Sets the current audio track to the given value.
+public:
+ void ClrAvailableTracks(bool DescriptionsOnly = false);
+ bool SetAvailableTrack(eTrackType Type, int Index, uint16_t Id, const char *Language = NULL, const char *Description = NULL, uint32_t Flags = 0);
+ ///< Sets the track of the given Type and Index to the given values.
+ ///< Type must be one of the basic eTrackType values, like ttAudio or ttDolby.
+ ///< Index tells which track of the given basic type is meant.
+ ///< If Id is 0 any existing id (and flags) will be left untouched and only the
+ ///< given Language and Description will be set.
+ ///< \return Returns true if the track was set correctly, false otherwise.
+ const tTrackId *GetTrack(eTrackType Type);
+ ///< Returns a pointer to the given track id, or NULL if Type is not
+ ///< less than ttMaxTrackTypes.
+ int NumAudioTracks(void) const;
+ ///< Returns the number of audio tracks that are currently available.
+ ///< This is just for information, to quickly find out whether there
+ ///< is more than one audio track.
+ eTrackType GetCurrentAudioTrack(void) { return currentAudioTrack; }
+ bool SetCurrentAudioTrack(eTrackType Type);
+ ///< Sets the current audio track to the given Type.
+ ///< \return Returns true if Type is a valid audio track, false otherwise.
+
// Audio facilities
private:
bool mute;
int volume;
protected:
+ virtual int GetAudioChannelDevice(void);
+ ///< Gets the current audio channel, which is stereo (0), mono left (1) or
+ ///< mono right (2).
+ virtual void SetAudioChannelDevice(int AudioChannel);
+ ///< Sets the audio channel to stereo (0), mono left (1) or mono right (2).
virtual void SetVolumeDevice(int Volume);
///< Sets the audio volume on this device (Volume = 0...255).
- virtual int NumAudioTracksDevice(void) const;
- ///< Returns the number of audio tracks that are currently available on this
- ///< device. The default return value is 0, meaning that this device
- ///< doesn't have multiple audio track capabilities. The return value may
- ///< change with every call and need not necessarily be the number of list
- ///< entries returned by GetAudioTracksDevice(). This function is mainly called to
- ///< decide whether there should be an "Audio" button in a menu.
- virtual const char **GetAudioTracksDevice(int *CurrentTrack = NULL) const;
- ///< Returns a list of currently available audio tracks. The last entry in the
- ///< list must be NULL. The number of entries does not necessarily have to be
- ///< the same as returned by a previous call to NumAudioTracksDevice().
- ///< If CurrentTrack is given, it will be set to the index of the current track
- ///< in the returned list. Note that the list must not be changed after it has
- ///< been returned by a call to GetAudioTracksDevice()! The only time the list may
- ///< change is *inside* the GetAudioTracksDevice() function.
- ///< By default the return value is NULL and CurrentTrack, if given, will not
- ///< have any meaning.
- virtual void SetAudioTrackDevice(int Index);
- ///< Sets the current audio track to the given value, which should be within the
- ///< range of the list returned by a previous call to GetAudioTracksDevice()
- ///< (otherwise nothing will happen).
+ virtual void SetDigitalAudioDevice(bool On);
+ ///< Tells the actual device that digital audio output shall be switched
+ ///< on or off.
public:
bool IsMute(void) const { return mute; }
bool ToggleMute(void);
///< Turns the volume off or on and returns the new mute state.
+ int GetAudioChannel(void);
+ ///< Gets the current audio channel, which is stereo (0), mono left (1) or
+ ///< mono right (2).
+ void SetAudioChannel(int AudioChannel);
+ ///< Sets the audio channel to stereo (0), mono left (1) or mono right (2).
+ ///< Any other values will be silently ignored.
void SetVolume(int Volume, bool Absolute = false);
///< Sets the volume to the given value, either absolutely or relative to
///< the current volume.
static int CurrentVolume(void) { return primaryDevice ? primaryDevice->volume : 0; }//XXX???
- int NumAudioTracks(void) const;
- ///< Returns the number of audio tracks that are currently available on this
- ///< device or a player attached to it.
- const char **GetAudioTracks(int *CurrentTrack = NULL) const;
- ///< Returns a list of currently available audio tracks. The last entry in the
- ///< list is NULL. The number of entries does not necessarily have to be
- ///< the same as returned by a previous call to NumAudioTracks().
- ///< If CurrentTrack is given, it will be set to the index of the current track
- ///< in the returned list.
- ///< By default the return value is NULL and CurrentTrack, if given, will not
- ///< have any meaning.
- void SetAudioTrack(int Index);
- ///< Sets the current audio track to the given value, which should be within the
- ///< range of the list returned by a previous call to GetAudioTracks() (otherwise
- ///< nothing will happen).
// Player facilities
private:
cPlayer *player;
+ cPesAssembler *pesAssembler;
protected:
virtual bool CanReplay(void) const;
///< Returns true if this device can currently start a replay session.
virtual bool SetPlayMode(ePlayMode PlayMode);
///< Sets the device into the given play mode.
///< \return true if the operation was successful.
+ virtual int PlayVideo(const uchar *Data, int Length);
+ ///< Plays the given data block as video.
+ ///< Data points to exactly one complete PES packet of the given Length.
+ ///< PlayVideo() shall process the packet either as a whole (returning
+ ///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN).
+ ///< \return Returns the number of bytes actually taken from Data, or -1
+ ///< in case of an error.
+ virtual int PlayAudio(const uchar *Data, int Length);
+ ///< Plays the given data block as audio.
+ ///< Data points to exactly one complete PES packet of the given Length.
+ ///< PlayAudio() shall process the packet either as a whole (returning
+ ///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN).
+ ///< \return Returns the number of bytes actually taken from Data, or -1
+ ///< in case of an error.
+ virtual int PlayPesPacket(const uchar *Data, int Length, bool VideoOnly = false);
+ ///< Plays the single PES packet in Data with the given Length.
+ ///< If VideoOnly is true, only the video will be displayed,
+ ///< which is necessary for trick modes like 'fast forward'.
+ ///< Data must point to one single, complete PES packet.
public:
virtual int64_t GetSTC(void);
///< Gets the current System Time Counter, which can be used to
@@ -382,14 +436,16 @@ public:
///< If TimeoutMs is not zero, the device will wait up to the given
///< number of milliseconds before returning in case there is still
///< data in the buffers..
- virtual int PlayVideo(const uchar *Data, int Length);
- ///< Actually plays the given data block as video. The data must be
- ///< part of a PES (Packetized Elementary Stream) which can contain
- ///< one video and one audio stream.
- virtual void PlayAudio(const uchar *Data, int Length);
- ///< Plays additional audio streams, like Dolby Digital.
- ///< A derived class must call the base class function to make sure data
- ///< is distributed to all registered cAudio objects.
+ virtual int PlayPes(const uchar *Data, int Length, bool VideoOnly = false);
+ ///< Plays all valid PES packets in Data with the given Length.
+ ///< If Data is NULL any leftover data from a previous call will be
+ ///< discarded. If VideoOnly is true, only the video will be displayed,
+ ///< which is necessary for trick modes like 'fast forward'.
+ ///< Data should point to a sequence of complete PES packets. If the
+ ///< last packet in Data is not complete, it will be copied and combined
+ ///< to a complete packet with data from the next call to PlayPes().
+ ///< That way any functions called from within PlayPes() will be
+ ///< guaranteed to always receive complete PES packets.
bool Replaying(void) const;
///< Returns true if we are currently replaying.
void StopReplay(void);
@@ -402,6 +458,7 @@ public:
// Receiver facilities
private:
+ cMutex mutexReceiver;
cReceiver *receiver[MAXRECEIVERS];
int CanShift(int Ca, int Priority, int UsedCards = 0) const;
protected: