Mercurial > repos > blastem
annotate mediaplayer.c @ 2709:55eff4d9101d
Fix hang when running BTTF3 US in PAL mode
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 07 Jul 2025 22:53:49 -0700 |
parents | a64c0e1ed6ac |
children |
rev | line source |
---|---|
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #include <stdlib.h> |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 #include <stddef.h> |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 #include <limits.h> |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 #include <string.h> |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 #include "mediaplayer.h" |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 #include "io.h" |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 #include "ym2612.h" |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 #include "psg.h" |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 #include "rf5c164.h" |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 #include "util.h" |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 #include "render.h" |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 #define ADJUST_BUFFER (12500000) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 #define MAX_NO_ADJUST (UINT_MAX-ADJUST_BUFFER) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 #define MAX_RUN_SAMPLES 128 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 enum { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 AUDIO_VGM, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 AUDIO_WAVE, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 AUDIO_FLAC, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 MEDIA_UNKNOWN |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 }; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
24 #define STREAM_FLAG_REVERSE 0x01 |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
25 #define STREAM_FLAG_LOOP 0x10 |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
26 #define STREAM_FLAG_PLAY 0x80 |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
27 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 uint32_t cycles_to_samples(uint32_t clock_rate, uint32_t cycles) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 return ((uint64_t)cycles) * ((uint64_t)44100) / ((uint64_t)clock_rate); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 uint32_t samples_to_cycles(uint32_t clock_rate, uint32_t cycles) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 return ((uint64_t)cycles) * ((uint64_t)clock_rate) / ((uint64_t)44100); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 void ym_adjust(chip_info *chip) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 ym2612_context *ym = chip->context; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 if (ym->current_cycle >= MAX_NO_ADJUST) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 uint32_t deduction = ym->current_cycle - ADJUST_BUFFER; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 chip->samples -= cycles_to_samples(chip->clock, deduction); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 ym->current_cycle -= deduction; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
48 void ym_adjust_clock(chip_info *chip, uint32_t percent) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
49 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
50 ym_adjust_master_clock(chip->context, chip->clock * percent / 100); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
51 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
52 |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
53 void ym_scope(chip_info *chip, oscilloscope *scope) |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
54 { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
55 ym_enable_scope(chip->context, scope, chip->clock); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
56 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
57 |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
58 void ym_no_scope(void *context) |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
59 { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
60 ym2612_context *ym = context; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
61 ym->scope = NULL; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
62 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
63 |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
64 void ym_stream(chip_info *chip, uint8_t port, uint8_t command, uint16_t sample) |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
65 { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
66 ym2612_context *ym = chip->context; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
67 if (port) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
68 ym_address_write_part2(ym, command); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
69 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
70 ym_address_write_part1(ym, command); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
71 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
72 ym_data_write(ym, sample); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
73 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
74 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 void psg_adjust(chip_info *chip) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 psg_context *psg = chip->context; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 if (psg->cycles >= MAX_NO_ADJUST) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 uint32_t deduction = psg->cycles - ADJUST_BUFFER; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 chip->samples -= cycles_to_samples(chip->clock, deduction); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 psg->cycles -= deduction; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
85 void psg_adjust_clock(chip_info *chip, uint32_t percent) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
86 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
87 psg_adjust_master_clock(chip->context, chip->clock * percent / 100); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
88 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
89 |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
90 void psg_scope(chip_info *chip, oscilloscope *scope) |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
91 { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
92 psg_enable_scope(chip->context, scope, chip->clock); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
93 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
94 |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
95 void psg_no_scope(void *context) |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
96 { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
97 psg_context *psg = context; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
98 psg->scope = NULL; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
99 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
100 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 void pcm_adjust(chip_info *chip) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 rf5c164 *pcm = chip->context; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 if (pcm->cycle >= MAX_NO_ADJUST) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 uint32_t deduction = pcm->cycle - ADJUST_BUFFER; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
106 chip->samples -= cycles_to_samples(chip->clock, deduction); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
107 pcm->cycle -= deduction; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
108 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
109 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
110 |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
111 void pcm_adjust_clock(chip_info *chip, uint32_t percent) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
112 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
113 rf5c164_adjust_master_clock(chip->context, chip->clock * percent / 100); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
114 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
115 |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
116 void pcm_scope(chip_info *chip, oscilloscope *scope) |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
117 { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
118 rf5c164_enable_scope(chip->context, scope); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
119 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
120 |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
121 void pcm_no_scope(void *context) |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
122 { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
123 rf5c164 *pcm = context; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
124 pcm->scope = NULL; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
125 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
126 |
2377
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
127 void pcm_free(void *context) |
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
128 { |
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
129 rf5c164 *pcm = context; |
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
130 rf5c164_deinit(pcm); |
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
131 free(pcm); |
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
132 } |
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
133 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 uint8_t *find_block(data_block *head, uint32_t offset, uint32_t size) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
135 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
136 if (!head) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
137 return NULL; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
138 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
139 while (head->size < offset) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
140 offset -= head->size; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
141 head = head->next; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
142 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
143 if (head->size - offset < size) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
144 return NULL; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
145 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
146 return head->data + offset; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
147 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
148 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
149 void vgm_wait(media_player *player, uint32_t samples) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
150 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
151 chip_info *chips = player->chips; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
152 uint32_t num_chips = player->num_chips; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
153 while (samples > MAX_RUN_SAMPLES) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
154 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
155 vgm_wait(player, MAX_RUN_SAMPLES); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
156 samples -= MAX_RUN_SAMPLES; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
157 } |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
158 uint8_t keep_going; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
159 do { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
160 keep_going = 0; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
161 for (uint32_t i = 0; i < 0xFF; i++) |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
162 { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
163 if (!player->streams[i] || !(player->streams[i]->flags & STREAM_FLAG_PLAY)) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
164 continue; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
165 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
166 vgm_stream *stream = player->streams[i]; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
167 uint32_t cycle = samples_to_cycles(stream->chip->clock, stream->chip->samples + samples); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
168 if (cycle >= stream->next_sample_cycle) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
169 stream->chip->run(stream->chip->context, stream->next_sample_cycle); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
170 if (stream->block_offset >= stream->cur_block->size) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
171 stream->cur_block = stream->cur_block->next; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
172 if (!stream->cur_block) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
173 //TODO: looping support |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
174 player->streams[i]->flags &= ~STREAM_FLAG_PLAY; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
175 continue; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
176 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
177 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
178 //TODO: support for chips where the stream data unit is not a byte |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
179 uint16_t sample = stream->cur_block->data[stream->block_offset]; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
180 stream->block_offset += stream->step; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
181 if (stream->chip->stream) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
182 stream->chip->stream(stream->chip, stream->port, stream->command, sample); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
183 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
184 stream->next_sample_cycle += stream->cycles_per_sample; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
185 //TODO: deal with cycle adjustments |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
186 keep_going = 1; |
2491
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
187 if (stream->length_mode == 1) { |
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
188 //unclear how this is supposed to work |
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
189 } else { |
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
190 stream->remaining--; |
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
191 if (!stream->remaining) { |
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
192 //TODO: looping support |
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
193 player->streams[i]->flags &= ~STREAM_FLAG_PLAY; |
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
194 } |
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
195 } |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
196 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
197 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
198 } while (keep_going); |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
199 for (uint32_t i = 0; i < num_chips; i++) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
200 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
201 chips[i].samples += samples; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
202 chips[i].run(chips[i].context, samples_to_cycles(chips[i].clock, chips[i].samples)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
203 chips[i].adjust(chips + i); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
204 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
205 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
206 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
207 void vgm_stop(media_player *player) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
208 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
209 player->state = STATE_PAUSED; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
210 player->playback_time = 0; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
211 player->current_offset = player->vgm->data_offset + offsetof(vgm_header, data_offset); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
212 player->loop_count = 2; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
213 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
214 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
215 chip_info *find_chip(media_player *player, uint8_t cmd) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
216 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
217 for (uint32_t i = 0; i < player->num_chips; i++) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
218 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
219 if (player->chips[i].cmd == cmd) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
220 return player->chips + i; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
221 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
222 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
223 return NULL; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
224 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
225 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
226 void *find_chip_context(media_player *player, uint8_t cmd) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
227 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
228 chip_info *chip = find_chip(player, cmd); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
229 return chip ? chip->context : NULL; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
230 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
231 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
232 chip_info *find_chip_by_data(media_player *player, uint8_t data_type) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
233 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
234 for (uint32_t i = 0; i < player->num_chips; i++) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
235 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
236 if (player->chips[i].data_type == data_type) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
237 return &player->chips[i]; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
238 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
239 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
240 return NULL; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
241 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
242 |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
243 chip_info *find_chip_by_stream(media_player *player, uint8_t stream_type) |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
244 { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
245 for (uint32_t i = 0; i < player->num_chips; i++) |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
246 { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
247 if (player->chips[i].stream_type == stream_type) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
248 return &player->chips[i]; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
249 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
250 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
251 return NULL; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
252 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
253 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
254 static uint8_t read_byte(media_player *player) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
255 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
256 uint8_t *buffer = player->media->buffer; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
257 return buffer[player->current_offset++]; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
258 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
259 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
260 static uint16_t read_word_le(media_player *player) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
261 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
262 uint8_t *buffer = player->media->buffer; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
263 uint16_t value = buffer[player->current_offset++]; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
264 value |= buffer[player->current_offset++] << 8; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
265 return value; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
266 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
267 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
268 static uint32_t read_24_le(media_player *player) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
269 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
270 uint8_t *buffer = player->media->buffer; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
271 uint32_t value = buffer[player->current_offset++]; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
272 value |= buffer[player->current_offset++] << 8; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
273 value |= buffer[player->current_offset++] << 16; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
274 return value; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
275 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
276 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
277 static uint32_t read_long_le(media_player *player) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
278 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
279 uint8_t *buffer = player->media->buffer; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
280 uint32_t value = buffer[player->current_offset++]; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
281 value |= buffer[player->current_offset++] << 8; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
282 value |= buffer[player->current_offset++] << 16; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
283 value |= buffer[player->current_offset++] << 24; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
284 return value; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
285 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
286 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
287 void vgm_frame(media_player *player) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
288 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
289 for (uint32_t remaining_samples = 44100 / 60; remaining_samples > 0;) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
290 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
291 if (player->wait_samples) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
292 uint32_t to_wait = player->wait_samples; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
293 if (to_wait > remaining_samples) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
294 to_wait = remaining_samples; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
295 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
296 vgm_wait(player, to_wait); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
297 player->wait_samples -= to_wait; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
298 remaining_samples -= to_wait; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
299 if (player->wait_samples) { |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
300 goto frame_end; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
301 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
302 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
303 if (player->current_offset >= player->media->size) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
304 vgm_stop(player); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
305 goto frame_end; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
306 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
307 uint8_t cmd = read_byte(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
308 psg_context *psg; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
309 ym2612_context *ym; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
310 rf5c164 *pcm; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
311 switch (cmd) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
312 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
313 case CMD_PSG_STEREO: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
314 psg = find_chip_context(player, CMD_PSG); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
315 if (!psg || player->current_offset > player->media->size - 1) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
316 vgm_stop(player); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
317 goto frame_end; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
318 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
319 psg->pan = read_byte(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
320 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
321 case CMD_PSG: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
322 psg = find_chip_context(player, CMD_PSG); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
323 if (!psg || player->current_offset > player->media->size - 1) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
324 vgm_stop(player); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
325 goto frame_end; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
326 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
327 psg_write(psg, read_byte(player)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
328 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
329 case CMD_YM2612_0: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
330 ym = find_chip_context(player, CMD_YM2612_0); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
331 if (!ym || player->current_offset > player->media->size - 2) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
332 vgm_stop(player); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
333 goto frame_end; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
334 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
335 ym_address_write_part1(ym, read_byte(player)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
336 ym_data_write(ym, read_byte(player)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
337 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
338 case CMD_YM2612_1: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
339 ym = find_chip_context(player, CMD_YM2612_0); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
340 if (!ym || player->current_offset > player->media->size - 2) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
341 vgm_stop(player); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
342 goto frame_end; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
343 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
344 ym_address_write_part2(ym, read_byte(player)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
345 ym_data_write(ym, read_byte(player)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
346 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
347 case CMD_WAIT: { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
348 if (player->current_offset > player->media->size - 2) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
349 vgm_stop(player); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
350 goto frame_end; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
351 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
352 player->wait_samples += read_word_le(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
353 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
354 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
355 case CMD_WAIT_60: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
356 player->wait_samples += 735; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
357 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
358 case CMD_WAIT_50: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
359 player->wait_samples += 882; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
360 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
361 case CMD_END: |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
362 if (player->vgm->loop_offset && --player->loop_count) { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
363 player->current_offset = player->vgm->loop_offset + offsetof(vgm_header, loop_offset); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
364 if (player->current_offset < player->vgm->data_offset + offsetof(vgm_header, data_offset)) { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
365 // invalid loop offset |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
366 vgm_stop(player); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
367 goto frame_end; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
368 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
369 } else { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
370 //TODO: fade out? |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
371 vgm_stop(player); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
372 goto frame_end; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
373 } |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
374 return; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
375 case CMD_PCM_WRITE: { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
376 if (player->current_offset > player->media->size - 11) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
377 vgm_stop(player); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
378 goto frame_end; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
379 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
380 player->current_offset++; //skip compatibility command |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
381 uint8_t data_type = read_byte(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
382 uint32_t read_offset = read_24_le(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
383 uint32_t write_offset = read_24_le(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
384 uint16_t size = read_24_le(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
385 chip_info *chip = find_chip_by_data(player, data_type); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
386 if (!chip || !chip->blocks) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
387 warning("Failed to find data block list for type %d\n", data_type); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
388 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
389 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
390 uint8_t *src = find_block(chip->blocks, read_offset, size); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
391 if (!src) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
392 warning("Failed to find data offset %X with size %X for chip type %d\n", read_offset, size, data_type); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
393 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
394 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
395 switch (data_type) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
396 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
397 case DATA_RF5C68: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
398 case DATA_RF5C164: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
399 pcm = chip->context; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
400 write_offset |= pcm->ram_bank; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
401 write_offset &= 0xFFFF; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
402 if (size + write_offset > 0x10000) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
403 size = 0x10000 - write_offset; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
404 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
405 memcpy(pcm->ram + write_offset, src, size); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
406 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
407 default: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
408 warning("Unknown PCM write read_offset %X, write_offset %X, size %X\n", read_offset, write_offset, size); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
409 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
410 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
411 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
412 case CMD_PCM68_REG: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
413 pcm = find_chip_context(player, CMD_PCM68_REG); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
414 if (!pcm || player->current_offset > player->media->size - 2) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
415 vgm_stop(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
416 return; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
417 } else { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
418 uint8_t reg = read_byte(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
419 uint8_t value = read_byte(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
420 rf5c164_write(pcm, reg, value); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
421 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
422 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
423 case CMD_PCM164_REG: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
424 pcm = find_chip_context(player, CMD_PCM164_REG); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
425 if (!pcm || player->current_offset > player->media->size - 2) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
426 vgm_stop(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
427 return; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
428 } else { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
429 uint8_t reg = read_byte(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
430 uint8_t value = read_byte(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
431 rf5c164_write(pcm, reg, value); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
432 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
433 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
434 case CMD_PCM68_RAM: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
435 pcm = find_chip_context(player, CMD_PCM68_REG); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
436 if (!pcm || player->current_offset > player->media->size - 3) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
437 vgm_stop(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
438 return; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
439 } else { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
440 uint16_t address = read_word_le(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
441 address &= 0xFFF; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
442 address |= 0x1000; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
443 rf5c164_write(pcm, address, read_byte(player)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
444 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
445 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
446 case CMD_PCM164_RAM: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
447 pcm = find_chip_context(player, CMD_PCM164_REG); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
448 if (!pcm || player->current_offset > player->media->size - 3) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
449 vgm_stop(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
450 return; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
451 } else { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
452 uint16_t address = read_word_le(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
453 address &= 0xFFF; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
454 address |= 0x1000; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
455 rf5c164_write(pcm, address, read_byte(player)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
456 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
457 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
458 case CMD_DATA: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
459 if (player->current_offset > player->media->size - 6) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
460 vgm_stop(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
461 return; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
462 } else { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
463 player->current_offset++; //skip compat command |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
464 uint8_t data_type = read_byte(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
465 uint32_t data_size = read_long_le(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
466 if (data_size > player->media->size || player->current_offset > player->media->size - data_size) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
467 vgm_stop(player); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
468 goto frame_end; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
469 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
470 chip_info *chip = find_chip_by_data(player, data_type); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
471 if (chip) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
472 data_block **cur = &(chip->blocks); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
473 while (*cur) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
474 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
475 cur = &((*cur)->next); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
476 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
477 *cur = calloc(1, sizeof(data_block)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
478 (*cur)->size = data_size; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
479 (*cur)->type = data_type; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
480 (*cur)->data = ((uint8_t *)player->media->buffer) + player->current_offset; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
481 } else { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
482 fprintf(stderr, "Skipping data block with unrecognized type %X\n", data_type); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
483 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
484 player->current_offset += data_size; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
485 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
486 break; |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
487 case CMD_DAC_STREAM_SETUP: |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
488 if (player->current_offset > player->media->size - 4) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
489 vgm_stop(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
490 goto frame_end; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
491 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
492 uint8_t stream_id = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
493 if (!player->streams[stream_id]) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
494 player->streams[stream_id] = calloc(1, sizeof(vgm_stream)); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
495 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
496 vgm_stream *stream = player->streams[stream_id]; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
497 uint8_t chip_type = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
498 stream->chip = find_chip_by_stream(player, chip_type); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
499 if (!stream->chip) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
500 fprintf(stderr, "Failed to find chip with stream type %d for stream %d\n", chip_type, stream_id); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
501 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
502 stream->port = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
503 stream->command = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
504 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
505 break; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
506 case CMD_DAC_STREAM_DATA: |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
507 if (player->current_offset > player->media->size - 4) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
508 vgm_stop(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
509 goto frame_end; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
510 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
511 uint8_t stream_id = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
512 if (!player->streams[stream_id]) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
513 player->streams[stream_id] = calloc(1, sizeof(vgm_stream)); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
514 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
515 vgm_stream *stream = player->streams[stream_id]; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
516 stream->data_type = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
517 stream->step = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
518 stream->start_offset = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
519 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
520 break; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
521 case CMD_DAC_STREAM_FREQ: |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
522 if (player->current_offset > player->media->size - 4) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
523 vgm_stop(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
524 goto frame_end; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
525 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
526 uint8_t stream_id = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
527 if (!player->streams[stream_id]) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
528 player->streams[stream_id] = calloc(1, sizeof(vgm_stream)); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
529 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
530 vgm_stream *stream = player->streams[stream_id]; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
531 stream->sample_rate = read_long_le(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
532 if (stream->chip) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
533 stream->cycles_per_sample = stream->chip->clock / stream->sample_rate; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
534 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
535 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
536 break; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
537 case CMD_DAC_STREAM_START: |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
538 if (player->current_offset > player->media->size - 10) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
539 vgm_stop(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
540 goto frame_end; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
541 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
542 uint8_t stream_id = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
543 if (!player->streams[stream_id]) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
544 player->streams[stream_id] = calloc(1, sizeof(vgm_stream)); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
545 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
546 vgm_stream *stream = player->streams[stream_id]; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
547 uint32_t data_start_offset = read_long_le(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
548 uint8_t length_mode = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
549 uint32_t length = read_long_le(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
550 stream->flags = length_mode & STREAM_FLAG_REVERSE; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
551 if (length_mode & 0x80) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
552 stream->flags |= STREAM_FLAG_LOOP; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
553 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
554 length_mode &= 0x3; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
555 if (length_mode) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
556 stream->length_mode = length_mode; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
557 if (length_mode == 2) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
558 //length is in msec |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
559 if (stream->chip) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
560 stream->remaining = (((uint64_t)length) * (uint64_t)stream->sample_rate) / 1000; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
561 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
562 } else if (length_mode == 3) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
563 //play until end of data |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
564 stream->remaining = 0xFFFFFFFF; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
565 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
566 //length is in commands? |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
567 stream->remaining = length; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
568 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
569 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
570 if (stream->chip && data_start_offset != 0xFFFFFFFF) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
571 data_block * cur_block = stream->chip->blocks; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
572 data_start_offset += stream->start_offset; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
573 while (cur_block) |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
574 { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
575 if (cur_block->type == stream->data_type) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
576 if (data_start_offset >= cur_block->size) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
577 data_start_offset -= cur_block->size; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
578 cur_block = cur_block->next; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
579 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
580 stream->block_offset = data_start_offset; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
581 stream->cur_block = cur_block; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
582 break; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
583 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
584 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
585 cur_block = cur_block->next; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
586 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
587 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
588 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
589 if (stream->chip && stream->cur_block) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
590 stream->flags |= STREAM_FLAG_PLAY; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
591 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
592 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
593 break; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
594 case CMD_DAC_STREAM_STOP: |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
595 if (player->current_offset < player->media->size) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
596 vgm_stop(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
597 goto frame_end; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
598 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
599 uint8_t stream_id = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
600 if (stream_id == 0xFF) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
601 for (uint32_t i = 0; i < 0xFF; i++) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
602 if (player->streams[i]) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
603 player->streams[i]->flags &= ~STREAM_FLAG_PLAY; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
604 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
605 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
606 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
607 if (!player->streams[stream_id]) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
608 player->streams[stream_id] = calloc(1, sizeof(vgm_stream)); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
609 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
610 player->streams[stream_id]->flags &= ~STREAM_FLAG_PLAY; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
611 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
612 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
613 break; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
614 case CMD_DAC_STREAM_STARTFAST: |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
615 if (player->current_offset > player->media->size - 4) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
616 vgm_stop(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
617 goto frame_end; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
618 } else { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
619 uint8_t stream_id = read_byte(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
620 if (!player->streams[stream_id]) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
621 player->streams[stream_id] = calloc(1, sizeof(vgm_stream)); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
622 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
623 vgm_stream *stream = player->streams[stream_id]; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
624 uint16_t block_id = read_word_le(player); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
625 stream->flags = read_byte(player) & (STREAM_FLAG_LOOP|STREAM_FLAG_REVERSE); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
626 if (stream->chip) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
627 uint16_t cur_block_id = 0; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
628 data_block *cur_block = stream->chip->blocks; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
629 while (cur_block) |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
630 { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
631 if (cur_block_id == block_id) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
632 stream->cur_block = cur_block; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
633 stream->block_offset = stream->start_offset; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
634 break; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
635 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
636 if (cur_block->type == stream->data_type) { |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
637 cur_block_id++; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
638 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
639 cur_block = cur_block->next; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
640 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
641 if (stream->cur_block) { |
2491
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
642 stream->remaining = 0xFFFFFFFF; |
6c834c281fa2
Some VGM player changes I forgot to commit
Michael Pavone <pavone@retrodev.com>
parents:
2482
diff
changeset
|
643 stream->length_mode = 3; |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
644 stream->flags |= STREAM_FLAG_PLAY; |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
645 stream->next_sample_cycle = samples_to_cycles(stream->chip->clock, stream->chip->samples); |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
646 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
647 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
648 } |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
649 break; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
650 case CMD_DATA_SEEK: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
651 if (player->current_offset > player->media->size - 4) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
652 vgm_stop(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
653 return; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
654 } else { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
655 uint32_t new_offset = read_long_le(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
656 if (!player->ym_seek_block || new_offset < player->ym_seek_offset) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
657 chip_info *chip = find_chip(player, CMD_YM2612_0); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
658 if (!chip) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
659 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
660 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
661 player->ym_seek_block = chip->blocks; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
662 player->ym_seek_offset = 0; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
663 player->ym_block_offset = 0; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
664 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
665 while (player->ym_seek_block && (player->ym_seek_offset - player->ym_block_offset + player->ym_seek_block->size) < new_offset) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
666 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
667 player->ym_seek_offset += player->ym_seek_block->size - player->ym_block_offset; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
668 player->ym_seek_block = player->ym_seek_block->next; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
669 player->ym_block_offset = 0; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
670 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
671 player->ym_block_offset += new_offset - player->ym_seek_offset; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
672 player->ym_seek_offset = new_offset; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
673 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
674 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
675 default: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
676 if (cmd >= CMD_WAIT_SHORT && cmd < (CMD_WAIT_SHORT + 0x10)) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
677 uint32_t wait_time = (cmd & 0xF) + 1; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
678 player->wait_samples += wait_time; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
679 } else if (cmd >= CMD_YM2612_DAC && cmd < CMD_DAC_STREAM_SETUP) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
680 if (player->ym_seek_block) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
681 ym = find_chip_context(player, CMD_YM2612_0); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
682 ym_address_write_part1(ym, 0x2A); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
683 ym_data_write(ym, player->ym_seek_block->data[player->ym_block_offset++]); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
684 player->ym_seek_offset++; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
685 if (player->ym_block_offset > player->ym_seek_block->size) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
686 player->ym_seek_block = player->ym_seek_block->next; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
687 player->ym_block_offset = 0; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
688 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
689 } else { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
690 fputs("Encountered DAC write command but data seek pointer is invalid!\n", stderr); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
691 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
692 player->wait_samples += cmd & 0xF; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
693 } else { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
694 warning("unimplemented command: %X at offset %X\n", cmd, player->current_offset); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
695 vgm_stop(player); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
696 goto frame_end; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
697 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
698 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
699 } |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
700 frame_end: |
2457 | 701 #ifndef IS_LIB |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
702 if (player->scope) { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
703 scope_render(player->scope); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
704 } |
2457 | 705 #endif |
706 return; | |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
707 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
708 |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
709 static void wave_stop(media_player *player) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
710 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
711 player->current_offset = player->wave->format_header.size + offsetof(wave_header, audio_format); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
712 player->state = STATE_PAUSED; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
713 player->playback_time = 0; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
714 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
715 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
716 void wave_frame(media_player *player) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
717 { |
2290
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
718 for (uint32_t remaining_samples = player->wave->sample_rate / 60; remaining_samples > 0; remaining_samples--) |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
719 { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
720 uint32_t sample_size = player->wave->bits_per_sample * player->wave->num_channels / 8; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
721 if (sample_size > player->media->size || player->current_offset > player->media->size - sample_size) { |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
722 wave_stop(player); |
2290
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
723 return; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
724 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
725 if (player->wave->bits_per_sample == 16) { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
726 int16_t value = read_word_le(player); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
727 if (player->wave->num_channels == 1) { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
728 render_put_mono_sample(player->audio, value); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
729 } else { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
730 int16_t right = read_word_le(player); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
731 render_put_stereo_sample(player->audio, value, right); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
732 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
733 } else { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
734 uint8_t sample = read_byte(player); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
735 int16_t value = sample * 257 - 128 * 257; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
736 if (player->wave->num_channels == 1) { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
737 render_put_mono_sample(player->audio, value); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
738 } else { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
739 sample = read_byte(player); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
740 int16_t right = sample * 257 - 128 * 257; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
741 render_put_stereo_sample(player->audio, value, right); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
742 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
743 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
744 |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
745 } |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
746 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
747 |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
748 static void flac_stop(media_player *player) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
749 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
750 player->state = STATE_PAUSED; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
751 player->playback_time = 0; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
752 flac_seek(player->flac, 0); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
753 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
754 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
755 void flac_frame(media_player *player) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
756 { |
2296
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
757 for (uint32_t remaining_samples = player->flac->sample_rate / 60; remaining_samples > 0; remaining_samples--) |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
758 { |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
759 int16_t samples[2]; |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
760 if (flac_get_sample(player->flac, samples, 2)) { |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
761 render_put_stereo_sample(player->audio, samples[0], samples[1]); |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
762 } else { |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
763 flac_stop(player); |
2296
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
764 return; |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
765 } |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
766 } |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
767 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
768 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
769 void vgm_init(media_player *player, uint32_t opts) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
770 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
771 player->vgm = calloc(1, sizeof(vgm_header)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
772 player->vgm_ext = NULL; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
773 memcpy(player->vgm, player->media->buffer, sizeof(vgm_header)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
774 if (player->vgm->version < 0x150 || !player->vgm->data_offset) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
775 player->vgm->data_offset = 0xC; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
776 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
777 if (player->vgm->data_offset + offsetof(vgm_header, data_offset) > player->media->size) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
778 player->vgm->data_offset = player->media->size - offsetof(vgm_header, data_offset); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
779 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
780 if (player->vgm->version <= 0x101 && player->vgm->ym2413_clk > 4000000) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
781 player->vgm->ym2612_clk = player->vgm->ym2413_clk; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
782 player->vgm->ym2413_clk = 0; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
783 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
784 if (player->vgm->data_offset > 0xC) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
785 player->vgm_ext = calloc(1, sizeof(vgm_extended_header)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
786 size_t additional_header = player->vgm->data_offset + offsetof(vgm_header, data_offset) - sizeof(vgm_header); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
787 if (additional_header > sizeof(vgm_extended_header)) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
788 additional_header = sizeof(vgm_extended_header); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
789 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
790 memcpy(player->vgm_ext, ((uint8_t *)player->media->buffer) + sizeof(vgm_header), additional_header); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
791 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
792 player->num_chips = 0; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
793 if (player->vgm->sn76489_clk) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
794 player->num_chips++; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
795 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
796 if (player->vgm->ym2612_clk) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
797 player->num_chips++; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
798 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
799 if (player->vgm_ext && player->vgm_ext->rf5c68_clk) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
800 player->num_chips++; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
801 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
802 if (player->vgm_ext && player->vgm_ext->rf5c164_clk) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
803 player->num_chips++; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
804 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
805 player->chips = calloc(player->num_chips, sizeof(chip_info)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
806 uint32_t chip = 0; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
807 if (player->vgm->ym2612_clk) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
808 ym2612_context *ym = calloc(1, sizeof(ym2612_context)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
809 ym_init(ym, player->vgm->ym2612_clk, 1, opts); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
810 player->chips[chip++] = (chip_info) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
811 .context = ym, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
812 .run = (chip_run_fun)ym_run, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
813 .adjust = ym_adjust, |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
814 .adjust_clock = ym_adjust_clock, |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
815 .scope = ym_scope, |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
816 .no_scope = ym_no_scope, |
2377
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
817 .free = (chip_noarg_fun)ym_free, |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
818 .stream = ym_stream, |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
819 .clock = player->vgm->ym2612_clk, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
820 .samples = 0, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
821 .cmd = CMD_YM2612_0, |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
822 .data_type = DATA_YM2612_PCM, |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
823 .stream_type = STREAM_CHIP_YM2612 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
824 }; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
825 } |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
826 if (player->vgm->sn76489_clk) { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
827 psg_context *psg = calloc(1, sizeof(psg_context)); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
828 psg_init(psg, player->vgm->sn76489_clk, 16); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
829 player->chips[chip++] = (chip_info) { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
830 .context = psg, |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
831 .run = (chip_run_fun)psg_run, |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
832 .adjust = psg_adjust, |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
833 .adjust_clock = psg_adjust_clock, |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
834 .scope = psg_scope, |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
835 .no_scope = ym_no_scope, |
2377
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
836 .free = (chip_noarg_fun)psg_free, |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
837 .clock = player->vgm->sn76489_clk, |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
838 .samples = 0, |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
839 .cmd = CMD_PSG, |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
840 .data_type = 0xFF, |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
841 .stream_type = STREAM_CHIP_PSG |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
842 }; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
843 } |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
844 if (player->vgm_ext && player->vgm_ext->rf5c68_clk) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
845 rf5c164 *pcm = calloc(1, sizeof(rf5c164)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
846 rf5c164_init(pcm, player->vgm_ext->rf5c68_clk, 1); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
847 player->chips[chip++] = (chip_info) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
848 .context = pcm, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
849 .run = (chip_run_fun)rf5c164_run, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
850 .adjust = pcm_adjust, |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
851 .adjust_clock = pcm_adjust_clock, |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
852 .scope = pcm_scope, |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
853 .no_scope = pcm_no_scope, |
2377
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
854 .free = pcm_free, |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
855 .clock = player->vgm_ext->rf5c68_clk, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
856 .samples = 0, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
857 .cmd = CMD_PCM68_REG, |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
858 .data_type = DATA_RF5C68, |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
859 .stream_type = STREAM_CHIP_RF5C68 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
860 }; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
861 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
862 if (player->vgm_ext && player->vgm_ext->rf5c164_clk) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
863 rf5c164 *pcm = calloc(1, sizeof(rf5c164)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
864 rf5c164_init(pcm, player->vgm_ext->rf5c164_clk, 1); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
865 player->chips[chip++] = (chip_info) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
866 .context = pcm, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
867 .run = (chip_run_fun)rf5c164_run, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
868 .adjust = pcm_adjust, |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
869 .adjust_clock = pcm_adjust_clock, |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
870 .scope = pcm_scope, |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
871 .no_scope = pcm_no_scope, |
2377
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
872 .free = pcm_free, |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
873 .clock = player->vgm_ext->rf5c164_clk, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
874 .samples = 0, |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
875 .cmd = CMD_PCM164_REG, |
2482
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
876 .data_type = DATA_RF5C164, |
fb8f49b0aece
Impelement partial support for DAC stream commands in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2457
diff
changeset
|
877 .stream_type = STREAM_CHIP_RF5C164 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
878 }; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
879 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
880 player->current_offset = player->vgm->data_offset + offsetof(vgm_header, data_offset); |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
881 player->loop_count = 2; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
882 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
883 |
2290
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
884 static void wave_player_init(media_player *player) |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
885 { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
886 player->wave = calloc(1, sizeof(wave_header)); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
887 memcpy(player->wave, player->media->buffer, offsetof(wave_header, data_header)); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
888 if (memcmp(player->wave->chunk.format, "WAVE", 4)) { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
889 goto format_error; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
890 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
891 if (player->wave->chunk.size < offsetof(wave_header, data_header)) { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
892 goto format_error; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
893 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
894 if (memcmp(player->wave->format_header.id, "fmt ", 4)) { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
895 goto format_error; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
896 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
897 if (player->wave->format_header.size < offsetof(wave_header, data_header) - offsetof(wave_header, audio_format)) { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
898 goto format_error; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
899 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
900 if (player->wave->bits_per_sample != 8 && player->wave->bits_per_sample != 16) { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
901 goto format_error; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
902 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
903 uint32_t data_sub_chunk = player->wave->format_header.size + offsetof(wave_header, audio_format); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
904 if (data_sub_chunk > player->media->size || player->media->size - data_sub_chunk < sizeof(riff_sub_chunk)) { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
905 goto format_error; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
906 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
907 memcpy(&player->wave->data_header, ((uint8_t *)player->media->buffer) + data_sub_chunk, sizeof(riff_sub_chunk)); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
908 player->current_offset = data_sub_chunk; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
909 player->audio = render_audio_source("Audio File", player->wave->sample_rate, 1, player->wave->num_channels); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
910 return; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
911 format_error: |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
912 player->media_type = MEDIA_UNKNOWN; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
913 free(player->wave); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
914 } |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
915 |
2296
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
916 static void flac_player_init(media_player *player) |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
917 { |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
918 player->flac = flac_file_from_buffer(player->media->buffer, player->media->size); |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
919 if (player->flac) { |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
920 player->audio = render_audio_source("Audio File", player->flac->sample_rate, 1, 2); |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
921 } |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
922 } |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
923 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
924 static void resume_player(system_header *system) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
925 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
926 media_player *player = (media_player *)system; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
927 player->should_return = 0; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
928 while (!player->header.should_exit && !player->should_return) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
929 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
930 switch (player->state) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
931 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
932 case STATE_PLAY: |
2376
1c09f5be285b
Very basic UI for media player
Michael Pavone <pavone@retrodev.com>
parents:
2375
diff
changeset
|
933 player->playback_time++; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
934 switch(player->media_type) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
935 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
936 case AUDIO_VGM: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
937 vgm_frame(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
938 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
939 case AUDIO_WAVE: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
940 wave_frame(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
941 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
942 case AUDIO_FLAC: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
943 flac_frame(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
944 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
945 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
946 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
947 case STATE_PAUSED: |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2296
diff
changeset
|
948 #ifndef IS_LIB |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
949 render_sleep_ms(15); |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2296
diff
changeset
|
950 #endif |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
951 break; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
952 } |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2296
diff
changeset
|
953 //TODO: Fix this for libretro build properly |
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2296
diff
changeset
|
954 #ifndef IS_LIB |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
955 render_update_display(); |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2296
diff
changeset
|
956 #endif |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
957 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
958 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
959 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
960 static void gamepad_down(system_header *system, uint8_t pad, uint8_t button) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
961 { |
2375
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
962 if (pad != 1) { |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
963 return; |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
964 } |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
965 media_player *player = (media_player *)system; |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
966 if (player->button_state[button]) { |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
967 //already pressed |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
968 return; |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
969 } |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
970 player->button_state[button] = 1; |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
971 if (button == BUTTON_A || button == BUTTON_C || button == BUTTON_START) { |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
972 if (player->state == STATE_PAUSED) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
973 player->state = STATE_PLAY; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
974 puts("Now playing"); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
975 } else { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
976 player->state = STATE_PAUSED; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
977 puts("Now paused"); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
978 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
979 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
980 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
981 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
982 static void gamepad_up(system_header *system, uint8_t pad, uint8_t button) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
983 { |
2375
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
984 if (pad != 1) { |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
985 return; |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
986 } |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
987 media_player *player = (media_player *)system; |
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
988 player->button_state[button] = 0; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
989 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
990 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
991 static void start_player(system_header *system, char *statefile) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
992 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
993 resume_player(system); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
994 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
995 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
996 static void free_player(system_header *system) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
997 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
998 media_player *player = (media_player *)system; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
999 for (uint32_t i = 0; i < player->num_chips; i++) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1000 { |
2377
30e59954eab9
Properly free sound chips in VGM player
Michael Pavone <pavone@retrodev.com>
parents:
2376
diff
changeset
|
1001 player->chips[i].free(player->chips[i].context); |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1002 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1003 free(player->chips); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1004 free(player->vgm); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1005 free(player); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1006 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1007 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1008 uint8_t detect_media_type(system_media *media) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1009 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1010 if (media->size < 4) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1011 return MEDIA_UNKNOWN; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1012 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1013 if (!memcmp(media->buffer, "Vgm ", 4)) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1014 if (media->size < sizeof(vgm_header)) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1015 return MEDIA_UNKNOWN; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1016 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1017 return AUDIO_VGM; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1018 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1019 if (!memcmp(media->buffer, "RIFF", 4)) { |
2290
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
1020 if (media->size < sizeof(wave_header)) { |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
1021 return MEDIA_UNKNOWN; |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
1022 } |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1023 return AUDIO_WAVE; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1024 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1025 if (!memcmp(media->buffer, "fLaC", 4)) { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1026 return AUDIO_FLAC; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1027 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1028 return MEDIA_UNKNOWN; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1029 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1030 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1031 static void request_exit(system_header *system) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1032 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1033 media_player *player = (media_player *)system; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1034 player->should_return = 1; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1035 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1036 |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1037 static void toggle_debug_view(system_header *system, uint8_t debug_view) |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1038 { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1039 #ifndef IS_LIB |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1040 media_player *player = (media_player *)system; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1041 if (debug_view == DEBUG_OSCILLOSCOPE && player->chips) { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1042 if (player->scope) { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1043 for (uint32_t i = 0; i < player->num_chips; i++) |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1044 { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1045 player->chips[i].no_scope(player->chips[i].context); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1046 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1047 scope_close(player->scope); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1048 player->scope = NULL; |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1049 } else { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1050 player->scope = create_oscilloscope(); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1051 for (uint32_t i = 0; i < player->num_chips; i++) |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1052 { |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1053 player->chips[i].scope(player->chips + i, player->scope); |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1054 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1055 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1056 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1057 #endif |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1058 } |
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1059 |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1060 static void inc_debug_mode(system_header * system) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1061 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1062 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1063 |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1064 static void soft_reset(system_header * system) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1065 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1066 media_player *player = (media_player *)system; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1067 switch(player->media_type) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1068 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1069 case AUDIO_VGM: |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1070 vgm_stop(player); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1071 break; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1072 case AUDIO_WAVE: |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1073 wave_stop(player); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1074 break; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1075 case AUDIO_FLAC: |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1076 flac_stop(player); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1077 break; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1078 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1079 player->state = STATE_PLAY; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1080 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1081 |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1082 static void set_speed_percent(system_header * system, uint32_t percent) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1083 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1084 media_player *player = (media_player *)system; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1085 switch(player->media_type) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1086 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1087 case AUDIO_VGM: |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1088 for (uint32_t i = 0; i < player->num_chips; i++) |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1089 { |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1090 player->chips[i].adjust_clock(player->chips + i, percent); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1091 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1092 break; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1093 case AUDIO_WAVE: |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1094 render_audio_adjust_clock(player->audio, player->wave->sample_rate * percent / 100, 1); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1095 break; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1096 case AUDIO_FLAC: |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1097 render_audio_adjust_clock(player->audio, player->wave->sample_rate * percent / 100, 1); |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1098 break; |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1099 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1100 } |
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1101 |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1102 media_player *alloc_media_player(system_media *media, uint32_t opts) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1103 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1104 media_player *player = calloc(1, sizeof(media_player)); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1105 player->header.start_context = start_player; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1106 player->header.resume_context = resume_player; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1107 player->header.request_exit = request_exit; |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1108 player->header.soft_reset = soft_reset; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1109 player->header.free_context = free_player; |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1110 player->header.set_speed_percent = set_speed_percent; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1111 player->header.gamepad_down = gamepad_down; |
2375
02c04196c2da
Fix mediaplayer play/pause handling
Michael Pavone <pavone@retrodev.com>
parents:
2374
diff
changeset
|
1112 player->header.gamepad_up = gamepad_up; |
2374
97f164d1f0f6
Re-enable VGM looping. Enable oscilloscope in VGM player. Fix VGM player PSG output
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1113 player->header.toggle_debug_view = toggle_debug_view; |
2707
a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
Michael Pavone <pavone@retrodev.com>
parents:
2491
diff
changeset
|
1114 player->header.inc_debug_mode = inc_debug_mode; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1115 player->header.type = SYSTEM_MEDIA_PLAYER; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1116 player->header.info.name = strdup(media->name); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1117 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1118 player->media = media; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1119 player->media_type = detect_media_type(media); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1120 player->state = STATE_PLAY; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1121 switch (player->media_type) |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1122 { |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1123 case AUDIO_VGM: |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1124 vgm_init(player, opts); |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1125 break; |
2290
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
1126 case AUDIO_WAVE: |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
1127 wave_player_init(player); |
c4980d89614b
Support WAVE files in media player
Michael Pavone <pavone@retrodev.com>
parents:
2289
diff
changeset
|
1128 break; |
2296
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
1129 case AUDIO_FLAC: |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
1130 flac_player_init(player); |
789802d99629
Add basic FLAC decoder and add FLAC playback support to the media player
Michael Pavone <pavone@retrodev.com>
parents:
2290
diff
changeset
|
1131 break; |
2289
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1132 } |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1133 |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1134 return player; |
92449b47cce8
Integrate VGM player into main blastem binary
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1135 } |