implemented volume control, and restructured slightly
[dos_auplay] / src / main.c
index 2015a10..c88aa3b 100644 (file)
@@ -1,15 +1,29 @@
 #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 = 220;\r
+static int quit;\r
+\r
 int main(int argc, char **argv)\r
 {\r
        int i;\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
@@ -22,23 +36,134 @@ int main(int argc, char **argv)
                        }\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
-       /* TODO: cont */\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
+               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("pause\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("volume: %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("volume: %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\n", 100 * prev / au->size, prev, au->size);\r
+               } else {\r
+                       _enable();\r
+               }\r
+\r
+       }\r
+\r
+end:\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