Mixer::~Mixer()
{
+ httpd.stop();
BMUSBCapture::stop_bm_thread();
for (unsigned card_index = 0; card_index < num_cards + num_video_inputs + num_html_inputs; ++card_index) {
}
}
- BasicStats basic_stats(/*verbose=*/true);
+ BasicStats basic_stats(/*verbose=*/true, /*use_opengl=*/true);
int stats_dropped_frames = 0;
while (!should_quit) {
} else {
master_card_is_output = false;
master_card_index = theme->map_signal(master_clock_channel);
- assert(master_card_index < num_cards);
+ assert(master_card_index < num_cards + num_video_inputs);
}
OutputFrameInfo output_frame_info = get_one_frame_from_each_card(master_card_index, master_card_is_output, new_frames, has_new_frame);
int64_t frame_duration = output_frame_info.frame_duration;
render_one_frame(frame_duration);
- ++frame_num;
+ {
+ lock_guard<mutex> lock(frame_num_mutex);
+ ++frame_num;
+ }
+ frame_num_updated.notify_all();
pts_int += frame_duration;
basic_stats.update(frame_num, stats_dropped_frames);
return cards[desired_output_card_index].output->get_available_video_modes();
}
+string Mixer::get_ffmpeg_filename(unsigned card_index) const
+{
+ assert(card_index >= num_cards && card_index < num_cards + num_video_inputs);
+ return ((FFmpegCapture *)(cards[card_index].capture.get()))->get_filename();
+}
+
+void Mixer::set_ffmpeg_filename(unsigned card_index, const string &filename) {
+ assert(card_index >= num_cards && card_index < num_cards + num_video_inputs);
+ ((FFmpegCapture *)(cards[card_index].capture.get()))->change_filename(filename);
+}
+
+void Mixer::wait_for_next_frame()
+{
+ unique_lock<mutex> lock(frame_num_mutex);
+ unsigned old_frame_num = frame_num;
+ frame_num_updated.wait_for(lock, seconds(1), // Timeout is just in case.
+ [old_frame_num, this]{ return this->frame_num > old_frame_num; });
+}
+
Mixer::OutputChannel::~OutputChannel()
{
if (has_current_frame) {