X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bmusb.cpp;h=6867805e719e4c6983af99063f343cbb2dd94b1f;hb=76d42863dafcc8ab3b60df73c0caae9f98545a2a;hp=16da5f01e467409188f4cb3ab92335631802d401;hpb=64568304a31f00588d7cd69d6edfb574a5fe3ad8;p=bmusb diff --git a/bmusb.cpp b/bmusb.cpp index 16da5f0..6867805 100644 --- a/bmusb.cpp +++ b/bmusb.cpp @@ -52,7 +52,7 @@ atomic should_quit; FrameAllocator::~FrameAllocator() {} -#define NUM_QUEUED_FRAMES 8 +#define NUM_QUEUED_FRAMES 16 class MallocFrameAllocator : public FrameAllocator { public: MallocFrameAllocator(size_t frame_size); @@ -144,11 +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() { - for ( ;; ) { + if (has_dequeue_callbacks) { + dequeue_init_callback(); + } + 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; @@ -181,6 +184,9 @@ void BMUSBCapture::dequeue_thread() audio_frame.frame, AUDIO_HEADER_SIZE, audio_frame.format); } } + if (has_dequeue_callbacks) { + dequeue_cleanup_callback(); + } } void BMUSBCapture::start_new_frame(const uint8_t *start) @@ -628,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; @@ -931,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;