00001
00002
00003 #include <unistd.h>
00004
00005
00006 #include "mpegstreamdata.h"
00007 #include "iptvchannel.h"
00008 #include "iptvfeederwrapper.h"
00009 #include "iptvsignalmonitor.h"
00010
00011 #undef DBG_SM
00012 #define DBG_SM(FUNC, MSG) VERBOSE(VB_CHANNEL, \
00013 "IPTVSM("<<channel->GetDevice()<<")::"<<FUNC<<": "<<MSG);
00014
00015 #define LOC QString("IPTVSM(%1): ").arg(channel->GetDevice())
00016 #define LOC_ERR QString("IPTVSM(%1), Error: ").arg(channel->GetDevice())
00017
00033 IPTVSignalMonitor::IPTVSignalMonitor(
00034 int db_cardnum, IPTVChannel *_channel,
00035 uint64_t _flags, const char *_name)
00036 : DTVSignalMonitor(db_cardnum, _channel, _flags, _name),
00037 dtvMonitorRunning(false)
00038 {
00039 bool isLocked = false;
00040 IPTVChannelInfo chaninfo = GetChannel()->GetCurrentChanInfo();
00041 if (chaninfo.isValid())
00042 {
00043 isLocked = GetChannel()->GetFeeder()->Open(chaninfo.m_url);
00044 }
00045
00046 QMutexLocker locker(&statusLock);
00047 signalLock.SetValue((isLocked) ? 1 : 0);
00048 signalStrength.SetValue((isLocked) ? 100 : 0);
00049 }
00050
00054 IPTVSignalMonitor::~IPTVSignalMonitor()
00055 {
00056 GetChannel()->GetFeeder()->RemoveListener(this);
00057 Stop();
00058 }
00059
00060 IPTVChannel *IPTVSignalMonitor::GetChannel(void)
00061 {
00062 return dynamic_cast<IPTVChannel*>(channel);
00063 }
00064
00065 void IPTVSignalMonitor::deleteLater(void)
00066 {
00067 disconnect();
00068 GetChannel()->GetFeeder()->RemoveListener(this);
00069 Stop();
00070 DTVSignalMonitor::deleteLater();
00071 }
00072
00076 void IPTVSignalMonitor::Stop(void)
00077 {
00078 DBG_SM("Stop", "begin");
00079 GetChannel()->GetFeeder()->RemoveListener(this);
00080 SignalMonitor::Stop();
00081 if (dtvMonitorRunning)
00082 {
00083 GetChannel()->GetFeeder()->Stop();
00084 dtvMonitorRunning = false;
00085 pthread_join(table_monitor_thread, NULL);
00086 }
00087 DBG_SM("Stop", "end");
00088 }
00089
00090 void *IPTVSignalMonitor::TableMonitorThread(void *param)
00091 {
00092 IPTVSignalMonitor *mon = (IPTVSignalMonitor*) param;
00093 mon->RunTableMonitor();
00094 return NULL;
00095 }
00096
00099 void IPTVSignalMonitor::RunTableMonitor(void)
00100 {
00101 DBG_SM("Run", "begin");
00102 dtvMonitorRunning = true;
00103
00104 GetStreamData()->AddListeningPID(0);
00105
00106 GetChannel()->GetFeeder()->AddListener(this);
00107 GetChannel()->GetFeeder()->Run();
00108 GetChannel()->GetFeeder()->RemoveListener(this);
00109
00110 dtvMonitorRunning = false;
00111 DBG_SM("Run", "end");
00112 }
00113
00114 void IPTVSignalMonitor::AddData(
00115 const unsigned char *data, unsigned int dataSize)
00116 {
00117 GetStreamData()->ProcessData((unsigned char*)data, dataSize);
00118 }
00119
00126 void IPTVSignalMonitor::UpdateValues(void)
00127 {
00128 if (!running || exit)
00129 return;
00130
00131 if (dtvMonitorRunning)
00132 {
00133 EmitIPTVSignals();
00134 if (IsAllGood())
00135 emit AllGood();
00136
00137
00138 update_done = true;
00139 return;
00140 }
00141
00142 bool isLocked = false;
00143 {
00144 QMutexLocker locker(&statusLock);
00145 isLocked = signalLock.IsGood();
00146 }
00147
00148 EmitIPTVSignals();
00149 if (IsAllGood())
00150 emit AllGood();
00151
00152
00153
00154 if (isLocked && GetStreamData() &&
00155 HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT |
00156 kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT |
00157 kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT))
00158 {
00159 pthread_create(&table_monitor_thread, NULL,
00160 TableMonitorThread, this);
00161 DBG_SM("UpdateValues", "Waiting for table monitor to start");
00162 while (!dtvMonitorRunning)
00163 usleep(50);
00164 DBG_SM("UpdateValues", "Table monitor started");
00165 }
00166
00167 update_done = true;
00168 }
00169
00170 #define EMIT(SIGNAL_FUNC, SIGNAL_VAL) \
00171 do { statusLock.lock(); \
00172 SignalMonitorValue val = SIGNAL_VAL; \
00173 statusLock.unlock(); \
00174 emit SIGNAL_FUNC(val); } while (false)
00175
00179 void IPTVSignalMonitor::EmitIPTVSignals(void)
00180 {
00181
00182 EMIT(StatusSignalLock, signalLock);
00183 if (HasFlags(kDTVSigMon_WaitForSig))
00184 EMIT(StatusSignalStrength, signalStrength);
00185 }
00186
00187 #undef EMIT