vdr/player.c
Klaus Schmidinger ed643353b1 Version 1.1.7
- Adapted VDR to the NEWSTRUCT driver. To use the new driver, compile VDR with
  'make NEWSTRUCT=1' (thanks to Holger Wächtler for some valuable advice).
  By default it currently still uses the old driver.
- Added some missing #includes (thanks to Martin Hammerschmid).
- Changed the log error message "can't record MPEG1!" to "error in data stream!",
  since the mentioning of MPEG1 has irritated many people.
- Consistently using malloc/free and new/delete (thanks to Andreas Schultz).
- Temporarily made cDevice::ProvidesCa() virtual (Andreas Schultz needs this
  in his DXR3 plugin).
- cDevice no longer exposes a file handle to cPlayer. A derived cPlayer class
  can now call DevicePoll() to see whether the replay device is ready for
  further data. A derived cDevice class must implement Poll() and shall
  check if any of its file handles is ready for data.
- Implemented several replay modes to allow players that play only audio (thanks
  to Stefan Huelswitt).
- Improved cCondVar::Wait() and implemented cCondVar::TimedWait() (thanks to
  Stefan Huelswitt).
- VDR no longer gives up if there is no DVB device. It continues to work if
  there is at least one device, either a DVB device found by the core VDR code
  itself, or a device implemented by a plugin.
2002-08-16 18:00:00 +02:00

93 lines
1.8 KiB
C

/*
* player.c: The basic player interface
*
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: player.c 1.5 2002/08/15 10:29:17 kls Exp $
*/
#include "player.h"
#include "i18n.h"
// --- cPlayer ---------------------------------------------------------------
cPlayer::cPlayer(ePlayMode PlayMode)
{
device = NULL;
playMode = PlayMode;
}
cPlayer::~cPlayer()
{
Detach();
}
int cPlayer::PlayVideo(const uchar *Data, int Length)
{
if (device)
return device->PlayVideo(Data, Length);
esyslog("ERROR: attempt to use cPlayer::PlayVideo() without attaching to a cDevice!");
return -1;
}
int cPlayer::PlayAudio(const uchar *Data, int Length)
{
if (device)
return device->PlayAudio(Data, Length);
esyslog("ERROR: attempt to use cPlayer::PlayAudio() without attaching to a cDevice!");
return -1;
}
void cPlayer::Detach(void)
{
if (device)
device->Detach(this);
}
// --- cControl --------------------------------------------------------------
cControl *cControl::control = NULL;
cControl::cControl(cPlayer *Player, bool Hidden)
{
attached = false;
hidden = Hidden;
player = Player;
}
cControl::~cControl()
{
if (this == control)
control = NULL;
}
cControl *cControl::Control(void)
{
return (control && !control->hidden) ? 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;
}