c88aa3b39bfabd7f80f3ea86a2325abc92804ad7
[dos_auplay] / 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 "aufile.h"\r
7 #include "audio.h"\r
8 \r
9 #define DBG_PRELOAD\r
10 \r
11 static int play_file(const char *fname);\r
12 static int cbfunc(void *buf, int size, void *cls);\r
13 static void print_usage(const char *argv0);\r
14 \r
15 static int vol = 220;\r
16 static int quit;\r
17 \r
18 int main(int argc, char **argv)\r
19 {\r
20         int i;\r
21 \r
22         if(audio_init() == -1) {\r
23                 return 1;\r
24         }\r
25         audio_setvolume(AUDIO_MASTER, 255);\r
26         audio_setvolume(AUDIO_PCM, 255);\r
27 \r
28         for(i=1; i<argc; i++) {\r
29                 if(argv[i][0] == '-') {\r
30                         if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0) {\r
31                                 print_usage(argv[0]);\r
32                                 return 0;\r
33                         } else {\r
34                                 fprintf(stderr, "invalid option: %s\n", argv[i]);\r
35                                 return 1;\r
36                         }\r
37                 } else {\r
38                         play_file(argv[i]);\r
39                         if(quit) break;\r
40                 }\r
41         }\r
42         return 0;\r
43 }\r
44 \r
45 static unsigned char *dbg_samples;\r
46 static int dbg_cur_offs;\r
47 \r
48 static int play_file(const char *fname)\r
49 {\r
50         struct au_file *au;\r
51         int paused = 0, muted = 0;\r
52         unsigned long prev;\r
53 \r
54         if(!(au = au_open(fname))) {\r
55                 return -1;\r
56         }\r
57 \r
58         audio_set_callback(cbfunc, au);\r
59 \r
60 #ifdef DBG_PRELOAD\r
61         if(!(dbg_samples = malloc(au->size))) {\r
62                 perror("failed to preload samples into memory");\r
63                 return -1;\r
64         }\r
65         dbg_cur_offs = 0;\r
66         if(au_read(au, dbg_samples, au->size) < au->size) {\r
67                 perror("failed to preload samples into memory");\r
68                 return -1;\r
69         }\r
70 #endif\r
71 \r
72         audio_play(au->rate, au->bits, au->chan);\r
73         while(audio_isplaying()) {\r
74                 if(kbhit()) {\r
75                         int c = getch();\r
76                         switch(c) {\r
77                         case 27:\r
78                                 audio_stop();\r
79                                 quit = 1;\r
80                                 goto end;\r
81 \r
82                         case ' ':\r
83                                 paused = !paused;\r
84                                 if(paused) {\r
85                                         audio_pause();\r
86                                         printf("pause\n");\r
87                                 } else {\r
88                                         audio_resume();\r
89                                         printf("resume\n");\r
90                                 }\r
91                                 break;\r
92 \r
93                         case '=':\r
94                                 vol += 32;\r
95                                 if(vol > 255) vol = 255;\r
96                                 audio_setvolume(AUDIO_DEFAULT, vol);\r
97                                 printf("volume: %d%%\n", 101 * vol / 256);\r
98                                 break;\r
99 \r
100                         case '-':\r
101                                 vol -= 32;\r
102                                 if(vol < 0) vol = 0;\r
103                                 audio_setvolume(AUDIO_DEFAULT, vol);\r
104                                 printf("volume: %d%%\n", 101 * vol / 256);\r
105                                 break;\r
106 \r
107                         case 'm':\r
108                                 muted = !muted;\r
109                                 if(muted) {\r
110                                         audio_setvolume(AUDIO_DEFAULT, 0);\r
111                                 } else {\r
112                                         audio_setvolume(AUDIO_DEFAULT, vol);\r
113                                 }\r
114                                 break;\r
115 \r
116                         default:\r
117                                 break;\r
118                         }\r
119                 }\r
120 \r
121                 _disable();\r
122                 if(dbg_cur_offs != prev) {\r
123                         prev = dbg_cur_offs;\r
124                         _enable();\r
125 \r
126                         printf("%3d%% - offs: %lu/%lu\n", 100 * prev / au->size, prev, au->size);\r
127                 } else {\r
128                         _enable();\r
129                 }\r
130 \r
131         }\r
132 \r
133 end:\r
134         au_close(au);\r
135 #ifdef DBG_PRELOAD\r
136         free(dbg_samples);\r
137 #endif\r
138         return 0;\r
139 }\r
140 \r
141 #ifdef DBG_PRELOAD\r
142 static int cbfunc(void *buf, int size, void *cls)\r
143 {\r
144         struct au_file *au = cls;\r
145 \r
146         if(dbg_cur_offs + size > au->size) {\r
147                 size = au->size - dbg_cur_offs;\r
148         }\r
149         if(size <= 0) return 0;\r
150 \r
151         memcpy(buf, dbg_samples + dbg_cur_offs, size);\r
152         dbg_cur_offs += size;\r
153         return size;\r
154 }\r
155 #else\r
156 static int cbfunc(void *buf, int size, void *cls)\r
157 {\r
158         int rd;\r
159 \r
160         if((rd = au_read(cls, buf, size)) <= 0) {\r
161                 return 0;\r
162         }\r
163         return rd;\r
164 }\r
165 #endif\r
166 \r
167 static void print_usage(const char *argv0)\r
168 {\r
169         printf("Usage: %s [options] <file1> <file2> ... <filen>\n", argv0);\r
170         printf("options:\n");\r
171         printf(" -h,-help: print usage and exit\n");\r
172 }\r