]> git.sesse.net Git - nageru/blobdiff - mixer.cpp
Release Nageru 1.2.1.
[nageru] / mixer.cpp
index 9565894d420722e802d59aa4692373ff819a02b3..42d854817b57c10c7dce162c9b149cceb62a8ed3 100644 (file)
--- a/mixer.cpp
+++ b/mixer.cpp
@@ -261,6 +261,14 @@ Mixer::Mixer(const QSurfaceFormat &format, unsigned num_cards)
 
        locut.init(FILTER_HPF, 2);
 
+       // If --flat-audio is given, turn off everything that messes with the sound,
+       // except the final makeup gain.
+       if (global_flags.flat_audio) {
+               set_locut_enabled(false);
+               set_limiter_enabled(false);
+               set_compressor_enabled(false);
+       }
+
        // hlen=16 is pretty low quality, but we use quite a bit of CPU otherwise,
        // and there's a limit to how important the peak meter is.
        peak_resampler.setup(OUTPUT_FREQUENCY, OUTPUT_FREQUENCY * 4, /*num_channels=*/2, /*hlen=*/16, /*frel=*/1.0);
@@ -535,8 +543,10 @@ void Mixer::bm_frame(unsigned card_index, uint16_t timecode,
                check_error();
                glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
                check_error();
-               glFlushMappedBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, video_frame.size);
-               check_error();
+               if (global_flags.flush_pbos) {
+                       glFlushMappedBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, video_frame.size);
+                       check_error();
+               }
 
                glBindTexture(GL_TEXTURE_2D, userdata->tex_cbcr[field]);
                check_error();
@@ -553,6 +563,8 @@ void Mixer::bm_frame(unsigned card_index, uint16_t timecode,
                RefCountedGLsync fence(GL_SYNC_GPU_COMMANDS_COMPLETE, /*flags=*/0);
                check_error();
                assert(fence.get() != nullptr);
+               glFlush();  // Make sure the main thread doesn't have to wait until we push out enough frames to make a new command buffer.
+               check_error();
 
                if (field == 1) {
                        // Don't upload the second field as fast as we can; wait until
@@ -785,11 +797,8 @@ void Mixer::render_one_frame()
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
-       RefCountedGLsync fence(GL_SYNC_GPU_COMMANDS_COMPLETE, /*flags=*/0);
-       check_error();
-
        const int64_t av_delay = TIMEBASE / 10;  // Corresponds to the fixed delay in resampling_queue.h. TODO: Make less hard-coded.
-       h264_encoder->end_frame(fence, pts_int + av_delay, theme_main_chain.input_frames);
+       RefCountedGLsync fence = h264_encoder->end_frame(pts_int + av_delay, theme_main_chain.input_frames);
 
        // The live frame just shows the RGBA texture we just rendered.
        // It owns rgba_tex now.