Ticket #6305: condwait_usage.patch
File condwait_usage.patch, 4.4 KB (added by , 15 years ago) |
---|
-
libs/libmythtv/recorderbase.cpp
31 31 audiodevice("/dev/dsp"), videodevice("/dev/video"), vbidevice("/dev/vbi"), 32 32 vbimode(0), ntsc(true), ntsc_framerate(true), video_frame_rate(29.97), 33 33 m_videoAspect(0), m_videoHeight(0), m_videoWidth(0), curRecording(NULL), 34 request_pause(false), paused(false), nextRingBuffer(NULL), nextRecording(NULL), 35 positionMapType(MARK_GOP_BYFRAME), positionMapLock() 34 request_pause(false), paused(false), 35 nextRingBuffer(NULL), nextRecording(NULL), 36 positionMapType(MARK_GOP_BYFRAME), positionMapLock(), 37 pauseWaitSignal(false), unpauseWaitSignal(false) 36 38 { 37 39 QMutexLocker locker(&avcodeclock); 38 40 avcodec_init(); // init CRC's … … 167 169 MythTimer t; 168 170 t.start(); 169 171 170 // Qt4 requires a QMutex as a parameter...171 // not sure if this is the best solution. Mutex Must be locked before wait.172 QMutex mutex;173 mutex.lock();174 175 172 while (true) 176 173 { 177 174 int wait = timeout - t.elapsed(); … … 181 178 else if (IsPaused()) 182 179 return true; 183 180 184 pauseWait.wait(&mutex, wait); 181 pauseWaitMutex.lock(); 182 if (pauseWaitSignal == false) 183 pauseWait.wait(&pauseWaitMutex, wait); 184 pauseWaitSignal = false; 185 pauseWaitMutex.unlock(); 185 186 } 186 187 } 187 188 … … 198 199 if (!paused) 199 200 { 200 201 paused = true; 201 pauseWait.wakeAll(); 202 triggerPauseWait(); 203 202 204 if (tvrec) 203 205 tvrec->RecorderPaused(); 204 206 } 205 207 206 // Qt4 requires a QMutex as a parameter... 207 // not sure if this is the best solution. Mutex Must be locked before wait. 208 QMutex mutex; 209 mutex.lock(); 210 211 unpauseWait.wait(&mutex, timeout); 208 unpauseWaitMutex.lock(); 209 if (unpauseWaitSignal == false) 210 unpauseWait.wait(&unpauseWaitMutex, timeout); 211 unpauseWaitSignal = false; 212 unpauseWaitMutex.unlock(); 212 213 } 213 214 if (!request_pause) 214 215 paused = false; 215 216 return paused; 216 217 } 217 218 219 void RecorderBase::triggerPauseWait(void) 220 { 221 pauseWaitMutex.lock(); 222 pauseWaitSignal = true; 223 pauseWait.wakeAll(); 224 pauseWaitMutex.unlock(); 225 } 226 227 bool RecorderBase::catchPauseWait(unsigned long timeout) 228 { 229 bool ret = true; 230 231 pauseWaitMutex.lock(); 232 if (pauseWaitSignal == false) 233 ret = pauseWait.wait(&pauseWaitMutex, timeout); 234 pauseWaitSignal = false; 235 pauseWaitMutex.unlock(); 236 return ret; 237 } 238 239 void RecorderBase::triggerUnPauseWait(void) 240 { 241 unpauseWaitMutex.lock(); 242 unpauseWaitSignal = true; 243 unpauseWait.wakeAll(); 244 unpauseWaitMutex.unlock(); 245 } 246 247 bool RecorderBase::catchUnPauseWait(unsigned long timeout) 248 { 249 bool ret = true; 250 251 unpauseWaitMutex.lock(); 252 if (unpauseWaitSignal == false) 253 ret = unpauseWait.wait(&unpauseWaitMutex, timeout); 254 unpauseWaitSignal = false; 255 unpauseWaitMutex.unlock(); 256 return ret; 257 } 258 218 259 void RecorderBase::CheckForRingBufferSwitch(void) 219 260 { 220 261 nextRingBufferLock.lock(); -
libs/libmythtv/recorderbase.h
252 252 */ 253 253 void ResolutionChange(uint width, uint height, long long frame); 254 254 255 void triggerPauseWait(void); 256 bool catchPauseWait(unsigned long timeout = ULONG_MAX); 257 258 void triggerUnPauseWait(void); 259 bool catchUnPauseWait(unsigned long timeout = ULONG_MAX); 260 261 255 262 TVRec *tvrec; 256 263 RingBuffer *ringBuffer; 257 264 bool weMadeBuffer; … … 276 283 // For handling pausing 277 284 bool request_pause; 278 285 bool paused; 279 QWaitCondition pauseWait;280 QWaitCondition unpauseWait;281 286 282 287 // For RingBuffer switching 283 288 QMutex nextRingBufferLock; … … 290 295 PosMap positionMap; 291 296 PosMap positionMapDelta; 292 297 298 299 private: 300 301 QWaitCondition pauseWait; 302 QMutex pauseWaitMutex; 303 bool pauseWaitSignal; 304 305 QWaitCondition unpauseWait; 306 QMutex unpauseWaitMutex; 307 bool unpauseWaitSignal; 293 308 }; 294 309 295 310 #endif