98 lines
3.2 KiB
C++
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);
|
|
}
|
|
}
|