From e124592afc3c6474c9e391a155ad96b72c52ad87 Mon Sep 17 00:00:00 2001 From: Daniel Kristjansson Date: Thu, 16 Feb 2012 15:21:48 -0500 Subject: [PATCH] Rework IPTV MPEGStreamData handling a bit so that it can work for the signal monitor too. --- mythtv/libs/libmythtv/iptvchannel.cpp | 22 +++++--- mythtv/libs/libmythtv/iptvchannel.h | 4 +- mythtv/libs/libmythtv/iptvrecorder.cpp | 7 +-- mythtv/libs/libmythtv/iptvsignalmonitor.cpp | 60 +++++---------------- mythtv/libs/libmythtv/iptvsignalmonitor.h | 18 +------ 5 files changed, 35 insertions(+), 76 deletions(-) diff --git a/mythtv/libs/libmythtv/iptvchannel.cpp b/mythtv/libs/libmythtv/iptvchannel.cpp index 30df769d911..9ca682f378e 100644 --- a/mythtv/libs/libmythtv/iptvchannel.cpp +++ b/mythtv/libs/libmythtv/iptvchannel.cpp @@ -16,7 +16,7 @@ #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"); } @@ -24,6 +24,7 @@ IPTVChannel::IPTVChannel(TVRec *rec, const QString&) : IPTVChannel::~IPTVChannel() { LOG(VB_GENERAL, LOG_INFO, LOC + "dtor"); + m_stream_data = NULL; } bool IPTVChannel::Open(void) @@ -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) @@ -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") @@ -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; diff --git a/mythtv/libs/libmythtv/iptvchannel.h b/mythtv/libs/libmythtv/iptvchannel.h index 47383388c35..f06269dc3d3 100644 --- a/mythtv/libs/libmythtv/iptvchannel.h +++ b/mythtv/libs/libmythtv/iptvchannel.h @@ -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; @@ -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_ diff --git a/mythtv/libs/libmythtv/iptvrecorder.cpp b/mythtv/libs/libmythtv/iptvrecorder.cpp index b0ee83cfc54..9f702def34e 100644 --- a/mythtv/libs/libmythtv/iptvrecorder.cpp +++ b/mythtv/libs/libmythtv/iptvrecorder.cpp @@ -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; } @@ -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; } @@ -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) diff --git a/mythtv/libs/libmythtv/iptvsignalmonitor.cpp b/mythtv/libs/libmythtv/iptvsignalmonitor.cpp index 9c8fef14ed9..d7d2d3f0352 100644 --- a/mythtv/libs/libmythtv/iptvsignalmonitor.cpp +++ b/mythtv/libs/libmythtv/iptvsignalmonitor.cpp @@ -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, @@ -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; @@ -52,6 +41,7 @@ IPTVSignalMonitor::IPTVSignalMonitor(int db_cardnum, */ IPTVSignalMonitor::~IPTVSignalMonitor() { + LOG(VB_CHANNEL, LOG_INFO, LOC + "dtor"); Stop(); } @@ -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) @@ -105,7 +74,7 @@ void IPTVSignalMonitor::UpdateValues(void) if (!running || exit) return; - if (dtvMonitorRunning) + if (m_streamHandlerStarted) { EmitStatus(); if (IsAllGood()) @@ -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; diff --git a/mythtv/libs/libmythtv/iptvsignalmonitor.h b/mythtv/libs/libmythtv/iptvsignalmonitor.h index 3a54785860c..96b88281c8d 100644 --- a/mythtv/libs/libmythtv/iptvsignalmonitor.h +++ b/mythtv/libs/libmythtv/iptvsignalmonitor.h @@ -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; @@ -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_