diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2020-08-08 21:56:15 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2020-08-11 03:29:12 +0000 |
commit | b4e70422a3455e327433a7471c929ef100ef3b10 (patch) | |
tree | e96c5431a1b22af1fcbc628322b79fb8c3162427 /apps/plugins/mikmod/mikmod_internals.h | |
parent | 8c7780bafc9eabac6b92cfe5a5a00831c3d5fd9d (diff) | |
download | rockbox-b4e70422a3455e327433a7471c929ef100ef3b10.tar.gz rockbox-b4e70422a3455e327433a7471c929ef100ef3b10.zip |
mikmod: Upgrade mikmod core from v3.2.0 to v3.3.11
* Get rid of the non-functional GT2 loader
* Add the UMX loader
* Add HQ mixer routines (and make it configurable)
* Allow samplerate to be configured at run/playtime
* Support >64KHz mixing/playback
* Correctly restore non-boost status
(The diff to upstream is much smaller now too!)
Change-Id: Iaa4ac901ba9cd4123bb225656976e78271353a72
Diffstat (limited to 'apps/plugins/mikmod/mikmod_internals.h')
-rw-r--r-- | apps/plugins/mikmod/mikmod_internals.h | 789 |
1 files changed, 425 insertions, 364 deletions
diff --git a/apps/plugins/mikmod/mikmod_internals.h b/apps/plugins/mikmod/mikmod_internals.h index 78d7b52045..e6ba1875c0 100644 --- a/apps/plugins/mikmod/mikmod_internals.h +++ b/apps/plugins/mikmod/mikmod_internals.h | |||
@@ -20,11 +20,9 @@ | |||
20 | 20 | ||
21 | /*============================================================================== | 21 | /*============================================================================== |
22 | 22 | ||
23 | $Id: mikmod_internals.h,v 1.7 2010/01/12 03:30:31 realtech Exp $ | ||
24 | |||
25 | MikMod sound library internal definitions | 23 | MikMod sound library internal definitions |
26 | 24 | ||
27 | ==============================================================================*/ | 25 | ==============================================================================*/ |
28 | 26 | ||
29 | #ifndef _MIKMOD_INTERNALS_H | 27 | #ifndef _MIKMOD_INTERNALS_H |
30 | #define _MIKMOD_INTERNALS_H | 28 | #define _MIKMOD_INTERNALS_H |
@@ -34,32 +32,52 @@ extern "C" { | |||
34 | #endif | 32 | #endif |
35 | 33 | ||
36 | #include <stdarg.h> | 34 | #include <stdarg.h> |
37 | #if 0 | 35 | |
38 | #if defined(__OS2__)||defined(__EMX__)||defined(WIN32) | 36 | #if defined(_MSC_VER) && !defined(__cplusplus) && !defined(HAVE_CONFIG_H) |
39 | #define strcasecmp(s,t) stricmp(s,t) | 37 | #define inline __inline |
40 | #endif | ||
41 | #endif | 38 | #endif |
42 | 39 | ||
43 | #include "mikmod.h" | 40 | #include "mikmod.h" |
44 | 41 | ||
42 | #ifndef MIKMOD_UNIX | ||
43 | #if (defined(unix) || defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) && \ | ||
44 | !(defined(_MIKMOD_WIN32) || defined(_MIKMOD_OS2) || defined(_MIKMOD_DOS) || defined(_MIKMOD_AMIGA) || defined(macintosh)) | ||
45 | #define MIKMOD_UNIX 1 | ||
46 | #else | ||
47 | #define MIKMOD_UNIX 0 | ||
48 | #endif | ||
49 | #endif /* MIKMOD_UNIX */ | ||
50 | |||
45 | /*========== More type definitions */ | 51 | /*========== More type definitions */ |
46 | 52 | ||
47 | /* SLONGLONG: 64bit, signed */ | 53 | /* SLONGLONG: 64bit, signed */ |
48 | #if defined (__arch64__) || defined(__alpha) || defined (__x64_64) || defined (_LP64) || defined (__powerpc64__) | 54 | #if !defined(_WIN32) && \ |
49 | typedef long SLONGLONG; | 55 | (defined(_LP64) || defined(__LP64__) || defined(__arch64__) || defined(__alpha) || defined(__x64_64) || defined(__powerpc64__)) |
56 | typedef long SLONGLONG; | ||
57 | #define NATIVE_64BIT_INT | ||
58 | #elif defined(_WIN64) /* win64 is LLP64, not LP64 */ | ||
50 | #define NATIVE_64BIT_INT | 59 | #define NATIVE_64BIT_INT |
51 | #if 0 | 60 | typedef long long SLONGLONG; |
52 | #elif defined(__WATCOMC__) | 61 | #elif defined(__WATCOMC__) |
53 | typedef __int64 SLONGLONG; | 62 | typedef __int64 SLONGLONG; |
54 | #elif defined(WIN32) && !defined(__MWERKS__) | 63 | #elif defined(_WIN32) && !defined(__MWERKS__) |
55 | typedef LONGLONG SLONGLONG; | 64 | typedef LONGLONG SLONGLONG; |
56 | #elif macintosh && !TYPE_LONGLONG | 65 | #elif defined(macintosh) && !TYPE_LONGLONG |
57 | #include <Types.h> | 66 | #include <Types.h> |
58 | typedef SInt64 SLONGLONG; | 67 | typedef SInt64 SLONGLONG; |
68 | #else | ||
69 | typedef long long SLONGLONG; | ||
59 | #endif | 70 | #endif |
71 | typedef int __s64_typetest [(sizeof(SLONGLONG)==8) * 2 - 1]; | ||
72 | |||
73 | /* pointer-sized signed int (ssize_t/intptr_t) : */ | ||
74 | #if defined(_WIN64) /* win64 is LLP64, not LP64 */ | ||
75 | typedef long long SINTPTR_T; | ||
60 | #else | 76 | #else |
61 | typedef long long SLONGLONG; | 77 | /* long should be pointer-sized for all others : */ |
78 | typedef long SINTPTR_T; | ||
62 | #endif | 79 | #endif |
80 | typedef int __iptr_typetest [(sizeof(SINTPTR_T)==sizeof(void*)) * 2 - 1]; | ||
63 | 81 | ||
64 | /*========== Error handling */ | 82 | /*========== Error handling */ |
65 | 83 | ||
@@ -72,33 +90,36 @@ extern MikMod_handler_t _mm_errorhandler; | |||
72 | #ifdef HAVE_PTHREAD | 90 | #ifdef HAVE_PTHREAD |
73 | #include <pthread.h> | 91 | #include <pthread.h> |
74 | #define DECLARE_MUTEX(name) \ | 92 | #define DECLARE_MUTEX(name) \ |
75 | extern pthread_mutex_t _mm_mutex_##name | 93 | extern pthread_mutex_t _mm_mutex_##name |
76 | #define MUTEX_LOCK(name) \ | 94 | #define MUTEX_LOCK(name) \ |
77 | pthread_mutex_lock(&_mm_mutex_##name) | 95 | pthread_mutex_lock(&_mm_mutex_##name) |
78 | #define MUTEX_UNLOCK(name) \ | 96 | #define MUTEX_UNLOCK(name) \ |
79 | pthread_mutex_unlock(&_mm_mutex_##name) | 97 | pthread_mutex_unlock(&_mm_mutex_##name) |
98 | |||
80 | #elif defined(__OS2__)||defined(__EMX__) | 99 | #elif defined(__OS2__)||defined(__EMX__) |
81 | #define DECLARE_MUTEX(name) \ | 100 | #define DECLARE_MUTEX(name) \ |
82 | extern HMTX _mm_mutex_##name | 101 | extern HMTX _mm_mutex_##name |
83 | #define MUTEX_LOCK(name) \ | 102 | #define MUTEX_LOCK(name) \ |
84 | if(_mm_mutex_##name) \ | 103 | if(_mm_mutex_##name)\ |
85 | DosRequestMutexSem(_mm_mutex_##name,SEM_INDEFINITE_WAIT) | 104 | DosRequestMutexSem(_mm_mutex_##name,SEM_INDEFINITE_WAIT) |
86 | #define MUTEX_UNLOCK(name) \ | 105 | #define MUTEX_UNLOCK(name) \ |
87 | if(_mm_mutex_##name) \ | 106 | if(_mm_mutex_##name)\ |
88 | DosReleaseMutexSem(_mm_mutex_##name) | 107 | DosReleaseMutexSem(_mm_mutex_##name) |
89 | #elif defined(WIN32) | 108 | |
109 | #elif defined(_WIN32) | ||
90 | #include <windows.h> | 110 | #include <windows.h> |
91 | #define DECLARE_MUTEX(name) \ | 111 | #define DECLARE_MUTEX(name) \ |
92 | extern HANDLE _mm_mutex_##name | 112 | extern HANDLE _mm_mutex_##name |
93 | #define MUTEX_LOCK(name) \ | 113 | #define MUTEX_LOCK(name) \ |
94 | if(_mm_mutex_##name) \ | 114 | if(_mm_mutex_##name)\ |
95 | WaitForSingleObject(_mm_mutex_##name,INFINITE) | 115 | WaitForSingleObject(_mm_mutex_##name,INFINITE) |
96 | #define MUTEX_UNLOCK(name) \ | 116 | #define MUTEX_UNLOCK(name) \ |
97 | if(_mm_mutex_##name) \ | 117 | if(_mm_mutex_##name)\ |
98 | ReleaseMutex(_mm_mutex_##name) | 118 | ReleaseMutex(_mm_mutex_##name) |
119 | |||
99 | #else | 120 | #else |
100 | #define DECLARE_MUTEX(name) \ | 121 | #define DECLARE_MUTEX(name) \ |
101 | extern void *_mm_mutex_##name | 122 | extern void *_mm_mutex_##name |
102 | #define MUTEX_LOCK(name) | 123 | #define MUTEX_LOCK(name) |
103 | #define MUTEX_UNLOCK(name) | 124 | #define MUTEX_UNLOCK(name) |
104 | #endif | 125 | #endif |
@@ -106,9 +127,13 @@ extern MikMod_handler_t _mm_errorhandler; | |||
106 | DECLARE_MUTEX(lists); | 127 | DECLARE_MUTEX(lists); |
107 | DECLARE_MUTEX(vars); | 128 | DECLARE_MUTEX(vars); |
108 | 129 | ||
130 | /*========== Replacement funcs */ | ||
131 | |||
132 | //extern int strcasecmp (const char *__s1, const char *__s2); | ||
133 | |||
109 | /*========== Portable file I/O */ | 134 | /*========== Portable file I/O */ |
110 | 135 | ||
111 | extern MREADER* _mm_new_mem_reader(const void *buffer, int len); | 136 | extern MREADER* _mm_new_mem_reader(const void *buffer, long len); |
112 | extern void _mm_delete_mem_reader(MREADER *reader); | 137 | extern void _mm_delete_mem_reader(MREADER *reader); |
113 | 138 | ||
114 | extern MREADER* _mm_new_file_reader(int fp); | 139 | extern MREADER* _mm_new_file_reader(int fp); |
@@ -117,33 +142,32 @@ extern void _mm_delete_file_reader(MREADER*); | |||
117 | extern MWRITER* _mm_new_file_writer(int fp); | 142 | extern MWRITER* _mm_new_file_writer(int fp); |
118 | extern void _mm_delete_file_writer(MWRITER*); | 143 | extern void _mm_delete_file_writer(MWRITER*); |
119 | 144 | ||
120 | extern int _mm_FileExists(CHAR *fname); | 145 | extern int _mm_FileExists(const CHAR *fname); |
121 | 146 | ||
122 | #define _mm_write_SBYTE(x,y) y->Put(y,(int)x) | 147 | #define _mm_write_SBYTE(x,y) y->Put(y,(int)x) |
123 | #define _mm_write_UBYTE(x,y) y->Put(y,(int)x) | 148 | #define _mm_write_UBYTE(x,y) y->Put(y,(int)x) |
124 | 149 | ||
125 | #define _mm_read_SBYTE(x) (SBYTE)x->Get(x) | 150 | #define _mm_read_SBYTE(x) (SBYTE)x->Get(x) |
126 | #define _mm_read_UBYTE(x) (UBYTE)x->Get(x) | 151 | #define _mm_read_UBYTE(x) (UBYTE)x->Get(x) |
152 | #define _mm_skip_BYTE(x) (void)x->Get(x) | ||
127 | 153 | ||
128 | #define _mm_write_SBYTES(x,y,z) z->Write(z,(void *)x,y) | 154 | #define _mm_write_SBYTES(x,y,z) z->Write(z,(const void *)x,y) |
129 | #define _mm_write_UBYTES(x,y,z) z->Write(z,(void *)x,y) | 155 | #define _mm_write_UBYTES(x,y,z) z->Write(z,(const void *)x,y) |
130 | #define _mm_read_SBYTES(x,y,z) z->Read(z,(void *)x,y) | 156 | #define _mm_read_SBYTES(x,y,z) z->Read(z,(void *)x,y) |
131 | #define _mm_read_UBYTES(x,y,z) z->Read(z,(void *)x,y) | 157 | #define _mm_read_UBYTES(x,y,z) z->Read(z,(void *)x,y) |
132 | 158 | ||
133 | #define _mm_fseek(x,y,z) x->Seek(x,y,z) | 159 | #define _mm_fseek(x,y,z) x->Seek(x,y,z) |
134 | #define _mm_ftell(x) x->Tell(x) | 160 | #define _mm_ftell(x) x->Tell(x) |
135 | #define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET) | 161 | #define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET) |
136 | 162 | ||
137 | #define _mm_eof(x) x->Eof(x) | 163 | #define _mm_eof(x) x->Eof(x) |
138 | 164 | ||
139 | extern void _mm_iobase_setcur(MREADER*); | 165 | extern void _mm_iobase_setcur(MREADER*); |
140 | extern void _mm_iobase_revert(MREADER*); | 166 | extern void _mm_iobase_revert(MREADER*); |
141 | extern int _mm_fopen(CHAR*,CHAR*); | 167 | extern int _mm_fopen(const CHAR *, const CHAR *); |
142 | extern int _mm_fclose(int); | 168 | extern int _mm_fclose(int); |
143 | #if !defined(ROCKBOX) | 169 | extern void _mm_write_string(const CHAR*,MWRITER*); |
144 | extern void _mm_write_string(CHAR*,MWRITER*); | 170 | extern int _mm_read_string (CHAR*,int,MREADER*); |
145 | #endif | ||
146 | extern int _mm_read_string (CHAR*,int,MREADER*); | ||
147 | 171 | ||
148 | extern SWORD _mm_read_M_SWORD(MREADER*); | 172 | extern SWORD _mm_read_M_SWORD(MREADER*); |
149 | extern SWORD _mm_read_I_SWORD(MREADER*); | 173 | extern SWORD _mm_read_I_SWORD(MREADER*); |
@@ -187,19 +211,21 @@ extern void _mm_write_I_ULONGS(ULONG*,int,MWRITER*); | |||
187 | 211 | ||
188 | /*========== Samples */ | 212 | /*========== Samples */ |
189 | 213 | ||
214 | #define MAX_SAMPLE_SIZE 0x10000000 /* a sane value guaranteed to not overflow an SLONG */ | ||
215 | |||
190 | /* This is a handle of sorts attached to any sample registered with | 216 | /* This is a handle of sorts attached to any sample registered with |
191 | SL_RegisterSample. Generally, this only need be used or changed by the | 217 | SL_RegisterSample. Generally, this only need be used or changed by the |
192 | loaders and drivers of mikmod. */ | 218 | loaders and drivers of mikmod. */ |
193 | typedef struct SAMPLOAD { | 219 | typedef struct SAMPLOAD { |
194 | struct SAMPLOAD *next; | 220 | struct SAMPLOAD *next; |
195 | 221 | ||
196 | ULONG length; /* length of sample (in samples!) */ | 222 | ULONG length; /* length of sample (in samples!) */ |
197 | ULONG loopstart; /* repeat position (relative to start, in samples) */ | 223 | ULONG loopstart; /* repeat position (relative to start, in samples) */ |
198 | ULONG loopend; /* repeat end */ | 224 | ULONG loopend; /* repeat end */ |
199 | UWORD infmt,outfmt; | 225 | UWORD infmt,outfmt; |
200 | int scalefactor; | 226 | int scalefactor; |
201 | SAMPLE* sample; | 227 | SAMPLE* sample; |
202 | MREADER* reader; | 228 | MREADER* reader; |
203 | } SAMPLOAD; | 229 | } SAMPLOAD; |
204 | 230 | ||
205 | /*========== Sample and waves loading interface */ | 231 | /*========== Sample and waves loading interface */ |
@@ -209,9 +235,9 @@ extern void SL_Sample8to16(SAMPLOAD*); | |||
209 | extern void SL_Sample16to8(SAMPLOAD*); | 235 | extern void SL_Sample16to8(SAMPLOAD*); |
210 | extern void SL_SampleSigned(SAMPLOAD*); | 236 | extern void SL_SampleSigned(SAMPLOAD*); |
211 | extern void SL_SampleUnsigned(SAMPLOAD*); | 237 | extern void SL_SampleUnsigned(SAMPLOAD*); |
212 | extern int SL_LoadSamples(void); | 238 | extern int SL_LoadSamples(void); |
213 | extern SAMPLOAD* SL_RegisterSample(SAMPLE*,int,MREADER*); | 239 | extern SAMPLOAD* SL_RegisterSample(SAMPLE*,int,MREADER*); |
214 | extern int SL_Load(void*,SAMPLOAD*,ULONG); | 240 | extern int SL_Load(void*,SAMPLOAD*,ULONG); |
215 | extern int SL_Init(SAMPLOAD*); | 241 | extern int SL_Init(SAMPLOAD*); |
216 | extern void SL_Exit(SAMPLOAD*); | 242 | extern void SL_Exit(SAMPLOAD*); |
217 | 243 | ||
@@ -233,126 +259,126 @@ extern UBYTE* UniDup(void); | |||
233 | extern int UniInit(void); | 259 | extern int UniInit(void); |
234 | extern void UniCleanup(void); | 260 | extern void UniCleanup(void); |
235 | extern void UniEffect(UWORD,UWORD); | 261 | extern void UniEffect(UWORD,UWORD); |
236 | #define UniInstrument(x) UniEffect(UNI_INSTRUMENT,x) | 262 | #define UniInstrument(x) UniEffect(UNI_INSTRUMENT,x) |
237 | #define UniNote(x) UniEffect(UNI_NOTE,x) | 263 | #define UniNote(x) UniEffect(UNI_NOTE,x) |
238 | extern void UniPTEffect(UBYTE,UBYTE); | 264 | extern void UniPTEffect(UBYTE,UBYTE); |
239 | extern void UniVolEffect(UWORD,UBYTE); | 265 | extern void UniVolEffect(UWORD,UBYTE); |
240 | 266 | ||
241 | /*========== Module Commands */ | 267 | /*========== Module Commands */ |
242 | 268 | ||
243 | enum { | 269 | enum { |
244 | /* Simple note */ | 270 | /* Simple note */ |
245 | UNI_NOTE = 1, | 271 | UNI_NOTE = 1, |
246 | /* Instrument change */ | 272 | /* Instrument change */ |
247 | UNI_INSTRUMENT, | 273 | UNI_INSTRUMENT, |
248 | /* Protracker effects */ | 274 | /* Protracker effects */ |
249 | UNI_PTEFFECT0, /* arpeggio */ | 275 | UNI_PTEFFECT0, /* arpeggio */ |
250 | UNI_PTEFFECT1, /* porta up */ | 276 | UNI_PTEFFECT1, /* porta up */ |
251 | UNI_PTEFFECT2, /* porta down */ | 277 | UNI_PTEFFECT2, /* porta down */ |
252 | UNI_PTEFFECT3, /* porta to note */ | 278 | UNI_PTEFFECT3, /* porta to note */ |
253 | UNI_PTEFFECT4, /* vibrato */ | 279 | UNI_PTEFFECT4, /* vibrato */ |
254 | UNI_PTEFFECT5, /* dual effect 3+A */ | 280 | UNI_PTEFFECT5, /* dual effect 3+A */ |
255 | UNI_PTEFFECT6, /* dual effect 4+A */ | 281 | UNI_PTEFFECT6, /* dual effect 4+A */ |
256 | UNI_PTEFFECT7, /* tremolo */ | 282 | UNI_PTEFFECT7, /* tremolo */ |
257 | UNI_PTEFFECT8, /* pan */ | 283 | UNI_PTEFFECT8, /* pan */ |
258 | UNI_PTEFFECT9, /* sample offset */ | 284 | UNI_PTEFFECT9, /* sample offset */ |
259 | UNI_PTEFFECTA, /* volume slide */ | 285 | UNI_PTEFFECTA, /* volume slide */ |
260 | UNI_PTEFFECTB, /* pattern jump */ | 286 | UNI_PTEFFECTB, /* pattern jump */ |
261 | UNI_PTEFFECTC, /* set volume */ | 287 | UNI_PTEFFECTC, /* set volume */ |
262 | UNI_PTEFFECTD, /* pattern break */ | 288 | UNI_PTEFFECTD, /* pattern break */ |
263 | UNI_PTEFFECTE, /* extended effects */ | 289 | UNI_PTEFFECTE, /* extended effects */ |
264 | UNI_PTEFFECTF, /* set speed */ | 290 | UNI_PTEFFECTF, /* set speed */ |
265 | /* Scream Tracker effects */ | 291 | /* Scream Tracker effects */ |
266 | UNI_S3MEFFECTA, /* set speed */ | 292 | UNI_S3MEFFECTA, /* set speed */ |
267 | UNI_S3MEFFECTD, /* volume slide */ | 293 | UNI_S3MEFFECTD, /* volume slide */ |
268 | UNI_S3MEFFECTE, /* porta down */ | 294 | UNI_S3MEFFECTE, /* porta down */ |
269 | UNI_S3MEFFECTF, /* porta up */ | 295 | UNI_S3MEFFECTF, /* porta up */ |
270 | UNI_S3MEFFECTI, /* tremor */ | 296 | UNI_S3MEFFECTI, /* tremor */ |
271 | UNI_S3MEFFECTQ, /* retrig */ | 297 | UNI_S3MEFFECTQ, /* retrig */ |
272 | UNI_S3MEFFECTR, /* tremolo */ | 298 | UNI_S3MEFFECTR, /* tremolo */ |
273 | UNI_S3MEFFECTT, /* set tempo */ | 299 | UNI_S3MEFFECTT, /* set tempo */ |
274 | UNI_S3MEFFECTU, /* fine vibrato */ | 300 | UNI_S3MEFFECTU, /* fine vibrato */ |
275 | UNI_KEYOFF, /* note off */ | 301 | UNI_KEYOFF, /* note off */ |
276 | /* Fast Tracker effects */ | 302 | /* Fast Tracker effects */ |
277 | UNI_KEYFADE, /* note fade */ | 303 | UNI_KEYFADE, /* note fade */ |
278 | UNI_VOLEFFECTS, /* volume column effects */ | 304 | UNI_VOLEFFECTS, /* volume column effects */ |
279 | UNI_XMEFFECT4, /* vibrato */ | 305 | UNI_XMEFFECT4, /* vibrato */ |
280 | UNI_XMEFFECT6, /* dual effect 4+A */ | 306 | UNI_XMEFFECT6, /* dual effect 4+A */ |
281 | UNI_XMEFFECTA, /* volume slide */ | 307 | UNI_XMEFFECTA, /* volume slide */ |
282 | UNI_XMEFFECTE1, /* fine porta up */ | 308 | UNI_XMEFFECTE1, /* fine porta up */ |
283 | UNI_XMEFFECTE2, /* fine porta down */ | 309 | UNI_XMEFFECTE2, /* fine porta down */ |
284 | UNI_XMEFFECTEA, /* fine volume slide up */ | 310 | UNI_XMEFFECTEA, /* fine volume slide up */ |
285 | UNI_XMEFFECTEB, /* fine volume slide down */ | 311 | UNI_XMEFFECTEB, /* fine volume slide down */ |
286 | UNI_XMEFFECTG, /* set global volume */ | 312 | UNI_XMEFFECTG, /* set global volume */ |
287 | UNI_XMEFFECTH, /* global volume slide */ | 313 | UNI_XMEFFECTH, /* global volume slide */ |
288 | UNI_XMEFFECTL, /* set envelope position */ | 314 | UNI_XMEFFECTL, /* set envelope position */ |
289 | UNI_XMEFFECTP, /* pan slide */ | 315 | UNI_XMEFFECTP, /* pan slide */ |
290 | UNI_XMEFFECTX1, /* extra fine porta up */ | 316 | UNI_XMEFFECTX1, /* extra fine porta up */ |
291 | UNI_XMEFFECTX2, /* extra fine porta down */ | 317 | UNI_XMEFFECTX2, /* extra fine porta down */ |
292 | /* Impulse Tracker effects */ | 318 | /* Impulse Tracker effects */ |
293 | UNI_ITEFFECTG, /* porta to note */ | 319 | UNI_ITEFFECTG, /* porta to note */ |
294 | UNI_ITEFFECTH, /* vibrato */ | 320 | UNI_ITEFFECTH, /* vibrato */ |
295 | UNI_ITEFFECTI, /* tremor (xy not incremented) */ | 321 | UNI_ITEFFECTI, /* tremor (xy not incremented) */ |
296 | UNI_ITEFFECTM, /* set channel volume */ | 322 | UNI_ITEFFECTM, /* set channel volume */ |
297 | UNI_ITEFFECTN, /* slide / fineslide channel volume */ | 323 | UNI_ITEFFECTN, /* slide / fineslide channel volume */ |
298 | UNI_ITEFFECTP, /* slide / fineslide channel panning */ | 324 | UNI_ITEFFECTP, /* slide / fineslide channel panning */ |
299 | UNI_ITEFFECTT, /* slide tempo */ | 325 | UNI_ITEFFECTT, /* slide tempo */ |
300 | UNI_ITEFFECTU, /* fine vibrato */ | 326 | UNI_ITEFFECTU, /* fine vibrato */ |
301 | UNI_ITEFFECTW, /* slide / fineslide global volume */ | 327 | UNI_ITEFFECTW, /* slide / fineslide global volume */ |
302 | UNI_ITEFFECTY, /* panbrello */ | 328 | UNI_ITEFFECTY, /* panbrello */ |
303 | UNI_ITEFFECTZ, /* resonant filters */ | 329 | UNI_ITEFFECTZ, /* resonant filters */ |
304 | UNI_ITEFFECTS0, | 330 | UNI_ITEFFECTS0, |
305 | /* UltraTracker effects */ | 331 | /* UltraTracker effects */ |
306 | UNI_ULTEFFECT9, /* Sample fine offset */ | 332 | UNI_ULTEFFECT9, /* Sample fine offset */ |
307 | /* OctaMED effects */ | 333 | /* OctaMED effects */ |
308 | UNI_MEDSPEED, | 334 | UNI_MEDSPEED, |
309 | UNI_MEDEFFECTF1, /* play note twice */ | 335 | UNI_MEDEFFECTF1,/* play note twice */ |
310 | UNI_MEDEFFECTF2, /* delay note */ | 336 | UNI_MEDEFFECTF2,/* delay note */ |
311 | UNI_MEDEFFECTF3, /* play note three times */ | 337 | UNI_MEDEFFECTF3,/* play note three times */ |
312 | /* Oktalyzer effects */ | 338 | /* Oktalyzer effects */ |
313 | UNI_OKTARP, /* arpeggio */ | 339 | UNI_OKTARP, /* arpeggio */ |
314 | 340 | ||
315 | UNI_LAST | 341 | UNI_LAST |
316 | }; | 342 | }; |
317 | 343 | ||
318 | extern UWORD unioperands[UNI_LAST]; | 344 | extern const UWORD unioperands[UNI_LAST]; |
319 | 345 | ||
320 | /* IT / S3M Extended SS effects: */ | 346 | /* IT / S3M Extended SS effects: */ |
321 | enum { | 347 | enum { |
322 | SS_GLISSANDO = 1, | 348 | SS_GLISSANDO = 1, |
323 | SS_FINETUNE, | 349 | SS_FINETUNE, |
324 | SS_VIBWAVE, | 350 | SS_VIBWAVE, |
325 | SS_TREMWAVE, | 351 | SS_TREMWAVE, |
326 | SS_PANWAVE, | 352 | SS_PANWAVE, |
327 | SS_FRAMEDELAY, | 353 | SS_FRAMEDELAY, |
328 | SS_S7EFFECTS, | 354 | SS_S7EFFECTS, |
329 | SS_PANNING, | 355 | SS_PANNING, |
330 | SS_SURROUND, | 356 | SS_SURROUND, |
331 | SS_HIOFFSET, | 357 | SS_HIOFFSET, |
332 | SS_PATLOOP, | 358 | SS_PATLOOP, |
333 | SS_NOTECUT, | 359 | SS_NOTECUT, |
334 | SS_NOTEDELAY, | 360 | SS_NOTEDELAY, |
335 | SS_PATDELAY | 361 | SS_PATDELAY |
336 | }; | 362 | }; |
337 | 363 | ||
338 | /* IT Volume column effects */ | 364 | /* IT Volume column effects */ |
339 | enum { | 365 | enum { |
340 | VOL_VOLUME = 1, | 366 | VOL_VOLUME = 1, |
341 | VOL_PANNING, | 367 | VOL_PANNING, |
342 | VOL_VOLSLIDE, | 368 | VOL_VOLSLIDE, |
343 | VOL_PITCHSLIDEDN, | 369 | VOL_PITCHSLIDEDN, |
344 | VOL_PITCHSLIDEUP, | 370 | VOL_PITCHSLIDEUP, |
345 | VOL_PORTAMENTO, | 371 | VOL_PORTAMENTO, |
346 | VOL_VIBRATO | 372 | VOL_VIBRATO |
347 | }; | 373 | }; |
348 | 374 | ||
349 | /* IT resonant filter information */ | 375 | /* IT resonant filter information */ |
350 | 376 | ||
351 | #define UF_MAXMACRO 0x10 | 377 | #define UF_MAXMACRO 0x10 |
352 | #define UF_MAXFILTER 0x100 | 378 | #define UF_MAXFILTER 0x100 |
353 | 379 | ||
354 | #define FILT_CUT 0x80 | 380 | #define FILT_CUT 0x80 |
355 | #define FILT_RESONANT 0x81 | 381 | #define FILT_RESONANT 0x81 |
356 | 382 | ||
357 | typedef struct FILTER { | 383 | typedef struct FILTER { |
358 | UBYTE filter,inf; | 384 | UBYTE filter,inf; |
@@ -401,163 +427,163 @@ typedef struct FILTER { | |||
401 | 427 | ||
402 | /*========== Playing */ | 428 | /*========== Playing */ |
403 | 429 | ||
404 | #define POS_NONE (-2) /* no loop position defined */ | 430 | #define POS_NONE (-2) /* no loop position defined */ |
405 | 431 | ||
406 | #define LAST_PATTERN (UWORD)(-1) /* special ``end of song'' pattern */ | 432 | #define LAST_PATTERN (UWORD)(-1) /* special ``end of song'' pattern */ |
407 | 433 | ||
408 | typedef struct ENVPR { | 434 | typedef struct ENVPR { |
409 | UBYTE flg; /* envelope flag */ | 435 | UBYTE flg; /* envelope flag */ |
410 | UBYTE pts; /* number of envelope points */ | 436 | UBYTE pts; /* number of envelope points */ |
411 | UBYTE susbeg; /* envelope sustain index begin */ | 437 | UBYTE susbeg; /* envelope sustain index begin */ |
412 | UBYTE susend; /* envelope sustain index end */ | 438 | UBYTE susend; /* envelope sustain index end */ |
413 | UBYTE beg; /* envelope loop begin */ | 439 | UBYTE beg; /* envelope loop begin */ |
414 | UBYTE end; /* envelope loop end */ | 440 | UBYTE end; /* envelope loop end */ |
415 | SWORD p; /* current envelope counter */ | 441 | SWORD p; /* current envelope counter */ |
416 | UWORD a; /* envelope index a */ | 442 | UWORD a; /* envelope index a */ |
417 | UWORD b; /* envelope index b */ | 443 | UWORD b; /* envelope index b */ |
418 | ENVPT* env; /* envelope points */ | 444 | ENVPT* env; /* envelope points */ |
419 | } ENVPR; | 445 | } ENVPR; |
420 | 446 | ||
421 | typedef struct MP_CHANNEL { | 447 | typedef struct MP_CHANNEL { |
422 | INSTRUMENT* i; | 448 | INSTRUMENT* i; |
423 | SAMPLE* s; | 449 | SAMPLE *s; |
424 | UBYTE sample; /* which sample number */ | 450 | UBYTE sample; /* which sample number */ |
425 | UBYTE note; /* the audible note as heard, direct rep of period */ | 451 | UBYTE note; /* the audible note as heard, direct rep of period */ |
426 | SWORD outvolume; /* output volume (vol + sampcol + instvol) */ | 452 | SWORD outvolume; /* output volume (vol + sampcol + instvol) */ |
427 | SBYTE chanvol; /* channel's "global" volume */ | 453 | SBYTE chanvol; /* channel's "global" volume */ |
428 | UWORD fadevol; /* fading volume rate */ | 454 | UWORD fadevol; /* fading volume rate */ |
429 | SWORD panning; /* panning position */ | 455 | SWORD panning; /* panning position */ |
430 | UBYTE kick; /* if true = sample has to be restarted */ | 456 | UBYTE kick; /* if true = sample has to be restarted */ |
431 | UBYTE kick_flag; /* kick has been true */ | 457 | UBYTE kick_flag; /* kick has been true */ |
432 | UWORD period; /* period to play the sample at */ | 458 | UWORD period; /* period to play the sample at */ |
433 | UBYTE nna; /* New note action type + master/slave flags */ | 459 | UBYTE nna; /* New note action type + master/slave flags */ |
434 | 460 | ||
435 | UBYTE volflg; /* volume envelope settings */ | 461 | UBYTE volflg; /* volume envelope settings */ |
436 | UBYTE panflg; /* panning envelope settings */ | 462 | UBYTE panflg; /* panning envelope settings */ |
437 | UBYTE pitflg; /* pitch envelope settings */ | 463 | UBYTE pitflg; /* pitch envelope settings */ |
438 | 464 | ||
439 | UBYTE keyoff; /* if true = fade out and stuff */ | 465 | UBYTE keyoff; /* if true = fade out and stuff */ |
440 | SWORD handle; /* which sample-handle */ | 466 | SWORD handle; /* which sample-handle */ |
441 | UBYTE notedelay; /* (used for note delay) */ | 467 | UBYTE notedelay; /* (used for note delay) */ |
442 | SLONG start; /* The starting byte index in the sample */ | 468 | SLONG start; /* The starting byte index in the sample */ |
443 | } MP_CHANNEL; | 469 | } MP_CHANNEL; |
444 | 470 | ||
445 | typedef struct MP_CONTROL { | 471 | typedef struct MP_CONTROL { |
446 | struct MP_CHANNEL main; | 472 | struct MP_CHANNEL main; |
447 | 473 | ||
448 | struct MP_VOICE *slave; /* Audio Slave of current effects control channel */ | 474 | struct MP_VOICE* slave; /* Audio Slave of current effects control channel */ |
449 | 475 | ||
450 | UBYTE slavechn; /* Audio Slave of current effects control channel */ | 476 | UBYTE slavechn; /* Audio Slave of current effects control channel */ |
451 | UBYTE muted; /* if set, channel not played */ | 477 | UBYTE muted; /* if set, channel not played */ |
452 | UWORD ultoffset; /* fine sample offset memory */ | 478 | UWORD ultoffset; /* fine sample offset memory */ |
453 | UBYTE anote; /* the note that indexes the audible */ | 479 | UBYTE anote; /* the note that indexes the audible */ |
454 | UBYTE oldnote; | 480 | UBYTE oldnote; |
455 | SWORD ownper; | 481 | SWORD ownper; |
456 | SWORD ownvol; | 482 | SWORD ownvol; |
457 | UBYTE dca; /* duplicate check action */ | 483 | UBYTE dca; /* duplicate check action */ |
458 | UBYTE dct; /* duplicate check type */ | 484 | UBYTE dct; /* duplicate check type */ |
459 | UBYTE* row; /* row currently playing on this channel */ | 485 | UBYTE* row; /* row currently playing on this channel */ |
460 | SBYTE retrig; /* retrig value (0 means don't retrig) */ | 486 | SBYTE retrig; /* retrig value (0 means don't retrig) */ |
461 | ULONG speed; /* what finetune to use */ | 487 | ULONG speed; /* what finetune to use */ |
462 | SWORD volume; /* amiga volume (0 t/m 64) to play the sample at */ | 488 | SWORD volume; /* amiga volume (0 t/m 64) to play the sample at */ |
463 | 489 | ||
464 | SWORD tmpvolume; /* tmp volume */ | 490 | SWORD tmpvolume; /* tmp volume */ |
465 | UWORD tmpperiod; /* tmp period */ | 491 | UWORD tmpperiod; /* tmp period */ |
466 | UWORD wantedperiod; /* period to slide to (with effect 3 or 5) */ | 492 | UWORD wantedperiod;/* period to slide to (with effect 3 or 5) */ |
467 | 493 | ||
468 | UBYTE arpmem; /* arpeggio command memory */ | 494 | UBYTE arpmem; /* arpeggio command memory */ |
469 | UBYTE pansspd; /* panslide speed */ | 495 | UBYTE pansspd; /* panslide speed */ |
470 | UWORD slidespeed; | 496 | UWORD slidespeed; |
471 | UWORD portspeed; /* noteslide speed (toneportamento) */ | 497 | UWORD portspeed; /* noteslide speed (toneportamento) */ |
472 | 498 | ||
473 | UBYTE s3mtremor; /* s3m tremor (effect I) counter */ | 499 | UBYTE s3mtremor; /* s3m tremor (effect I) counter */ |
474 | UBYTE s3mtronof; /* s3m tremor ontime/offtime */ | 500 | UBYTE s3mtronof; /* s3m tremor ontime/offtime */ |
475 | UBYTE s3mvolslide; /* last used volslide */ | 501 | UBYTE s3mvolslide;/* last used volslide */ |
476 | SBYTE sliding; | 502 | SBYTE sliding; |
477 | UBYTE s3mrtgspeed; /* last used retrig speed */ | 503 | UBYTE s3mrtgspeed;/* last used retrig speed */ |
478 | UBYTE s3mrtgslide; /* last used retrig slide */ | 504 | UBYTE s3mrtgslide;/* last used retrig slide */ |
479 | 505 | ||
480 | UBYTE glissando; /* glissando (0 means off) */ | 506 | UBYTE glissando; /* glissando (0 means off) */ |
481 | UBYTE wavecontrol; | 507 | UBYTE wavecontrol; |
482 | 508 | ||
483 | SBYTE vibpos; /* current vibrato position */ | 509 | SBYTE vibpos; /* current vibrato position */ |
484 | UBYTE vibspd; /* "" speed */ | 510 | UBYTE vibspd; /* "" speed */ |
485 | UBYTE vibdepth; /* "" depth */ | 511 | UBYTE vibdepth; /* "" depth */ |
486 | 512 | ||
487 | SBYTE trmpos; /* current tremolo position */ | 513 | SBYTE trmpos; /* current tremolo position */ |
488 | UBYTE trmspd; /* "" speed */ | 514 | UBYTE trmspd; /* "" speed */ |
489 | UBYTE trmdepth; /* "" depth */ | 515 | UBYTE trmdepth; /* "" depth */ |
490 | 516 | ||
491 | UBYTE fslideupspd; | 517 | UBYTE fslideupspd; |
492 | UBYTE fslidednspd; | 518 | UBYTE fslidednspd; |
493 | UBYTE fportupspd; /* fx E1 (extra fine portamento up) data */ | 519 | UBYTE fportupspd; /* fx E1 (extra fine portamento up) data */ |
494 | UBYTE fportdnspd; /* fx E2 (extra fine portamento dn) data */ | 520 | UBYTE fportdnspd; /* fx E2 (extra fine portamento dn) data */ |
495 | UBYTE ffportupspd; /* fx X1 (extra fine portamento up) data */ | 521 | UBYTE ffportupspd;/* fx X1 (extra fine portamento up) data */ |
496 | UBYTE ffportdnspd; /* fx X2 (extra fine portamento dn) data */ | 522 | UBYTE ffportdnspd;/* fx X2 (extra fine portamento dn) data */ |
497 | 523 | ||
498 | ULONG hioffset; /* last used high order of sample offset */ | 524 | ULONG hioffset; /* last used high order of sample offset */ |
499 | UWORD soffset; /* last used low order of sample-offset (effect 9) */ | 525 | UWORD soffset; /* last used low order of sample-offset (effect 9) */ |
500 | 526 | ||
501 | UBYTE sseffect; /* last used Sxx effect */ | 527 | UBYTE sseffect; /* last used Sxx effect */ |
502 | UBYTE ssdata; /* last used Sxx data info */ | 528 | UBYTE ssdata; /* last used Sxx data info */ |
503 | UBYTE chanvolslide; /* last used channel volume slide */ | 529 | UBYTE chanvolslide;/* last used channel volume slide */ |
504 | 530 | ||
505 | UBYTE panbwave; /* current panbrello waveform */ | 531 | UBYTE panbwave; /* current panbrello waveform */ |
506 | UBYTE panbpos; /* current panbrello position */ | 532 | UBYTE panbpos; /* current panbrello position */ |
507 | SBYTE panbspd; /* "" speed */ | 533 | SBYTE panbspd; /* "" speed */ |
508 | UBYTE panbdepth; /* "" depth */ | 534 | UBYTE panbdepth; /* "" depth */ |
509 | 535 | ||
510 | UWORD newsamp; /* set to 1 upon a sample / inst change */ | 536 | UWORD newsamp; /* set to 1 upon a sample / inst change */ |
511 | UBYTE voleffect; /* Volume Column Effect Memory as used by IT */ | 537 | UBYTE voleffect; /* Volume Column Effect Memory as used by IT */ |
512 | UBYTE voldata; /* Volume Column Data Memory */ | 538 | UBYTE voldata; /* Volume Column Data Memory */ |
513 | 539 | ||
514 | SWORD pat_reppos; /* patternloop position */ | 540 | SWORD pat_reppos; /* patternloop position */ |
515 | UWORD pat_repcnt; /* times to loop */ | 541 | UWORD pat_repcnt; /* times to loop */ |
516 | } MP_CONTROL; | 542 | } MP_CONTROL; |
517 | 543 | ||
518 | /* Used by NNA only player (audio control. AUDTMP is used for full effects | 544 | /* Used by NNA only player (audio control. AUDTMP is used for full effects |
519 | control). */ | 545 | control). */ |
520 | typedef struct MP_VOICE { | 546 | typedef struct MP_VOICE { |
521 | struct MP_CHANNEL main; | 547 | struct MP_CHANNEL main; |
522 | 548 | ||
523 | ENVPR venv; | 549 | ENVPR venv; |
524 | ENVPR penv; | 550 | ENVPR penv; |
525 | ENVPR cenv; | 551 | ENVPR cenv; |
526 | 552 | ||
527 | UWORD avibpos; /* autovibrato pos */ | 553 | UWORD avibpos; /* autovibrato pos */ |
528 | UWORD aswppos; /* autovibrato sweep pos */ | 554 | UWORD aswppos; /* autovibrato sweep pos */ |
529 | 555 | ||
530 | ULONG totalvol; /* total volume of channel (before global mixings) */ | 556 | ULONG totalvol; /* total volume of channel (before global mixings) */ |
531 | 557 | ||
532 | int mflag; | 558 | int mflag; |
533 | SWORD masterchn; | 559 | SWORD masterchn; |
534 | UWORD masterperiod; | 560 | UWORD masterperiod; |
535 | 561 | ||
536 | MP_CONTROL* master; /* index of "master" effects channel */ | 562 | MP_CONTROL* master; /* index of "master" effects channel */ |
537 | } MP_VOICE; | 563 | } MP_VOICE; |
538 | 564 | ||
539 | /*========== Loaders */ | 565 | /*========== Loaders */ |
540 | 566 | ||
541 | typedef struct MLOADER { | 567 | typedef struct MLOADER { |
542 | struct MLOADER* next; | 568 | struct MLOADER* next; |
543 | CHAR* type; | 569 | const CHAR* type; |
544 | CHAR* version; | 570 | const CHAR* version; |
545 | int (*Init)(void); | 571 | int (*Init)(void); |
546 | int (*Test)(void); | 572 | int (*Test)(void); |
547 | int (*Load)(int); | 573 | int (*Load)(int); |
548 | void (*Cleanup)(void); | 574 | void (*Cleanup)(void); |
549 | CHAR* (*LoadTitle)(void); | 575 | CHAR* (*LoadTitle)(void); |
550 | } MLOADER; | 576 | } MLOADER; |
551 | 577 | ||
552 | /* internal loader variables */ | 578 | /* internal loader variables */ |
553 | extern MREADER* modreader; | 579 | extern MREADER* modreader; |
554 | extern UWORD finetune[16]; | ||
555 | extern MODULE of; /* static unimod loading space */ | 580 | extern MODULE of; /* static unimod loading space */ |
556 | extern UWORD npertab[7*OCTAVE]; /* used by the original MOD loaders */ | 581 | extern const UWORD finetune[16]; |
582 | extern const UWORD npertab[7*OCTAVE];/* used by the original MOD loaders */ | ||
557 | 583 | ||
558 | extern SBYTE remap[UF_MAXCHAN]; /* for removing empty channels */ | 584 | extern SBYTE remap[UF_MAXCHAN]; /* for removing empty channels */ |
559 | extern UBYTE* poslookup; /* lookup table for pattern jumps after | 585 | extern UBYTE* poslookup; /* lookup table for pattern jumps after |
560 | blank pattern removal */ | 586 | blank pattern removal */ |
561 | extern UWORD poslookupcnt; | 587 | extern UWORD poslookupcnt; |
562 | extern UWORD* origpositions; | 588 | extern UWORD* origpositions; |
563 | 589 | ||
@@ -577,8 +603,7 @@ extern int AllocPatterns(void); | |||
577 | extern int AllocTracks(void); | 603 | extern int AllocTracks(void); |
578 | extern int AllocInstruments(void); | 604 | extern int AllocInstruments(void); |
579 | extern int AllocSamples(void); | 605 | extern int AllocSamples(void); |
580 | extern CHAR* DupStr(CHAR*,UWORD,int); | 606 | extern CHAR* DupStr(const CHAR*, UWORD, int); |
581 | extern CHAR* StrDup(CHAR *s); | ||
582 | 607 | ||
583 | /* loader utility functions */ | 608 | /* loader utility functions */ |
584 | extern int* AllocLinear(void); | 609 | extern int* AllocLinear(void); |
@@ -588,28 +613,38 @@ extern void S3MIT_ProcessCmd(UBYTE,UBYTE,unsigned int); | |||
588 | extern void S3MIT_CreateOrders(int); | 613 | extern void S3MIT_CreateOrders(int); |
589 | 614 | ||
590 | /* flags for S3MIT_ProcessCmd */ | 615 | /* flags for S3MIT_ProcessCmd */ |
591 | #define S3MIT_OLDSTYLE 1 /* behave as old scream tracker */ | 616 | #define S3MIT_OLDSTYLE 1 /* behave as old scream tracker */ |
592 | #define S3MIT_IT 2 /* behave as impulse tracker */ | 617 | #define S3MIT_IT 2 /* behave as impulse tracker */ |
593 | #define S3MIT_SCREAM 4 /* enforce scream tracker specific limits */ | 618 | #define S3MIT_SCREAM 4 /* enforce scream tracker specific limits */ |
594 | 619 | ||
595 | /* used to convert c4spd to linear XM periods (IT and IMF loaders). */ | 620 | /* used to convert c4spd to linear XM periods (IT and IMF loaders). */ |
596 | extern UWORD getlinearperiod(UWORD,ULONG); | 621 | extern UWORD getlinearperiod(UWORD,ULONG); |
597 | extern ULONG getfrequency(UWORD,ULONG); | 622 | extern ULONG getfrequency(UWORD,ULONG); |
598 | 623 | ||
599 | /* loader shared data */ | 624 | /* loader shared data */ |
600 | #define STM_NTRACKERS 3 | 625 | #define STM_NTRACKERS 3 |
601 | extern CHAR *STM_Signatures[STM_NTRACKERS]; | 626 | extern const CHAR *STM_Signatures[STM_NTRACKERS]; |
602 | 627 | ||
603 | /*========== Player interface */ | 628 | /*========== Player interface */ |
604 | 629 | ||
605 | extern int Player_Init(MODULE*); | 630 | extern int Player_Init(MODULE*); |
606 | extern void Player_Exit(MODULE*); | 631 | extern void Player_Exit(MODULE*); |
607 | extern void Player_HandleTick(void); | 632 | extern void Player_HandleTick(void); |
608 | 633 | ||
634 | /*========== UnPackers */ | ||
635 | |||
636 | typedef int (*MUNPACKER) (struct MREADER*, | ||
637 | void** /* unpacked data out */ , | ||
638 | long* /* unpacked data size */ ); | ||
639 | extern int PP20_Unpack(MREADER*, void**, long*); | ||
640 | extern int MMCMP_Unpack(MREADER*, void**, long*); | ||
641 | extern int XPK_Unpack(MREADER*, void**, long*); | ||
642 | extern int S404_Unpack(MREADER*, void**, long*); | ||
643 | |||
609 | /*========== Drivers */ | 644 | /*========== Drivers */ |
610 | 645 | ||
611 | /* max. number of handles a driver has to provide. (not strict) */ | 646 | /* max. number of handles a driver has to provide. (not strict) */ |
612 | #define MAXSAMPLEHANDLES 384 | 647 | #define MAXSAMPLEHANDLES 384 |
613 | 648 | ||
614 | /* These variables can be changed at ANY time and results will be immediate */ | 649 | /* These variables can be changed at ANY time and results will be immediate */ |
615 | extern UWORD md_bpm; /* current song / hardware BPM rate */ | 650 | extern UWORD md_bpm; /* current song / hardware BPM rate */ |
@@ -625,7 +660,7 @@ extern UBYTE md_softchn; /* number of software mixed voices */ | |||
625 | 660 | ||
626 | /* This is for use by the hardware drivers only. It points to the registered | 661 | /* This is for use by the hardware drivers only. It points to the registered |
627 | tickhandler function. */ | 662 | tickhandler function. */ |
628 | extern void (*md_player)(void); | 663 | extern MikMod_player_t md_player; |
629 | 664 | ||
630 | extern SWORD MD_SampleLoad(SAMPLOAD*,int); | 665 | extern SWORD MD_SampleLoad(SAMPLOAD*,int); |
631 | extern void MD_SampleUnload(SWORD); | 666 | extern void MD_SampleUnload(SWORD); |
@@ -636,17 +671,17 @@ extern ULONG MD_SampleLength(int,SAMPLE*); | |||
636 | extern void unsignedtoulaw(char *,int); | 671 | extern void unsignedtoulaw(char *,int); |
637 | 672 | ||
638 | /* Parameter extraction helper */ | 673 | /* Parameter extraction helper */ |
639 | extern CHAR *MD_GetAtom(CHAR*,CHAR*,int); | 674 | extern CHAR *MD_GetAtom(const CHAR*, const CHAR*, int); |
640 | 675 | ||
641 | /* Internal software mixer stuff */ | 676 | /* Internal software mixer stuff */ |
642 | extern void VC_SetupPointers(void); | 677 | extern void VC_SetupPointers(void); |
643 | extern int VC1_Init(void); | 678 | extern int VC1_Init(void); |
644 | extern int VC2_Init(void); | 679 | extern int VC2_Init(void); |
645 | 680 | ||
646 | #if defined(unix) || defined(__APPLE__) && defined(__MACH__) | 681 | #if (MIKMOD_UNIX) |
647 | /* POSIX helper functions */ | 682 | /* POSIX helper functions */ |
648 | extern int MD_Access(CHAR *); | 683 | extern int MD_Access(const CHAR *); |
649 | extern int MD_DropPrivileges(void); | 684 | extern int MD_DropPrivileges(void); |
650 | #endif | 685 | #endif |
651 | 686 | ||
652 | /* Macro to define a missing driver, yet allowing binaries to dynamically link | 687 | /* Macro to define a missing driver, yet allowing binaries to dynamically link |
@@ -659,9 +694,9 @@ extern void _mm_registerdriver(struct MDRIVER*); | |||
659 | extern void _mm_registerloader(struct MLOADER*); | 694 | extern void _mm_registerloader(struct MLOADER*); |
660 | extern int MikMod_Active_internal(void); | 695 | extern int MikMod_Active_internal(void); |
661 | extern void MikMod_DisableOutput_internal(void); | 696 | extern void MikMod_DisableOutput_internal(void); |
662 | extern int MikMod_EnableOutput_internal(void); | 697 | extern int MikMod_EnableOutput_internal(void); |
663 | extern void MikMod_Exit_internal(void); | 698 | extern void MikMod_Exit_internal(void); |
664 | extern int MikMod_SetNumVoices_internal(int,int); | 699 | extern int MikMod_SetNumVoices_internal(int,int); |
665 | extern void Player_Exit_internal(MODULE*); | 700 | extern void Player_Exit_internal(MODULE*); |
666 | extern void Player_Stop_internal(void); | 701 | extern void Player_Stop_internal(void); |
667 | extern int Player_Paused_internal(void); | 702 | extern int Player_Paused_internal(void); |
@@ -673,6 +708,15 @@ extern void Voice_SetVolume_internal(SBYTE,UWORD); | |||
673 | extern void Voice_Stop_internal(SBYTE); | 708 | extern void Voice_Stop_internal(SBYTE); |
674 | extern int Voice_Stopped_internal(SBYTE); | 709 | extern int Voice_Stopped_internal(SBYTE); |
675 | 710 | ||
711 | extern int VC1_PlayStart(void); | ||
712 | extern int VC2_PlayStart(void); | ||
713 | extern void VC1_PlayStop(void); | ||
714 | extern void VC2_PlayStop(void); | ||
715 | extern int VC1_SetNumVoices(void); | ||
716 | extern int VC2_SetNumVoices(void); | ||
717 | |||
718 | extern MikMod_callback_t vc_callback; | ||
719 | |||
676 | #ifdef __cplusplus | 720 | #ifdef __cplusplus |
677 | } | 721 | } |
678 | #endif | 722 | #endif |
@@ -680,30 +724,36 @@ extern int Voice_Stopped_internal(SBYTE); | |||
680 | /*========== SIMD mixing routines */ | 724 | /*========== SIMD mixing routines */ |
681 | #undef HAVE_ALTIVEC | 725 | #undef HAVE_ALTIVEC |
682 | #undef HAVE_SSE2 | 726 | #undef HAVE_SSE2 |
727 | #if defined(MIKMOD_SIMD) | ||
683 | 728 | ||
684 | #if defined(__APPLE__) && !defined (__i386__) | 729 | #if (defined(__ppc__) || defined(__ppc64__)) && defined(__VEC__) && !(defined(__GNUC__) && (__GNUC__ < 3)) |
685 | |||
686 | #if defined __VEC__ && !(defined(__GNUC__) && (__GNUC__ < 3)) | ||
687 | #define HAVE_ALTIVEC | 730 | #define HAVE_ALTIVEC |
688 | #endif // __VEC__ | ||
689 | 731 | ||
690 | #elif defined WIN32 || defined __WIN64 || (defined __APPLE__ && defined (__i386__) && defined __VEC__) | 732 | #elif defined(__GNUC__) && defined(__SSE2__) /* x86 / x86_64 */ |
691 | |||
692 | // FIXME: emmintrin.h requires VC6 processor pack or VC2003+ | ||
693 | #define HAVE_SSE2 | 733 | #define HAVE_SSE2 |
694 | 734 | ||
695 | /* Fixes couples warnings */ | 735 | #elif defined(_MSC_VER) && (_MSC_VER >= 1300) && (defined(_M_IX86) || defined(_M_AMD64)) |
696 | #ifdef _MSC_VER | 736 | /* FIXME: emmintrin.h requires VC6 processor pack or VC2003+ */ |
737 | #define HAVE_SSE2 | ||
738 | /* avoid some warnings */ | ||
697 | #pragma warning(disable:4761) | 739 | #pragma warning(disable:4761) |
698 | #pragma warning(disable:4391) | 740 | #pragma warning(disable:4391) |
699 | #pragma warning(disable:4244) | 741 | #pragma warning(disable:4244) |
700 | #endif | 742 | |
701 | #endif | 743 | #endif /* AltiVec/SSE2 */ |
702 | // TODO: Test for GCC Linux | 744 | #endif /* MIKMOD_SIMD */ |
703 | 745 | ||
704 | /*========== SIMD mixing helper functions =============*/ | 746 | /*========== SIMD mixing helper functions =============*/ |
705 | 747 | ||
706 | #define IS_ALIGNED_16(ptr) (!(((intptr_t)(ptr)) & 15)) | 748 | #if defined(_WIN64) |
749 | # if defined(_MSC_VER) | ||
750 | # define IS_ALIGNED_16(ptr) (!((__int64)(ptr) & 15i64)) | ||
751 | # else /* GCC, LCC, .. */ | ||
752 | # define IS_ALIGNED_16(ptr) (!((long long)(ptr) & 15LL)) | ||
753 | # endif | ||
754 | #else /* long cast should be OK for all else */ | ||
755 | #define IS_ALIGNED_16(ptr) (!((long)(ptr) & 15L)) | ||
756 | #endif | ||
707 | 757 | ||
708 | /* Altivec helper function */ | 758 | /* Altivec helper function */ |
709 | #if defined HAVE_ALTIVEC | 759 | #if defined HAVE_ALTIVEC |
@@ -715,33 +765,29 @@ extern int Voice_Stopped_internal(SBYTE); | |||
715 | #include <ppc_intrinsics.h> | 765 | #include <ppc_intrinsics.h> |
716 | #endif | 766 | #endif |
717 | 767 | ||
718 | // Helper functions | 768 | /* Helper functions */ |
719 | 769 | ||
720 | // Set single float across the four values | 770 | /* Set single float across the four values */ |
721 | static inline vector float vec_mul( const vector float a, const vector float b) | 771 | static inline vector float vec_mul(const vector float a, const vector float b) { |
722 | { | ||
723 | return vec_madd(a, b, (const vector float)(0.f)); | 772 | return vec_madd(a, b, (const vector float)(0.f)); |
724 | } | 773 | } |
725 | 774 | ||
726 | // Set single float across the four values | 775 | /* Set single float across the four values */ |
727 | static inline vector float vec_load_ps1(const float *pF ) | 776 | static inline vector float vec_load_ps1(const float *pF) { |
728 | { | ||
729 | vector float data = vec_lde(0, pF); | 777 | vector float data = vec_lde(0, pF); |
730 | return vec_splat(vec_perm(data, data, vec_lvsl(0, pF)), 0); | 778 | return vec_splat(vec_perm(data, data, vec_lvsl(0, pF)), 0); |
731 | } | 779 | } |
732 | 780 | ||
733 | // Set vector to 0 | 781 | /* Set vector to 0 */ |
734 | static inline const vector float vec_setzero() | 782 | static inline vector float vec_setzero() { |
735 | { | 783 | return (vector float) (0.); |
736 | return (const vector float) (0.); | ||
737 | } | 784 | } |
738 | 785 | ||
739 | static inline vector signed char vec_set1_8(unsigned char splatchar) | 786 | static inline vector signed char vec_set1_8(unsigned char splatchar) { |
740 | { | 787 | vector unsigned char splatmap = vec_lvsl(0, &splatchar); |
741 | vector unsigned char splatmap = vec_lvsl(0, &splatchar); | 788 | vector unsigned char result = vec_lde(0, &splatchar); |
742 | vector unsigned char result = vec_lde(0, &splatchar); | 789 | splatmap = vec_splat(splatmap, 0); |
743 | splatmap = vec_splat(splatmap, 0); | 790 | return (vector signed char)vec_perm(result, result, splatmap); |
744 | return (vector signed char)vec_perm(result, result, splatmap); | ||
745 | } | 791 | } |
746 | 792 | ||
747 | #define PERM_A0 0x00,0x01,0x02,0x03 | 793 | #define PERM_A0 0x00,0x01,0x02,0x03 |
@@ -753,48 +799,45 @@ static inline vector signed char vec_set1_8(unsigned char splatchar) | |||
753 | #define PERM_B2 0x18,0x19,0x1A,0x1B | 799 | #define PERM_B2 0x18,0x19,0x1A,0x1B |
754 | #define PERM_B3 0x1C,0x1D,0x1E,0x1F | 800 | #define PERM_B3 0x1C,0x1D,0x1E,0x1F |
755 | 801 | ||
756 | // Equivalent to _mm_unpacklo_epi32 | 802 | /* Equivalent to _mm_unpacklo_epi32 */ |
757 | static inline vector signed int vec_unpacklo(vector signed int a, vector signed int b) | 803 | static inline vector signed int vec_unpacklo(vector signed int a, vector signed int b) { |
758 | { | ||
759 | return vec_perm(a, b, (vector unsigned char)(PERM_A0,PERM_A1,PERM_B0,PERM_B1)); | 804 | return vec_perm(a, b, (vector unsigned char)(PERM_A0,PERM_A1,PERM_B0,PERM_B1)); |
760 | } | 805 | } |
761 | 806 | ||
762 | // Equivalent to _mm_srli_si128(a, 8) (without the zeroing in high part). | 807 | /* Equivalent to _mm_srli_si128(a, 8) (without the zeroing in high part). */ |
763 | static inline vector signed int vec_hiqq(vector signed int a) | 808 | static inline vector signed int vec_hiqq(vector signed int a) { |
764 | { | ||
765 | vector signed int b = vec_splat_s32(0); | 809 | vector signed int b = vec_splat_s32(0); |
766 | return vec_perm(a, b, (vector unsigned char)(PERM_A2,PERM_A3,PERM_B2,PERM_B3)); | 810 | return vec_perm(a, b, (vector unsigned char)(PERM_A2,PERM_A3,PERM_B2,PERM_B3)); |
767 | } | 811 | } |
768 | 812 | ||
769 | // vec_sra is max +15. We have to do in two times ... | 813 | /* vec_sra is max +15. We have to do in two times ... */ |
770 | #define EXTRACT_SAMPLE_SIMD_F(srce, var, size, mul) var = vec_mul(vec_ctf(vec_sra(vec_ld(0, (vector signed int*)(srce)), vec_splat_u32(BITSHIFT-size)),0), mul); | 814 | #define EXTRACT_SAMPLE_SIMD_F(srce, var, size, mul) var = vec_mul(vec_ctf(vec_sra(vec_ld(0, (vector signed int const *)(srce)), vec_splat_u32(BITSHIFT-size)),0), mul); |
771 | #define EXTRACT_SAMPLE_SIMD_0(srce, var) var = vec_sra(vec_sra(vec_ld(0, (vector signed int*)(srce)), vec_splat_u32(15)), vec_splat_u32(BITSHIFT+16-15-0)); | 815 | #define EXTRACT_SAMPLE_SIMD_0(srce, var) var = vec_sra(vec_sra(vec_ld(0, (vector signed int const *)(srce)), vec_splat_u32(15)), vec_splat_u32(BITSHIFT+16-15-0)); |
772 | #define EXTRACT_SAMPLE_SIMD_8(srce, var) var = vec_sra(vec_sra(vec_ld(0, (vector signed int*)(srce)), vec_splat_u32(15)), vec_splat_u32(BITSHIFT+16-15-8)); | 816 | #define EXTRACT_SAMPLE_SIMD_8(srce, var) var = vec_sra(vec_sra(vec_ld(0, (vector signed int const *)(srce)), vec_splat_u32(15)), vec_splat_u32(BITSHIFT+16-15-8)); |
773 | #define EXTRACT_SAMPLE_SIMD_16(srce, var) var = vec_sra(vec_ld(0, (vector signed int*)(srce)), vec_splat_u32(BITSHIFT+16-16)); | 817 | #define EXTRACT_SAMPLE_SIMD_16(srce, var) var = vec_sra(vec_ld(0, (vector signed int const *)(srce)), vec_splat_u32(BITSHIFT+16-16)); |
774 | #define PUT_SAMPLE_SIMD_W(dste, v1, v2) vec_st(vec_packs(v1, v2), 0, dste); | 818 | #define PUT_SAMPLE_SIMD_W(dste, v1, v2) vec_st(vec_packs(v1, v2), 0, dste); |
775 | #define PUT_SAMPLE_SIMD_B(dste, v1, v2, v3, v4) vec_st(vec_add(vec_packs((vector signed short)vec_packs(v1, v2), (vector signed short)vec_packs(v3, v4)), vec_set1_8(128)), 0, dste); | 819 | #define PUT_SAMPLE_SIMD_B(dste, v1, v2, v3, v4) vec_st(vec_add(vec_packs((vector signed short)vec_packs(v1, v2), (vector signed short)vec_packs(v3, v4)), vec_set1_8(128)), 0, dste); |
776 | #define PUT_SAMPLE_SIMD_F(dste, v1) vec_st(v1, 0, dste); | 820 | #define PUT_SAMPLE_SIMD_F(dste, v1) vec_st(v1, 0, dste); |
777 | #define LOAD_PS1_SIMD(ptr) vec_load_ps1(ptr) | 821 | #define LOAD_PS1_SIMD(ptr) vec_load_ps1(ptr) |
778 | 822 | ||
779 | #elif defined HAVE_SSE2 | 823 | #elif defined HAVE_SSE2 |
780 | 824 | ||
781 | /* SSE2 helper function */ | ||
782 | |||
783 | #include <emmintrin.h> | 825 | #include <emmintrin.h> |
784 | 826 | ||
785 | static __inline __m128i mm_hiqq(const __m128i a) | 827 | /* SSE2 helper function */ |
786 | { | 828 | |
787 | return _mm_srli_si128(a, 8); // get the 64bit upper part. new 64bit upper is undefined (zeroed is fine). | 829 | static __inline __m128i mm_hiqq(const __m128i a) { |
830 | return _mm_srli_si128(a, 8); /* get the 64bit upper part. new 64bit upper is undefined (zeroed is fine). */ | ||
788 | } | 831 | } |
789 | 832 | ||
790 | /* 128-bit mixing macros */ | 833 | /* 128-bit mixing macros */ |
791 | #define EXTRACT_SAMPLE_SIMD(srce, var, size) var = _mm_srai_epi32(_mm_load_si128((__m128i*)(srce)), BITSHIFT+16-size); | 834 | #define EXTRACT_SAMPLE_SIMD(srce, var, size) var = _mm_srai_epi32(_mm_load_si128((__m128i const *)(srce)), BITSHIFT+16-size); |
792 | #define EXTRACT_SAMPLE_SIMD_F(srce, var, size, mul) var = _mm_mul_ps(_mm_cvtepi32_ps(_mm_srai_epi32(_mm_load_si128((__m128i*)(srce)), BITSHIFT-size)), mul); | 835 | #define EXTRACT_SAMPLE_SIMD_F(srce, var, size, mul) var = _mm_mul_ps(_mm_cvtepi32_ps(_mm_srai_epi32(_mm_load_si128((__m128i const *)(srce)), BITSHIFT-size)), mul); |
793 | #define EXTRACT_SAMPLE_SIMD_0(srce, var) EXTRACT_SAMPLE_SIMD(srce, var, 0) | 836 | #define EXTRACT_SAMPLE_SIMD_0(srce, var) EXTRACT_SAMPLE_SIMD(srce, var, 0) |
794 | #define EXTRACT_SAMPLE_SIMD_8(srce, var) EXTRACT_SAMPLE_SIMD(srce, var, 8) | 837 | #define EXTRACT_SAMPLE_SIMD_8(srce, var) EXTRACT_SAMPLE_SIMD(srce, var, 8) |
795 | #define EXTRACT_SAMPLE_SIMD_16(srce, var) EXTRACT_SAMPLE_SIMD(srce, var, 16) | 838 | #define EXTRACT_SAMPLE_SIMD_16(srce, var) EXTRACT_SAMPLE_SIMD(srce, var, 16) |
796 | #define PUT_SAMPLE_SIMD_W(dste, v1, v2) _mm_store_si128((__m128i*)(dste), _mm_packs_epi32(v1, v2)); | 839 | #define PUT_SAMPLE_SIMD_W(dste, v1, v2) _mm_store_si128((__m128i*)(dste), _mm_packs_epi32(v1, v2)); |
797 | #define PUT_SAMPLE_SIMD_B(dste, v1, v2, v3, v4) _mm_store_si128((__m128i*)(dste), _mm_add_epi8(_mm_packs_epi16(_mm_packs_epi32(v1, v2), _mm_packs_epi32(v3, v4)), _mm_set1_epi8(128))); | 840 | #define PUT_SAMPLE_SIMD_B(dste, v1, v2, v3, v4) _mm_store_si128((__m128i*)(dste), _mm_add_epi8(_mm_packs_epi16(_mm_packs_epi32(v1, v2), _mm_packs_epi32(v3, v4)), _mm_set1_epi8(128))); |
798 | #define PUT_SAMPLE_SIMD_F(dste, v1) _mm_store_ps((float*)(dste), v1); | 841 | #define PUT_SAMPLE_SIMD_F(dste, v1) _mm_store_ps((float*)(dste), v1); |
799 | #define LOAD_PS1_SIMD(ptr) _mm_load_ps1(ptr) | 842 | #define LOAD_PS1_SIMD(ptr) _mm_load_ps1(ptr) |
800 | #define simd_m128i __m128i | 843 | #define simd_m128i __m128i |
@@ -802,7 +845,25 @@ static __inline __m128i mm_hiqq(const __m128i a) | |||
802 | 845 | ||
803 | #endif | 846 | #endif |
804 | 847 | ||
848 | #if defined(HAVE_SSE2) || defined(HAVE_ALTIVEC) | ||
849 | /* MikMod_amalloc() returns a 16 byte aligned zero-filled | ||
850 | memory in SIMD-enabled builds. | ||
851 | - the returned memory can be freed with MikMod_afree() | ||
852 | - the returned memory CAN NOT be realloc()'ed safely. */ | ||
853 | #ifdef __cplusplus | ||
854 | extern "C" { | ||
855 | #endif | ||
856 | void* MikMod_amalloc(size_t); | ||
857 | void MikMod_afree(void *); /* frees if ptr != NULL */ | ||
858 | #ifdef __cplusplus | ||
859 | } | ||
860 | #endif | ||
805 | 861 | ||
862 | #else /* NO SIMD */ | ||
863 | #define MikMod_amalloc MikMod_malloc | ||
864 | #define MikMod_afree MikMod_free | ||
806 | #endif | 865 | #endif |
807 | 866 | ||
867 | #endif /* _MIKMOD_INTERNALS_H */ | ||
868 | |||
808 | /* ex:set ts=4: */ | 869 | /* ex:set ts=4: */ |