summaryrefslogtreecommitdiff
path: root/src/test/c/audio_test.c
blob: f82504c3b1142ed9ee46271e0de906ee5f81c82a (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
// Explicit optional integration checks: real miniaudio thread, silent device.
#define SIMPLE_AUDIO_TEST_NULL
#include "../../main/c/simple_miniaudio.c"
#include <assert.h>

int main(void) {
    assert(api.play(1)==-1 && api.playing()==0);
    assert(api.stop()==0);
    api.close();
    for (int pass=0;pass<2;++pass) {
        assert(api.open()==0 && api.open()==0);
        assert(api.load(NULL,1)==-1);
        int16_t pcm[RATE]={0};
        assert(api.load(pcm,0)==-1 && api.load(pcm,RATE*10+1)==-1);
        int sound=api.load(pcm,RATE);
        assert(sound==4);
        pcm[0]=12345;
        assert(sounds[sound].pcm[0]==0);
        assert(api.play(-1)==-1 && api.play(0)==-1 && api.play(SLOTS)==-1);
        assert(api.play(sound)==0 && api.playing());
        // A one-second sound returns while playback is still in progress.
        assert(api.stop()==0 && !api.playing());
        for (int cue=1;cue<=3;++cue) {
            assert(api.play(cue)==0);
            int elapsed=0;
            while (api.playing() && elapsed<2000) { ma_sleep(10); elapsed+=10; }
            assert(!api.playing());
        }
        for (int i=5;i<SLOTS;++i) assert(api.load(pcm,1)==i);
        assert(api.load(pcm,1)==-1);
        assert(api.play(sound)==0);
        api.close(); // Join during playback, then reopen next pass.
        api.close();
        assert(api.play(sound)==-1 && !api.playing());
    }
    // The loss cue reverses exactly the same three softly enveloped notes.
    assert(tone(1,0)==0 && tone(2,0)==0 && tone(3,1)==0);
    uint32_t note=RATE*16/100;
    for (int n=0;n<3;++n)
        assert(memcmp(sounds[2].pcm+n*note,sounds[3].pcm+(2-n)*note,note*sizeof(int16_t))==0);
    for (int i=1;i<=3;++i) {
        assert(sounds[i].pcm[0]==0);
        for (uint32_t j=0;j<sounds[i].count;++j) assert(abs(sounds[i].pcm[j])<=3200);
        free(sounds[i].pcm); sounds[i].pcm=NULL;
    }
    puts("audio native checks passed");
    return 0;
}