]> git.sesse.net Git - nageru/blobdiff - mixer.cpp
Release Nageru 1.7.2.
[nageru] / mixer.cpp
index 23658103e222d94383525e20f07911573c451e4d..7a3f437d6ec745048c57be3283005cbf94597937 100644 (file)
--- a/mixer.cpp
+++ b/mixer.cpp
@@ -499,6 +499,7 @@ Mixer::Mixer(const QSurfaceFormat &format, unsigned num_cards)
 
 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) {
@@ -992,7 +993,7 @@ void Mixer::thread_func()
                }
        }
 
-       BasicStats basic_stats(/*verbose=*/true);
+       BasicStats basic_stats(/*verbose=*/true, /*use_opengl=*/true);
        int stats_dropped_frames = 0;
 
        while (!should_quit) {
@@ -1018,7 +1019,7 @@ void Mixer::thread_func()
                } 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);
@@ -1066,7 +1067,11 @@ void Mixer::thread_func()
 
                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);
@@ -1587,6 +1592,25 @@ map<uint32_t, VideoMode> Mixer::get_available_output_video_modes() const
        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) {