Files
AronaImGui/Arona/widget/widget_mixer.cpp
2024-03-04 13:32:14 +08:00

98 lines
3.2 KiB
C++

#include "widget_mixer.h"
#include "arona_widget.h"
#include "audio/device/audio_device_manager.h"
#include "audio/mixer/mixer.h"
#include "audio/mixer/mixer_track.h"
widget_mixer_track::widget_mixer_track(mixer_track* in_mixer_track): mixer_track_(in_mixer_track) {
name_ = mixer_track_->get_name();
peak_.resize(in_mixer_track->buffer.get_num_channels());
for (auto& p: peak_) {
p = -90.f;
}
peak_decay_.resize(in_mixer_track->buffer.get_num_channels());
}
widget_mixer_track::~widget_mixer_track() {
mixer_track_->on_processed.remove_object(this);
}
void widget_mixer_track::on_paint(ImGuiIO& io) {
ImGui::BeginChild(generate_widget_id(), ImVec2(25, 0));
{
ImGui::Text(name_.c_str());
ImGui::SliderFloat("dB", &volume_, -60.0f, 3.0f);
uint32_t sample_count = get_audio_device_manager().get_sample_rate() * io.DeltaTime;
for (uint32_t i = 0; i < mixer_track_->ui_buffers.size(); i++) {
auto& bu_buffer = mixer_track_->ui_buffers[i];
sample_count = std::min(sample_count, bu_buffer.Num());
// float temp_max = 0.f;
std::vector<float> samples(sample_count);
bu_buffer.Pop(samples.data(), sample_count);
const float rms = calculate_rms(samples);
const float dB = rms_2_db(rms, 1.0f);
// for (uint32_t i = 0; i < sample_count; ++i) {
// temp_max = std::max(temp_max, std::abs(samples[i]));
// }
update_peak(i, dB, io.DeltaTime);
// const float peak = get_range_pct(-90.0f, 6.0f, peak_[i]);
draw_volume_bar(dB, peak_[i], ImVec2(5.0f, 100.0f), "");
ImGui::SameLine();
}
}
ImGui::EndChild();
}
void widget_mixer_track::update_peak(uint32_t channel, float new_peak, float delta_time) {
float& current_peak = peak_[channel];
float& current_decay = peak_decay_[channel];
if (new_peak > current_peak) {
current_peak = new_peak;
current_decay = 1.f;
}
current_decay -= delta_time;
if (current_decay < 0.0f) {
current_peak -= delta_time * 30.f;
current_peak = std::max(current_peak, -120.f);
}
}
widget_mixer::widget_mixer() {
get_mixer().on_add_track_main_thread.add_raw(this, &widget_mixer::on_add_track);
get_mixer().on_remove_track_main_thread.add_raw(this, &widget_mixer::on_remove_track);
}
widget_mixer::~widget_mixer() {
get_mixer().on_add_track_main_thread.remove_object(this);
get_mixer().on_remove_track_main_thread.remove_object(this);
}
void widget_mixer::on_paint(ImGuiIO& io) {
ImGui::Begin("mixer");
for (const auto& widget_mixer_track : tracks_) {
widget_mixer_track->on_paint(io);
ImGui::SameLine();
}
ImGui::End();
}
void widget_mixer::on_add_track(mixer_track* track) {
auto find = std::ranges::find(tracks_, track, &widget_mixer_track::get_mixer_track);
if (find == tracks_.end()) {
tracks_.push_back(std::make_shared<widget_mixer_track>(track));
}
}
void widget_mixer::on_remove_track(mixer_track* track) {
auto find = std::ranges::find(tracks_, track, &widget_mixer_track::get_mixer_track);
if (find != tracks_.end()) {
tracks_.erase(find);
}
}