initial commit
[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 void 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;\r
31         }\r
32 \r
33         printf("No supported audio device detected\n");\r
34 }\r
35 \r
36 void audio_set_callback(audio_callback_func func, void *cls)\r
37 {\r
38         cbfunc = func;\r
39         cbcls = cls;\r
40 }\r
41 \r
42 int audio_callback(void *buf, int sz)\r
43 {\r
44         if(!cbfunc) {\r
45                 return 0;\r
46         }\r
47         return cbfunc(buf, sz, cbcls);\r
48 }\r
49 \r
50 void audio_play(int rate, int bits, int nchan)\r
51 {\r
52         drv.start(rate, bits, nchan);\r
53 }\r
54 \r
55 void audio_pause(void)\r
56 {\r
57         drv.pause();\r
58 }\r
59 \r
60 void audio_resume(void)\r
61 {\r
62         drv.cont();\r
63 }\r
64 \r
65 void audio_stop(void)\r
66 {\r
67         drv.stop();\r
68 }\r
69 \r
70 void audio_volume(int vol)\r
71 {\r
72         drv.volume(vol);\r
73 }\r
74 \r
75 int audio_isplaying(void)\r
76 {\r
77         return drv.isplaying();\r
78 }\r