#include "../uicommon/imgui.h" #include "audio.h" #include 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(y_pos))); ImGui::SetNextWindowSize(ImVec2(640, static_cast(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); } }