diff --git a/HISTORY b/HISTORY index 06f92f67..0842d0f9 100644 --- a/HISTORY +++ b/HISTORY @@ -1354,3 +1354,4 @@ Video Disk Recorder Revision History - Activated cutting. - Activated transfer mode. - Moved handling of the Menu key entirely into vdr.c. +- Switched VDR's own player to the new cPlayer/cControl structures. diff --git a/device.c b/device.c index 7bce6c4e..d30a1e59 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.3 2002/06/22 13:45:53 kls Exp $ + * $Id: device.c 1.4 2002/06/23 11:16:21 kls Exp $ */ #include "device.h" @@ -460,7 +460,7 @@ bool cDevice::SetPid(int fd, dmxPesType_t PesType, int Pid, dmxOutput_t Output) eSetChannelResult cDevice::SetChannel(int ChannelNumber, int Frequency, char Polarization, int Diseqc, int Srate, int Vpid, int Apid, int Tpid, int Ca, int Pnr) { DELETENULL(transfer); - //XXX+StopReplay(); + StopReplay(); cStatus::MsgChannelSwitch(this, 0); @@ -735,11 +735,6 @@ void cDevice::StillPicture(const uchar *Data, int Length) bool cDevice::Replaying(void) { - /*XXX+ - if (replayBuffer && !replayBuffer->Active()) - StopReplay(); - return replayBuffer != NULL; - XXX*/ return player != NULL; } diff --git a/dvbplayer.c b/dvbplayer.c index 3027e37d..9ea8eb13 100644 --- a/dvbplayer.c +++ b/dvbplayer.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbplayer.c 1.3 2002/06/22 13:35:36 kls Exp $ + * $Id: dvbplayer.c 1.4 2002/06/23 10:52:51 kls Exp $ */ #include "dvbplayer.h" @@ -625,9 +625,9 @@ bool cDvbPlayer::GetReplayMode(bool &Play, bool &Forward, int &Speed) // --- cDvbPlayerControl ----------------------------------------------------- -cDvbPlayerControl::cDvbPlayerControl(void) +cDvbPlayerControl::cDvbPlayerControl(const char *FileName) +:cControl(player = new cDvbPlayer(FileName)) { - player = NULL; } cDvbPlayerControl::~cDvbPlayerControl() @@ -640,16 +640,6 @@ bool cDvbPlayerControl::Active(void) return player && player->Active(); } -bool cDvbPlayerControl::Start(const char *FileName) -{ - delete player; - player = new cDvbPlayer(FileName); - if (cDevice::PrimaryDevice()->AttachPlayer(player)) - return true; - Stop(); - return false; -} - void cDvbPlayerControl::Stop(void) { delete player; diff --git a/dvbplayer.h b/dvbplayer.h index b05bcdfa..41590257 100644 --- a/dvbplayer.h +++ b/dvbplayer.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbplayer.h 1.1 2002/06/16 10:59:14 kls Exp $ + * $Id: dvbplayer.h 1.2 2002/06/23 10:13:51 kls Exp $ */ #ifndef __DVBPLAYER_H @@ -19,11 +19,10 @@ class cDvbPlayerControl : public cControl { private: cDvbPlayer *player; public: - cDvbPlayerControl(void); + cDvbPlayerControl(const char *FileName); + // Sets up a player for the given file. virtual ~cDvbPlayerControl(); bool Active(void); - bool Start(const char *FileName); - // Starts replaying the given file. void Stop(void); // Stops the current replay session (if any). void Pause(void); diff --git a/menu.c b/menu.c index 338838ec..2a5f2fee 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.200 2002/06/23 09:09:11 kls Exp $ + * $Id: menu.c 1.201 2002/06/23 11:07:19 kls Exp $ */ #include "menu.h" @@ -2681,18 +2681,14 @@ char *cReplayControl::fileName = NULL; char *cReplayControl::title = NULL; cReplayControl::cReplayControl(void) +:cDvbPlayerControl(fileName) { visible = modeOnly = shown = displayFrames = false; lastCurrent = lastTotal = -1; timeoutShow = 0; timeSearchActive = false; - if (fileName) { - marks.Load(fileName); - if (!Start(fileName)) - Interface->Error(tr("Channel locked (recording)!"));//XXX+ - else - cStatus::MsgReplaying(this, fileName); - } + marks.Load(fileName); + cStatus::MsgReplaying(this, fileName); } cReplayControl::~cReplayControl() diff --git a/player.c b/player.c index fe0a2771..7b66fae0 100644 --- a/player.c +++ b/player.c @@ -4,10 +4,11 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: player.c 1.1 2002/06/16 10:34:50 kls Exp $ + * $Id: player.c 1.2 2002/06/23 11:23:17 kls Exp $ */ #include "player.h" +#include "i18n.h" // --- cPlayer --------------------------------------------------------------- @@ -46,10 +47,40 @@ void cPlayer::Detach(void) // --- cControl -------------------------------------------------------------- -cControl::cControl(void) +cControl *cControl::control = NULL; + +cControl::cControl(cPlayer *Player) { + attached = false; + player = Player; } cControl::~cControl() { + if (this == control) + control = NULL; +} + +void cControl::Launch(cControl *Control) +{ + delete control; + control = Control; +} + +void cControl::Attach(void) +{ + if (control && !control->attached && control->player && !control->player->IsAttached()) { + if (cDevice::PrimaryDevice()->AttachPlayer(control->player)) + control->attached = true; + else { + Interface->Error(tr("Channel locked (recording)!")); + Shutdown(); + } + } +} + +void cControl::Shutdown(void) +{ + delete control; + control = NULL; } diff --git a/player.h b/player.h index f4b976b7..ce0cb441 100644 --- a/player.h +++ b/player.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: player.h 1.2 2002/06/22 14:47:25 kls Exp $ + * $Id: player.h 1.3 2002/06/23 11:20:23 kls Exp $ */ #ifndef __PLAYER_H @@ -40,13 +40,23 @@ protected: public: cPlayer(void); virtual ~cPlayer(); + bool IsAttached(void) { return device != NULL; } }; class cControl : public cOsdObject { +private: + static cControl *control; + bool attached; +protected: + cPlayer *player; public: - cControl(void); + cControl(cPlayer *Player); virtual ~cControl(); virtual void Hide(void) = 0; + static void Launch(cControl *Control); + static void Attach(void); + static void Shutdown(void); + static cControl *Control(void) { return control; } }; #endif //__PLAYER_H diff --git a/vdr.c b/vdr.c index 534439dc..10c54f74 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.116 2002/06/23 09:35:08 kls Exp $ + * $Id: vdr.c 1.117 2002/06/23 11:23:34 kls Exp $ */ #include @@ -373,7 +373,6 @@ int main(int argc, char *argv[]) cOsdObject *Menu = NULL; cOsdObject *Temp = NULL; - cReplayControl *ReplayControl = NULL; int LastChannel = -1; int PreviousChannel = cDevice::CurrentChannel(); time_t LastActivity = 0; @@ -391,6 +390,8 @@ int main(int argc, char *argv[]) esyslog("emergency exit requested - shutting down"); break; } + // Attach launched player control: + cControl::Attach(); // Restart the Watchdog timer: if (WatchdogTimeout > 0) { int LatencyTime = WatchdogTimeout - alarm(WatchdogTimeout); @@ -418,8 +419,8 @@ int main(int argc, char *argv[]) } } // User Input: - cOsdObject **Interact = Menu ? &Menu : (cOsdObject **)&ReplayControl; - eKeys key = Interface->GetKey(!*Interact || !(*Interact)->NeedsFastResponse()); + cOsdObject *Interact = Menu ? Menu : cControl::Control(); + eKeys key = Interface->GetKey(!Interact || !Interact->NeedsFastResponse()); if (NORMALKEY(key) != kNone) { EITScanner.Activity(); LastActivity = time(NULL); @@ -433,9 +434,9 @@ int main(int argc, char *argv[]) if (!Temp) break; } - if (ReplayControl) - ReplayControl->Hide(); - Menu = new cMenuMain(ReplayControl); + if (cControl::Control()) + cControl::Control()->Hide(); + Menu = new cMenuMain(cControl::Control()); Temp = NULL; break; // Volume Control: @@ -456,7 +457,8 @@ int main(int argc, char *argv[]) break; // Power off: case kPower: isyslog("Power button pressed"); - DELETENULL(*Interact); + DELETENULL(Menu); + cControl::Shutdown(); Temp = NULL; if (!Shutdown) { Interface->Error(tr("Can't shutdown - option '-s' not given!")); @@ -469,8 +471,8 @@ int main(int argc, char *argv[]) LastActivity = 1; // not 0, see below! break; default: - if (*Interact) { - switch ((*Interact)->ProcessKey(key)) { + if (Interact) { + switch (Interact->ProcessKey(key)) { case osRecord: DELETENULL(Menu); Temp = NULL; if (!cRecordControls::Start()) @@ -478,28 +480,32 @@ int main(int argc, char *argv[]) break; case osRecordings: DELETENULL(Menu); - DELETENULL(ReplayControl); + cControl::Shutdown(); Temp = NULL; - Menu = new cMenuMain(ReplayControl, osRecordings); + Menu = new cMenuMain(false, osRecordings); break; case osReplay: DELETENULL(Menu); - DELETENULL(ReplayControl); + cControl::Shutdown(); Temp = NULL; - ReplayControl = new cReplayControl; + cControl::Launch(new cReplayControl); break; case osStopReplay: - DELETENULL(*Interact); - DELETENULL(ReplayControl); + DELETENULL(Menu); + cControl::Shutdown(); Temp = NULL; break; case osSwitchDvb: - DELETENULL(*Interact); + DELETENULL(Menu); + cControl::Shutdown(); Temp = NULL; Interface->Info(tr("Switching primary DVB...")); cDevice::SetPrimaryDevice(Setup.PrimaryDVB); break; case osBack: - case osEnd: DELETENULL(*Interact); + case osEnd: if (Interact == Menu) + DELETENULL(Menu); + else + cControl::Shutdown(); Temp = NULL; break; default: ; @@ -552,7 +558,7 @@ int main(int argc, char *argv[]) Interface->Info(tr("Editing process finished")); } } - if (!*Interact && ((!cRecordControls::Active() && !cCutter::Active()) || ForceShutdown)) { + if (!Interact && ((!cRecordControls::Active() && !cCutter::Active()) || ForceShutdown)) { time_t Now = time(NULL); if (Now - LastActivity > ACTIVITYTIMEOUT) { // Shutdown: @@ -614,7 +620,7 @@ int main(int argc, char *argv[]) cRecordControls::Shutdown(); cCutter::Stop(); delete Menu; - delete ReplayControl; + cControl::Shutdown(); delete Interface; cOsd::Shutdown(); PluginManager.Shutdown(true);