#pragma once #include "misc/delegates.h" #include "misc/singleton/singleton.h" #include <map> #include <string> #include "taskflow/taskflow.hpp" class plugin_host; class channel_interface; class instrument_track; class mixer_track; class dummy_track; class mixer : public singleton_t<mixer> { typedef std::pair<int32_t, std::vector<mixer_track*>> layer_type; public: void init(singleton_initliazer& initliazer) override; void begin_release(singleton_release_guard &release_guard) override; void release(singleton_release_guard& release_guard) override; const char* get_name() override { return "mixer"; } dummy_track* create_dummy_track(const std::string& in_name); instrument_track* create_instrument_track(plugin_host* in_instrument); void remove_track(mixer_track* track); const std::vector<mixer_track*>& get_tracks() const { return tracks_; } void process(uint32_t in_frames); void reset(); [[nodiscard]] dummy_track* get_master() const { return reinterpret_cast<dummy_track*>(tracks_[0]); } void build_process_node(); void request_build_process_node(); dummy_track* zero_track; // 用于没有任何音频输出的通道 multicast_delegate<mixer_track*> on_add_track; multicast_delegate<mixer_track*> on_add_track_main_thread; multicast_delegate<mixer_track*> on_remove_track; multicast_delegate<mixer_track*> on_remove_track_main_thread; private: void post_process(uint32_t in_frames) const; void thread_register_track(mixer_track* track); void thread_remove_track(mixer_track* track); void update_taskflow(uint32_t in_frames); std::vector<mixer_track*> tracks_; std::unordered_map<int32_t, std::vector<mixer_track*>> layer_tracks_; std::vector<int32_t> layer_order_; std::atomic<tf::Executor*> executor_; tf::Taskflow taskflow_; }; DEFINE_SINGLETON_INSTANCE(mixer)