fixed by preloading samples. the audio callback is being called from the
[dos_auplay] / src / audio.c
1 #include <stdio.h>\r
2 #include "audio.h"\r
3 #include "au_sb.h"\r
4 \r
5 struct audrv {\r
6         void *(*get_buffer)(int *size);\r
7         void (*start)(int rate, int bits, int nchan);\r
8         void (*pause)(void);\r
9         void (*cont)(void);\r
10         void (*stop)(void);\r
11         void (*volume)(int vol);\r
12         int (*isplaying)(void);\r
13 };\r
14 \r
15 static struct audrv drv;\r
16 \r
17 static audio_callback_func cbfunc;\r
18 static void *cbcls;\r
19 \r
20 int audio_init(void)\r
21 {\r
22         if(sb_detect()) {\r
23                 drv.get_buffer = sb_buffer;\r
24                 drv.start = sb_start;\r
25                 drv.pause = sb_pause;\r
26                 drv.cont = sb_continue;\r
27                 drv.stop = sb_stop;\r
28                 drv.volume = sb_volume;\r
29                 drv.isplaying = sb_isplaying;\r
30                 return 0;\r
31         }\r
32 \r
33         fprintf(stderr, "No supported audio device detected\n");\r
34         return -1;\r
35 }\r
36 \r
37 void audio_set_callback(audio_callback_func func, void *cls)\r
38 {\r
39         cbfunc = func;\r
40         cbcls = cls;\r
41 }\r
42 \r
43 int audio_callback(void *buf, int sz)\r
44 {\r
45         if(!cbfunc) {\r
46                 return 0;\r
47         }\r
48         return cbfunc(buf, sz, cbcls);\r
49 }\r
50 \r
51 void audio_play(int rate, int bits, int nchan)\r
52 {\r
53         printf("play %d samples/s, %d bits, %s\n", rate, bits, nchan == 1 ? "mono" : "stereo");\r
54         drv.start(rate, bits, nchan);\r
55 }\r
56 \r
57 void audio_pause(void)\r
58 {\r
59         drv.pause();\r
60 }\r
61 \r
62 void audio_resume(void)\r
63 {\r
64         drv.cont();\r
65 }\r
66 \r
67 void audio_stop(void)\r
68 {\r
69         drv.stop();\r
70 }\r
71 \r
72 void audio_volume(int vol)\r
73 {\r
74         drv.volume(vol);\r
75 }\r
76 \r
77 int audio_isplaying(void)\r
78 {\r
79         return drv.isplaying();\r
80 }\r