diff options
Diffstat (limited to 'src/dsound.c')
-rw-r--r-- | src/dsound.c | 61 |
1 files changed, 61 insertions, 0 deletions
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 @@ | |||
1 | static bool audio_sync_click = false; | ||
2 | #define AUDIO_FREQ 40137 | ||
3 | #define AUDIO_BUF_LEN 672 | ||
4 | #define AUDIO_TIMER 65118 | ||
5 | |||
6 | s8 audio_buffer[AUDIO_BUF_LEN * 2]; | ||
7 | static int audio_buf_active = 1; | ||
8 | |||
9 | void | ||
10 | click_timer(void) { | ||
11 | DMA_TRANSFER[1].ctrl = 0; | ||
12 | TIMER_CTRL_0 = 0; | ||
13 | TIMER_CTRL_1 = 0; | ||
14 | } | ||
15 | |||
16 | void | ||
17 | play_click(void) { | ||
18 | DMA_TRANSFER[1].ctrl = 0; | ||
19 | audio_buf_active = 1; | ||
20 | TIMER_CTRL_0 = 0; | ||
21 | TIMER_CTRL_1 = 0; | ||
22 | TIMER_DATA_1 = 0xFFFF - 1500; | ||
23 | TIMER_CTRL_1 = TIMER_CTRL_ENABLE | TIMER_CTRL_CASCADE; | ||
24 | irs_set(IRQ_TIMER_1, click_timer); | ||
25 | TIMER_DATA_0 = AUDIO_TIMER; | ||
26 | TIMER_CTRL_0 = TIMER_CTRL_ENABLE; | ||
27 | audio_sync_click = false; | ||
28 | } | ||
29 | |||
30 | void | ||
31 | init_dsound(void) { | ||
32 | // Initialize audio buffers/channels. | ||
33 | int high = 1; | ||
34 | for (size_t i = 0; i < AUDIO_BUF_LEN * 2; i++) { | ||
35 | audio_buffer[i] = 127 * high; | ||
36 | if (i % AUDIO_BUF_LEN == 0) { | ||
37 | high *= -1; | ||
38 | } | ||
39 | } | ||
40 | |||
41 | // Enable the sound chip. | ||
42 | SOUND_STATUS = SOUND_ENABLE; | ||
43 | } | ||
44 | |||
45 | |||
46 | void | ||
47 | sound_vsync() { | ||
48 | if(audio_buf_active == 1) { | ||
49 | dma_transfer_copy(SOUND_FIFO_A, audio_buffer, 1, 1, | ||
50 | DMA_DST_FIXED | ||
51 | | DMA_CHUNK_32 | ||
52 | | DMA_REFRESH | ||
53 | | DMA_REPEAT | ||
54 | | DMA_ENABLE); | ||
55 | // Start playing and set the backbuffer. | ||
56 | audio_buf_active = 0; | ||
57 | } else { | ||
58 | // Flip front/backbuffer. | ||
59 | audio_buf_active = 1; | ||
60 | } | ||
61 | } | ||