X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mixer.h;h=a09268996688918de9533c6a0e6a1ee82f15c043;hb=01c2a21a4729cd054156308c55800d83f61798ce;hp=e893ffb8427728b235d21f93c7a9169991c14aef;hpb=3170a65ace5cb8c5955fb5ce9d97fd1790f1c061;p=nageru diff --git a/mixer.h b/mixer.h index e893ffb..a092689 100644 --- a/mixer.h +++ b/mixer.h @@ -49,7 +49,6 @@ class ResourcePool; namespace movit { class YCbCrInput; } -class QOpenGLContext; class QSurfaceFormat; // For any card that's not the master (where we pick out the frames as they @@ -302,6 +301,12 @@ public: gain_staging_db = gain_db; } + float get_gain_staging_db() const + { + std::unique_lock lock(compressor_mutex); + return gain_staging_db; + } + void set_gain_staging_auto(bool enabled) { std::unique_lock lock(compressor_mutex); @@ -327,6 +332,12 @@ public: final_makeup_gain_auto = enabled; } + bool get_final_makeup_gain_auto() const + { + std::unique_lock lock(compressor_mutex); + return final_makeup_gain_auto; + } + void schedule_cut() { should_cut = true; @@ -388,13 +399,20 @@ public: cards[card_index].capture->set_audio_input(input); } + void change_x264_bitrate(unsigned rate_kbit) { + video_encoder->change_x264_bitrate(rate_kbit); + } + private: - void configure_card(unsigned card_index, const QSurfaceFormat &format, CaptureInterface *capture); + void configure_card(unsigned card_index, CaptureInterface *capture, bool is_fake_capture); void bm_frame(unsigned card_index, uint16_t timecode, FrameAllocator::Frame video_frame, size_t video_offset, VideoFormat video_format, FrameAllocator::Frame audio_frame, size_t audio_offset, AudioFormat audio_format); + void bm_hotplug_add(libusb_device *dev); + void bm_hotplug_remove(unsigned card_index); void place_rectangle(movit::Effect *resample_effect, movit::Effect *padding_effect, float x0, float y0, float x1, float y1); void thread_func(); + void handle_hotplugged_cards(); void schedule_audio_resampling_tasks(unsigned dropped_frames, int num_samples_per_frame, int length_per_frame); void render_one_frame(int64_t duration); void send_audio_level_callback(); @@ -424,13 +442,14 @@ private: int64_t pts_int = 0; // In TIMEBASE units. std::mutex bmusb_mutex; + bool has_bmusb_thread = false; struct CaptureCard { - CaptureInterface *capture; + CaptureInterface *capture = nullptr; + bool is_fake_capture; std::unique_ptr frame_allocator; // Stuff for the OpenGL context (for texture uploading). - QSurface *surface; - QOpenGLContext *context; + QSurface *surface = nullptr; struct NewFrame { RefCountedFrame frame; @@ -460,6 +479,11 @@ private: InputState input_state; + // Cards we have been noticed about being hotplugged, but haven't tried adding yet. + // Protected by its own mutex. + std::mutex hotplug_mutex; + std::vector hotplugged_cards; + class OutputChannel { public: ~OutputChannel(); @@ -541,5 +565,6 @@ private: }; extern Mixer *global_mixer; +extern bool uses_mlock; #endif // !defined(_MIXER_H)