1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
/** -*- Mode: c++ -*-
* IPTVFeederLive -- base class for livemedia based IPTVFeeders
* Copyright (c) 2006 by Laurent Arnal, Benjamin Lerman & Mickaƫl Remars
* Distributed as part of MythTV under GPL v2 and later.
*/
#include "iptvfeederlive.h"
// MythTV headers
#include "mythverbose.h"
#include "timeoutedtaskscheduler.h"
#define LOC QString("FbFeedLive:")
#define LOC_ERR QString("FbFeedLive, Error:")
IPTVFeederLive::IPTVFeederLive() :
_live_env(NULL), _lock(),
_abort(0), _running(false)
{
}
IPTVFeederLive::~IPTVFeederLive()
{
}
bool IPTVFeederLive::InitEnv(void)
{
if (_live_env)
{
VERBOSE(VB_IMPORTANT, LOC_ERR + "InitEnv, live env. already exits.");
return false;
}
TaskScheduler *scheduler = new TimeoutedTaskScheduler(500);
if (!scheduler)
{
VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to create Live Scheduler.");
return false;
}
_live_env = BasicUsageEnvironment::createNew(*scheduler);
if (!_live_env)
{
VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to create Live Environment.");
delete scheduler;
return false;
}
return true;
}
void IPTVFeederLive::FreeEnv(void)
{
if (_live_env)
{
TaskScheduler *scheduler = &_live_env->taskScheduler();
_live_env->reclaim();
_live_env = NULL;
if (scheduler)
delete scheduler;
}
}
void IPTVFeederLive::Run(void)
{
VERBOSE(VB_RECORD, LOC + "Run() -- begin");
_lock.lock();
_running = true;
_abort = 0;
_lock.unlock();
VERBOSE(VB_RECORD, LOC + "Run() -- loop begin");
if (_live_env)
_live_env->taskScheduler().doEventLoop(&_abort);
VERBOSE(VB_RECORD, LOC + "Run() -- loop end");
_lock.lock();
_running = false;
_cond.wakeAll();
_lock.unlock();
VERBOSE(VB_RECORD, LOC + "Run() -- end");
}
void IPTVFeederLive::Stop(void)
{
VERBOSE(VB_RECORD, LOC + "Stop() -- begin");
QMutexLocker locker(&_lock);
_abort = 0xFF;
while (_running)
_cond.wait(&_lock, 500);
VERBOSE(VB_RECORD, LOC + "Stop() -- end");
}
|