107cd11ec2d460be71a7c871893e45649dd0c6cc
[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, 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_MASTER, 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("pause\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("volume: %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("volume: %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\n", 100 * prev / au->size, prev, au->size);\r
134                 } else {\r
135                         _enable();\r
136                 }\r
137 \r
138         }\r
139 \r
140 end:\r
141         au_close(au);\r
142 #ifdef DBG_PRELOAD\r
143         free(dbg_samples);\r
144 #endif\r
145         return 0;\r
146 }\r
147 \r
148 #ifdef DBG_PRELOAD\r
149 static int cbfunc(void *buf, int size, void *cls)\r
150 {\r
151         struct au_file *au = cls;\r
152 \r
153         if(dbg_cur_offs + size > au->size) {\r
154                 size = au->size - dbg_cur_offs;\r
155         }\r
156         if(size <= 0) return 0;\r
157 \r
158         memcpy(buf, dbg_samples + dbg_cur_offs, size);\r
159         dbg_cur_offs += size;\r
160         return size;\r
161 }\r
162 #else\r
163 static int cbfunc(void *buf, int size, void *cls)\r
164 {\r
165         int rd;\r
166 \r
167         if((rd = au_read(cls, buf, size)) <= 0) {\r
168                 return 0;\r
169         }\r
170         return rd;\r
171 }\r
172 #endif\r
173 \r
174 static void print_usage(const char *argv0)\r
175 {\r
176         printf("Usage: %s [options] <file1> <file2> ... <filen>\n", argv0);\r
177         printf("options:\n");\r
178         printf(" -v,-volume <percent>: set audio volume (1-100)\n");\r
179         printf(" -h,-help: print usage and exit\n");\r
180 }\r