51 lines
1.6 KiB
C++
51 lines
1.6 KiB
C++
#pragma once
|
|
#include "misc/delegates.h"
|
|
#include "misc/singleton/singleton.h"
|
|
|
|
#include <map>
|
|
#include <string>
|
|
|
|
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 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);
|
|
|
|
std::vector<mixer_track*> tracks_;
|
|
std::map<int32_t, std::vector<mixer_track*>> layer_tracks_;
|
|
std::vector<int32_t> layer_order_;
|
|
};
|
|
|
|
DEFINE_SINGLETON_INSTANCE(mixer)
|