1#ifndef YAZE_APP_EDITOR_MUSIC_PANELS_MUSIC_AUDIO_DEBUG_PANEL_H_
2#define YAZE_APP_EDITOR_MUSIC_PANELS_MUSIC_AUDIO_DEBUG_PANEL_H_
10#include "imgui/imgui.h"
34 std::string
GetId()
const override {
return "music.audio_debug"; }
44 void Draw(
bool* p_open)
override {
46 ImGui::TextDisabled(
"Music player not available");
52 ImGui::TextColored(ImVec4(0.8f, 0.8f, 0.4f, 1.0f),
55 ImGui::TextDisabled(
"Audio emulator not initialized");
61 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f),
86 ImGui::Text(
"Device Rate: %d Hz", config.sample_rate);
87 ImGui::Text(
"Native Rate: 32040 Hz (SPC700)");
88 ImGui::Text(
"Channels: %d", config.channels);
89 ImGui::Text(
"Buffer Frames: %d", config.buffer_frames);
99 if (status.is_playing) {
100 ImGui::TextColored(ImVec4(0.3f, 0.9f, 0.3f, 1.0f),
"Status: Playing");
102 ImGui::TextColored(ImVec4(0.9f, 0.9f, 0.3f, 1.0f),
"Status: Stopped");
105 ImGui::Text(
"Queued Frames: %u", status.queued_frames);
106 ImGui::Text(
"Queued Bytes: %u", status.queued_bytes);
108 if (status.has_underrun) {
109 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f),
123 if (resampling_enabled) {
124 float ratio =
static_cast<float>(config.sample_rate) / 32040.0f;
125 ImGui::TextColored(ImVec4(0.3f, 0.9f, 0.3f, 1.0f),
126 "Status: ENABLED (32040 -> %d Hz)",
128 ImGui::Text(
"Ratio: %.3f", ratio);
131 if (ratio < 1.4f || ratio > 1.6f) {
132 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
136 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f),
"Status: DISABLED");
137 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
143 ImGui::Text(
"Playback Speed: %.2fx", player_state.playback_speed);
144 ImGui::Text(
"Effective Rate: %.0f Hz",
145 32040.0f * player_state.playback_speed);
156 ImGui::Text(
"Sample Offset: %u", dsp_status.sample_offset);
157 ImGui::Text(
"Frame Boundary: %u", dsp_status.frame_boundary);
158 ImGui::Text(
"Master Vol L/R: %d / %d", dsp_status.master_vol_l,
159 dsp_status.master_vol_r);
161 if (dsp_status.mute) {
162 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
"Muted");
164 if (dsp_status.reset) {
165 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f),
"Reset");
168 ImGui::Text(
"Echo: %s (delay: %u)", dsp_status.echo_enabled ?
"ON" :
"OFF",
169 dsp_status.echo_delay);
180 ImGui::Text(
"Cycles: %llu", apu_status.cycles);
183 if (ImGui::BeginTable(
"ApuTimers", 4, ImGuiTableFlags_Borders)) {
184 ImGui::TableSetupColumn(
"Timer");
185 ImGui::TableSetupColumn(
"Enabled");
186 ImGui::TableSetupColumn(
"Counter");
187 ImGui::TableSetupColumn(
"Target");
188 ImGui::TableHeadersRow();
191 ImGui::TableNextRow();
192 ImGui::TableSetColumnIndex(0);
194 ImGui::TableSetColumnIndex(1);
195 ImGui::Text(
"%s", apu_status.timer0_enabled ?
"ON" :
"OFF");
196 ImGui::TableSetColumnIndex(2);
197 ImGui::Text(
"%u", apu_status.timer0_counter);
198 ImGui::TableSetColumnIndex(3);
199 ImGui::Text(
"%u", apu_status.timer0_target);
202 ImGui::TableNextRow();
203 ImGui::TableSetColumnIndex(0);
205 ImGui::TableSetColumnIndex(1);
206 ImGui::Text(
"%s", apu_status.timer1_enabled ?
"ON" :
"OFF");
207 ImGui::TableSetColumnIndex(2);
208 ImGui::Text(
"%u", apu_status.timer1_counter);
209 ImGui::TableSetColumnIndex(3);
210 ImGui::Text(
"%u", apu_status.timer1_target);
213 ImGui::TableNextRow();
214 ImGui::TableSetColumnIndex(0);
216 ImGui::TableSetColumnIndex(1);
217 ImGui::Text(
"%s", apu_status.timer2_enabled ?
"ON" :
"OFF");
218 ImGui::TableSetColumnIndex(2);
219 ImGui::Text(
"%u", apu_status.timer2_counter);
220 ImGui::TableSetColumnIndex(3);
221 ImGui::Text(
"%u", apu_status.timer2_target);
227 ImGui::Text(
"Ports In: %02X %02X", apu_status.port0_in,
228 apu_status.port1_in);
229 ImGui::Text(
"Ports Out: %02X %02X", apu_status.port0_out,
230 apu_status.port1_out);
239 if (ImGui::Button(
"Clear Audio Queue")) {
243 if (ImGui::Button(
"Reset DSP Buffer")) {
247 if (ImGui::Button(
"Force NewFrame")) {
251 if (ImGui::Button(
"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