summaryrefslogtreecommitdiff
path: root/apps/codecs/libgme/kss_emu.h
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libgme/kss_emu.h')
-rw-r--r--apps/codecs/libgme/kss_emu.h69
1 files changed, 32 insertions, 37 deletions
diff --git a/apps/codecs/libgme/kss_emu.h b/apps/codecs/libgme/kss_emu.h
index 43df964fcc..382e4b807b 100644
--- a/apps/codecs/libgme/kss_emu.h
+++ b/apps/codecs/libgme/kss_emu.h
@@ -16,8 +16,8 @@
16#include "ay_apu.h" 16#include "ay_apu.h"
17#include "opl_apu.h" 17#include "opl_apu.h"
18#include "m3u_playlist.h" 18#include "m3u_playlist.h"
19#include "track_filter.h"
19 20
20typedef short sample_t;
21typedef int kss_time_t; 21typedef int kss_time_t;
22typedef int kss_addr_t; 22typedef int kss_addr_t;
23typedef struct Z80_Cpu Kss_Cpu; 23typedef struct Z80_Cpu Kss_Cpu;
@@ -35,7 +35,6 @@ enum {
35enum { idle_addr = 0xFFFF }; 35enum { idle_addr = 0xFFFF };
36enum { scc_enabled_true = 0xC000 }; 36enum { scc_enabled_true = 0xC000 };
37enum { mem_size = 0x10000 }; 37enum { mem_size = 0x10000 };
38enum { buf_size = 2048 };
39 38
40// KSS file header 39// KSS file header
41enum { header_size = 0x20 }; 40enum { header_size = 0x20 };
@@ -53,7 +52,7 @@ struct header_t
53 byte bank_mode; 52 byte bank_mode;
54 byte extra_header; 53 byte extra_header;
55 byte device_flags; 54 byte device_flags;
56 55
57 // KSSX extended data, if extra_header==0x10 56 // KSSX extended data, if extra_header==0x10
58 byte data_size [4]; 57 byte data_size [4];
59 byte unused [4]; 58 byte unused [4];
@@ -69,7 +68,7 @@ struct sms_t {
69 struct Sms_Apu psg; 68 struct Sms_Apu psg;
70 struct Opl_Apu fm; 69 struct Opl_Apu fm;
71}; 70};
72 71
73struct msx_t { 72struct msx_t {
74 struct Ay_Apu psg; 73 struct Ay_Apu psg;
75 struct Scc_Apu scc; 74 struct Scc_Apu scc;
@@ -84,8 +83,6 @@ struct Kss_Emu {
84 bool scc_accessed; 83 bool scc_accessed;
85 bool gain_updated; 84 bool gain_updated;
86 85
87 int track_count;
88
89 unsigned scc_enabled; // 0 or 0xC000 86 unsigned scc_enabled; // 0 or 0xC000
90 int bank_count; 87 int bank_count;
91 88
@@ -94,48 +91,34 @@ struct Kss_Emu {
94 int ay_latch; 91 int ay_latch;
95 92
96 // general 93 // general
97 int max_initial_silence;
98 int voice_count; 94 int voice_count;
95 int const* voice_types;
99 int mute_mask_; 96 int mute_mask_;
100 int tempo; 97 int tempo;
101 int gain; 98 int gain;
102 99
103 long sample_rate; 100 int sample_rate;
104 101
105 // track-specific 102 // track-specific
103 int track_count;
106 int current_track; 104 int current_track;
107 blargg_long out_time; // number of samples played since start of track
108 blargg_long emu_time; // number of samples emulator has generated since start of track
109 bool emu_track_ended_; // emulator has reached end of track
110 volatile bool track_ended;
111
112 // fading
113 blargg_long fade_start;
114 int fade_step;
115
116 // silence detection
117 int silence_lookahead; // speed to run emulator when looking ahead for silence
118 bool ignore_silence;
119 long silence_time; // number of samples where most recent silence began
120 long silence_count; // number of samples of silence to play before using buf
121 long buf_remain; // number of samples left in silence buffer
122 105
123 struct Stereo_Buffer stereo_buffer; // NULL if using custom buffer 106 int clock_rate_;
124 long clock_rate_;
125 unsigned buf_changed_count; 107 unsigned buf_changed_count;
126 108
127 // M3u Playlist 109 // M3u Playlist
128 struct M3u_Playlist m3u; 110 struct M3u_Playlist m3u;
129 111
130 // large items 112 struct setup_t tfilter;
131 sample_t buf [buf_size]; 113 struct Track_Filter track_filter;
132 114
133 struct sms_t sms; 115 struct sms_t sms;
134 struct msx_t msx; 116 struct msx_t msx;
135 117
136 Kss_Cpu cpu; 118 Kss_Cpu cpu;
119 struct Multi_Buffer stereo_buf; // NULL if using custom buffer
137 struct Rom_Data rom; 120 struct Rom_Data rom;
138 121
139 byte unmapped_read [0x100]; 122 byte unmapped_read [0x100];
140 byte unmapped_write [page_size]; 123 byte unmapped_write [page_size];
141 byte ram [mem_size + cpu_padding]; 124 byte ram [mem_size + cpu_padding];
@@ -148,34 +131,46 @@ blargg_err_t Kss_load_mem( struct Kss_Emu* this, const void* data, long size );
148blargg_err_t end_frame( struct Kss_Emu* this, kss_time_t ); 131blargg_err_t end_frame( struct Kss_Emu* this, kss_time_t );
149 132
150// Set output sample rate. Must be called only once before loading file. 133// Set output sample rate. Must be called only once before loading file.
151blargg_err_t Kss_set_sample_rate( struct Kss_Emu* this, long sample_rate ); 134blargg_err_t Kss_set_sample_rate( struct Kss_Emu* this, int sample_rate );
152 135
153// Start a track, where 0 is the first track. Also clears warning string. 136// Start a track, where 0 is the first track. Also clears warning string.
154blargg_err_t Kss_start_track( struct Kss_Emu* this, int track ); 137blargg_err_t Kss_start_track( struct Kss_Emu* this, int track );
155 138
156// Generate 'count' samples info 'buf'. Output is in stereo. Any emulation 139// Generate 'count' samples info 'buf'. Output is in stereo. Any emulation
157// errors set warning string, and major errors also end track. 140// errors set warning string, and major errors also end track.
158blargg_err_t Kss_play( struct Kss_Emu* this, long count, sample_t* buf ); 141blargg_err_t Kss_play( struct Kss_Emu* this, int count, sample_t* buf );
159 142
160// Track status/control 143// Track status/control
161 144
162// Number of milliseconds (1000 msec = 1 second) played since beginning of track 145// Number of milliseconds (1000 msec = 1 second) played since beginning of track
163long Track_tell( struct Kss_Emu* this ); 146int Track_tell( struct Kss_Emu* this );
164 147
165// Seek to new time in track. Seeking backwards or far forward can take a while. 148// Seek to new time in track. Seeking backwards or far forward can take a while.
166blargg_err_t Track_seek( struct Kss_Emu* this, long msec ); 149blargg_err_t Track_seek( struct Kss_Emu* this, int msec );
167 150
168// Skip n samples 151// Skip n samples
169blargg_err_t Track_skip( struct Kss_Emu* this, long n ); 152blargg_err_t Track_skip( struct Kss_Emu* this, int n );
170 153
171// Set start time and length of track fade out. Once fade ends track_ended() returns 154// Set start time and length of track fade out. Once fade ends track_ended() returns
172// true. Fade time can be changed while track is playing. 155// true. Fade time can be changed while track is playing.
173void Track_set_fade( struct Kss_Emu* this, long start_msec, long length_msec ); 156void Track_set_fade( struct Kss_Emu* this, int start_msec, int length_msec );
157
158// True if a track has reached its end
159static inline bool Track_ended( struct Kss_Emu* this )
160{
161 return track_ended( &this->track_filter );
162}
163
164// Disables automatic end-of-track detection and skipping of silence at beginning
165static inline void Track_ignore_silence( struct Kss_Emu* this, bool disable )
166{
167 this->track_filter.silence_ignored_ = disable;
168}
174 169
175// Get track length in milliseconds 170// Get track length in milliseconds
176static inline long Track_get_length( struct Kss_Emu* this, int n ) 171static inline int Track_get_length( struct Kss_Emu* this, int n )
177{ 172{
178 long length = 0; 173 int length = 0;
179 174
180 if ( (this->m3u.size > 0) && (n < this->m3u.size) ) { 175 if ( (this->m3u.size > 0) && (n < this->m3u.size) ) {
181 struct entry_t* entry = &this->m3u.entries [n]; 176 struct entry_t* entry = &this->m3u.entries [n];