comparison vgmplay.c @ 514:f66c78cbdcaa

Implement per-channel wave logging and primitive looping support in vgm player.
author Michael Pavone <pavone@retrodev.com>
date Fri, 07 Feb 2014 21:18:05 -0800
parents 6800d30437c9
children 16ee0937c676
comparison
equal deleted inserted replaced
513:24ebabd89162 514:f66c78cbdcaa
26 uint32_t sn76489_clk; 26 uint32_t sn76489_clk;
27 uint32_t ym2413_clk; 27 uint32_t ym2413_clk;
28 uint32_t gd3_offset; 28 uint32_t gd3_offset;
29 uint32_t num_samples; 29 uint32_t num_samples;
30 uint32_t loop_offset; 30 uint32_t loop_offset;
31 uint32_t loop_count; 31 uint32_t loop_samples;
32 uint32_t rate; 32 uint32_t rate;
33 uint16_t sn76489_fb; 33 uint16_t sn76489_fb;
34 uint8_t sn76489_shift; 34 uint8_t sn76489_shift;
35 uint8_t sn76489_flags; 35 uint8_t sn76489_flags;
36 uint32_t ym2612_clk; 36 uint32_t ym2612_clk;
142 142
143 uint32_t fps = 60; 143 uint32_t fps = 60;
144 config = load_config(argv[0]); 144 config = load_config(argv[0]);
145 render_init(320, 240, "vgm play", 60, 0, 0); 145 render_init(320, 240, "vgm play", 60, 0, 0);
146 146
147 uint32_t opts = 0;
148 if (argc >= 3 && !strcmp(argv[2], "-y")) {
149 opts |= YM_OPT_WAVE_LOG;
150 }
147 151
148 ym2612_context y_context; 152 ym2612_context y_context;
149 ym_init(&y_context, render_sample_rate(), MCLKS_NTSC, MCLKS_PER_YM, render_audio_buffer(), 0); 153 ym_init(&y_context, render_sample_rate(), MCLKS_NTSC, MCLKS_PER_YM, render_audio_buffer(), opts);
150 154
151 psg_context p_context; 155 psg_context p_context;
152 psg_init(&p_context, render_sample_rate(), MCLKS_NTSC, MCLKS_PER_PSG, render_audio_buffer()); 156 psg_init(&p_context, render_sample_rate(), MCLKS_NTSC, MCLKS_PER_PSG, render_audio_buffer());
153 157
154 FILE * f = fopen(argv[1], "rb"); 158 FILE * f = fopen(argv[1], "rb");
162 uint8_t * data = malloc(data_size); 166 uint8_t * data = malloc(data_size);
163 fread(data, 1, data_size, f); 167 fread(data, 1, data_size, f);
164 fclose(f); 168 fclose(f);
165 169
166 uint32_t mclks_sample = MCLKS_NTSC / 44100; 170 uint32_t mclks_sample = MCLKS_NTSC / 44100;
171 uint32_t loop_count = 2;
167 172
168 uint8_t * end = data + data_size; 173 uint8_t * end = data + data_size;
169 uint8_t * cur = data; 174 uint8_t * cur = data;
170 uint32_t current_cycle = 0; 175 uint32_t current_cycle = 0;
171 while (cur < end) { 176 while (cur < end) {
199 break; 204 break;
200 case CMD_WAIT_50: 205 case CMD_WAIT_50:
201 wait(&y_context, &p_context, &current_cycle, 882 * mclks_sample); 206 wait(&y_context, &p_context, &current_cycle, 882 * mclks_sample);
202 break; 207 break;
203 case CMD_END: 208 case CMD_END:
204 return 0; 209 if (header.loop_offset && --loop_count) {
210 cur = data + header.loop_offset + 0x1C - (header.data_offset + 0x34);
211 } else {
212 //TODO: fade out
213 return 0;
214 }
215 break;
205 case CMD_DATA: { 216 case CMD_DATA: {
206 cur++; //skip compat command 217 cur++; //skip compat command
207 uint8_t data_type = *(cur++); 218 uint8_t data_type = *(cur++);
208 uint32_t data_size = *(cur++); 219 uint32_t data_size = *(cur++);
209 data_size |= *(cur++) << 8; 220 data_size |= *(cur++) << 8;