Skip to content

Commit 7118ae8

Browse files
committed
SNES: Call rg_audio_submit even when sound is disabled
This is necessary for emulation pacing.
1 parent a5b3219 commit 7118ae8

File tree

2 files changed

+24
-30
lines changed

2 files changed

+24
-30
lines changed

components/retro-go/drivers/audio/i2s.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ static bool driver_submit(const rg_audio_frame_t *frames, size_t count)
119119
{
120120
float volume = state.muted ? 0.f : (state.volume * 0.01f);
121121
rg_audio_frame_t buffer[180];
122-
size_t written = 0;
123122
size_t pos = 0;
124123

125124
bool use_internal_dac = state.device == 0;
@@ -168,6 +167,7 @@ static bool driver_submit(const rg_audio_frame_t *frames, size_t count)
168167

169168
if (i == count - 1 || ++pos == RG_COUNT(buffer))
170169
{
170+
size_t written;
171171
if (i2s_write(I2S_NUM_0, (void *)buffer, pos * 4, &written, 1000) != ESP_OK)
172172
RG_LOGW("I2S Submission error! Written: %d/%d\n", written, pos * 4);
173173
pos = 0;

retro-core/main/main_snes.c

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,15 @@ static rg_audio_sample_t *currentAudioBuffer;
8080
static rg_task_t *audio_task_handle;
8181
#endif
8282

83-
static bool apu_enabled = true;
83+
static bool sound_enabled = true;
8484
static bool lowpass_filter = false;
8585

8686
static int keymap_id = 0;
8787
static keymap_t keymap;
8888

8989
static const char *SETTING_KEYMAP = "keymap";
90-
static const char *SETTING_APU_EMULATION = "apu";
91-
static const char *SETTING_APU_FILTER = "filter";
90+
static const char *SETTING_SOUND_EMULATION = "apu";
91+
static const char *SETTING_SOUND_FILTER = "filter";
9292
// --- MAIN
9393

9494
static void update_keymap(int id)
@@ -115,6 +115,8 @@ static bool load_state_handler(const char *filename)
115115
static bool reset_handler(bool hard)
116116
{
117117
S9xReset();
118+
memset(audioBuffers[0], 0, AUDIO_BUFFER_LENGTH * 4);
119+
memset(audioBuffers[1], 0, AUDIO_BUFFER_LENGTH * 4);
118120
return true;
119121
}
120122

@@ -130,12 +132,11 @@ static rg_gui_event_t apu_toggle_cb(rg_gui_option_t *option, rg_gui_event_t even
130132
{
131133
if (event == RG_DIALOG_PREV || event == RG_DIALOG_NEXT)
132134
{
133-
apu_enabled = !apu_enabled;
134-
rg_settings_set_number(NS_APP, SETTING_APU_EMULATION, apu_enabled);
135+
sound_enabled = !sound_enabled;
136+
rg_settings_set_number(NS_APP, SETTING_SOUND_EMULATION, sound_enabled);
135137
}
136138

137-
strcpy(option->value, apu_enabled ? _("On") : _("Off"));
138-
139+
strcpy(option->value, sound_enabled ? _("On") : _("Off"));
139140
return RG_DIALOG_VOID;
140141
}
141142

@@ -144,11 +145,10 @@ static rg_gui_event_t lowpass_filter_cb(rg_gui_option_t *option, rg_gui_event_t
144145
if (event == RG_DIALOG_PREV || event == RG_DIALOG_NEXT)
145146
{
146147
lowpass_filter = !lowpass_filter;
147-
rg_settings_set_number(NS_APP, SETTING_APU_FILTER, lowpass_filter);
148+
rg_settings_set_number(NS_APP, SETTING_SOUND_FILTER, lowpass_filter);
148149
}
149150

150151
strcpy(option->value, lowpass_filter ? _("On") : _("Off"));
151-
152152
return RG_DIALOG_VOID;
153153
}
154154

@@ -304,7 +304,8 @@ static void audio_task(void *arg)
304304
{
305305
if (msg.type == RG_TASK_MSG_STOP)
306306
break;
307-
mix_samples(AUDIO_BUFFER_LENGTH << 1);
307+
if (msg.type != 0)
308+
mix_samples(AUDIO_BUFFER_LENGTH << 1);
308309
rg_audio_submit(currentAudioBuffer, AUDIO_BUFFER_LENGTH);
309310
}
310311
}
@@ -331,8 +332,8 @@ void snes_main(void)
331332
app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, NULL);
332333

333334
// Load settings
334-
apu_enabled = rg_settings_get_number(NS_APP, SETTING_APU_EMULATION, 1);
335-
lowpass_filter = rg_settings_get_number(NS_APP, SETTING_APU_FILTER, 0);
335+
sound_enabled = rg_settings_get_number(NS_APP, SETTING_SOUND_EMULATION, 1);
336+
lowpass_filter = rg_settings_get_number(NS_APP, SETTING_SOUND_FILTER, 0);
336337
update_keymap(rg_settings_get_number(NS_APP, SETTING_KEYMAP, 0));
337338

338339
// Allocate surfaces and audio buffers
@@ -347,10 +348,10 @@ void snes_main(void)
347348
currentUpdate = updates[0];
348349

349350
#ifdef AUDIO_DOUBLE_BUFFERING
350-
audioBuffers[0] = (rg_audio_sample_t *)malloc(AUDIO_BUFFER_LENGTH * 4);
351-
audioBuffers[1] = (rg_audio_sample_t *)malloc(AUDIO_BUFFER_LENGTH * 4);
351+
audioBuffers[0] = (rg_audio_sample_t *)calloc(AUDIO_BUFFER_LENGTH, 4);
352+
audioBuffers[1] = (rg_audio_sample_t *)calloc(AUDIO_BUFFER_LENGTH, 4);
352353
#else
353-
audioBuffers[0] = (rg_audio_sample_t *)malloc(AUDIO_BUFFER_LENGTH * 4);
354+
audioBuffers[0] = (rg_audio_sample_t *)calloc(AUDIO_BUFFER_LENGTH, 4);
354355
audioBuffers[1] = audioBuffers[0];
355356
#endif
356357
currentAudioBuffer = audioBuffers[0];
@@ -432,6 +433,8 @@ void snes_main(void)
432433
else if (joystick & RG_KEY_OPTION)
433434
{
434435
rg_gui_options_menu();
436+
memset(audioBuffers[0], 0, AUDIO_BUFFER_LENGTH * 4);
437+
memset(audioBuffers[1], 0, AUDIO_BUFFER_LENGTH * 4);
435438
}
436439

437440
menuPressed = joystick & RG_KEY_MENU;
@@ -451,11 +454,8 @@ void snes_main(void)
451454
S9xMainLoop();
452455

453456
#ifdef USE_AUDIO_TASK
454-
if (apu_enabled)
455-
{
456-
rg_task_msg_t msg = {0};
457-
rg_task_send(audio_task_handle, &msg);
458-
}
457+
rg_task_msg_t msg = {.type = (int)sound_enabled};
458+
rg_task_send(audio_task_handle, &msg);
459459
#endif
460460

461461
if (drawFrame)
@@ -466,16 +466,10 @@ void snes_main(void)
466466
}
467467

468468
#ifndef USE_AUDIO_TASK
469-
if (apu_enabled)
470-
{
469+
if (sound_enabled)
471470
mix_samples(AUDIO_BUFFER_LENGTH << 1);
472-
rg_system_tick(rg_system_timer() - startTime);
473-
rg_audio_submit(currentAudioBuffer, AUDIO_BUFFER_LENGTH);
474-
}
475-
else
476-
{
477-
rg_system_tick(rg_system_timer() - startTime);
478-
}
471+
rg_system_tick(rg_system_timer() - startTime);
472+
rg_audio_submit(currentAudioBuffer, AUDIO_BUFFER_LENGTH);
479473
#else
480474
rg_system_tick(rg_system_timer() - startTime);
481475
#endif

0 commit comments

Comments
 (0)