From f0ebc747d1b0d8753a1bc0f74b34a3012dd16753 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 30 May 2023 21:52:30 +0200 Subject: Properly handle audio/link sync settings --- src/gba/gba.h | 12 ++++++++++-- src/sequencer.c | 12 +++++++----- src/settings.c | 31 +++++++++++++++++++++++++++++++ src/settings.h | 12 ++++++++++++ 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/gba/gba.h b/src/gba/gba.h index 2b28295..74b6942 100644 --- a/src/gba/gba.h +++ b/src/gba/gba.h @@ -510,10 +510,18 @@ typedef enum { } SoundChannel; inline u16 -sound_volume(SoundChannel channels, u8 volume) { +sound_volume(SoundChannel channels, u8 volume, u8 pan) { volume = volume & 0x7; channels = channels & 0xF; - return volume | (volume << 0x4) | (channels << 0x8) | (channels << 0xC); + u16 right = volume | (channels << 0x8); + u16 left = (volume << 0x4) | (channels << 0xC); + if (pan == 1) { + return left; + } + if (pan == 2) { + return right; + } + return left | right; } // Sound Direct Sound master bits. diff --git a/src/sequencer.c b/src/sequencer.c index d8c5f3f..2ee6b07 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -45,7 +45,6 @@ gate_on(void) { irs_set(IRQ_TIMER_3, gate_off); TIMER_DATA_3 = n_ticks; TIMER_CTRL_3 = TIMER_CTRL_IRQ | TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3; - audio_sync_click = true; } void @@ -169,6 +168,12 @@ play_step(void) { case SYNC_OUT_LINK_16: { gate_on(); } break; case SYNC_OUT_LINK_8: { if (step_counter % 2 == 0) { gate_on(); } } break; case SYNC_OUT_LINK_4: { if (step_counter % 4 == 0) { gate_on(); } } break; + case SYNC_OUT_AUDIO_16: { audio_sync_click = true; } break; + case SYNC_OUT_AUDIO_8: { if (step_counter % 2 == 0) { audio_sync_click = true; } } break; + case SYNC_OUT_AUDIO_4: { if (step_counter % 4 == 0) { audio_sync_click = true; } } break; + case SYNC_OUT_LINK_AUDIO_16: { gate_on(); audio_sync_click = true; } break; + case SYNC_OUT_LINK_AUDIO_8: { if (step_counter % 2 == 0) { gate_on(); audio_sync_click = true; } } break; + case SYNC_OUT_LINK_AUDIO_4: { if (step_counter % 4 == 0) { gate_on(); audio_sync_click = true; } } break; default: break; } step_counter = (step_counter + 1) % 16; @@ -1033,9 +1038,6 @@ sequencer_init(void) { // Initialize sound system. SOUND_STATUS = SOUND_ENABLE; - SOUND_DMG_MASTER = sound_volume(SOUND_SQUARE1 - | SOUND_SQUARE2 - | SOUND_WAVE - | SOUND_NOISE, 3); init_dsound(); + set_audio_settings(); } diff --git a/src/settings.c b/src/settings.c index d9d890d..b814e1a 100644 --- a/src/settings.c +++ b/src/settings.c @@ -13,6 +13,35 @@ draw_settings_cursor(void) { draw_line(x + 3, y + 5, x + 3, y + 5, COL_ACC_0); } +void +set_audio_settings(void) { + switch (settings.sync) { + case SYNC_OUT_LINK_AUDIO_4: + case SYNC_OUT_LINK_AUDIO_8: + case SYNC_OUT_LINK_AUDIO_16: + case SYNC_OUT_AUDIO_4: + case SYNC_OUT_AUDIO_8: + case SYNC_OUT_AUDIO_16: { + SOUND_DMG_MASTER = sound_volume(SOUND_SQUARE1 + | SOUND_SQUARE2 + | SOUND_WAVE + | SOUND_NOISE, 3, 2); + SOUND_DSOUND_MASTER = + SOUND_DMG100 + | SOUND_DSOUND_RATIO_A + | SOUND_DSOUND_LEFT_A + | SOUND_DSOUND_RESET_A; + } break; + default: { + SOUND_DMG_MASTER = sound_volume(SOUND_SQUARE1 + | SOUND_SQUARE2 + | SOUND_WAVE + | SOUND_NOISE, 3, 0); + SOUND_DSOUND_MASTER = SOUND_DMG100; + } break; + } +} + void handle_settings_input(void) { if (key_tap(KEY_DOWN)) { @@ -39,6 +68,7 @@ handle_settings_input(void) { } else { settings.sync++; } + set_audio_settings(); } break; case 1: { if ((settings.theme + 1) >= THEME_NUM) { @@ -67,6 +97,7 @@ handle_settings_input(void) { } else { settings.sync--; } + set_audio_settings(); } break; case 1: { if (settings.theme == 0) { diff --git a/src/settings.h b/src/settings.h index 370c03c..960eabc 100644 --- a/src/settings.h +++ b/src/settings.h @@ -8,6 +8,12 @@ typedef enum SyncSetting { SYNC_OUT_LINK_16, SYNC_OUT_LINK_8, SYNC_OUT_LINK_4, + SYNC_OUT_AUDIO_16, + SYNC_OUT_AUDIO_8, + SYNC_OUT_AUDIO_4, + SYNC_OUT_LINK_AUDIO_16, + SYNC_OUT_LINK_AUDIO_8, + SYNC_OUT_LINK_AUDIO_4, SYNC_NUM, } SyncSetting; @@ -16,6 +22,12 @@ char * sync_setting_str[] = { "LINK OUT (16)", "LINK OUT (8)", "LINK OUT (4)", + "AUDIO OUT (16)", + "AUDIO OUT (8)", + "AUDIO OUT (4)", + "LINK+AUDIO OUT (16)", + "LINK+AUDIO OUT (8)", + "LINK+AUDIO OUT (4)", }; typedef enum ThemeSetting { -- cgit v1.2.1