Commit Description:
Various UI improvements.
Commit Description:
Various UI improvements.
File last commit:
Show/Diff file:
Action:
FNA/lib/FAudio/utils/testreverb/testreverb.cpp
196 lines | 6.3 KiB | text/x-c | CppLexer
#include "../uicommon/imgui.h"
#include "audio.h"
#include <math.h>
const char* TOOL_NAME = "Reverb Test Tool";
int TOOL_WIDTH = 640;
int TOOL_HEIGHT = 850;
int next_window_dims(int y_pos, int height)
{
ImGui::SetNextWindowPos(ImVec2(0, static_cast<float>(y_pos)));
ImGui::SetNextWindowSize(ImVec2(640, static_cast<float>(height)));
return y_pos + height;
}
void FAudioTool_Init()
{
/* Nothing to do... */
}
void FAudioTool_Quit()
{
/* Nothing to do... */
}
void FAudioTool_Update()
{
bool update_engine = false;
bool update_wave = false;
bool play_wave = false;
bool stop_wave = false;
bool update_effect = false;
// gui
int window_y = next_window_dims(0, 80);
ImGui::Begin("Output Audio Engine");
static int audio_engine = (int)AudioEngine_FAudio;
update_engine |= ImGui::RadioButton("FAudio", &audio_engine, (int)AudioEngine_FAudio); ImGui::SameLine();
#ifdef HAVE_XAUDIO2
update_engine |= ImGui::RadioButton("XAudio2", &audio_engine, (int)AudioEngine_XAudio2); ImGui::SameLine();
#endif
static bool output_5p1 = false;
update_engine |= ImGui::Checkbox("5.1 channel output", &output_5p1);
static int32_t voice_index = (int32_t) AudioVoiceType_Submix;
update_engine |= ImGui::Combo("Apply effect to", &voice_index, audio_voice_type_names, 3);
ImGui::End();
window_y = next_window_dims(window_y, 80);
ImGui::Begin("Wave file to play");
static int wave_index = (int)AudioWave_SnareDrum01;
static bool wave_stereo = false;
update_wave |= ImGui::RadioButton("Snare Drum (Forte)", &wave_index, (int)AudioWave_SnareDrum01); ImGui::SameLine();
update_wave |= ImGui::RadioButton("Snare Drum (Fortissimo)", &wave_index, (int)AudioWave_SnareDrum02); ImGui::SameLine();
update_wave |= ImGui::RadioButton("Snare Drum (Mezzo-Forte)", &wave_index, (int)AudioWave_SnareDrum03);
play_wave = ImGui::Button("Play"); ImGui::SameLine();
stop_wave = ImGui::Button("Stop"); ImGui::SameLine();
update_wave |= ImGui::Checkbox("Stereo", &wave_stereo);
ImGui::End();
window_y = next_window_dims(window_y, 80);
ImGui::Begin("Reverb effect");
static bool effect_enabled = false;
update_effect |= ImGui::Checkbox("Enabled", &effect_enabled);
static int32_t preset_index = -1;
static ReverbParameters reverb_params = {
100.0f,
40,
60,
0, 0, 0, 0, 0,
3,
3,
0,
0,
0,
0,
5000.0f,
-5.0f,
-5.0f,
-5.0f,
-5.0f,
2000.0f,
50.0f,
100.0f,
};
if (ImGui::Combo("Preset", &preset_index, audio_reverb_preset_names, audio_reverb_preset_count)) {
memcpy(&reverb_params, &audio_reverb_presets[preset_index], sizeof(ReverbParameters));
update_effect = true;
}
ImGui::End();
window_y = next_window_dims(window_y, 600);
ImGui::Begin("FAudio Tune Detail");
int ReverbDelay = reverb_params.ReverbDelay;
int RearDelay = reverb_params.RearDelay;
int PositionLeft = reverb_params.PositionLeft;
int PositionRight = reverb_params.PositionRight;
int PositionMatrixLeft = reverb_params.PositionMatrixLeft;
int PositionMatrixRight = reverb_params.PositionMatrixRight;
int EarlyDiffusion = reverb_params.EarlyDiffusion;
int LateDiffusion = reverb_params.LateDiffusion;
int LowEQGain = reverb_params.LowEQGain;
int LowEQCutoff = reverb_params.LowEQCutoff;
int HighEQGain = reverb_params.HighEQGain;
int HighEQCutoff = reverb_params.HighEQCutoff;
update_effect |= ImGui::SliderFloat("WetDryMix (%)", &reverb_params.WetDryMix, 0, 100);
update_effect |= ImGui::SliderInt("ReflectionsDelay (ms)", (int *)&reverb_params.ReflectionsDelay, 0, 300);
update_effect |= ImGui::SliderInt("ReverbDelay (ms)", &ReverbDelay, 0, 85);
update_effect |= ImGui::SliderInt("RearDelay (ms)", &RearDelay, 0, 5);
update_effect |= ImGui::SliderInt("PositionLeft", &PositionLeft, 0, 30);
update_effect |= ImGui::SliderInt("PositionRight", &PositionRight, 0, 30);
update_effect |= ImGui::SliderInt("PositionMatrixLeft", &PositionMatrixLeft, 0, 30);
update_effect |= ImGui::SliderInt("PositionMatrixRight", &PositionMatrixRight, 0, 30);
update_effect |= ImGui::SliderInt("Early Diffusion", &EarlyDiffusion, 0, 15);
update_effect |= ImGui::SliderInt("Late Diffusion", &LateDiffusion, 0, 15);
update_effect |= ImGui::SliderInt("LowEqGain", &LowEQGain, 0, 12);
update_effect |= ImGui::SliderInt("LowEqCuttoff", &LowEQCutoff, 0, 9);
update_effect |= ImGui::SliderInt("HighEqGain", &HighEQGain, 0, 8);
update_effect |= ImGui::SliderInt("HighEqCuttoff", &HighEQCutoff, 0, 14);
update_effect |= ImGui::SliderFloat("RoomFreq (Hz)", &reverb_params.RoomFilterFreq, 20, 20000);
update_effect |= ImGui::SliderFloat("RoomGain (dB)", &reverb_params.RoomFilterMain, -100, 0);
update_effect |= ImGui::SliderFloat("RoomHFGain (dB)", &reverb_params.RoomFilterHF, -100, 0);
update_effect |= ImGui::SliderFloat("ReflectionsGain (dB)", &reverb_params.ReflectionsGain, -100, 20);
update_effect |= ImGui::SliderFloat("ReverbGain (dB)", &reverb_params.ReverbGain, -100, 20);
update_effect |= ImGui::SliderFloat("DecayTime (s)", &reverb_params.DecayTime, 0.1f, 15.0f);
update_effect |= ImGui::SliderFloat("Density (%)", &reverb_params.Density, 0, 100);
update_effect |= ImGui::SliderFloat("RoomSize (feet)", &reverb_params.RoomSize, 1, 100);
reverb_params.ReverbDelay = ReverbDelay;
reverb_params.RearDelay = RearDelay;
reverb_params.PositionLeft = PositionLeft;
reverb_params.PositionRight = PositionRight;
reverb_params.PositionMatrixLeft = PositionMatrixLeft;
reverb_params.PositionMatrixRight = PositionMatrixRight;
reverb_params.EarlyDiffusion = EarlyDiffusion;
reverb_params.LateDiffusion = LateDiffusion;
reverb_params.LowEQGain = LowEQGain;
reverb_params.LowEQCutoff = LowEQCutoff;
reverb_params.HighEQGain = HighEQGain;
reverb_params.HighEQCutoff = HighEQCutoff;
ImGui::End();
// audio control
static AudioContext *player = NULL;
if (player == NULL || update_engine)
{
if (player != NULL)
{
audio_destroy_context(player);
}
player = audio_create_context((AudioEngine) audio_engine, output_5p1, (AudioVoiceType) voice_index);
}
if (update_wave | update_engine)
{
audio_wave_load(player, (AudioSampleWave) wave_index, wave_stereo);
}
if (play_wave) {
audio_wave_play(player);
}
if (stop_wave)
{
audio_wave_stop(player);
}
if ((update_engine || update_effect))
{
audio_effect_change(player, effect_enabled, &reverb_params);
}
}