akkera 102
/
apuplay
SPC music playback tools for real snes apu
cmd.cpp@2:62e6e22f8be2, 2017-01-11 (annotated)
- Committer:
- akkera102
- Date:
- Wed Jan 11 16:00:29 2017 +0000
- Revision:
- 2:62e6e22f8be2
second
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
akkera102 | 2:62e6e22f8be2 | 1 | #include "cmd.h" |
akkera102 | 2:62e6e22f8be2 | 2 | #include "mbed.h" |
akkera102 | 2:62e6e22f8be2 | 3 | #include "apu.h" |
akkera102 | 2:62e6e22f8be2 | 4 | #include "apu2.h" |
akkera102 | 2:62e6e22f8be2 | 5 | |
akkera102 | 2:62e6e22f8be2 | 6 | // option |
akkera102 | 2:62e6e22f8be2 | 7 | int g_loop = 0; // Loop |
akkera102 | 2:62e6e22f8be2 | 8 | int g_verbose = 0; // Verbose |
akkera102 | 2:62e6e22f8be2 | 9 | int g_debug = 0; // Debug mode |
akkera102 | 2:62e6e22f8be2 | 10 | |
akkera102 | 2:62e6e22f8be2 | 11 | static int cmd_read_id666(FILE *fp, id666_tag *tag); |
akkera102 | 2:62e6e22f8be2 | 12 | static void cmd_print_time(int seconds); |
akkera102 | 2:62e6e22f8be2 | 13 | |
akkera102 | 2:62e6e22f8be2 | 14 | void cmd(char *filename) |
akkera102 | 2:62e6e22f8be2 | 15 | { |
akkera102 | 2:62e6e22f8be2 | 16 | FILE *fp = fopen(filename, "rb"); |
akkera102 | 2:62e6e22f8be2 | 17 | if(fp == NULL) |
akkera102 | 2:62e6e22f8be2 | 18 | { |
akkera102 | 2:62e6e22f8be2 | 19 | perror("fopen\n"); |
akkera102 | 2:62e6e22f8be2 | 20 | return; |
akkera102 | 2:62e6e22f8be2 | 21 | } |
akkera102 | 2:62e6e22f8be2 | 22 | |
akkera102 | 2:62e6e22f8be2 | 23 | id666_tag tag; |
akkera102 | 2:62e6e22f8be2 | 24 | if(cmd_read_id666(fp, &tag)) |
akkera102 | 2:62e6e22f8be2 | 25 | { |
akkera102 | 2:62e6e22f8be2 | 26 | perror("id666_tag\n"); |
akkera102 | 2:62e6e22f8be2 | 27 | return; |
akkera102 | 2:62e6e22f8be2 | 28 | } |
akkera102 | 2:62e6e22f8be2 | 29 | |
akkera102 | 2:62e6e22f8be2 | 30 | printf("\nNow loading '%s' using 'embedded' algo\n", filename); |
akkera102 | 2:62e6e22f8be2 | 31 | if(LoadAPU_embedded(fp) < 0) |
akkera102 | 2:62e6e22f8be2 | 32 | { |
akkera102 | 2:62e6e22f8be2 | 33 | return; |
akkera102 | 2:62e6e22f8be2 | 34 | } |
akkera102 | 2:62e6e22f8be2 | 35 | |
akkera102 | 2:62e6e22f8be2 | 36 | BOLD(); |
akkera102 | 2:62e6e22f8be2 | 37 | printf("Title: "); |
akkera102 | 2:62e6e22f8be2 | 38 | NORMAL(); |
akkera102 | 2:62e6e22f8be2 | 39 | printf("%s\n", tag.title); |
akkera102 | 2:62e6e22f8be2 | 40 | |
akkera102 | 2:62e6e22f8be2 | 41 | BOLD(); |
akkera102 | 2:62e6e22f8be2 | 42 | printf("Game Title: "); |
akkera102 | 2:62e6e22f8be2 | 43 | NORMAL(); |
akkera102 | 2:62e6e22f8be2 | 44 | printf("%s\n", tag.game_title); |
akkera102 | 2:62e6e22f8be2 | 45 | |
akkera102 | 2:62e6e22f8be2 | 46 | BOLD(); |
akkera102 | 2:62e6e22f8be2 | 47 | printf("Dumper: "); |
akkera102 | 2:62e6e22f8be2 | 48 | NORMAL(); |
akkera102 | 2:62e6e22f8be2 | 49 | printf("%s\n", tag.name_of_dumper); |
akkera102 | 2:62e6e22f8be2 | 50 | |
akkera102 | 2:62e6e22f8be2 | 51 | BOLD(); |
akkera102 | 2:62e6e22f8be2 | 52 | printf("Comments: "); |
akkera102 | 2:62e6e22f8be2 | 53 | NORMAL(); |
akkera102 | 2:62e6e22f8be2 | 54 | printf("%s\n", tag.comments); |
akkera102 | 2:62e6e22f8be2 | 55 | |
akkera102 | 2:62e6e22f8be2 | 56 | BOLD(); |
akkera102 | 2:62e6e22f8be2 | 57 | printf("Seconds: "); |
akkera102 | 2:62e6e22f8be2 | 58 | NORMAL(); |
akkera102 | 2:62e6e22f8be2 | 59 | printf("%s\n", tag.seconds_til_fadeout); |
akkera102 | 2:62e6e22f8be2 | 60 | |
akkera102 | 2:62e6e22f8be2 | 61 | fclose(fp); |
akkera102 | 2:62e6e22f8be2 | 62 | |
akkera102 | 2:62e6e22f8be2 | 63 | |
akkera102 | 2:62e6e22f8be2 | 64 | int num_sec = atoi(tag.seconds_til_fadeout); |
akkera102 | 2:62e6e22f8be2 | 65 | int last_elaps_sec = -1; |
akkera102 | 2:62e6e22f8be2 | 66 | |
akkera102 | 2:62e6e22f8be2 | 67 | if(num_sec < 1 || num_sec > 999) |
akkera102 | 2:62e6e22f8be2 | 68 | { |
akkera102 | 2:62e6e22f8be2 | 69 | num_sec = 150; |
akkera102 | 2:62e6e22f8be2 | 70 | } |
akkera102 | 2:62e6e22f8be2 | 71 | if(strlen(tag.title) == 0) |
akkera102 | 2:62e6e22f8be2 | 72 | { |
akkera102 | 2:62e6e22f8be2 | 73 | strncpy(tag.title, filename, 32); |
akkera102 | 2:62e6e22f8be2 | 74 | } |
akkera102 | 2:62e6e22f8be2 | 75 | |
akkera102 | 2:62e6e22f8be2 | 76 | |
akkera102 | 2:62e6e22f8be2 | 77 | Timer t; |
akkera102 | 2:62e6e22f8be2 | 78 | t.start(); |
akkera102 | 2:62e6e22f8be2 | 79 | |
akkera102 | 2:62e6e22f8be2 | 80 | for(;;) |
akkera102 | 2:62e6e22f8be2 | 81 | { |
akkera102 | 2:62e6e22f8be2 | 82 | int elaps_sec = t.read(); |
akkera102 | 2:62e6e22f8be2 | 83 | |
akkera102 | 2:62e6e22f8be2 | 84 | if((!g_loop) && (elaps_sec > num_sec)) |
akkera102 | 2:62e6e22f8be2 | 85 | { |
akkera102 | 2:62e6e22f8be2 | 86 | break; |
akkera102 | 2:62e6e22f8be2 | 87 | } |
akkera102 | 2:62e6e22f8be2 | 88 | |
akkera102 | 2:62e6e22f8be2 | 89 | if(last_elaps_sec != elaps_sec) |
akkera102 | 2:62e6e22f8be2 | 90 | { |
akkera102 | 2:62e6e22f8be2 | 91 | if(!g_loop) |
akkera102 | 2:62e6e22f8be2 | 92 | { |
akkera102 | 2:62e6e22f8be2 | 93 | BOLD(); |
akkera102 | 2:62e6e22f8be2 | 94 | printf("Time: "); |
akkera102 | 2:62e6e22f8be2 | 95 | |
akkera102 | 2:62e6e22f8be2 | 96 | NORMAL(); |
akkera102 | 2:62e6e22f8be2 | 97 | cmd_print_time(elaps_sec); |
akkera102 | 2:62e6e22f8be2 | 98 | printf(" ["); |
akkera102 | 2:62e6e22f8be2 | 99 | cmd_print_time(num_sec - elaps_sec); |
akkera102 | 2:62e6e22f8be2 | 100 | printf("] of "); |
akkera102 | 2:62e6e22f8be2 | 101 | cmd_print_time(num_sec); |
akkera102 | 2:62e6e22f8be2 | 102 | printf(" \r"); |
akkera102 | 2:62e6e22f8be2 | 103 | } |
akkera102 | 2:62e6e22f8be2 | 104 | else |
akkera102 | 2:62e6e22f8be2 | 105 | { |
akkera102 | 2:62e6e22f8be2 | 106 | BOLD(); |
akkera102 | 2:62e6e22f8be2 | 107 | printf("Time: "); |
akkera102 | 2:62e6e22f8be2 | 108 | |
akkera102 | 2:62e6e22f8be2 | 109 | NORMAL(); |
akkera102 | 2:62e6e22f8be2 | 110 | cmd_print_time(elaps_sec); |
akkera102 | 2:62e6e22f8be2 | 111 | printf(" \r"); |
akkera102 | 2:62e6e22f8be2 | 112 | } |
akkera102 | 2:62e6e22f8be2 | 113 | } |
akkera102 | 2:62e6e22f8be2 | 114 | last_elaps_sec = elaps_sec; |
akkera102 | 2:62e6e22f8be2 | 115 | fflush(stdout); |
akkera102 | 2:62e6e22f8be2 | 116 | |
akkera102 | 2:62e6e22f8be2 | 117 | wait_ms(75); |
akkera102 | 2:62e6e22f8be2 | 118 | } |
akkera102 | 2:62e6e22f8be2 | 119 | |
akkera102 | 2:62e6e22f8be2 | 120 | printf("\nFinished playing.\n"); |
akkera102 | 2:62e6e22f8be2 | 121 | apu_reset(); |
akkera102 | 2:62e6e22f8be2 | 122 | } |
akkera102 | 2:62e6e22f8be2 | 123 | |
akkera102 | 2:62e6e22f8be2 | 124 | static int cmd_read_id666(FILE *fp, id666_tag *tag) |
akkera102 | 2:62e6e22f8be2 | 125 | { |
akkera102 | 2:62e6e22f8be2 | 126 | long orig_pos = ftell(fp); |
akkera102 | 2:62e6e22f8be2 | 127 | unsigned char istag=0; |
akkera102 | 2:62e6e22f8be2 | 128 | |
akkera102 | 2:62e6e22f8be2 | 129 | fseek(fp, 0x23, SEEK_SET); |
akkera102 | 2:62e6e22f8be2 | 130 | fread(&istag, 1, 1, fp); |
akkera102 | 2:62e6e22f8be2 | 131 | |
akkera102 | 2:62e6e22f8be2 | 132 | if(istag != 26) |
akkera102 | 2:62e6e22f8be2 | 133 | { |
akkera102 | 2:62e6e22f8be2 | 134 | printf("No tag\n"); |
akkera102 | 2:62e6e22f8be2 | 135 | strcpy(tag->title, ""); |
akkera102 | 2:62e6e22f8be2 | 136 | strcpy(tag->game_title, ""); |
akkera102 | 2:62e6e22f8be2 | 137 | strcpy(tag->name_of_dumper, ""); |
akkera102 | 2:62e6e22f8be2 | 138 | strcpy(tag->comments, ""); |
akkera102 | 2:62e6e22f8be2 | 139 | strcpy(tag->seconds_til_fadeout, "150"); // 2.5 minutes |
akkera102 | 2:62e6e22f8be2 | 140 | |
akkera102 | 2:62e6e22f8be2 | 141 | return 1; |
akkera102 | 2:62e6e22f8be2 | 142 | } |
akkera102 | 2:62e6e22f8be2 | 143 | |
akkera102 | 2:62e6e22f8be2 | 144 | fseek(fp, 0x2e, SEEK_SET); |
akkera102 | 2:62e6e22f8be2 | 145 | |
akkera102 | 2:62e6e22f8be2 | 146 | fread(&tag->title, 32, 1, fp); |
akkera102 | 2:62e6e22f8be2 | 147 | tag->title[32] = 0; |
akkera102 | 2:62e6e22f8be2 | 148 | |
akkera102 | 2:62e6e22f8be2 | 149 | fread(&tag->game_title, 32, 1, fp); |
akkera102 | 2:62e6e22f8be2 | 150 | tag->game_title[32] = 0; |
akkera102 | 2:62e6e22f8be2 | 151 | |
akkera102 | 2:62e6e22f8be2 | 152 | fread(&tag->name_of_dumper, 16, 1, fp); |
akkera102 | 2:62e6e22f8be2 | 153 | tag->name_of_dumper[16] = 0; |
akkera102 | 2:62e6e22f8be2 | 154 | |
akkera102 | 2:62e6e22f8be2 | 155 | fread(&tag->comments, 32, 1, fp); |
akkera102 | 2:62e6e22f8be2 | 156 | tag->comments[32] = 0; |
akkera102 | 2:62e6e22f8be2 | 157 | |
akkera102 | 2:62e6e22f8be2 | 158 | fseek(fp, 0xa9, SEEK_SET); |
akkera102 | 2:62e6e22f8be2 | 159 | |
akkera102 | 2:62e6e22f8be2 | 160 | fread(&tag->seconds_til_fadeout, 3, 1, fp); |
akkera102 | 2:62e6e22f8be2 | 161 | tag->seconds_til_fadeout[3] = 0; |
akkera102 | 2:62e6e22f8be2 | 162 | |
akkera102 | 2:62e6e22f8be2 | 163 | fseek(fp, orig_pos, SEEK_SET); |
akkera102 | 2:62e6e22f8be2 | 164 | |
akkera102 | 2:62e6e22f8be2 | 165 | return 0; |
akkera102 | 2:62e6e22f8be2 | 166 | } |
akkera102 | 2:62e6e22f8be2 | 167 | |
akkera102 | 2:62e6e22f8be2 | 168 | static void cmd_print_time(int seconds) |
akkera102 | 2:62e6e22f8be2 | 169 | { |
akkera102 | 2:62e6e22f8be2 | 170 | int hour=0, min=0, sec=0; |
akkera102 | 2:62e6e22f8be2 | 171 | |
akkera102 | 2:62e6e22f8be2 | 172 | if(seconds >= 3600) |
akkera102 | 2:62e6e22f8be2 | 173 | { |
akkera102 | 2:62e6e22f8be2 | 174 | hour = seconds / 3600; |
akkera102 | 2:62e6e22f8be2 | 175 | seconds -= hour * 3600;; |
akkera102 | 2:62e6e22f8be2 | 176 | } |
akkera102 | 2:62e6e22f8be2 | 177 | |
akkera102 | 2:62e6e22f8be2 | 178 | if(seconds >= 60) |
akkera102 | 2:62e6e22f8be2 | 179 | { |
akkera102 | 2:62e6e22f8be2 | 180 | min = seconds / 60; |
akkera102 | 2:62e6e22f8be2 | 181 | seconds -= min * 60; |
akkera102 | 2:62e6e22f8be2 | 182 | } |
akkera102 | 2:62e6e22f8be2 | 183 | |
akkera102 | 2:62e6e22f8be2 | 184 | sec = seconds; |
akkera102 | 2:62e6e22f8be2 | 185 | |
akkera102 | 2:62e6e22f8be2 | 186 | printf("%02d:%02d:%02d", hour, min, sec); |
akkera102 | 2:62e6e22f8be2 | 187 | } |
akkera102 | 2:62e6e22f8be2 | 188 | |
akkera102 | 2:62e6e22f8be2 | 189 | void cmd_pspin_update(void) |
akkera102 | 2:62e6e22f8be2 | 190 | { |
akkera102 | 2:62e6e22f8be2 | 191 | static int pspin_step = 0; |
akkera102 | 2:62e6e22f8be2 | 192 | |
akkera102 | 2:62e6e22f8be2 | 193 | switch(pspin_step) |
akkera102 | 2:62e6e22f8be2 | 194 | { |
akkera102 | 2:62e6e22f8be2 | 195 | default: |
akkera102 | 2:62e6e22f8be2 | 196 | case 4: |
akkera102 | 2:62e6e22f8be2 | 197 | pspin_step = 0; |
akkera102 | 2:62e6e22f8be2 | 198 | case 0: |
akkera102 | 2:62e6e22f8be2 | 199 | printf("|\b"); break; |
akkera102 | 2:62e6e22f8be2 | 200 | case 1: |
akkera102 | 2:62e6e22f8be2 | 201 | printf("/\b"); break; |
akkera102 | 2:62e6e22f8be2 | 202 | case 2: |
akkera102 | 2:62e6e22f8be2 | 203 | printf("-\b"); break; |
akkera102 | 2:62e6e22f8be2 | 204 | case 3: |
akkera102 | 2:62e6e22f8be2 | 205 | printf("\\\b"); break; |
akkera102 | 2:62e6e22f8be2 | 206 | } |
akkera102 | 2:62e6e22f8be2 | 207 | pspin_step++; |
akkera102 | 2:62e6e22f8be2 | 208 | |
akkera102 | 2:62e6e22f8be2 | 209 | fflush(stdout); |
akkera102 | 2:62e6e22f8be2 | 210 | } |