]> git.sesse.net Git - nageru/blobdiff - nageru/mixer.cpp
Fix a deadlock exposed by the previous patch.
[nageru] / nageru / mixer.cpp
index 3b7a99c0319ea567a0f5fcb38f17075ef9d7151d..85e5ade8dc294061b0b4af58e606abc4fcd2db5f 100644 (file)
@@ -574,7 +574,9 @@ void Mixer::configure_card(unsigned card_index, CaptureInterface *capture, CardT
 
        CaptureCard *card = &cards[card_index];
        if (card->capture != nullptr) {
+               card_mutex.unlock();  // The dequeue thread could be waiting for bm_frame().
                card->capture->stop_dequeue_thread();
+               card_mutex.lock();
        }
        card->capture.reset(capture);
        card->is_fake_capture = (card_type == CardType::FAKE_CAPTURE);
@@ -1289,7 +1291,10 @@ void Mixer::thread_func()
                        assert(master_card_index < MAX_VIDEO_CARDS);
                }
 
-               handle_hotplugged_cards();
+               {
+                       lock_guard<mutex> lock(card_mutex);
+                       handle_hotplugged_cards();
+               }
 
                vector<int32_t> raw_audio[MAX_VIDEO_CARDS];  // For MJPEG encoding.
                OutputFrameInfo output_frame_info = get_one_frame_from_each_card(master_card_index, master_card_is_output, new_frames, has_new_frame, raw_audio);