diff --git a/mythtv/libs/libmythtv/iptv/iptvfeederhls.cpp b/mythtv/libs/libmythtv/iptv/iptvfeederhls.cpp
index a2701be..eeb3722 100644
a
|
b
|
IPTVFeederHLS::IPTVFeederHLS() : |
30 | 30 | IPTVFeederHLS::~IPTVFeederHLS() |
31 | 31 | { |
32 | 32 | Close(); |
| 33 | QMutexLocker locker(&m_hlsbufferlock); |
33 | 34 | delete[] m_buffer; |
34 | 35 | } |
35 | 36 | |
… |
… |
bool IPTVFeederHLS::IsHLS(const QString &url) |
41 | 42 | |
42 | 43 | bool IPTVFeederHLS::IsOpen(void) const |
43 | 44 | { |
| 45 | QMutexLocker locker(&m_hlsbufferlock); |
44 | 46 | if (m_hls == NULL) |
45 | 47 | return false; |
46 | 48 | return m_hls->IsOpen(); |
… |
… |
bool IPTVFeederHLS::Open(const QString &url) |
50 | 52 | { |
51 | 53 | LOG(VB_RECORD, LOG_INFO, LOC + QString("Open(%1) -- begin").arg(url)); |
52 | 54 | |
53 | | QMutexLocker locker(&_lock); |
| 55 | QMutexLocker locker(&m_hlsbufferlock); |
54 | 56 | |
55 | 57 | if (m_hls) |
56 | 58 | { |
… |
… |
bool IPTVFeederHLS::Open(const QString &url) |
67 | 69 | |
68 | 70 | void IPTVFeederHLS::Run(void) |
69 | 71 | { |
70 | | m_lock.lock(); |
| 72 | QMutexLocker runlocker(&m_runlock); |
71 | 73 | m_running = true; |
72 | 74 | m_interrupted = false; |
73 | | m_lock.unlock(); |
74 | 75 | |
75 | 76 | while (!m_interrupted) |
76 | 77 | { |
| 78 | runlocker.unlock(); |
| 79 | |
| 80 | QMutexLocker hlslocker(&m_hlsbufferlock); |
| 81 | |
77 | 82 | if (m_hls == NULL) |
78 | 83 | break; |
79 | | m_lock.lock(); |
| 84 | |
80 | 85 | uint size = m_hls->Read((void *)m_buffer, BUFFER_SIZE); |
81 | 86 | if (m_buffer[0] != 0x47) |
82 | 87 | { |
… |
… |
void IPTVFeederHLS::Run(void) |
90 | 95 | for (; it != _listeners.end(); ++it) |
91 | 96 | (*it)->AddData(m_buffer, size); |
92 | 97 | _lock.unlock(); |
93 | | m_lock.unlock(); |
| 98 | |
| 99 | runlocker.relock(); |
94 | 100 | } |
95 | 101 | |
96 | 102 | m_running = false; |
97 | | m_lock.lock(); |
98 | 103 | m_waitcond.wakeAll(); |
99 | | m_lock.unlock(); |
100 | 104 | } |
101 | 105 | |
102 | 106 | void IPTVFeederHLS::Stop(void) |
103 | 107 | { |
104 | 108 | LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- begin"); |
105 | | QMutexLocker locker(&m_lock); |
| 109 | QMutexLocker locker(&m_runlock); |
106 | 110 | m_interrupted = true; |
107 | 111 | |
108 | 112 | while (m_running) |
109 | | m_waitcond.wait(&m_lock, 500); |
| 113 | m_waitcond.wait(&m_runlock, 500); |
110 | 114 | |
111 | 115 | LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- end"); |
112 | 116 | } |
… |
… |
void IPTVFeederHLS::Close(void) |
116 | 120 | LOG(VB_RECORD, LOG_INFO, LOC + "Close() -- begin"); |
117 | 121 | Stop(); |
118 | 122 | |
119 | | QMutexLocker lock(&m_lock); |
| 123 | QMutexLocker lock(&m_hlsbufferlock); |
120 | 124 | delete m_hls; |
121 | 125 | m_hls = NULL; |
122 | 126 | |
diff --git a/mythtv/libs/libmythtv/iptv/iptvfeederhls.h b/mythtv/libs/libmythtv/iptv/iptvfeederhls.h
index 8bd68a7..705ca78 100644
a
|
b
|
|
16 | 16 | class TSDataListener; |
17 | 17 | class HLSRingBuffer; |
18 | 18 | |
| 19 | // m_hlsbufferlock->_lock |
| 20 | |
19 | 21 | class IPTVFeederHLS : public IPTVFeederLive |
20 | 22 | { |
21 | 23 | public: |
… |
… |
public: |
33 | 35 | static bool IsHLS(const QString &url); |
34 | 36 | |
35 | 37 | private: |
| 38 | mutable QMutex m_hlsbufferlock; |
36 | 39 | uint8_t *m_buffer; |
37 | 40 | HLSRingBuffer *m_hls; |
38 | | mutable QMutex m_lock; |
| 41 | |
| 42 | mutable QMutex m_runlock; |
39 | 43 | QWaitCondition m_waitcond; |
40 | 44 | bool m_interrupted; |
41 | 45 | bool m_running; |