1. 优化ui_buffer显示
This commit is contained in:
parent
e65c44899a
commit
e74ecd2250
@ -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();
|
||||||
});
|
});
|
||||||
|
@ -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)
|
||||||
|
@ -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) {}
|
||||||
|
|
||||||
|
@ -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_; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user