From e74ecd2250472be323c0f3f6724c54981adc65a8 Mon Sep 17 00:00:00 2001 From: Nanako <469449812@qq.com> Date: Fri, 12 Jul 2024 08:19:46 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BC=98=E5=8C=96ui=5Fbuffer=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/audio/mixer/mixer.cpp | 9 ++++----- core/audio/mixer/mixer.h | 5 +++-- core/audio/mixer/mixer_track.cpp | 10 +++++++++- core/audio/mixer/mixer_track.h | 9 +-------- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/core/audio/mixer/mixer.cpp b/core/audio/mixer/mixer.cpp index d130bb9..21c9a9b 100644 --- a/core/audio/mixer/mixer.cpp +++ b/core/audio/mixer/mixer.cpp @@ -44,6 +44,7 @@ void mixer::release(singleton_release_guard& release_guard) { } dummy_track* mixer::create_dummy_track(const std::string& in_name) { + ready_dirty(); auto* track = new dummy_track(); track->init(); track->rename(in_name); @@ -56,6 +57,7 @@ dummy_track* mixer::create_dummy_track(const std::string& in_name) { } instrument_track* mixer::create_instrument_track(plugin_host* in_instrument) { + ready_dirty(); auto* track = new instrument_track(in_instrument); track->init(); @@ -87,14 +89,10 @@ void mixer::remove_track(mixer_track* track) { void mixer::process(uint32_t in_frames, circular_buffer_vector_type& out_buffer) { processor_.process(in_frames); processor_.pop_master(in_frames, out_buffer); + ready_ = true; } void mixer::reset() { - if (process_node_dirty_) { - processor_.update_all(); - process_node_dirty_ = false; - } - for (const auto track : tracks_) { track->clear(); } @@ -120,6 +118,7 @@ void mixer::thread_register_track(mixer_track* track) { } void mixer::on_mixer_latency_changed() { + ready_dirty(); g_audio_thread_hub.push_message([this] { processor_.update_latency(); }); diff --git a/core/audio/mixer/mixer.h b/core/audio/mixer/mixer.h index 19c7147..b4c2a53 100644 --- a/core/audio/mixer/mixer.h +++ b/core/audio/mixer/mixer.h @@ -33,7 +33,8 @@ public: [[nodiscard]] auto get_master() const -> dummy_track* { return master_; } [[nodiscard]] auto get_zero_track() const -> dummy_track* { return zero_track_; } void request_build_process_node(); - + bool is_ready() const { return ready_; } + void ready_dirty() { ready_ = false; } multicast_delegate on_add_track; multicast_delegate on_add_track_main_thread; @@ -52,7 +53,7 @@ private: dummy_track* zero_track_; // 用于没有任何音频输出的通道 std::vector tracks_; mixer_processor processor_; - bool process_node_dirty_ = false; + std::atomic ready_ = false; }; DEFINE_SINGLETON_INSTANCE(mixer) diff --git a/core/audio/mixer/mixer_track.cpp b/core/audio/mixer/mixer_track.cpp index b4a3f77..ace6833 100644 --- a/core/audio/mixer/mixer_track.cpp +++ b/core/audio/mixer/mixer_track.cpp @@ -61,7 +61,7 @@ auto mixer_track::get_latency() const -> int32_t { void mixer_track::set_ui_buffer_latency(int32_t in_latency) { const uint32_t block_size = g_audio_device_manager.get_buffer_size(); - const int32_t block_num = std::ceil((float)in_latency / block_size) + 1; + const int32_t block_num = std::ceil((float)in_latency / block_size) + 4; for (auto& buffer : ui_buffers_) { buffer.set_capacity(block_num * block_size); @@ -69,6 +69,14 @@ void mixer_track::set_ui_buffer_latency(int32_t in_latency) { } } +void mixer_track::push_ui_buffer(const audio_buffer& in_buffer) { + auto headers = in_buffer.get_headers_vector(); + for (const auto& header : std::ranges::views::zip(headers, ui_buffers_)) { + const auto& [in, out] = header; + out.push(in, in_buffer.get_num_samples()); + } +} + instrument_track::instrument_track(plugin_host* in_instrument): mixer_track(mixer_track_type::instrument) , instrument_(in_instrument) {} diff --git a/core/audio/mixer/mixer_track.h b/core/audio/mixer/mixer_track.h index 62b3fea..b835bb3 100644 --- a/core/audio/mixer/mixer_track.h +++ b/core/audio/mixer/mixer_track.h @@ -60,14 +60,7 @@ public: } void set_ui_buffer_latency(int32_t in_latency); - - void push_ui_buffer(const audio_buffer& in_buffer) { - auto headers = in_buffer.get_headers_vector(); - for (auto header : std::ranges::views::zip(headers, ui_buffers_)) { - const auto& [in, out] = header; - out.push(in, in_buffer.get_num_samples()); - } - } + void push_ui_buffer(const audio_buffer& in_buffer); [[nodiscard]] auto get_ui_buffer() -> circular_buffer_vector_type& { return ui_buffers_;} [[nodiscard]] auto get_effects() const -> const std::vector& { return effects_; }