~ubuntu-branches/ubuntu/lucid/mythtv/lucid

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");
}