From 1659c24d4ccb3823e440aa183183112138b5d612 Mon Sep 17 00:00:00 2001 From: Nanako <469449812@qq.com> Date: Sun, 26 May 2024 15:56:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dmixer=5Ftrack=E7=9A=84ui=5Fbu?= =?UTF-8?q?ffer=E4=B8=8D=E6=AD=A3=E7=A1=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/application/application.cpp | 2 +- core/application/application.h | 2 +- core/audio/mixer/mixer.cpp | 33 +++++++++++++-------- core/audio/mixer/mixer_track.cpp | 3 ++ core/audio/mixer/mixer_track.h | 1 + core/thread_message/thread_message_hubs.cpp | 7 +++++ core/thread_message/thread_message_hubs.h | 4 +-- 7 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 core/thread_message/thread_message_hubs.cpp diff --git a/core/application/application.cpp b/core/application/application.cpp index 2b1115f..f8af054 100644 --- a/core/application/application.cpp +++ b/core/application/application.cpp @@ -38,7 +38,7 @@ void application::shutdown() { spdlog::shutdown(); } -bool application::update_window_manager() +bool application::update_application() { g_main_thread_hub.process_messages(); g_window_manager.update(); diff --git a/core/application/application.h b/core/application/application.h index 6da885a..a8a06ae 100644 --- a/core/application/application.h +++ b/core/application/application.h @@ -25,7 +25,7 @@ public: virtual void shutdown(); - bool update_window_manager(); + bool update_application(); virtual void tick(float delta_time) { diff --git a/core/audio/mixer/mixer.cpp b/core/audio/mixer/mixer.cpp index 469f6f2..0f0fc7b 100644 --- a/core/audio/mixer/mixer.cpp +++ b/core/audio/mixer/mixer.cpp @@ -129,8 +129,8 @@ void mixer::process(uint32_t in_frames) { return; e->run(taskflow_).wait(); post_process(in_frames); - dummy_track* master = get_master(); - master->buffer.multiple(master->volume); +// dummy_track* master = get_master(); +// master->buffer.multiple(master->volume); } void mixer::reset() { @@ -168,21 +168,21 @@ void mixer::request_build_process_node() { }); } -void post_process_internal(mixer_track* track, uint32_t in_frames, std::vector& processed_tracks) { +void post_process_internal(mixer_track* track, uint32_t in_frames, std::set& processed_tracks) { if (std::ranges::find(processed_tracks, track) != processed_tracks.end()) return; for (const auto& link: track->children) { post_process_internal(link.track, in_frames, processed_tracks); track->buffer.mix(link.track->buffer, link.send_level); } + track->post_process(in_frames); - // CalculatePeak ? - processed_tracks.push_back(track); + processed_tracks.emplace(track); } void mixer::post_process(uint32_t in_frames) const { const auto master = get_master(); - std::vector processed_tracks; + std::set processed_tracks; post_process_internal(master, in_frames, processed_tracks); } @@ -213,16 +213,23 @@ void mixer::thread_remove_track(mixer_track* track) { void mixer::update_taskflow(uint32_t in_frames) { tf::Taskflow taskflow; - tf::Task previous_task = taskflow.emplace([] {}); - for (const auto& order: layer_order_) { + std::vector> layer_tasks; + for (int32_t i = layer_order_.size() - 1; i >= 0; --i) { + const auto& order = layer_order_[i]; + auto new_layer = std::vector(); for (const auto& layer = layer_tracks_[order]; const auto& track: layer) { - taskflow.emplace([track, in_frames] { + auto t = taskflow.emplace([track, in_frames] { track->process(in_frames); - }).succeed(previous_task); + }); + new_layer.push_back(t); + } + layer_tasks.push_back(std::move(new_layer)); + } + for (int i = layer_tasks.size() - 1; i >= 0; --i) { + tf::Task layer_task = taskflow.emplace([]{}); + for (auto& task: layer_tasks[i]) { + task.precede(layer_task); } - tf::Task new_layer = taskflow.emplace([] {}); - new_layer.succeed(previous_task); - previous_task = new_layer; } taskflow_ = std::move(taskflow); } diff --git a/core/audio/mixer/mixer_track.cpp b/core/audio/mixer/mixer_track.cpp index 09fef04..58cbb46 100644 --- a/core/audio/mixer/mixer_track.cpp +++ b/core/audio/mixer/mixer_track.cpp @@ -52,6 +52,9 @@ void mixer_track::process(uint32_t in_frames) { effect->process(in_frames); buffer.multiple(volume); on_processed.broadcast(this); +} + +void mixer_track::post_process(uint32_t in_frames) { for (int i = 0; i < buffer.get_num_channels(); ++i) { (*ui_buffers)[i].Push(buffer.get_headers()[i], in_frames); } diff --git a/core/audio/mixer/mixer_track.h b/core/audio/mixer/mixer_track.h index 69e9da0..795b751 100644 --- a/core/audio/mixer/mixer_track.h +++ b/core/audio/mixer/mixer_track.h @@ -32,6 +32,7 @@ public: void remove_child(mixer_track* in_child); void process(uint32_t in_frames); + void post_process(uint32_t in_frames); virtual void rename(const std::string& in_name) = 0; [[nodiscard]] virtual std::string get_name() const = 0; diff --git a/core/thread_message/thread_message_hubs.cpp b/core/thread_message/thread_message_hubs.cpp new file mode 100644 index 0000000..1d2d4f5 --- /dev/null +++ b/core/thread_message/thread_message_hubs.cpp @@ -0,0 +1,7 @@ +// +// Created by 46944 on 24-5-26. +// +#include "thread_message_hubs.h" + +thread_message_hub g_main_thread_hub; +thread_message_hub g_audio_thread_hub; diff --git a/core/thread_message/thread_message_hubs.h b/core/thread_message/thread_message_hubs.h index a7aade2..f89a877 100644 --- a/core/thread_message/thread_message_hubs.h +++ b/core/thread_message/thread_message_hubs.h @@ -1,7 +1,7 @@ #pragma once #include "thread_message_hub.h" -inline thread_message_hub g_main_thread_hub; -inline thread_message_hub g_audio_thread_hub; +CORE_API extern thread_message_hub g_main_thread_hub; +CORE_API extern thread_message_hub g_audio_thread_hub; #define PUSH_MAIN_THREAD(code) g_main_thread_hub.push_message(code);