From 879674ce955cccb5484bb284a000dea97dec3a2e Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 12 Oct 2015 00:16:28 +0200 Subject: [PATCH] Make quitting a tad bit more robust. --- mixer.cpp | 10 +++++++--- mixer.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/mixer.cpp b/mixer.cpp index 5b2d0da..1f83215 100644 --- a/mixer.cpp +++ b/mixer.cpp @@ -151,8 +151,11 @@ Mixer::~Mixer() BMUSBCapture::stop_bm_thread(); for (int card_index = 0; card_index < NUM_CARDS; ++card_index) { - cards[card_index].new_data_ready = false; // Unblock thread. - cards[card_index].new_data_ready_changed.notify_all(); + { + std::unique_lock lock(bmusb_mutex); + cards[card_index].should_quit = true; // Unblock thread. + cards[card_index].new_data_ready_changed.notify_all(); + } cards[card_index].usb->stop_dequeue_thread(); } } @@ -176,7 +179,8 @@ void Mixer::bm_frame(int card_index, uint16_t timecode, { // Wait until the previous frame was consumed. std::unique_lock lock(bmusb_mutex); - card->new_data_ready_changed.wait(lock, [card]{ return !card->new_data_ready; }); + card->new_data_ready_changed.wait(lock, [card]{ return !card->new_data_ready || card->should_quit; }); + if (card->should_quit) return; } const PBOFrameAllocator::Userdata *userdata = (const PBOFrameAllocator::Userdata *)video_frame.userdata; GLuint pbo = userdata->pbo; diff --git a/mixer.h b/mixer.h index 9b631e4..3275b24 100644 --- a/mixer.h +++ b/mixer.h @@ -114,6 +114,7 @@ private: QOpenGLContext *context; bool new_data_ready = false; // Whether new_frame and new_frame_audio contains anything. + bool should_quit = false; RefCountedFrame new_frame; GLsync new_data_ready_fence; // Whether new_frame is ready for rendering. std::vector new_frame_audio; -- 2.39.2