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