4395af6db91028fd42e2f4e31540a7b6df86a15a
[dos_auplay] / src / main.c
1 #include <stdio.h>\r
2 #include <stdlib.h>\r
3 #include <string.h>\r
4 #include "aufile.h"\r
5 #include "audio.h"\r
6 \r
7 #define DBG_PRELOAD\r
8 \r
9 static int play_file(const char *fname);\r
10 static int cbfunc(void *buf, int size, void *cls);\r
11 static void print_usage(const char *argv0);\r
12 \r
13 int main(int argc, char **argv)\r
14 {\r
15         int i;\r
16 \r
17         if(audio_init() == -1) {\r
18                 return 1;\r
19         }\r
20 \r
21         for(i=1; i<argc; i++) {\r
22                 if(argv[i][0] == '-') {\r
23                         if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0) {\r
24                                 print_usage(argv[0]);\r
25                                 return 0;\r
26                         } else {\r
27                                 fprintf(stderr, "invalid option: %s\n", argv[i]);\r
28                                 return 1;\r
29                         }\r
30                 } else {\r
31                         play_file(argv[i]);\r
32                 }\r
33         }\r
34         return 0;\r
35 }\r
36 \r
37 static unsigned char *dbg_samples;\r
38 static int dbg_cur_offs;\r
39 \r
40 static int play_file(const char *fname)\r
41 {\r
42         struct au_file *au;\r
43 \r
44         if(!(au = au_open(fname))) {\r
45                 return -1;\r
46         }\r
47 \r
48         audio_set_callback(cbfunc, au);\r
49 \r
50 #ifdef DBG_PRELOAD\r
51         if(!(dbg_samples = malloc(au->size))) {\r
52                 perror("failed to preload samples into memory");\r
53                 return -1;\r
54         }\r
55         dbg_cur_offs = 0;\r
56         if(au_read(au, dbg_samples, au->size) < au->size) {\r
57                 perror("failed to preload samples into memory");\r
58                 return -1;\r
59         }\r
60 #endif\r
61 \r
62         audio_play(au->rate, au->bits, au->chan);\r
63         while(audio_isplaying());\r
64 \r
65         au_close(au);\r
66 #ifdef DBG_PRELOAD\r
67         free(dbg_samples);\r
68 #endif\r
69         return 0;\r
70 }\r
71 \r
72 #ifdef DBG_PRELOAD\r
73 static int cbfunc(void *buf, int size, void *cls)\r
74 {\r
75         struct au_file *au = cls;\r
76 \r
77         if(dbg_cur_offs + size > au->size) {\r
78                 size = au->size - dbg_cur_offs;\r
79         }\r
80         if(size <= 0) return 0;\r
81 \r
82         memcpy(buf, dbg_samples + dbg_cur_offs, size);\r
83         dbg_cur_offs += size;\r
84         return size;\r
85 }\r
86 #else\r
87 static int cbfunc(void *buf, int size, void *cls)\r
88 {\r
89         int rd;\r
90 \r
91         if((rd = au_read(cls, buf, size)) <= 0) {\r
92                 return 0;\r
93         }\r
94         return rd;\r
95 }\r
96 #endif\r
97 \r
98 static void print_usage(const char *argv0)\r
99 {\r
100         printf("Usage: %s [options] <file1> <file2> ... <filen>\n", argv0);\r
101         printf("options:\n");\r
102         printf(" -h,-help: print usage and exit\n");\r
103 }\r