summaryrefslogtreecommitdiff
path: root/apps/plugins/mikmod/mikmod_internals.h
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/mikmod/mikmod_internals.h')
-rw-r--r--apps/plugins/mikmod/mikmod_internals.h789
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) && \
49typedef long SLONGLONG; 55 (defined(_LP64) || defined(__LP64__) || defined(__arch64__) || defined(__alpha) || defined(__x64_64) || defined(__powerpc64__))
56typedef 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 60typedef long long SLONGLONG;
52#elif defined(__WATCOMC__) 61#elif defined(__WATCOMC__)
53typedef __int64 SLONGLONG; 62typedef __int64 SLONGLONG;
54#elif defined(WIN32) && !defined(__MWERKS__) 63#elif defined(_WIN32) && !defined(__MWERKS__)
55typedef LONGLONG SLONGLONG; 64typedef LONGLONG SLONGLONG;
56#elif macintosh && !TYPE_LONGLONG 65#elif defined(macintosh) && !TYPE_LONGLONG
57#include <Types.h> 66#include <Types.h>
58typedef SInt64 SLONGLONG; 67typedef SInt64 SLONGLONG;
68#else
69typedef long long SLONGLONG;
59#endif 70#endif
71typedef 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 */
75typedef long long SINTPTR_T;
60#else 76#else
61typedef long long SLONGLONG; 77/* long should be pointer-sized for all others : */
78typedef long SINTPTR_T;
62#endif 79#endif
80typedef 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;
106DECLARE_MUTEX(lists); 127DECLARE_MUTEX(lists);
107DECLARE_MUTEX(vars); 128DECLARE_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
111extern MREADER* _mm_new_mem_reader(const void *buffer, int len); 136extern MREADER* _mm_new_mem_reader(const void *buffer, long len);
112extern void _mm_delete_mem_reader(MREADER *reader); 137extern void _mm_delete_mem_reader(MREADER *reader);
113 138
114extern MREADER* _mm_new_file_reader(int fp); 139extern MREADER* _mm_new_file_reader(int fp);
@@ -117,33 +142,32 @@ extern void _mm_delete_file_reader(MREADER*);
117extern MWRITER* _mm_new_file_writer(int fp); 142extern MWRITER* _mm_new_file_writer(int fp);
118extern void _mm_delete_file_writer(MWRITER*); 143extern void _mm_delete_file_writer(MWRITER*);
119 144
120extern int _mm_FileExists(CHAR *fname); 145extern 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
139extern void _mm_iobase_setcur(MREADER*); 165extern void _mm_iobase_setcur(MREADER*);
140extern void _mm_iobase_revert(MREADER*); 166extern void _mm_iobase_revert(MREADER*);
141extern int _mm_fopen(CHAR*,CHAR*); 167extern int _mm_fopen(const CHAR *, const CHAR *);
142extern int _mm_fclose(int); 168extern int _mm_fclose(int);
143#if !defined(ROCKBOX) 169extern void _mm_write_string(const CHAR*,MWRITER*);
144extern void _mm_write_string(CHAR*,MWRITER*); 170extern int _mm_read_string (CHAR*,int,MREADER*);
145#endif
146extern int _mm_read_string (CHAR*,int,MREADER*);
147 171
148extern SWORD _mm_read_M_SWORD(MREADER*); 172extern SWORD _mm_read_M_SWORD(MREADER*);
149extern SWORD _mm_read_I_SWORD(MREADER*); 173extern 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. */
193typedef struct SAMPLOAD { 219typedef 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*);
209extern void SL_Sample16to8(SAMPLOAD*); 235extern void SL_Sample16to8(SAMPLOAD*);
210extern void SL_SampleSigned(SAMPLOAD*); 236extern void SL_SampleSigned(SAMPLOAD*);
211extern void SL_SampleUnsigned(SAMPLOAD*); 237extern void SL_SampleUnsigned(SAMPLOAD*);
212extern int SL_LoadSamples(void); 238extern int SL_LoadSamples(void);
213extern SAMPLOAD* SL_RegisterSample(SAMPLE*,int,MREADER*); 239extern SAMPLOAD* SL_RegisterSample(SAMPLE*,int,MREADER*);
214extern int SL_Load(void*,SAMPLOAD*,ULONG); 240extern int SL_Load(void*,SAMPLOAD*,ULONG);
215extern int SL_Init(SAMPLOAD*); 241extern int SL_Init(SAMPLOAD*);
216extern void SL_Exit(SAMPLOAD*); 242extern void SL_Exit(SAMPLOAD*);
217 243
@@ -233,126 +259,126 @@ extern UBYTE* UniDup(void);
233extern int UniInit(void); 259extern int UniInit(void);
234extern void UniCleanup(void); 260extern void UniCleanup(void);
235extern void UniEffect(UWORD,UWORD); 261extern 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)
238extern void UniPTEffect(UBYTE,UBYTE); 264extern void UniPTEffect(UBYTE,UBYTE);
239extern void UniVolEffect(UWORD,UBYTE); 265extern void UniVolEffect(UWORD,UBYTE);
240 266
241/*========== Module Commands */ 267/*========== Module Commands */
242 268
243enum { 269enum {
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
318extern UWORD unioperands[UNI_LAST]; 344extern const UWORD unioperands[UNI_LAST];
319 345
320/* IT / S3M Extended SS effects: */ 346/* IT / S3M Extended SS effects: */
321enum { 347enum {
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 */
339enum { 365enum {
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
357typedef struct FILTER { 383typedef 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
408typedef struct ENVPR { 434typedef 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
421typedef struct MP_CHANNEL { 447typedef 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
445typedef struct MP_CONTROL { 471typedef 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). */
520typedef struct MP_VOICE { 546typedef 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
541typedef struct MLOADER { 567typedef struct MLOADER {
542struct 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 */
553extern MREADER* modreader; 579extern MREADER* modreader;
554extern UWORD finetune[16];
555extern MODULE of; /* static unimod loading space */ 580extern MODULE of; /* static unimod loading space */
556extern UWORD npertab[7*OCTAVE]; /* used by the original MOD loaders */ 581extern const UWORD finetune[16];
582extern const UWORD npertab[7*OCTAVE];/* used by the original MOD loaders */
557 583
558extern SBYTE remap[UF_MAXCHAN]; /* for removing empty channels */ 584extern SBYTE remap[UF_MAXCHAN]; /* for removing empty channels */
559extern UBYTE* poslookup; /* lookup table for pattern jumps after 585extern UBYTE* poslookup; /* lookup table for pattern jumps after
560 blank pattern removal */ 586 blank pattern removal */
561extern UWORD poslookupcnt; 587extern UWORD poslookupcnt;
562extern UWORD* origpositions; 588extern UWORD* origpositions;
563 589
@@ -577,8 +603,7 @@ extern int AllocPatterns(void);
577extern int AllocTracks(void); 603extern int AllocTracks(void);
578extern int AllocInstruments(void); 604extern int AllocInstruments(void);
579extern int AllocSamples(void); 605extern int AllocSamples(void);
580extern CHAR* DupStr(CHAR*,UWORD,int); 606extern CHAR* DupStr(const CHAR*, UWORD, int);
581extern CHAR* StrDup(CHAR *s);
582 607
583/* loader utility functions */ 608/* loader utility functions */
584extern int* AllocLinear(void); 609extern int* AllocLinear(void);
@@ -588,28 +613,38 @@ extern void S3MIT_ProcessCmd(UBYTE,UBYTE,unsigned int);
588extern void S3MIT_CreateOrders(int); 613extern 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). */
596extern UWORD getlinearperiod(UWORD,ULONG); 621extern UWORD getlinearperiod(UWORD,ULONG);
597extern ULONG getfrequency(UWORD,ULONG); 622extern ULONG getfrequency(UWORD,ULONG);
598 623
599/* loader shared data */ 624/* loader shared data */
600#define STM_NTRACKERS 3 625#define STM_NTRACKERS 3
601extern CHAR *STM_Signatures[STM_NTRACKERS]; 626extern const CHAR *STM_Signatures[STM_NTRACKERS];
602 627
603/*========== Player interface */ 628/*========== Player interface */
604 629
605extern int Player_Init(MODULE*); 630extern int Player_Init(MODULE*);
606extern void Player_Exit(MODULE*); 631extern void Player_Exit(MODULE*);
607extern void Player_HandleTick(void); 632extern void Player_HandleTick(void);
608 633
634/*========== UnPackers */
635
636typedef int (*MUNPACKER) (struct MREADER*,
637 void** /* unpacked data out */ ,
638 long* /* unpacked data size */ );
639extern int PP20_Unpack(MREADER*, void**, long*);
640extern int MMCMP_Unpack(MREADER*, void**, long*);
641extern int XPK_Unpack(MREADER*, void**, long*);
642extern 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 */
615extern UWORD md_bpm; /* current song / hardware BPM rate */ 650extern 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. */
628extern void (*md_player)(void); 663extern MikMod_player_t md_player;
629 664
630extern SWORD MD_SampleLoad(SAMPLOAD*,int); 665extern SWORD MD_SampleLoad(SAMPLOAD*,int);
631extern void MD_SampleUnload(SWORD); 666extern void MD_SampleUnload(SWORD);
@@ -636,17 +671,17 @@ extern ULONG MD_SampleLength(int,SAMPLE*);
636extern void unsignedtoulaw(char *,int); 671extern void unsignedtoulaw(char *,int);
637 672
638/* Parameter extraction helper */ 673/* Parameter extraction helper */
639extern CHAR *MD_GetAtom(CHAR*,CHAR*,int); 674extern CHAR *MD_GetAtom(const CHAR*, const CHAR*, int);
640 675
641/* Internal software mixer stuff */ 676/* Internal software mixer stuff */
642extern void VC_SetupPointers(void); 677extern void VC_SetupPointers(void);
643extern int VC1_Init(void); 678extern int VC1_Init(void);
644extern int VC2_Init(void); 679extern 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 */
648extern int MD_Access(CHAR *); 683extern int MD_Access(const CHAR *);
649extern int MD_DropPrivileges(void); 684extern 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*);
659extern void _mm_registerloader(struct MLOADER*); 694extern void _mm_registerloader(struct MLOADER*);
660extern int MikMod_Active_internal(void); 695extern int MikMod_Active_internal(void);
661extern void MikMod_DisableOutput_internal(void); 696extern void MikMod_DisableOutput_internal(void);
662extern int MikMod_EnableOutput_internal(void); 697extern int MikMod_EnableOutput_internal(void);
663extern void MikMod_Exit_internal(void); 698extern void MikMod_Exit_internal(void);
664extern int MikMod_SetNumVoices_internal(int,int); 699extern int MikMod_SetNumVoices_internal(int,int);
665extern void Player_Exit_internal(MODULE*); 700extern void Player_Exit_internal(MODULE*);
666extern void Player_Stop_internal(void); 701extern void Player_Stop_internal(void);
667extern int Player_Paused_internal(void); 702extern int Player_Paused_internal(void);
@@ -673,6 +708,15 @@ extern void Voice_SetVolume_internal(SBYTE,UWORD);
673extern void Voice_Stop_internal(SBYTE); 708extern void Voice_Stop_internal(SBYTE);
674extern int Voice_Stopped_internal(SBYTE); 709extern int Voice_Stopped_internal(SBYTE);
675 710
711extern int VC1_PlayStart(void);
712extern int VC2_PlayStart(void);
713extern void VC1_PlayStop(void);
714extern void VC2_PlayStop(void);
715extern int VC1_SetNumVoices(void);
716extern int VC2_SetNumVoices(void);
717
718extern 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 */
721static inline vector float vec_mul( const vector float a, const vector float b) 771static 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 */
727static inline vector float vec_load_ps1(const float *pF ) 776static 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 */
734static inline const vector float vec_setzero() 782static inline vector float vec_setzero() {
735{ 783 return (vector float) (0.);
736 return (const vector float) (0.);
737} 784}
738 785
739static inline vector signed char vec_set1_8(unsigned char splatchar) 786static 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 */
757static inline vector signed int vec_unpacklo(vector signed int a, vector signed int b) 803static 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). */
763static inline vector signed int vec_hiqq(vector signed int a) 808static 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
785static __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). 829static __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
854extern "C" {
855#endif
856void* MikMod_amalloc(size_t);
857void 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: */