1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00
vdr/transfer.c

71 lines
2.0 KiB
C
Raw Normal View History

2002-06-22 13:45:53 +02:00
/*
* transfer.c: Transfer mode
*
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: transfer.c 2.3 2009/01/23 16:44:29 kls Exp $
2002-06-22 13:45:53 +02:00
*/
#include "transfer.h"
// --- cTransfer -------------------------------------------------------------
cTransfer::cTransfer(tChannelID ChannelID, int VPid, const int *APids, const int *DPids, const int *SPids)
:cReceiver(ChannelID, -1, VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids)
2002-06-22 13:45:53 +02:00
{
patPmtGenerator.SetChannel(Channels.GetByChannelID(ChannelID));
2002-06-22 13:45:53 +02:00
}
cTransfer::~cTransfer()
{
cReceiver::Detach();
cPlayer::Detach();
}
void cTransfer::Activate(bool On)
{
if (On) {
PlayTs(patPmtGenerator.GetPat(), TS_SIZE);
int Index = 0;
while (uchar *pmt = patPmtGenerator.GetPmt(Index))
PlayTs(pmt, TS_SIZE);
}
else
cPlayer::Detach();
2002-06-22 13:45:53 +02:00
}
void cTransfer::Receive(uchar *Data, int Length)
{
if (cPlayer::IsAttached()) {
// Transfer Mode means "live tv", so there's no point in doing any additional
// buffering here. The TS packets *must* get through here! However, every
// now and then there may be conditions where the packet just can't be
// handled when offered the first time, so that's why we try several times:
for (int i = 0; i < 100; i++) {
if (PlayTs(Data, Length) > 0)
return;
fprintf(stderr, "-");//XXX just for testing - remove when stable
cCondWait::SleepMs(10);
}
esyslog("ERROR: TS packet not accepted in Transfer Mode");
}
2002-06-22 13:45:53 +02:00
}
// --- cTransferControl ------------------------------------------------------
2003-05-11 09:01:51 +02:00
cDevice *cTransferControl::receiverDevice = NULL;
cTransferControl::cTransferControl(cDevice *ReceiverDevice, tChannelID ChannelID, int VPid, const int *APids, const int *DPids, const int *SPids)
:cControl(transfer = new cTransfer(ChannelID, VPid, APids, DPids, SPids), true)
{
ReceiverDevice->AttachReceiver(transfer);
2003-05-11 09:01:51 +02:00
receiverDevice = ReceiverDevice;
}
cTransferControl::~cTransferControl()
{
2003-05-11 09:01:51 +02:00
receiverDevice = NULL;
delete transfer;
}