Mercurial > repos > blastem
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, ¤t_cycle, 882 * mclks_sample); | 206 wait(&y_context, &p_context, ¤t_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; |