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