aboutsummaryrefslogtreecommitdiffstats
path: root/src/dsound.c
blob: 1751e47ff58133569da51c8dd9710b0d80631d89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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;
    }
}