#include <stdio.h>\r
+#include <stdlib.h>\r
#include <string.h>\r
+#include <dos.h>\r
+#include <conio.h>\r
#include "aufile.h"\r
#include "audio.h"\r
\r
+#define DBG_PRELOAD\r
+\r
static int play_file(const char *fname);\r
+static int cbfunc(void *buf, int size, void *cls);\r
static void print_usage(const char *argv0);\r
\r
+static int vol = 255;\r
+static int quit;\r
+\r
int main(int argc, char **argv)\r
{\r
- int i;\r
+ int i, vol;\r
\r
- play_file("namarie.wav"); /* TODO remove */\r
+ if(audio_init() == -1) {\r
+ return 1;\r
+ }\r
+ audio_setvolume(AUDIO_MASTER, 255);\r
+ audio_setvolume(AUDIO_PCM, 255);\r
\r
for(i=1; i<argc; i++) {\r
if(argv[i][0] == '-') {\r
- if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0) {\r
+ if(strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "-volume") == 0) {\r
+ if(!argv[++i] || (vol = atoi(argv[i])) <= 0 || vol > 100) {\r
+ fprintf(stderr, "%s must be followed by a number 1-100\n", argv[-1]);\r
+ return 1;\r
+ }\r
+ audio_setvolume(AUDIO_DEFAULT, vol * 255 / 100);\r
+\r
+ } else if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0) {\r
print_usage(argv[0]);\r
return 0;\r
} else {\r
}\r
} else {\r
play_file(argv[i]);\r
+ if(quit) break;\r
}\r
}\r
return 0;\r
}\r
\r
+static unsigned char *dbg_samples;\r
+static int dbg_cur_offs;\r
+\r
static int play_file(const char *fname)\r
{\r
struct au_file *au;\r
+ int paused = 0, muted = 0;\r
+ unsigned long prev;\r
\r
if(!(au = au_open(fname))) {\r
return -1;\r
}\r
\r
+ audio_set_callback(cbfunc, au);\r
+\r
+#ifdef DBG_PRELOAD\r
+ if(!(dbg_samples = malloc(au->size))) {\r
+ perror("failed to preload samples into memory");\r
+ return -1;\r
+ }\r
+ dbg_cur_offs = 0;\r
+ if(au_read(au, dbg_samples, au->size) < au->size) {\r
+ perror("failed to preload samples into memory");\r
+ return -1;\r
+ }\r
+#endif\r
+\r
audio_play(au->rate, au->bits, au->chan);\r
- while(audio_isplaying());\r
+ while(audio_isplaying()) {\r
+ if(kbhit()) {\r
+ int c = getch();\r
+ switch(c) {\r
+ case 27:\r
+ audio_stop();\r
+ quit = 1;\r
+ goto end;\r
+\r
+ case ' ':\r
+ paused = !paused;\r
+ if(paused) {\r
+ audio_pause();\r
+ printf("\npause\n");\r
+ } else {\r
+ audio_resume();\r
+ printf("resume\n");\r
+ }\r
+ break;\r
+\r
+ case '=':\r
+ vol += 32;\r
+ if(vol > 255) vol = 255;\r
+ audio_setvolume(AUDIO_DEFAULT, vol);\r
+ printf("\nvolume: %d%%\n", 101 * vol / 256);\r
+ break;\r
+\r
+ case '-':\r
+ vol -= 32;\r
+ if(vol < 0) vol = 0;\r
+ audio_setvolume(AUDIO_DEFAULT, vol);\r
+ printf("\nvolume: %d%%\n", 101 * vol / 256);\r
+ break;\r
+\r
+ case 'm':\r
+ muted = !muted;\r
+ if(muted) {\r
+ audio_setvolume(AUDIO_DEFAULT, 0);\r
+ } else {\r
+ audio_setvolume(AUDIO_DEFAULT, vol);\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+\r
+ _disable();\r
+ if(dbg_cur_offs != prev) {\r
+ prev = dbg_cur_offs;\r
+ _enable();\r
+\r
+ printf("%3d%% - offs: %lu/%lu \r", 100 * prev / au->size, prev, au->size);\r
+ fflush(stdout);\r
+ } else {\r
+ _enable();\r
+ }\r
\r
+ }\r
+\r
+end:\r
+ putchar('\n');\r
au_close(au);\r
+#ifdef DBG_PRELOAD\r
+ free(dbg_samples);\r
+#endif\r
return 0;\r
}\r
\r
+#ifdef DBG_PRELOAD\r
+static int cbfunc(void *buf, int size, void *cls)\r
+{\r
+ struct au_file *au = cls;\r
+\r
+ if(dbg_cur_offs + size > au->size) {\r
+ size = au->size - dbg_cur_offs;\r
+ }\r
+ if(size <= 0) return 0;\r
+\r
+ memcpy(buf, dbg_samples + dbg_cur_offs, size);\r
+ dbg_cur_offs += size;\r
+ return size;\r
+}\r
+#else\r
+static int cbfunc(void *buf, int size, void *cls)\r
+{\r
+ int rd;\r
+\r
+ if((rd = au_read(cls, buf, size)) <= 0) {\r
+ return 0;\r
+ }\r
+ return rd;\r
+}\r
+#endif\r
+\r
static void print_usage(const char *argv0)\r
{\r
printf("Usage: %s [options] <file1> <file2> ... <filen>\n", argv0);\r
printf("options:\n");\r
+ printf(" -v,-volume <percent>: set audio volume (1-100)\n");\r
printf(" -h,-help: print usage and exit\n");\r
}\r