1#ifndef YAZE_APP_EDITOR_MUSIC_PANELS_MUSIC_AUDIO_DEBUG_PANEL_H_
2#define YAZE_APP_EDITOR_MUSIC_PANELS_MUSIC_AUDIO_DEBUG_PANEL_H_
11#include "imgui/imgui.h"
35 std::string
GetId()
const override {
return "music.audio_debug"; }
45 void Draw(
bool* p_open)
override {
47 ImGui::TextDisabled(tr(
"Music player not available"));
53 ImGui::TextColored(ImVec4(0.8f, 0.8f, 0.4f, 1.0f),
56 ImGui::TextDisabled(tr(
"Audio emulator not initialized"));
62 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f),
87 ImGui::Text(tr(
"Device Rate: %d Hz"), config.sample_rate);
88 ImGui::Text(tr(
"Native Rate: 32040 Hz (SPC700)"));
89 ImGui::Text(tr(
"Channels: %d"), config.channels);
90 ImGui::Text(tr(
"Buffer Frames: %d"), config.buffer_frames);
100 if (status.is_playing) {
101 ImGui::TextColored(ImVec4(0.3f, 0.9f, 0.3f, 1.0f), tr(
"Status: Playing"));
103 ImGui::TextColored(ImVec4(0.9f, 0.9f, 0.3f, 1.0f), tr(
"Status: Stopped"));
106 ImGui::Text(tr(
"Queued Frames: %u"), status.queued_frames);
107 ImGui::Text(tr(
"Queued Bytes: %u"), status.queued_bytes);
109 if (status.has_underrun) {
110 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f),
124 if (resampling_enabled) {
125 float ratio =
static_cast<float>(config.sample_rate) / 32040.0f;
126 ImGui::TextColored(ImVec4(0.3f, 0.9f, 0.3f, 1.0f),
127 tr(
"Status: ENABLED (32040 -> %d Hz)"),
129 ImGui::Text(tr(
"Ratio: %.3f"), ratio);
132 if (ratio < 1.4f || ratio > 1.6f) {
133 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
137 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f),
138 tr(
"Status: DISABLED"));
139 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
145 ImGui::Text(tr(
"Playback Speed: %.2fx"), player_state.playback_speed);
146 ImGui::Text(tr(
"Effective Rate: %.0f Hz"),
147 32040.0f * player_state.playback_speed);
158 ImGui::Text(tr(
"Sample Offset: %u"), dsp_status.sample_offset);
159 ImGui::Text(tr(
"Frame Boundary: %u"), dsp_status.frame_boundary);
160 ImGui::Text(tr(
"Master Vol L/R: %d / %d"), dsp_status.master_vol_l,
161 dsp_status.master_vol_r);
163 if (dsp_status.mute) {
164 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f), tr(
"Muted"));
166 if (dsp_status.reset) {
167 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f), tr(
"Reset"));
170 ImGui::Text(tr(
"Echo: %s (delay: %u)"),
171 dsp_status.echo_enabled ?
"ON" :
"OFF", dsp_status.echo_delay);
182 ImGui::Text(tr(
"Cycles: %llu"), apu_status.cycles);
185 if (ImGui::BeginTable(
"ApuTimers", 4, ImGuiTableFlags_Borders)) {
186 ImGui::TableSetupColumn(
"Timer");
187 ImGui::TableSetupColumn(
"Enabled");
188 ImGui::TableSetupColumn(
"Counter");
189 ImGui::TableSetupColumn(
"Target");
190 ImGui::TableHeadersRow();
193 ImGui::TableNextRow();
194 ImGui::TableSetColumnIndex(0);
195 ImGui::Text(tr(
"T0"));
196 ImGui::TableSetColumnIndex(1);
197 ImGui::Text(
"%s", apu_status.timer0_enabled ?
"ON" :
"OFF");
198 ImGui::TableSetColumnIndex(2);
199 ImGui::Text(
"%u", apu_status.timer0_counter);
200 ImGui::TableSetColumnIndex(3);
201 ImGui::Text(
"%u", apu_status.timer0_target);
204 ImGui::TableNextRow();
205 ImGui::TableSetColumnIndex(0);
206 ImGui::Text(tr(
"T1"));
207 ImGui::TableSetColumnIndex(1);
208 ImGui::Text(
"%s", apu_status.timer1_enabled ?
"ON" :
"OFF");
209 ImGui::TableSetColumnIndex(2);
210 ImGui::Text(
"%u", apu_status.timer1_counter);
211 ImGui::TableSetColumnIndex(3);
212 ImGui::Text(
"%u", apu_status.timer1_target);
215 ImGui::TableNextRow();
216 ImGui::TableSetColumnIndex(0);
217 ImGui::Text(tr(
"T2"));
218 ImGui::TableSetColumnIndex(1);
219 ImGui::Text(
"%s", apu_status.timer2_enabled ?
"ON" :
"OFF");
220 ImGui::TableSetColumnIndex(2);
221 ImGui::Text(
"%u", apu_status.timer2_counter);
222 ImGui::TableSetColumnIndex(3);
223 ImGui::Text(
"%u", apu_status.timer2_target);
229 ImGui::Text(tr(
"Ports In: %02X %02X"), apu_status.port0_in,
230 apu_status.port1_in);
231 ImGui::Text(tr(
"Ports Out: %02X %02X"), apu_status.port0_out,
232 apu_status.port1_out);
241 if (ImGui::Button(tr(
"Clear Audio Queue"))) {
245 if (ImGui::Button(tr(
"Reset DSP Buffer"))) {
249 if (ImGui::Button(tr(
"Force NewFrame"))) {
253 if (ImGui::Button(tr(
"Reinit Audio"))) {
WindowContent providing audio diagnostics for debugging the music editor.
void DrawBackendInfo(emu::audio::IAudioBackend *backend)
void DrawResamplingStatus(emu::audio::IAudioBackend *backend)
std::string GetDisplayName() const override
Human-readable name shown in menus and title bars.
void Draw(bool *p_open) override
Draw the panel content.
int GetPriority() const override
Get display priority for menu ordering.
std::string GetId() const override
Unique identifier for this panel.
editor::music::MusicPlayer * player_
MusicAudioDebugPanel(editor::music::MusicPlayer *player)
std::string GetIcon() const override
Material Design icon for this panel.
std::string GetEditorCategory() const override
Editor category this panel belongs to.
void DrawQueueStatus(emu::audio::IAudioBackend *backend)
Base interface for all logical window content components.
Handles audio playback for the music editor using the SNES APU emulator.
emu::Emulator * emulator()
ApuDebugStatus GetApuStatus() const
Get APU timing diagnostic status.
void ReinitAudio()
Reinitialize the audio system.
void ForceNewFrame()
Force a DSP NewFrame() call.
DspDebugStatus GetDspStatus() const
Get DSP buffer diagnostic status.
PlaybackState GetState() const
void ResetDspBuffer()
Reset the DSP sample buffer.
void ClearAudioQueue()
Clear the audio queue (stops sound immediately).
A class for emulating and debugging SNES games.
bool is_snes_initialized() const
audio::IAudioBackend * audio_backend()
Abstract audio backend interface.
virtual std::string GetBackendName() const =0
virtual AudioStatus GetStatus() const =0
virtual AudioConfig GetConfig() const =0
virtual bool IsAudioStreamEnabled() const
#define ICON_MD_QUEUE_MUSIC
#define ICON_MD_BUG_REPORT
#define ICON_MD_TRANSFORM