\r
#include "ry0/iPTd/Controller.h"\r
#include "ry0/iPTd/HTTPLiveStreaming.h"\r
-#include "mpeg2/ts/Analyzer.h"\r
+#include "ry0/iPTd/Analyzer.h"\r
\r
+#include "b25/aribstr.h"\r
#include "b25/arib_std_b25.h"\r
#include "b25/b_cas_card.h"\r
\r
//\r
static const TimeInterval DEF_COLLECT_EPG_DELAY = 1.0;\r
static const TimeInterval DEF_COLLECT_EPG_RETRY = 60.0;\r
-static const TimeInterval DEF_COLLECT_EPG_LIMIT_S = 10.5;\r
-static const TimeInterval DEF_COLLECT_EPG_LIMIT_T = 20.5;\r
+\r
+static const time_t DEF_COLLECT_EPG_LIMIT_S = 20;\r
+static const time_t DEF_COLLECT_EPG_LIMIT_T = 30;\r
\r
static const time_t OFFSET_OF_START_TIME = -2; // 録画開始時刻の補正(秒単位)\r
static const time_t OFFSET_OF_END_TIME = -3; // 録画停止時刻の補正(秒単位)\r
RaymUnlock(this);\r
}\r
\r
-void Controller::collectEPGsForTuner(int tuner, TimeInterval limit)\r
+void Controller::collectEPGsForTuner(int tuner, time_t limit)\r
{\r
DebugLog2("Controller::collectEPGsForTuner(%d) start.", tuner);\r
\r
return;\r
}\r
\r
- // \r
- Array *collected = Array::arrayWithCapacity(0);\r
-\r
- // 開始時刻取得\r
- Date *start = Date::date();\r
-\r
- // 取得開始\r
- bool done = false;\r
- while (!done)\r
- {\r
- AutoreleasePool *pool = AutoreleasePool::alloc()->init();\r
\r
- // EPG取得\r
- MPEG2::TS::Analyzer an;\r
- an.setFlag(MPEG2::TS::Analyzer::FLAG_EIT);\r
- _tuners[tuner]->setListener(&an);\r
- Array *epgs = an.epgInfos();\r
- _tuners[tuner]->setListener(NULL);\r
+ Analyzer *an = Analyzer::alloc()->init();\r
+ _tuners[tuner]->setListener(an);\r
\r
- if (epgs != NULL)\r
- {\r
- // 取得成功\r
- collected->addObjectsFromArray(epgs);\r
- }\r
+ Array *collected = an->collectEPGs(limit);\r
\r
- // リミットチェック\r
- if (Date::date()->timeIntervalSinceDate(start) >= limit)\r
- {\r
- done = true;\r
- }\r
-\r
- // キャンセル確認\r
- RaymLock(this);\r
- if (!done)\r
- {\r
- done = _cancel_epg_collect;\r
- }\r
- RaymUnlock(this);\r
-\r
- pool->release();\r
- }\r
+ _tuners[tuner]->setListener(NULL);\r
+ an->release();\r
\r
// lock\r
RaymLock(this);\r
\r
+ long add_cnt = 0;\r
+ long discard = 0;\r
+\r
for (uint j = 0; j < collected->count(); ++j)\r
{\r
Dictionary *epg1 = (Dictionary *)collected->objectAtIndex(j);\r
if (epg1->stringForKey(KEY_EPG_TITLE) == NULL)\r
{\r
// タイトルが無い場合は不要\r
+ ++discard;\r
+// DebugLog0("discard: %s", epg1->toString().c_str());\r
continue;\r
}\r
\r
key = epg1->stringForKey(KEY_EPG_EVENT_ID);\r
if (key != NULL)\r
{\r
+ ++add_cnt;\r
epgs_of_service->setObject(epg1, key);\r
}\r
}\r
}\r
+ DebugLog0("add: %d, discard: %d", add_cnt, discard);\r
\r
// ファイルへ書き出し\r
_epgs->writeToFile(_epgs_path, true);\r
// チャンネル設定\r
if (_tuners[tuner]->setChannel(ch))\r
{\r
+ DebugLog0(" %s: channel: %d", _tuners[tuner]->name(), ch);\r
+\r
// EPG取集\r
collectEPGsForTuner(tuner, ((type == Tuner::ISDB_S) ? DEF_COLLECT_EPG_LIMIT_S : DEF_COLLECT_EPG_LIMIT_T));\r
\r
channelInfo->setBool(true, KEY_ENABLED);\r
\r
// 局情報を取得\r
- MPEG2::TS::Analyzer an;\r
- an.setFlag(MPEG2::TS::Analyzer::FLAG_SDT);\r
- _tuners[tuner]->setListener(&an);\r
- uint32_t count = 0;\r
- while (count++ < 8)\r
- {\r
- Dictionary *stationInfo = an.stationInfo();\r
- if (stationInfo != NULL)\r
+ Analyzer *an = Analyzer::alloc()->init();\r
+ _tuners[tuner]->setListener(an);\r
+\r
+ Dictionary *stationInfo = an->stationInfo();\r
+ if (stationInfo != NULL)\r
+ {\r
+ if (stationInfo->stringForKey(KEY_NAME) != NULL)\r
{\r
- if (stationInfo->stringForKey(KEY_NAME) != NULL)\r
- {\r
- channelInfo->setString(stationInfo->stringForKey(KEY_NAME), KEY_NAME);\r
- }\r
- if (stationInfo->objectForKey(KEY_SERVICES) != NULL)\r
- {\r
- channelInfo->setObject(stationInfo->objectForKey(KEY_SERVICES), KEY_SERVICES);\r
- }\r
+ channelInfo->setString(stationInfo->stringForKey(KEY_NAME), KEY_NAME);\r
}\r
-\r
- if ((channelInfo->stringForKey(KEY_NAME) != NULL) && (channelInfo->objectForKey(KEY_SERVICES) != NULL))\r
+ if (stationInfo->objectForKey(KEY_SERVICES) != NULL)\r
{\r
- break;\r
+ channelInfo->setObject(stationInfo->objectForKey(KEY_SERVICES), KEY_SERVICES);\r
+ }\r
+ if (channelInfo->stringForKey(KEY_NAME) != NULL)\r
+ {\r
+ DebugLog0(" Name: %s", channelInfo->stringForKey(KEY_NAME)->cString());\r
}\r
}\r
\r
- if (channelInfo->stringForKey(KEY_NAME) != NULL)\r
- {\r
- DebugLog0(" Name: %s", channelInfo->stringForKey(KEY_NAME)->cString());\r
- }\r
_tuners[tuner]->setListener(NULL);\r
+ an->release();\r
\r
// 成功したチャンネルを保持\r
lastChannel = ch;\r
DebugLog0(" CH %s: NG", chkey);\r
}\r
\r
- // unlock\r
RaymUnlock(this);\r
}\r
\r
- // lock\r
RaymLock(this);\r
\r
// チューナを初期化済みに更新\r
{\r
// 初期化成功\r
DebugLog2("tuner initialize success.");\r
-\r
+#if 0\r
// EPG収集用タイマ起動(ISDB-S)\r
_timer_epg_s = Timer::alloc()->initWithTimeInterval(DEF_COLLECT_EPG_DELAY, this, (void *)CMD_COLLECT_EPG_ISDB_S, true);\r
if (_timer_epg_s != NULL)\r
{\r
_timer_epg_s->fire();\r
}\r
-\r
+#endif\r
+#if 1\r
// EPG収集用タイマ起動(ISDB-T)\r
_timer_epg_t = Timer::alloc()->initWithTimeInterval(DEF_COLLECT_EPG_DELAY, this, (void *)CMD_COLLECT_EPG_ISDB_T, true);\r
if (_timer_epg_t != NULL)\r
{\r
_timer_epg_t->fire();\r
}\r
+#endif\r
}\r
else\r
{\r