00001
00007 #include <algorithm>
00008
00009 #include "iptvfeederlive.h"
00010
00011
00012 #include "mythlogging.h"
00013 #include "timeoutedtaskscheduler.h"
00014
00015 #define LOC QString("FbFeedLive:")
00016
00017
00018 IPTVFeederLive::IPTVFeederLive() :
00019 _live_env(NULL), _lock(),
00020 _abort(0), _running(false)
00021 {
00022 }
00023
00024 IPTVFeederLive::~IPTVFeederLive()
00025 {
00026 }
00027
00028 bool IPTVFeederLive::InitEnv(void)
00029 {
00030 if (_live_env)
00031 {
00032 LOG(VB_GENERAL, LOG_ERR, LOC + "InitEnv, live env. already exits.");
00033 return false;
00034 }
00035
00036 TaskScheduler *scheduler = new TimeoutedTaskScheduler(500);
00037 if (!scheduler)
00038 {
00039 LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to create Live Scheduler.");
00040 return false;
00041 }
00042
00043 _live_env = BasicUsageEnvironment::createNew(*scheduler);
00044 if (!_live_env)
00045 {
00046 LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to create Live Environment.");
00047 delete scheduler;
00048 return false;
00049 }
00050
00051 return true;
00052 }
00053
00054 void IPTVFeederLive::FreeEnv(void)
00055 {
00056 if (_live_env)
00057 {
00058 TaskScheduler *scheduler = &_live_env->taskScheduler();
00059 _live_env->reclaim();
00060 _live_env = NULL;
00061 if (scheduler)
00062 delete scheduler;
00063 }
00064 }
00065
00066 void IPTVFeederLive::Run(void)
00067 {
00068 LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- begin");
00069 _lock.lock();
00070 _running = true;
00071 _abort = 0;
00072 _lock.unlock();
00073
00074 LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- loop begin");
00075 if (_live_env)
00076 _live_env->taskScheduler().doEventLoop(&_abort);
00077 LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- loop end");
00078
00079 _lock.lock();
00080 _running = false;
00081 _cond.wakeAll();
00082 _lock.unlock();
00083 LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- end");
00084 }
00085
00086 void IPTVFeederLive::Stop(void)
00087 {
00088 LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- begin");
00089 QMutexLocker locker(&_lock);
00090 _abort = 0xFF;
00091
00092 while (_running)
00093 _cond.wait(&_lock, 500);
00094 LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- end");
00095 }
00096
00097 void IPTVFeederLive::AddListener(TSDataListener *item)
00098 {
00099 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- begin")
00100 .arg((uint64_t)item,0,16));
00101 if (!item)
00102 {
00103 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end")
00104 .arg((uint64_t)item,0,16));
00105 return;
00106 }
00107
00108
00109 RemoveListener(item);
00110
00111
00112 QMutexLocker locker(&_lock);
00113 _listeners.push_back(item);
00114
00115 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end")
00116 .arg((uint64_t)item,0,16));
00117 }
00118
00119 void IPTVFeederLive::RemoveListener(TSDataListener *item)
00120 {
00121 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- begin")
00122 .arg((uint64_t)item,0,16));
00123 QMutexLocker locker(&_lock);
00124 vector<TSDataListener*>::iterator it =
00125 find(_listeners.begin(), _listeners.end(), item);
00126
00127 if (it == _listeners.end())
00128 {
00129 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- end 1")
00130 .arg((uint64_t)item,0,16));
00131 return;
00132 }
00133
00134
00135 *it = *_listeners.rbegin();
00136 _listeners.resize(_listeners.size() - 1);
00137
00138 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- end 2")
00139 .arg((uint64_t)item,0,16));
00140 }
00141