Switched VDR's own player to the new cPlayer/cControl structures

This commit is contained in:
Klaus Schmidinger 2002-06-23 11:23:34 +02:00
parent 0bb9a1a77b
commit cd030554e5
8 changed files with 84 additions and 56 deletions

View File

@ -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.

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

12
menu.c
View File

@ -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()

View File

@ -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;
}

View File

@ -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

46
vdr.c
View File

@ -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 <getopt.h>
@ -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);