+void Mixer::set_output_card(int card_index)
+{
+ if (card_index == output_card_index) {
+ return;
+ }
+ unique_lock<mutex> lock(card_mutex);
+ if (output_card_index != -1) {
+ // Switch the old card from output to input.
+ CaptureCard *old_card = &cards[output_card_index];
+ old_card->output->end_output();
+
+ old_card->capture->stop_dequeue_thread();
+ delete old_card->capture;
+
+ old_card->capture = old_card->parked_capture;
+ old_card->is_fake_capture = false;
+ old_card->parked_capture = nullptr;
+ old_card->capture->start_bm_capture();
+ }
+
+ CaptureCard *card = &cards[card_index];
+ card->capture->stop_dequeue_thread();
+ card->parked_capture = card->capture;
+ FakeCapture *capture = new FakeCapture(global_flags.width, global_flags.height, FAKE_FPS, OUTPUT_FREQUENCY, card_index, global_flags.fake_cards_audio);
+ configure_card(card_index, capture, /*is_fake_capture=*/true, card->output);
+ card->queue_length_policy.reset(card_index);
+ card->capture->start_bm_capture();
+ card->output->start_output(bmdModeHD720p5994, pts_int); // FIXME
+ output_card_index = card_index;
+}