X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bmusb.cpp;h=1079f2aa60932197799855c5b683470223a8c4ad;hb=cd863aa837174f6a3fa5862323d82dab8f0030f8;hp=b2de56f2b2cee588bc4a1c01252ffa2154045a48;hpb=dae0dae8694ebf5e1255c17dca18dc03e4a0d961;p=bmusb diff --git a/bmusb.cpp b/bmusb.cpp index b2de56f..1079f2a 100644 --- a/bmusb.cpp +++ b/bmusb.cpp @@ -144,14 +144,14 @@ void dump_audio_block(uint8_t *audio_start, size_t audio_len) fwrite(audio_start + AUDIO_HEADER_SIZE, 1, audio_len - AUDIO_HEADER_SIZE, audiofp); } -void BMUSBCapture::dequeue_thread() +void BMUSBCapture::dequeue_thread_func() { if (has_dequeue_callbacks) { dequeue_init_callback(); } - for ( ;; ) { + while (!dequeue_thread_should_quit) { unique_lock lock(queue_lock); - queues_not_empty.wait(lock, [this]{ return !pending_video_frames.empty() && !pending_audio_frames.empty(); }); + queues_not_empty.wait(lock, [this]{ return dequeue_thread_should_quit || (!pending_video_frames.empty() && !pending_audio_frames.empty()); }); uint16_t video_timecode = pending_video_frames.front().timecode; uint16_t audio_timecode = pending_audio_frames.front().timecode; @@ -634,7 +634,8 @@ void BMUSBCapture::configure_card() if (audio_frame_allocator == nullptr) { set_audio_frame_allocator(new MallocFrameAllocator(65536)); // FIXME: leak. } - thread(&BMUSBCapture::dequeue_thread, this).detach(); + dequeue_thread_should_quit = false; + dequeue_thread = thread(&BMUSBCapture::dequeue_thread_func, this); int rc; struct libusb_transfer *xfr; @@ -937,6 +938,13 @@ out: #endif } +void BMUSBCapture::stop_dequeue_thread() +{ + dequeue_thread_should_quit = true; + queues_not_empty.notify_all(); + dequeue_thread.join(); +} + void BMUSBCapture::start_bm_thread() { should_quit = false;