1. 优化ui_buffer显示

This commit is contained in:
Nanako 2024-07-12 08:19:46 +08:00
parent e65c44899a
commit e74ecd2250
4 changed files with 17 additions and 16 deletions

View File

@ -44,6 +44,7 @@ void mixer::release(singleton_release_guard& release_guard) {
} }
dummy_track* mixer::create_dummy_track(const std::string& in_name) { dummy_track* mixer::create_dummy_track(const std::string& in_name) {
ready_dirty();
auto* track = new dummy_track(); auto* track = new dummy_track();
track->init(); track->init();
track->rename(in_name); 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) { instrument_track* mixer::create_instrument_track(plugin_host* in_instrument) {
ready_dirty();
auto* track = new instrument_track(in_instrument); auto* track = new instrument_track(in_instrument);
track->init(); 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) { void mixer::process(uint32_t in_frames, circular_buffer_vector_type& out_buffer) {
processor_.process(in_frames); processor_.process(in_frames);
processor_.pop_master(in_frames, out_buffer); processor_.pop_master(in_frames, out_buffer);
ready_ = true;
} }
void mixer::reset() { void mixer::reset() {
if (process_node_dirty_) {
processor_.update_all();
process_node_dirty_ = false;
}
for (const auto track : tracks_) { for (const auto track : tracks_) {
track->clear(); track->clear();
} }
@ -120,6 +118,7 @@ void mixer::thread_register_track(mixer_track* track) {
} }
void mixer::on_mixer_latency_changed() { void mixer::on_mixer_latency_changed() {
ready_dirty();
g_audio_thread_hub.push_message([this] { g_audio_thread_hub.push_message([this] {
processor_.update_latency(); processor_.update_latency();
}); });

View File

@ -33,7 +33,8 @@ public:
[[nodiscard]] auto get_master() const -> dummy_track* { return master_; } [[nodiscard]] auto get_master() const -> dummy_track* { return master_; }
[[nodiscard]] auto get_zero_track() const -> dummy_track* { return zero_track_; } [[nodiscard]] auto get_zero_track() const -> dummy_track* { return zero_track_; }
void request_build_process_node(); void request_build_process_node();
bool is_ready() const { return ready_; }
void ready_dirty() { ready_ = false; }
multicast_delegate<mixer_track*> on_add_track; multicast_delegate<mixer_track*> on_add_track;
multicast_delegate<mixer_track*> on_add_track_main_thread; multicast_delegate<mixer_track*> on_add_track_main_thread;
@ -52,7 +53,7 @@ private:
dummy_track* zero_track_; // 用于没有任何音频输出的通道 dummy_track* zero_track_; // 用于没有任何音频输出的通道
std::vector<mixer_track*> tracks_; std::vector<mixer_track*> tracks_;
mixer_processor processor_; mixer_processor processor_;
bool process_node_dirty_ = false; std::atomic<bool> ready_ = false;
}; };
DEFINE_SINGLETON_INSTANCE(mixer) DEFINE_SINGLETON_INSTANCE(mixer)

View File

@ -61,7 +61,7 @@ auto mixer_track::get_latency() const -> int32_t {
void mixer_track::set_ui_buffer_latency(int32_t in_latency) { void mixer_track::set_ui_buffer_latency(int32_t in_latency) {
const uint32_t block_size = g_audio_device_manager.get_buffer_size(); 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_) { for (auto& buffer : ui_buffers_) {
buffer.set_capacity(block_num * block_size); 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_track::instrument_track(plugin_host* in_instrument): mixer_track(mixer_track_type::instrument)
, instrument_(in_instrument) {} , instrument_(in_instrument) {}

View File

@ -60,14 +60,7 @@ public:
} }
void set_ui_buffer_latency(int32_t in_latency); void set_ui_buffer_latency(int32_t in_latency);
void push_ui_buffer(const audio_buffer& in_buffer);
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());
}
}
[[nodiscard]] auto get_ui_buffer() -> circular_buffer_vector_type& { return ui_buffers_;} [[nodiscard]] auto get_ui_buffer() -> circular_buffer_vector_type& { return ui_buffers_;}
[[nodiscard]] auto get_effects() const -> const std::vector<plugin_host*>& { return effects_; } [[nodiscard]] auto get_effects() const -> const std::vector<plugin_host*>& { return effects_; }