From 8aa5155ecfbaaa2e67f82561352a5857bc86d39e Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 6 Aug 2023 11:13:22 +0200 Subject: Add missing .c files and wishlist TODOs --- src/dsound.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/dsound.c (limited to 'src/dsound.c') diff --git a/src/dsound.c b/src/dsound.c new file mode 100644 index 0000000..cba8c86 --- /dev/null +++ b/src/dsound.c @@ -0,0 +1,61 @@ +static bool audio_sync_click = false; +#define AUDIO_FREQ 40137 +#define AUDIO_BUF_LEN 672 +#define AUDIO_TIMER 65118 + +s8 audio_buffer[AUDIO_BUF_LEN * 2]; +static int audio_buf_active = 1; + +void +click_timer(void) { + DMA_TRANSFER[1].ctrl = 0; + TIMER_CTRL_0 = 0; + TIMER_CTRL_1 = 0; +} + +void +play_click(void) { + DMA_TRANSFER[1].ctrl = 0; + audio_buf_active = 1; + TIMER_CTRL_0 = 0; + TIMER_CTRL_1 = 0; + TIMER_DATA_1 = 0xFFFF - 1500; + TIMER_CTRL_1 = TIMER_CTRL_ENABLE | TIMER_CTRL_CASCADE; + irs_set(IRQ_TIMER_1, click_timer); + TIMER_DATA_0 = AUDIO_TIMER; + TIMER_CTRL_0 = TIMER_CTRL_ENABLE; + audio_sync_click = false; +} + +void +init_dsound(void) { + // Initialize audio buffers/channels. + int high = 1; + for (size_t i = 0; i < AUDIO_BUF_LEN * 2; i++) { + audio_buffer[i] = 127 * high; + if (i % AUDIO_BUF_LEN == 0) { + high *= -1; + } + } + + // Enable the sound chip. + SOUND_STATUS = SOUND_ENABLE; +} + + +void +sound_vsync() { + if(audio_buf_active == 1) { + dma_transfer_copy(SOUND_FIFO_A, audio_buffer, 1, 1, + DMA_DST_FIXED + | DMA_CHUNK_32 + | DMA_REFRESH + | DMA_REPEAT + | DMA_ENABLE); + // Start playing and set the backbuffer. + audio_buf_active = 0; + } else { + // Flip front/backbuffer. + audio_buf_active = 1; + } +} -- cgit v1.2.1