修改audio_buffer::get_interleaved_buffer()为const, 新增当乐器类型插件移除时移除混音轨道

This commit is contained in:
Nanako 2024-03-01 18:12:26 +08:00
parent 23bc4ce501
commit 94b9057cbd
5 changed files with 6 additions and 7 deletions

View File

@ -39,7 +39,7 @@ void audio_buffer::multiple(float percent) {
}
}
std::vector<float> audio_buffer::get_interleaved_buffer() {
std::vector<float> audio_buffer::get_interleaved_buffer() const {
std::scoped_lock lock(lock_);
std::vector<float> result;
result.reserve(buffer_[0].size() * buffer_.size());

View File

@ -14,7 +14,7 @@ public:
void mix(audio_buffer& in_buffer, float percent = 1.f);
void multiple(float percent);
std::vector<float> get_interleaved_buffer();
std::vector<float> get_interleaved_buffer() const;
private:
std::vector<std::vector<float>> buffer_;
std::vector<float*> headers_{};

View File

@ -11,7 +11,6 @@ mixer_track::~mixer_track() {
void mixer_track::init() {
const uint32_t channel_count = g_audio_device_manager.get_output_channel_count();
buffer.resize(channel_count, g_audio_device_manager.get_buffer_size());
ui_buffer.SetCapacity(g_audio_device_manager.get_buffer_size() * 3);
channel_interface_ = new mixer_channel_interface(this);
}
@ -39,9 +38,7 @@ void mixer_track::process(uint32_t in_frames) {
for (auto effect : effects)
effect->process(in_frames);
buffer.multiple(volume);
const std::vector<float>& interleaved_buffer = buffer.get_interleaved_buffer();
ui_buffer.Push(interleaved_buffer.data(), interleaved_buffer.size());
on_processed.broadcast(this);
}
void instrument_track::rename(const std::string& in_name) {

View File

@ -1,6 +1,7 @@
#pragma once
#include "audio/misc/audio_buffer.h"
#include "audio/misc/circular_audio_buffer.h"
#include "misc/delegates.h"
class channel_interface;
class mixer_track;
@ -40,10 +41,10 @@ public:
[[nodiscard]] channel_interface* get_channel_interface() const { return channel_interface_; }
audio_buffer buffer;
circular_audio_buffer<float> ui_buffer; // (交错缓冲区)用于显示可视化的音频数据, 根据DeltaTime来动态获取数据
std::atomic<float> volume = 1.0f;
std::vector<plugin_host*> effects{};
std::vector<mixer_track_link> children{};
multicast_delegate<mixer_track*> on_processed;
private:
void add_effect_internal(plugin_host* in_effect);
const mixer_track_type type_;

View File

@ -38,6 +38,7 @@ void plugin_host_manager::remove_instrument_plugin_host(plugin_host* host) {
g_audio_thread_hub.push_message([host, this]() {
auto find = std::ranges::find(instrument_plugins_, host);
if (find != instrument_plugins_.end()) {
g_mixer.remove_track(host->owner_tracks[0]);
plugin_hosts_.erase(std::ranges::find(plugin_hosts_, host));
instrument_plugins_.erase(find);
g_main_thread_hub.push_message([host, this]() {