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 (play_status == 0) { return; } 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; } }