Skip to content

Commit

Permalink
Rework IPTV MPEGStreamData handling a bit so that it can work for the…
Browse files Browse the repository at this point in the history
… signal monitor too.
  • Loading branch information
daniel-kristjansson committed Feb 16, 2012
1 parent 5eeee9c commit e124592
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 76 deletions.
22 changes: 15 additions & 7 deletions mythtv/libs/libmythtv/iptvchannel.cpp
Expand Up @@ -16,14 +16,15 @@
#define LOC QString("IPTVChan(%1): ").arg(GetCardID())

IPTVChannel::IPTVChannel(TVRec *rec, const QString&) :
DTVChannel(rec), m_open(false), m_recorder(NULL)
DTVChannel(rec), m_open(false), m_stream_data(NULL)
{
LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor");
}

IPTVChannel::~IPTVChannel()
{
LOG(VB_GENERAL, LOG_INFO, LOC + "dtor");
m_stream_data = NULL;
}

bool IPTVChannel::Open(void)
Expand All @@ -48,14 +49,14 @@ bool IPTVChannel::Open(void)
return m_open;
}

void IPTVChannel::SetRecorder(IPTVRecorder *rec)
void IPTVChannel::SetStreamData(MPEGStreamData *sd)
{
QMutexLocker locker(&m_lock);
if (m_recorder && m_stream_handler && m_recorder->GetStreamData())
m_stream_handler->RemoveListener(m_recorder->GetStreamData());
m_recorder = rec;
if (m_recorder && m_stream_handler && m_recorder->GetStreamData())
m_stream_handler->AddListener(m_recorder->GetStreamData());
if (m_stream_data && m_stream_handler)
m_stream_handler->RemoveListener(sd);
m_stream_data = sd;
if (m_stream_data && m_stream_handler)
m_stream_handler->AddListener(m_stream_data);
}

void IPTVChannel::Close(void)
Expand All @@ -74,6 +75,7 @@ bool IPTVChannel::IsOpen(void) const

bool IPTVChannel::Tune(const QString &freqid, int finetune)
{
QMutexLocker locker(&m_lock);
(void) finetune;

LOG(VB_GENERAL, LOG_INFO, LOC + QString("Tune(%1) TO BE IMPLEMENTED")
Expand All @@ -91,9 +93,15 @@ bool IPTVChannel::Tune(const QString &freqid, int finetune)
.arg(bitrate);

if (m_stream_handler)
{
if (m_stream_data)
m_stream_handler->RemoveListener(m_stream_data);
IPTVStreamHandler::Return(m_stream_handler);
}

m_stream_handler = IPTVStreamHandler::Get(channel_id);
if (m_stream_data)
m_stream_handler->AddListener(m_stream_data);

m_last_channel_id = channel_id;

Expand Down
4 changes: 2 additions & 2 deletions mythtv/libs/libmythtv/iptvchannel.h
Expand Up @@ -31,7 +31,7 @@ class IPTVChannel : public DTVChannel
virtual bool Tune(const DTVMultiplex&, QString) { return false; }

// Sets
void SetRecorder(IPTVRecorder*);
void SetStreamData(MPEGStreamData*);

// Gets
bool IsOpen(void) const;
Expand All @@ -41,7 +41,7 @@ class IPTVChannel : public DTVChannel
volatile bool m_open;
QString m_last_channel_id;
IPTVStreamHandler *m_stream_handler;
IPTVRecorder *m_recorder;
MPEGStreamData *m_stream_data;
};

#endif // _IPTV_CHANNEL_H_
Expand Down
7 changes: 4 additions & 3 deletions mythtv/libs/libmythtv/iptvrecorder.cpp
Expand Up @@ -35,7 +35,8 @@ bool IPTVRecorder::Open(void)

LOG(VB_RECORD, LOG_INFO, LOC + "opened successfully");

m_channel->SetRecorder(this);
if (_stream_data)
m_channel->SetStreamData(_stream_data);

return true;
}
Expand All @@ -49,7 +50,7 @@ void IPTVRecorder::Close(void)
{
LOG(VB_RECORD, LOG_INFO, LOC + "Close()");

m_channel->SetRecorder(NULL);
m_channel->SetStreamData(NULL);

m_open = false;
}
Expand All @@ -58,7 +59,7 @@ void IPTVRecorder::SetStreamData(MPEGStreamData *data)
{
DTVRecorder::SetStreamData(data);
if (m_open)
m_channel->SetRecorder(this);
m_channel->SetStreamData(_stream_data);
}

void IPTVRecorder::run(void)
Expand Down
60 changes: 13 additions & 47 deletions mythtv/libs/libmythtv/iptvsignalmonitor.cpp
Expand Up @@ -6,21 +6,9 @@
#include "iptvchannel.h"
#include "mythlogging.h"

#undef DBG_SM
#define DBG_SM(FUNC, MSG) LOG(VB_CHANNEL, LOG_DEBUG, \
QString("IPTVSM(%1)::%2: %3").arg(channel->GetDevice()).arg(FUNC).arg(MSG))

