#ifndef __XINEDEVICE_H #define __XINEDEVICE_H #include "xineCommon.h" #include #include #include "xineLib.h" class cPlugin; namespace PluginXine { class cXineSettings; class cXineOsd; class cXineDevice; class cXineSpuDecoder : public cDvbSpuDecoder { cXineDevice *const m_xineDevice; void ptsAdjust(uint32_t &pts); public: cXineSpuDecoder(cXineDevice *const xineDevice) : cDvbSpuDecoder() , m_xineDevice(xineDevice) { } virtual int setTime(uint32_t pts); }; class cXineDevice : public cDevice, public cXineLibEvents { cXineSettings &m_settings; bool m_osdUpdateLocked; cXineOsd *m_currentOsd; cXineSpuDecoder *m_spuDecoder; virtual bool HasDecoder(void) const; virtual cSpuDecoder *GetSpuDecoder(void); virtual bool CanReplay(void) const; virtual bool SetPlayMode(ePlayMode PlayMode); virtual bool HasIBPTrickSpeed(void); virtual void TrickSpeed(int Speed, bool Forward); virtual void Clear(void); virtual void Play(void); virtual void Freeze(void); virtual void Mute(void); virtual void StillPicture(const uchar *Data, int Length); virtual bool Poll(cPoller &Poller, int TimeoutMs = 0); virtual bool Flush(int TimeoutMs = 0); virtual int PlayTs(const uchar *Data, int Length, bool VideoOnly = false); virtual int PlayTsImpl(const uchar *Data, int Length, bool VideoOnly = false); virtual int PlaySingleTs(const uchar *Data, int Length, bool VideoOnly = false); virtual void PlayTsTrampoline(const uchar *Data, int Length, bool VideoOnly = false); virtual int PlayTsVideo(const uchar *Data, int Length); virtual int PlayTsAudio(const uchar *Data, int Length); virtual int PlayVideo(const uchar *Data, int Length); int PlayVideo1(const uchar *Data, int Length, const bool stillImageData); int PlayVideo2(const uchar *Data, int Length, const bool stillImageData); int PlayVideo3(const uchar *Data, int Length, const bool stillImageData); int PlayAudio2(const uchar *Data, int Length); int PlayAudio3(const uchar *Data, int Length); int PlayCommon(const uchar *Data, int Length, const bool stillImageData); int PlayCommon1(const uchar *Data, int Length, int64_t ptsForce); int PlayCommon2(const uchar *Data, int Length, int64_t ptsForce); int PlayCommon3(const uchar *Data, int Length, int64_t ptsForce); #if APIVERSNUM >= 10338 virtual uchar *GrabImage(int &Size, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1); #else virtual bool GrabImage(const char *FileName, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1); #endif bool m_is16_9; virtual void SetVideoFormat(bool VideoFormat16_9); virtual void SetVolumeDevice(int Volume); #if APIVERSNUM >= 10707 #if APIVERSNUM >= 10708 virtual void GetVideoSize(int &Width, int &Height, double &VideoAspect); virtual void GetOsdSize(int &Width, int &Height, double &PixelAspect); #else virtual void GetVideoSize(int &Width, int &Height, eVideoAspect &Aspect); #endif #endif #if APIVERSNUM >= 10307 virtual void MakePrimaryDevice(bool On); #endif int m_audioChannel; #if APIVERSNUM < 10318 virtual void PlayAudio(const uchar *Data, int Length); #else virtual int GetAudioChannelDevice(void); virtual void SetAudioChannelDevice(int AudioChannel); virtual void SetDigitalAudioDevice(bool On); #if APIVERSNUM < 10342 virtual int PlayAudio(const uchar *Data, int Length); #else virtual int PlayAudio(const uchar *Data, int Length, uchar Id); #endif #endif int PlayAudioCommon(const uchar *Data, int Length); bool open(); void close(); int PushOut(); void initStream(); void reshowCurrentOsd(const bool dontOptimize = true, const int frameLeft = -1, const int frameTop = -1, const int frameWidth = -1, const int frameHeight = -1, const int frameZoomX = -1, const int frameZoomY = -1, const bool unlockOsdUpdate = false); virtual void OnClientConnect(); virtual void OnClientDisconnect(); virtual void ReshowCurrentOSD(const int frameLeft, const int frameTop, const int frameWidth, const int frameHeight, const int frameZoomX, const int frameZoomY, const bool unlockOsdUpdate); virtual void LockOsdUpdate(); virtual bool OsdUpdateLocked(); virtual void DiscontinuityDetected(); virtual bool DeviceReplayingOrTransferring(); cPlugin *const m_plugin; int m_switchPrimaryDeviceDeviceNo; cMutex m_switchPrimaryDeviceMutex; cCondVar m_switchPrimaryDeviceCond; void switchPrimaryDevice(const int deviceNo, const bool waitForExecution); void mainMenuTrampoline(); cMutex m_playTsMutex; public: const cXineSettings &Settings() const { return m_settings; } virtual int64_t GetSTC(void); #if APIVERSNUM < 10307 virtual cOsdBase *NewOsd(int w, int h, int x, int y); #elif APIVERSNUM < 10509 virtual cOsd *NewOsd(int w, int h, int x, int y); #else virtual cOsd *NewOsd(int w, int h, int x, int y, uint Level, bool TrueColor = false); #endif bool ChangeCurrentOsd(cXineOsd *osd, bool on); cXineDevice(cPlugin *const plugin, cXineSettings &settings, cXineRemote *remote); virtual ~cXineDevice(); #if APIVERSNUM < 10307 void OnFreeOsd(cOsdBase *const osd); #else void OnFreeOsd(cOsd *const osd); #endif #if APIVERSNUM >= 10733 virtual cRect CanScaleVideo(const cRect &Rect, int Alignment = taCenter); virtual void ScaleVideo(const cRect &Rect = cRect::Null); const cRect & GetScaleRect(); private: cRect vidWinRect; public: #endif // APIVERSNUM >= 10733 cXineLib m_xineLib; cMutex m_osdMutex; cMutex m_pmMutex; cCondVar m_pmCondVar; static bool Create(cPlugin *const plugin, cXineSettings &settings, cXineRemote *remote); static bool Open(); static void Stop(); static cXineDevice *GetDevice(); static void MainMenuTrampoline() { GetDevice()->mainMenuTrampoline(); } bool hasNoSignalStream() const { return m_xineLib.hasNoSignalStream(); } bool SupportsTrueColorOSD() const { return m_xineLib.SupportsTrueColorOSD(); } }; }; #endif //__XINEDEVICE_H