fixed DMA bug
[dos_sbtest] / src / main.c
1 #include <stdio.h>\r
2 #include <stdlib.h>\r
3 #include <string.h>\r
4 #include <dos.h>\r
5 #include <conio.h>\r
6 #include "audio.h"\r
7 \r
8 static int au_callback(void *buffer, int size, void *cls);\r
9 \r
10 static signed char *snd_click;\r
11 static int snd_click_size;\r
12 \r
13 static int dbg_cbcalled;\r
14 \r
15 int main(int argc, char **argv)\r
16 {\r
17         FILE *fp;\r
18 \r
19         if(!(fp = fopen("click.pcm", "rb"))) {\r
20                 fprintf(stderr, "failed to open click.pcm\n");\r
21                 return 1;\r
22         }\r
23         fseek(fp, 0, SEEK_END);\r
24         snd_click_size = ftell(fp);\r
25         rewind(fp);\r
26         if(!(snd_click = malloc(snd_click_size))) {\r
27                 fprintf(stderr, "failed to allocate sound sample\n");\r
28                 return 1;\r
29         }\r
30         fread(snd_click, 1, snd_click_size, fp);\r
31         fclose(fp);\r
32 \r
33         audio_init();\r
34         audio_set_callback(au_callback, 0);\r
35 \r
36         for(;;) {\r
37                 if(kbhit()) {\r
38                         int c = getch();\r
39                         switch(c) {\r
40                         case 27:\r
41                                 goto end;\r
42                         case ' ':\r
43                                 if(audio_isplaying()) {\r
44                                         audio_stop();\r
45                                 } else {\r
46                                         audio_play(22050, 8, 1);\r
47                                 }\r
48                                 break;\r
49                         default:\r
50                                 break;\r
51                         }\r
52                 }\r
53 \r
54                 _disable();\r
55                 if(dbg_cbcalled) {\r
56                         dbg_cbcalled = 0;\r
57                         _enable();\r
58                         printf("callback called!\n");\r
59                 } else {\r
60                         _enable();\r
61                 }\r
62         }\r
63 \r
64 end:\r
65         audio_stop();\r
66         return 0;\r
67 }\r
68 \r
69 /* snd_click_size is < 65536 so we can just throw it all at once in there */\r
70 static int au_callback(void *buffer, int size, void *cls)\r
71 {\r
72         dbg_cbcalled = 1;\r
73         memcpy(buffer, snd_click, snd_click_size);\r
74         return snd_click_size;\r
75 }\r