#define LOC QString("IPTVSM(%1): ").arg(channel->GetDevice())

void IPTVTableMonitorThread::run(void)
{
RunProlog();
m_parent->RunTableMonitor();
RunEpilog();
}

/** \fn IPTVSignalMonitor::IPTVSignalMonitor(int,IPTVChannel*,uint64_t)
* \brief Initializes signal lock and signal values.
/** \brief Initializes signal lock and signal values.
*
* Start() must be called to actually begin continuous
* signal monitoring. The timeout is set to 3 seconds,
Expand All @@ -36,9 +24,10 @@ void IPTVTableMonitorThread::run(void)
IPTVSignalMonitor::IPTVSignalMonitor(int db_cardnum,
IPTVChannel *_channel,
uint64_t _flags) :
DTVSignalMonitor(db_cardnum, _channel, _flags),
dtvMonitorRunning(false), tableMonitorThread(NULL)
DTVSignalMonitor(db_cardnum, _channel, _flags)
{
LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor");

// TODO init isLocked
bool isLocked = true;

Expand All @@ -52,6 +41,7 @@ IPTVSignalMonitor::IPTVSignalMonitor(int db_cardnum,
*/
IPTVSignalMonitor::~IPTVSignalMonitor()
{
LOG(VB_CHANNEL, LOG_INFO, LOC + "dtor");
Stop();
}

Expand All @@ -65,33 +55,12 @@ IPTVChannel *IPTVSignalMonitor::GetChannel(void)
*/
void IPTVSignalMonitor::Stop(void)
{
DBG_SM("Stop", "begin");
LOG(VB_CHANNEL, LOG_INFO, LOC + "Stop() -- begin");
SignalMonitor::Stop();
if (tableMonitorThread)
{
dtvMonitorRunning = false;
tableMonitorThread->wait();
delete tableMonitorThread;
tableMonitorThread = NULL;
}
DBG_SM("Stop", "end");
}

/** \fn IPTVSignalMonitor::RunTableMonitor(void)
*/
void IPTVSignalMonitor::RunTableMonitor(void)
{
DBG_SM("Run", "begin");
dtvMonitorRunning = true;

GetStreamData()->AddListeningPID(0);

// TODO IMPLEMENT -- RTP/UDP reading..

while (dtvMonitorRunning)
usleep(10000);

DBG_SM("Run", "end");
if (GetStreamData())
GetChannel()->SetStreamData(GetStreamData());
m_streamHandlerStarted = false;
LOG(VB_CHANNEL, LOG_INFO, LOC + "Stop() -- end");
}

/** \fn IPTVSignalMonitor::UpdateValues(void)
Expand All @@ -105,7 +74,7 @@ void IPTVSignalMonitor::UpdateValues(void)
if (!running || exit)
return;

if (dtvMonitorRunning)
if (m_streamHandlerStarted)
{
EmitStatus();
if (IsAllGood())
Expand Down Expand Up @@ -133,11 +102,8 @@ void IPTVSignalMonitor::UpdateValues(void)
kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT |
kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT))
{
tableMonitorThread = new IPTVTableMonitorThread(this);
DBG_SM("UpdateValues", "Waiting for table monitor to start");
while (!dtvMonitorRunning)
usleep(5000);
DBG_SM("UpdateValues", "Table monitor started");
GetChannel()->SetStreamData(GetStreamData());
m_streamHandlerStarted = true;
}

update_done = true;
Expand Down
18 changes: 1 addition & 17 deletions mythtv/libs/libmythtv/iptvsignalmonitor.h
Expand Up @@ -4,22 +4,10 @@
#define _IPTVSIGNALMONITOR_H_

#include "dtvsignalmonitor.h"
#include "mthread.h"

class IPTVChannel;
class IPTVSignalMonitor;

class IPTVTableMonitorThread : public MThread
{
public:
IPTVTableMonitorThread(IPTVSignalMonitor *p) :
MThread("IPTVTableMonitor"), m_parent(p) { start(); }
virtual ~IPTVTableMonitorThread() { wait(); m_parent = NULL; }
virtual void run(void);
private:
IPTVSignalMonitor *m_parent;
};

class IPTVSignalMonitor : public DTVSignalMonitor
{
friend class IPTVTableMonitorThread;
Expand All @@ -35,14 +23,10 @@ class IPTVSignalMonitor : public DTVSignalMonitor
IPTVSignalMonitor(const IPTVSignalMonitor&);

virtual void UpdateValues(void);

void RunTableMonitor(void);

IPTVChannel *GetChannel(void);

protected:
volatile bool dtvMonitorRunning;
IPTVTableMonitorThread *tableMonitorThread;
bool m_streamHandlerStarted;
};

#endif // _IPTVSIGNALMONITOR_H_

0 comments on commit e124592

Please sign in to comment.