X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mixer.h;h=05471d6d61ae550af47a8ceb03faebfbc29697ca;hb=08a992d58c34da8d8bbd70226f7e85c9f30d9514;hp=02140637fe665258a9332838b0ec03e226f7b6d4;hpb=2b5f4cfd9ef6dd9875de98f378061ebf15e0a385;p=nageru diff --git a/mixer.h b/mixer.h index 0214063..05471d6 100644 --- a/mixer.h +++ b/mixer.h @@ -301,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); @@ -326,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; @@ -340,7 +352,7 @@ public: return cards[card_index].capture->get_description(); } - std::map get_available_video_modes(unsigned card_index) const { + std::map get_available_video_modes(unsigned card_index) const { assert(card_index < num_cards); return cards[card_index].capture->get_available_video_modes(); } @@ -387,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, bmusb::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); + bmusb::FrameAllocator::Frame video_frame, size_t video_offset, bmusb::VideoFormat video_format, + bmusb::FrameAllocator::Frame audio_frame, size_t audio_offset, bmusb::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(); @@ -425,11 +444,12 @@ private: std::mutex bmusb_mutex; bool has_bmusb_thread = false; struct CaptureCard { - CaptureInterface *capture; + bmusb::CaptureInterface *capture = nullptr; + bool is_fake_capture; std::unique_ptr frame_allocator; // Stuff for the OpenGL context (for texture uploading). - QSurface *surface; + QSurface *surface = nullptr; struct NewFrame { RefCountedFrame frame; @@ -459,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();