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),
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)", config.sample_rate);
127 ImGui::Text(
"Ratio: %.3f", ratio);
130 if (ratio < 1.4f || ratio > 1.6f) {
131 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
135 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f),
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", 32040.0f * player_state.playback_speed);
155 ImGui::Text(
"Sample Offset: %u", dsp_status.sample_offset);
156 ImGui::Text(
"Frame Boundary: %u", dsp_status.frame_boundary);
157 ImGui::Text(
"Master Vol L/R: %d / %d", dsp_status.master_vol_l,
158 dsp_status.master_vol_r);
160 if (dsp_status.mute) {
161 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
"Muted");
163 if (dsp_status.reset) {
164 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f),
"Reset");
167 ImGui::Text(
"Echo: %s (delay: %u)", dsp_status.echo_enabled ?
"ON" :
"OFF",
168 dsp_status.echo_delay);
179 ImGui::Text(
"Cycles: %llu", apu_status.cycles);
182 if (ImGui::BeginTable(
"ApuTimers", 4, ImGuiTableFlags_Borders)) {
183 ImGui::TableSetupColumn(
"Timer");
184 ImGui::TableSetupColumn(
"Enabled");
185 ImGui::TableSetupColumn(
"Counter");
186 ImGui::TableSetupColumn(
"Target");
187 ImGui::TableHeadersRow();
190 ImGui::TableNextRow();
191 ImGui::TableSetColumnIndex(0);
193 ImGui::TableSetColumnIndex(1);
194 ImGui::Text(
"%s", apu_status.timer0_enabled ?
"ON" :
"OFF");
195 ImGui::TableSetColumnIndex(2);
196 ImGui::Text(
"%u", apu_status.timer0_counter);
197 ImGui::TableSetColumnIndex(3);
198 ImGui::Text(
"%u", apu_status.timer0_target);
201 ImGui::TableNextRow();
202 ImGui::TableSetColumnIndex(0);
204 ImGui::TableSetColumnIndex(1);
205 ImGui::Text(
"%s", apu_status.timer1_enabled ?
"ON" :
"OFF");
206 ImGui::TableSetColumnIndex(2);
207 ImGui::Text(
"%u", apu_status.timer1_counter);
208 ImGui::TableSetColumnIndex(3);
209 ImGui::Text(
"%u", apu_status.timer1_target);
212 ImGui::TableNextRow();
213 ImGui::TableSetColumnIndex(0);
215 ImGui::TableSetColumnIndex(1);
216 ImGui::Text(
"%s", apu_status.timer2_enabled ?
"ON" :
"OFF");
217 ImGui::TableSetColumnIndex(2);
218 ImGui::Text(
"%u", apu_status.timer2_counter);
219 ImGui::TableSetColumnIndex(3);
220 ImGui::Text(
"%u", apu_status.timer2_target);
226 ImGui::Text(
"Ports In: %02X %02X", apu_status.port0_in, apu_status.port1_in);
227 ImGui::Text(
"Ports Out: %02X %02X", apu_status.port0_out, apu_status.port1_out);