Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 3 | pmbaty | 1 | /* MikMod sound library |
| 2 | (c) 1998, 1999, 2000 Miodrag Vallat and others - see file AUTHORS |
||
| 3 | for complete list. |
||
| 4 | |||
| 5 | This library is free software; you can redistribute it and/or modify |
||
| 6 | it under the terms of the GNU Library General Public License as |
||
| 7 | published by the Free Software Foundation; either version 2 of |
||
| 8 | the License, or (at your option) any later version. |
||
| 9 | |||
| 10 | This program is distributed in the hope that it will be useful, |
||
| 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 13 | GNU Library General Public License for more details. |
||
| 14 | |||
| 15 | You should have received a copy of the GNU Library General Public |
||
| 16 | License along with this library; if not, write to the Free Software |
||
| 17 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
||
| 18 | 02111-1307, USA. |
||
| 19 | */ |
||
| 20 | |||
| 21 | /*============================================================================== |
||
| 22 | |||
| 23 | $Id: mikmod.h.in,v 1.2 2004/06/01 16:43:45 raph Exp $ |
||
| 24 | |||
| 25 | MikMod sound library include file |
||
| 26 | |||
| 27 | ==============================================================================*/ |
||
| 28 | |||
| 29 | #ifndef _MIKMOD_H_ |
||
| 30 | #define _MIKMOD_H_ |
||
| 31 | |||
| 32 | #include <stdio.h> |
||
| 33 | #include <stdlib.h> |
||
| 34 | |||
| 35 | #ifdef __cplusplus |
||
| 36 | extern "C" { |
||
| 37 | #endif |
||
| 38 | |||
| 39 | /* |
||
| 40 | * ========== Compiler magic for shared libraries |
||
| 41 | */ |
||
| 42 | |||
| 43 | #if defined WIN32 && defined _DLL |
||
| 44 | #ifdef DLL_EXPORTS |
||
| 45 | #define MIKMODAPI __declspec(dllexport) |
||
| 46 | #else |
||
| 47 | #define MIKMODAPI __declspec(dllimport) |
||
| 48 | #endif |
||
| 49 | #else |
||
| 50 | #define MIKMODAPI |
||
| 51 | #endif |
||
| 52 | |||
| 53 | /* |
||
| 54 | * ========== Library version |
||
| 55 | */ |
||
| 56 | |||
| 57 | #define LIBMIKMOD_VERSION_MAJOR 3L |
||
| 58 | #define LIBMIKMOD_VERSION_MINOR 1L |
||
| 59 | #define LIBMIKMOD_REVISION 10L |
||
| 60 | |||
| 61 | #define LIBMIKMOD_VERSION \ |
||
| 62 | ((LIBMIKMOD_VERSION_MAJOR<<16)| \ |
||
| 63 | (LIBMIKMOD_VERSION_MINOR<< 8)| \ |
||
| 64 | (LIBMIKMOD_REVISION)) |
||
| 65 | |||
| 66 | MIKMODAPI extern long MikMod_GetVersion(void); |
||
| 67 | |||
| 68 | /* |
||
| 69 | * ========== Platform independent-type definitions |
||
| 70 | */ |
||
| 71 | |||
| 72 | #ifdef WIN32 |
||
| 73 | #define WIN32_LEAN_AND_MEAN |
||
| 74 | #include <windows.h> |
||
| 75 | #include <io.h> |
||
| 76 | #include <mmsystem.h> |
||
| 77 | #endif |
||
| 78 | |||
| 79 | #if defined(__OS2__)||defined(__EMX__) |
||
| 80 | #define INCL_DOSSEMAPHORES |
||
| 81 | #include <os2.h> |
||
| 82 | #else |
||
| 83 | typedef char CHAR; |
||
| 84 | #endif |
||
| 85 | |||
| 86 | |||
| 87 | |||
| 88 | #if defined(__arch64__) || defined(__alpha) || defined(__x86_64) || defined(_LP64) |
||
| 89 | /* 64 bit architectures */ |
||
| 90 | |||
| 91 | typedef signed char SBYTE; /* 1 byte, signed */ |
||
| 92 | typedef unsigned char UBYTE; /* 1 byte, unsigned */ |
||
| 93 | typedef signed short SWORD; /* 2 bytes, signed */ |
||
| 94 | typedef unsigned short UWORD; /* 2 bytes, unsigned */ |
||
| 95 | typedef signed int SLONG; /* 4 bytes, signed */ |
||
| 96 | typedef unsigned int ULONG; /* 4 bytes, unsigned */ |
||
| 97 | typedef int BOOL; /* 0=false, <>0 true */ |
||
| 98 | |||
| 99 | #else |
||
| 100 | /* 32 bit architectures */ |
||
| 101 | |||
| 102 | typedef signed char SBYTE; /* 1 byte, signed */ |
||
| 103 | typedef unsigned char UBYTE; /* 1 byte, unsigned */ |
||
| 104 | typedef signed short SWORD; /* 2 bytes, signed */ |
||
| 105 | typedef unsigned short UWORD; /* 2 bytes, unsigned */ |
||
| 106 | typedef signed long SLONG; /* 4 bytes, signed */ |
||
| 107 | #if !defined(__OS2__)&&!defined(__EMX__)&&!defined(WIN32) |
||
| 108 | typedef unsigned long ULONG; /* 4 bytes, unsigned */ |
||
| 109 | typedef int BOOL; /* 0=false, <>0 true */ |
||
| 110 | #endif |
||
| 111 | #endif |
||
| 112 | |||
| 113 | /* |
||
| 114 | * ========== Error codes |
||
| 115 | */ |
||
| 116 | |||
| 117 | enum { |
||
| 118 | MMERR_OPENING_FILE = 1, |
||
| 119 | MMERR_OUT_OF_MEMORY, |
||
| 120 | MMERR_DYNAMIC_LINKING, |
||
| 121 | |||
| 122 | MMERR_SAMPLE_TOO_BIG, |
||
| 123 | MMERR_OUT_OF_HANDLES, |
||
| 124 | MMERR_UNKNOWN_WAVE_TYPE, |
||
| 125 | |||
| 126 | MMERR_LOADING_PATTERN, |
||
| 127 | MMERR_LOADING_TRACK, |
||
| 128 | MMERR_LOADING_HEADER, |
||
| 129 | MMERR_LOADING_SAMPLEINFO, |
||
| 130 | MMERR_NOT_A_MODULE, |
||
| 131 | MMERR_NOT_A_STREAM, |
||
| 132 | MMERR_MED_SYNTHSAMPLES, |
||
| 133 | MMERR_ITPACK_INVALID_DATA, |
||
| 134 | |||
| 135 | MMERR_DETECTING_DEVICE, |
||
| 136 | MMERR_INVALID_DEVICE, |
||
| 137 | MMERR_INITIALIZING_MIXER, |
||
| 138 | MMERR_OPENING_AUDIO, |
||
| 139 | MMERR_8BIT_ONLY, |
||
| 140 | MMERR_16BIT_ONLY, |
||
| 141 | MMERR_STEREO_ONLY, |
||
| 142 | MMERR_ULAW, |
||
| 143 | MMERR_NON_BLOCK, |
||
| 144 | |||
| 145 | MMERR_AF_AUDIO_PORT, |
||
| 146 | |||
| 147 | MMERR_AIX_CONFIG_INIT, |
||
| 148 | MMERR_AIX_CONFIG_CONTROL, |
||
| 149 | MMERR_AIX_CONFIG_START, |
||
| 150 | |||
| 151 | MMERR_GUS_SETTINGS, |
||
| 152 | MMERR_GUS_RESET, |
||
| 153 | MMERR_GUS_TIMER, |
||
| 154 | |||
| 155 | MMERR_HP_SETSAMPLESIZE, |
||
| 156 | MMERR_HP_SETSPEED, |
||
| 157 | MMERR_HP_CHANNELS, |
||
| 158 | MMERR_HP_AUDIO_OUTPUT, |
||
| 159 | MMERR_HP_AUDIO_DESC, |
||
| 160 | MMERR_HP_BUFFERSIZE, |
||
| 161 | |||
| 162 | MMERR_OSS_SETFRAGMENT, |
||
| 163 | MMERR_OSS_SETSAMPLESIZE, |
||
| 164 | MMERR_OSS_SETSTEREO, |
||
| 165 | MMERR_OSS_SETSPEED, |
||
| 166 | |||
| 167 | MMERR_SGI_SPEED, |
||
| 168 | MMERR_SGI_16BIT, |
||
| 169 | MMERR_SGI_8BIT, |
||
| 170 | MMERR_SGI_STEREO, |
||
| 171 | MMERR_SGI_MONO, |
||
| 172 | |||
| 173 | MMERR_SUN_INIT, |
||
| 174 | |||
| 175 | MMERR_OS2_MIXSETUP, |
||
| 176 | MMERR_OS2_SEMAPHORE, |
||
| 177 | MMERR_OS2_TIMER, |
||
| 178 | MMERR_OS2_THREAD, |
||
| 179 | |||
| 180 | MMERR_DS_PRIORITY, |
||
| 181 | MMERR_DS_BUFFER, |
||
| 182 | MMERR_DS_FORMAT, |
||
| 183 | MMERR_DS_NOTIFY, |
||
| 184 | MMERR_DS_EVENT, |
||
| 185 | MMERR_DS_THREAD, |
||
| 186 | MMERR_DS_UPDATE, |
||
| 187 | |||
| 188 | MMERR_WINMM_HANDLE, |
||
| 189 | MMERR_WINMM_ALLOCATED, |
||
| 190 | MMERR_WINMM_DEVICEID, |
||
| 191 | MMERR_WINMM_FORMAT, |
||
| 192 | MMERR_WINMM_UNKNOWN, |
||
| 193 | |||
| 194 | MMERR_MAC_SPEED, |
||
| 195 | MMERR_MAC_START, |
||
| 196 | |||
| 197 | MMERR_MAX |
||
| 198 | }; |
||
| 199 | |||
| 200 | /* |
||
| 201 | * ========== Error handling |
||
| 202 | */ |
||
| 203 | |||
| 204 | typedef void (MikMod_handler)(void); |
||
| 205 | typedef MikMod_handler *MikMod_handler_t; |
||
| 206 | |||
| 207 | MIKMODAPI extern int MikMod_errno; |
||
| 208 | MIKMODAPI extern BOOL MikMod_critical; |
||
| 209 | MIKMODAPI extern char *MikMod_strerror(int); |
||
| 210 | |||
| 211 | MIKMODAPI extern MikMod_handler_t MikMod_RegisterErrorHandler(MikMod_handler_t); |
||
| 212 | |||
| 213 | /* |
||
| 214 | * ========== Library initialization and core functions |
||
| 215 | */ |
||
| 216 | |||
| 217 | struct MDRIVER; |
||
| 218 | |||
| 219 | MIKMODAPI extern void MikMod_RegisterAllDrivers(void); |
||
| 220 | |||
| 221 | MIKMODAPI extern CHAR* MikMod_InfoDriver(void); |
||
| 222 | MIKMODAPI extern void MikMod_RegisterDriver(struct MDRIVER*); |
||
| 223 | MIKMODAPI extern int MikMod_DriverFromAlias(CHAR*); |
||
| 224 | |||
| 225 | MIKMODAPI extern BOOL MikMod_Init(CHAR*); |
||
| 226 | MIKMODAPI extern void MikMod_Exit(void); |
||
| 227 | MIKMODAPI extern BOOL MikMod_Reset(CHAR*); |
||
| 228 | MIKMODAPI extern BOOL MikMod_SetNumVoices(int,int); |
||
| 229 | MIKMODAPI extern BOOL MikMod_Active(void); |
||
| 230 | MIKMODAPI extern BOOL MikMod_EnableOutput(void); |
||
| 231 | MIKMODAPI extern void MikMod_DisableOutput(void); |
||
| 232 | MIKMODAPI extern void MikMod_Update(void); |
||
| 233 | |||
| 234 | MIKMODAPI extern BOOL MikMod_InitThreads(void); |
||
| 235 | MIKMODAPI extern void MikMod_Lock(void); |
||
| 236 | MIKMODAPI extern void MikMod_Unlock(void); |
||
| 237 | |||
| 238 | /* |
||
| 239 | * ========== Reader, Writer |
||
| 240 | */ |
||
| 241 | |||
| 242 | typedef struct MREADER { |
||
| 243 | BOOL (*Seek)(struct MREADER*,long,int); |
||
| 244 | long (*Tell)(struct MREADER*); |
||
| 245 | BOOL (*Read)(struct MREADER*,void*,size_t); |
||
| 246 | int (*Get)(struct MREADER*); |
||
| 247 | BOOL (*Eof)(struct MREADER*); |
||
| 248 | } MREADER; |
||
| 249 | |||
| 250 | typedef struct MWRITER { |
||
| 251 | BOOL (*Seek)(struct MWRITER*,long,int); |
||
| 252 | long (*Tell)(struct MWRITER*); |
||
| 253 | BOOL (*Write)(struct MWRITER*,void*,size_t); |
||
| 254 | BOOL (*Put)(struct MWRITER*,int); |
||
| 255 | } MWRITER; |
||
| 256 | |||
| 257 | /* |
||
| 258 | * ========== Samples |
||
| 259 | */ |
||
| 260 | |||
| 261 | /* Sample playback should not be interrupted */ |
||
| 262 | #define SFX_CRITICAL 1 |
||
| 263 | |||
| 264 | /* Sample format [loading and in-memory] flags: */ |
||
| 265 | #define SF_16BITS 0x0001 |
||
| 266 | #define SF_STEREO 0x0002 |
||
| 267 | #define SF_SIGNED 0x0004 |
||
| 268 | #define SF_BIG_ENDIAN 0x0008 |
||
| 269 | #define SF_DELTA 0x0010 |
||
| 270 | #define SF_ITPACKED 0x0020 |
||
| 271 | |||
| 272 | #define SF_FORMATMASK 0x003F |
||
| 273 | |||
| 274 | /* General Playback flags */ |
||
| 275 | |||
| 276 | #define SF_LOOP 0x0100 |
||
| 277 | #define SF_BIDI 0x0200 |
||
| 278 | #define SF_REVERSE 0x0400 |
||
| 279 | #define SF_SUSTAIN 0x0800 |
||
| 280 | |||
| 281 | #define SF_PLAYBACKMASK 0x0C00 |
||
| 282 | |||
| 283 | /* Module-only Playback Flags */ |
||
| 284 | |||
| 285 | #define SF_OWNPAN 0x1000 |
||
| 286 | #define SF_UST_LOOP 0x2000 |
||
| 287 | |||
| 288 | #define SF_EXTRAPLAYBACKMASK 0x3000 |
||
| 289 | |||
| 290 | /* Panning constants */ |
||
| 291 | #define PAN_LEFT 0 |
||
| 292 | #define PAN_HALFLEFT 64 |
||
| 293 | #define PAN_CENTER 128 |
||
| 294 | #define PAN_HALFRIGHT 192 |
||
| 295 | #define PAN_RIGHT 255 |
||
| 296 | #define PAN_SURROUND 512 /* panning value for Dolby Surround */ |
||
| 297 | |||
| 298 | typedef struct SAMPLE { |
||
| 299 | SWORD panning; /* panning (0-255 or PAN_SURROUND) */ |
||
| 300 | ULONG speed; /* Base playing speed/frequency of note */ |
||
| 301 | UBYTE volume; /* volume 0-64 */ |
||
| 302 | UWORD inflags; /* sample format on disk */ |
||
| 303 | UWORD flags; /* sample format in memory */ |
||
| 304 | ULONG length; /* length of sample (in samples!) */ |
||
| 305 | ULONG loopstart; /* repeat position (relative to start, in samples) */ |
||
| 306 | ULONG loopend; /* repeat end */ |
||
| 307 | ULONG susbegin; /* sustain loop begin (in samples) \ Not Supported */ |
||
| 308 | ULONG susend; /* sustain loop end / Yet! */ |
||
| 309 | |||
| 310 | /* Variables used by the module player only! (ignored for sound effects) */ |
||
| 311 | UBYTE globvol; /* global volume */ |
||
| 312 | UBYTE vibflags; /* autovibrato flag stuffs */ |
||
| 313 | UBYTE vibtype; /* Vibratos moved from INSTRUMENT to SAMPLE */ |
||
| 314 | UBYTE vibsweep; |
||
| 315 | UBYTE vibdepth; |
||
| 316 | UBYTE vibrate; |
||
| 317 | CHAR* samplename; /* name of the sample */ |
||
| 318 | |||
| 319 | /* Values used internally only */ |
||
| 320 | UWORD avibpos; /* autovibrato pos [player use] */ |
||
| 321 | UBYTE divfactor; /* for sample scaling, maintains proper period slides */ |
||
| 322 | ULONG seekpos; /* seek position in file */ |
||
| 323 | SWORD handle; /* sample handle used by individual drivers */ |
||
| 324 | } SAMPLE; |
||
| 325 | |||
| 326 | /* Sample functions */ |
||
| 327 | |||
| 328 | MIKMODAPI extern SAMPLE *Sample_Load(CHAR*); |
||
| 329 | MIKMODAPI extern SAMPLE *Sample_LoadFP(FILE*); |
||
| 330 | MIKMODAPI extern SAMPLE *Sample_LoadGeneric(MREADER*); |
||
| 331 | MIKMODAPI extern void Sample_Free(SAMPLE*); |
||
| 332 | MIKMODAPI extern SBYTE Sample_Play(SAMPLE*,ULONG,UBYTE); |
||
| 333 | |||
| 334 | MIKMODAPI extern void Voice_SetVolume(SBYTE,UWORD); |
||
| 335 | MIKMODAPI extern UWORD Voice_GetVolume(SBYTE); |
||
| 336 | MIKMODAPI extern void Voice_SetFrequency(SBYTE,ULONG); |
||
| 337 | MIKMODAPI extern ULONG Voice_GetFrequency(SBYTE); |
||
| 338 | MIKMODAPI extern void Voice_SetPanning(SBYTE,ULONG); |
||
| 339 | MIKMODAPI extern ULONG Voice_GetPanning(SBYTE); |
||
| 340 | MIKMODAPI extern void Voice_Play(SBYTE,SAMPLE*,ULONG); |
||
| 341 | MIKMODAPI extern void Voice_Stop(SBYTE); |
||
| 342 | MIKMODAPI extern BOOL Voice_Stopped(SBYTE); |
||
| 343 | MIKMODAPI extern SLONG Voice_GetPosition(SBYTE); |
||
| 344 | MIKMODAPI extern ULONG Voice_RealVolume(SBYTE); |
||
| 345 | |||
| 346 | /* |
||
| 347 | * ========== Internal module representation (UniMod) |
||
| 348 | */ |
||
| 349 | |||
| 350 | /* |
||
| 351 | Instrument definition - for information only, the only field which may be |
||
| 352 | of use in user programs is the name field |
||
| 353 | */ |
||
| 354 | |||
| 355 | /* Instrument note count */ |
||
| 356 | #define INSTNOTES 120 |
||
| 357 | |||
| 358 | /* Envelope point */ |
||
| 359 | typedef struct ENVPT { |
||
| 360 | SWORD pos; |
||
| 361 | SWORD val; |
||
| 362 | } ENVPT; |
||
| 363 | |||
| 364 | /* Envelope point count */ |
||
| 365 | #define ENVPOINTS 32 |
||
| 366 | |||
| 367 | /* Instrument structure */ |
||
| 368 | typedef struct INSTRUMENT { |
||
| 369 | CHAR* insname; |
||
| 370 | |||
| 371 | UBYTE flags; |
||
| 372 | UWORD samplenumber[INSTNOTES]; |
||
| 373 | UBYTE samplenote[INSTNOTES]; |
||
| 374 | |||
| 375 | UBYTE nnatype; |
||
| 376 | UBYTE dca; /* duplicate check action */ |
||
| 377 | UBYTE dct; /* duplicate check type */ |
||
| 378 | UBYTE globvol; |
||
| 379 | UWORD volfade; |
||
| 380 | SWORD panning; /* instrument-based panning var */ |
||
| 381 | |||
| 382 | UBYTE pitpansep; /* pitch pan separation (0 to 255) */ |
||
| 383 | UBYTE pitpancenter; /* pitch pan center (0 to 119) */ |
||
| 384 | UBYTE rvolvar; /* random volume varations (0 - 100%) */ |
||
| 385 | UBYTE rpanvar; /* random panning varations (0 - 100%) */ |
||
| 386 | |||
| 387 | /* volume envelope */ |
||
| 388 | UBYTE volflg; /* bit 0: on 1: sustain 2: loop */ |
||
| 389 | UBYTE volpts; |
||
| 390 | UBYTE volsusbeg; |
||
| 391 | UBYTE volsusend; |
||
| 392 | UBYTE volbeg; |
||
| 393 | UBYTE volend; |
||
| 394 | ENVPT volenv[ENVPOINTS]; |
||
| 395 | /* panning envelope */ |
||
| 396 | UBYTE panflg; /* bit 0: on 1: sustain 2: loop */ |
||
| 397 | UBYTE panpts; |
||
| 398 | UBYTE pansusbeg; |
||
| 399 | UBYTE pansusend; |
||
| 400 | UBYTE panbeg; |
||
| 401 | UBYTE panend; |
||
| 402 | ENVPT panenv[ENVPOINTS]; |
||
| 403 | /* pitch envelope */ |
||
| 404 | UBYTE pitflg; /* bit 0: on 1: sustain 2: loop */ |
||
| 405 | UBYTE pitpts; |
||
| 406 | UBYTE pitsusbeg; |
||
| 407 | UBYTE pitsusend; |
||
| 408 | UBYTE pitbeg; |
||
| 409 | UBYTE pitend; |
||
| 410 | ENVPT pitenv[ENVPOINTS]; |
||
| 411 | } INSTRUMENT; |
||
| 412 | |||
| 413 | struct MP_CONTROL; |
||
| 414 | struct MP_VOICE; |
||
| 415 | |||
| 416 | /* |
||
| 417 | Module definition |
||
| 418 | */ |
||
| 419 | |||
| 420 | /* maximum master channels supported */ |
||
| 421 | #define UF_MAXCHAN 64 |
||
| 422 | |||
| 423 | /* Module flags */ |
||
| 424 | #define UF_XMPERIODS 0x0001 /* XM periods / finetuning */ |
||
| 425 | #define UF_LINEAR 0x0002 /* LINEAR periods (UF_XMPERIODS must be set) */ |
||
| 426 | #define UF_INST 0x0004 /* Instruments are used */ |
||
| 427 | #define UF_NNA 0x0008 /* IT: NNA used, set numvoices rather |
||
| 428 | than numchn */ |
||
| 429 | #define UF_S3MSLIDES 0x0010 /* uses old S3M volume slides */ |
||
| 430 | #define UF_BGSLIDES 0x0020 /* continue volume slides in the background */ |
||
| 431 | #define UF_HIGHBPM 0x0040 /* MED: can use >255 bpm */ |
||
| 432 | #define UF_NOWRAP 0x0080 /* XM-type (i.e. illogical) pattern break |
||
| 433 | semantics */ |
||
| 434 | #define UF_ARPMEM 0x0100 /* IT: need arpeggio memory */ |
||
| 435 | #define UF_FT2QUIRKS 0x0200 /* emulate some FT2 replay quirks */ |
||
| 436 | #define UF_PANNING 0x0400 /* module uses panning effects or have |
||
| 437 | non-tracker default initial panning */ |
||
| 438 | |||
| 439 | typedef struct MODULE { |
||
| 440 | /* general module information */ |
||
| 441 | CHAR* songname; /* name of the song */ |
||
| 442 | CHAR* modtype; /* string type of module loaded */ |
||
| 443 | CHAR* comment; /* module comments */ |
||
| 444 | |||
| 445 | UWORD flags; /* See module flags above */ |
||
| 446 | UBYTE numchn; /* number of module channels */ |
||
| 447 | UBYTE numvoices; /* max # voices used for full NNA playback */ |
||
| 448 | UWORD numpos; /* number of positions in this song */ |
||
| 449 | UWORD numpat; /* number of patterns in this song */ |
||
| 450 | UWORD numins; /* number of instruments */ |
||
| 451 | UWORD numsmp; /* number of samples */ |
||
| 452 | struct INSTRUMENT* instruments; /* all instruments */ |
||
| 453 | struct SAMPLE* samples; /* all samples */ |
||
| 454 | UBYTE realchn; /* real number of channels used */ |
||
| 455 | UBYTE totalchn; /* total number of channels used (incl NNAs) */ |
||
| 456 | |||
| 457 | /* playback settings */ |
||
| 458 | UWORD reppos; /* restart position */ |
||
| 459 | UBYTE initspeed; /* initial song speed */ |
||
| 460 | UWORD inittempo; /* initial song tempo */ |
||
| 461 | UBYTE initvolume; /* initial global volume (0 - 128) */ |
||
| 462 | UWORD panning[UF_MAXCHAN]; /* panning positions */ |
||
| 463 | UBYTE chanvol[UF_MAXCHAN]; /* channel positions */ |
||
| 464 | UWORD bpm; /* current beats-per-minute speed */ |
||
| 465 | UWORD sngspd; /* current song speed */ |
||
| 466 | SWORD volume; /* song volume (0-128) (or user volume) */ |
||
| 467 | |||
| 468 | BOOL extspd; /* extended speed flag (default enabled) */ |
||
| 469 | BOOL panflag; /* panning flag (default enabled) */ |
||
| 470 | BOOL wrap; /* wrap module ? (default disabled) */ |
||
| 471 | BOOL loop; /* allow module to loop ? (default enabled) */ |
||
| 472 | BOOL fadeout; /* volume fade out during last pattern */ |
||
| 473 | |||
| 474 | UWORD patpos; /* current row number */ |
||
| 475 | SWORD sngpos; /* current song position */ |
||
| 476 | ULONG sngtime; /* current song time in 2^-10 seconds */ |
||
| 477 | |||
| 478 | SWORD relspd; /* relative speed factor */ |
||
| 479 | |||
| 480 | /* internal module representation */ |
||
| 481 | UWORD numtrk; /* number of tracks */ |
||
| 482 | UBYTE** tracks; /* array of numtrk pointers to tracks */ |
||
| 483 | UWORD* patterns; /* array of Patterns */ |
||
| 484 | UWORD* pattrows; /* array of number of rows for each pattern */ |
||
| 485 | UWORD* positions; /* all positions */ |
||
| 486 | |||
| 487 | BOOL forbid; /* if true, no player update! */ |
||
| 488 | UWORD numrow; /* number of rows on current pattern */ |
||
| 489 | UWORD vbtick; /* tick counter (counts from 0 to sngspd) */ |
||
| 490 | UWORD sngremainder;/* used for song time computation */ |
||
| 491 | |||
| 492 | struct MP_CONTROL* control; /* Effects Channel info (size pf->numchn) */ |
||
| 493 | struct MP_VOICE* voice; /* Audio Voice information (size md_numchn) */ |
||
| 494 | |||
| 495 | UBYTE globalslide; /* global volume slide rate */ |
||
| 496 | UBYTE pat_repcrazy;/* module has just looped to position -1 */ |
||
| 497 | UWORD patbrk; /* position where to start a new pattern */ |
||
| 498 | UBYTE patdly; /* patterndelay counter (command memory) */ |
||
| 499 | UBYTE patdly2; /* patterndelay counter (real one) */ |
||
| 500 | SWORD posjmp; /* flag to indicate a jump is needed... */ |
||
| 501 | UWORD bpmlimit; /* threshold to detect bpm or speed values */ |
||
| 502 | } MODULE; |
||
| 503 | |||
| 504 | /* |
||
| 505 | * ========== Module loaders |
||
| 506 | */ |
||
| 507 | |||
| 508 | struct MLOADER; |
||
| 509 | |||
| 510 | MIKMODAPI extern CHAR* MikMod_InfoLoader(void); |
||
| 511 | MIKMODAPI extern void MikMod_RegisterAllLoaders(void); |
||
| 512 | MIKMODAPI extern void MikMod_RegisterLoader(struct MLOADER*); |
||
| 513 | |||
| 514 | MIKMODAPI extern struct MLOADER load_669; /* 669 and Extended-669 (by Tran/Renaissance) */ |
||
| 515 | MIKMODAPI extern struct MLOADER load_amf; /* DMP Advanced Module Format (by Otto Chrons) */ |
||
| 516 | MIKMODAPI extern struct MLOADER load_dsm; /* DSIK internal module format */ |
||
| 517 | MIKMODAPI extern struct MLOADER load_far; /* Farandole Composer (by Daniel Potter) */ |
||
| 518 | MIKMODAPI extern struct MLOADER load_gdm; /* General DigiMusic (by Edward Schlunder) */ |
||
| 519 | MIKMODAPI extern struct MLOADER load_it; /* Impulse Tracker (by Jeffrey Lim) */ |
||
| 520 | MIKMODAPI extern struct MLOADER load_imf; /* Imago Orpheus (by Lutz Roeder) */ |
||
| 521 | MIKMODAPI extern struct MLOADER load_med; /* Amiga MED modules (by Teijo Kinnunen) */ |
||
| 522 | MIKMODAPI extern struct MLOADER load_m15; /* Soundtracker 15-instrument */ |
||
| 523 | MIKMODAPI extern struct MLOADER load_mod; /* Standard 31-instrument Module loader */ |
||
| 524 | MIKMODAPI extern struct MLOADER load_mtm; /* Multi-Tracker Module (by Renaissance) */ |
||
| 525 | MIKMODAPI extern struct MLOADER load_okt; /* Amiga Oktalyzer */ |
||
| 526 | MIKMODAPI extern struct MLOADER load_stm; /* ScreamTracker 2 (by Future Crew) */ |
||
| 527 | MIKMODAPI extern struct MLOADER load_stx; /* STMIK 0.2 (by Future Crew) */ |
||
| 528 | MIKMODAPI extern struct MLOADER load_s3m; /* ScreamTracker 3 (by Future Crew) */ |
||
| 529 | MIKMODAPI extern struct MLOADER load_ult; /* UltraTracker (by MAS) */ |
||
| 530 | MIKMODAPI extern struct MLOADER load_uni; /* MikMod and APlayer internal module format */ |
||
| 531 | MIKMODAPI extern struct MLOADER load_xm; /* FastTracker 2 (by Triton) */ |
||
| 532 | |||
| 533 | /* |
||
| 534 | * ========== Module player |
||
| 535 | */ |
||
| 536 | |||
| 537 | MIKMODAPI extern MODULE* Player_Load(CHAR*,int,BOOL); |
||
| 538 | MIKMODAPI extern MODULE* Player_LoadFP(FILE*,int,BOOL); |
||
| 539 | MIKMODAPI extern MODULE* Player_LoadGeneric(MREADER*,int,BOOL); |
||
| 540 | MIKMODAPI extern CHAR* Player_LoadTitle(CHAR*); |
||
| 541 | MIKMODAPI extern CHAR* Player_LoadTitleFP(FILE*); |
||
| 542 | MIKMODAPI extern void Player_Free(MODULE*); |
||
| 543 | MIKMODAPI extern void Player_Start(MODULE*); |
||
| 544 | MIKMODAPI extern BOOL Player_Active(void); |
||
| 545 | MIKMODAPI extern void Player_Stop(void); |
||
| 546 | MIKMODAPI extern void Player_TogglePause(void); |
||
| 547 | MIKMODAPI extern BOOL Player_Paused(void); |
||
| 548 | MIKMODAPI extern void Player_NextPosition(void); |
||
| 549 | MIKMODAPI extern void Player_PrevPosition(void); |
||
| 550 | MIKMODAPI extern void Player_SetPosition(UWORD); |
||
| 551 | MIKMODAPI extern BOOL Player_Muted(UBYTE); |
||
| 552 | MIKMODAPI extern void Player_SetVolume(SWORD); |
||
| 553 | MIKMODAPI extern MODULE* Player_GetModule(void); |
||
| 554 | MIKMODAPI extern void Player_SetSpeed(UWORD); |
||
| 555 | MIKMODAPI extern void Player_SetTempo(UWORD); |
||
| 556 | MIKMODAPI extern void Player_Unmute(SLONG,...); |
||
| 557 | MIKMODAPI extern void Player_Mute(SLONG,...); |
||
| 558 | MIKMODAPI extern void Player_ToggleMute(SLONG,...); |
||
| 559 | MIKMODAPI extern int Player_GetChannelVoice(UBYTE); |
||
| 560 | MIKMODAPI extern UWORD Player_GetChannelPeriod(UBYTE); |
||
| 561 | |||
| 562 | typedef void (MikMod_player)(void); |
||
| 563 | typedef MikMod_player *MikMod_player_t; |
||
| 564 | |||
| 565 | MIKMODAPI extern MikMod_player_t MikMod_RegisterPlayer(MikMod_player_t); |
||
| 566 | |||
| 567 | #define MUTE_EXCLUSIVE 32000 |
||
| 568 | #define MUTE_INCLUSIVE 32001 |
||
| 569 | |||
| 570 | /* |
||
| 571 | * ========== Drivers |
||
| 572 | */ |
||
| 573 | |||
| 574 | enum { |
||
| 575 | MD_MUSIC = 0, |
||
| 576 | MD_SNDFX |
||
| 577 | }; |
||
| 578 | |||
| 579 | enum { |
||
| 580 | MD_HARDWARE = 0, |
||
| 581 | MD_SOFTWARE |
||
| 582 | }; |
||
| 583 | |||
| 584 | /* Mixing flags */ |
||
| 585 | |||
| 586 | /* These ones take effect only after MikMod_Init or MikMod_Reset */ |
||
| 587 | #define DMODE_16BITS 0x0001 /* enable 16 bit output */ |
||
| 588 | #define DMODE_STEREO 0x0002 /* enable stereo output */ |
||
| 589 | #define DMODE_SOFT_SNDFX 0x0004 /* Process sound effects via software mixer */ |
||
| 590 | #define DMODE_SOFT_MUSIC 0x0008 /* Process music via software mixer */ |
||
| 591 | #define DMODE_HQMIXER 0x0010 /* Use high-quality (slower) software mixer */ |
||
| 592 | /* These take effect immediately. */ |
||
| 593 | #define DMODE_SURROUND 0x0100 /* enable surround sound */ |
||
| 594 | #define DMODE_INTERP 0x0200 /* enable interpolation */ |
||
| 595 | #define DMODE_REVERSE 0x0400 /* reverse stereo */ |
||
| 596 | |||
| 597 | struct SAMPLOAD; |
||
| 598 | typedef struct MDRIVER { |
||
| 599 | struct MDRIVER* next; |
||
| 600 | CHAR* Name; |
||
| 601 | CHAR* Version; |
||
| 602 | |||
| 603 | UBYTE HardVoiceLimit; /* Limit of hardware mixer voices */ |
||
| 604 | UBYTE SoftVoiceLimit; /* Limit of software mixer voices */ |
||
| 605 | |||
| 606 | CHAR* Alias; |
||
| 607 | |||
| 608 | void (*CommandLine) (CHAR*); |
||
| 609 | BOOL (*IsPresent) (void); |
||
| 610 | SWORD (*SampleLoad) (struct SAMPLOAD*,int); |
||
| 611 | void (*SampleUnload) (SWORD); |
||
| 612 | ULONG (*FreeSampleSpace) (int); |
||
| 613 | ULONG (*RealSampleLength) (int,struct SAMPLE*); |
||
| 614 | BOOL (*Init) (void); |
||
| 615 | void (*Exit) (void); |
||
| 616 | BOOL (*Reset) (void); |
||
| 617 | BOOL (*SetNumVoices) (void); |
||
| 618 | BOOL (*PlayStart) (void); |
||
| 619 | void (*PlayStop) (void); |
||
| 620 | void (*Update) (void); |
||
| 621 | void (*Pause) (void); |
||
| 622 | void (*VoiceSetVolume) (UBYTE,UWORD); |
||
| 623 | UWORD (*VoiceGetVolume) (UBYTE); |
||
| 624 | void (*VoiceSetFrequency)(UBYTE,ULONG); |
||
| 625 | ULONG (*VoiceGetFrequency)(UBYTE); |
||
| 626 | void (*VoiceSetPanning) (UBYTE,ULONG); |
||
| 627 | ULONG (*VoiceGetPanning) (UBYTE); |
||
| 628 | void (*VoicePlay) (UBYTE,SWORD,ULONG,ULONG,ULONG,ULONG,UWORD); |
||
| 629 | void (*VoiceStop) (UBYTE); |
||
| 630 | BOOL (*VoiceStopped) (UBYTE); |
||
| 631 | SLONG (*VoiceGetPosition) (UBYTE); |
||
| 632 | ULONG (*VoiceRealVolume) (UBYTE); |
||
| 633 | } MDRIVER; |
||
| 634 | |||
| 635 | /* These variables can be changed at ANY time and results will be immediate */ |
||
| 636 | MIKMODAPI extern UBYTE md_volume; /* global sound volume (0-128) */ |
||
| 637 | MIKMODAPI extern UBYTE md_musicvolume; /* volume of song */ |
||
| 638 | MIKMODAPI extern UBYTE md_sndfxvolume; /* volume of sound effects */ |
||
| 639 | MIKMODAPI extern UBYTE md_reverb; /* 0 = none; 15 = chaos */ |
||
| 640 | MIKMODAPI extern UBYTE md_pansep; /* 0 = mono; 128 == 100% (full left/right) */ |
||
| 641 | |||
| 642 | /* The variables below can be changed at any time, but changes will not be |
||
| 643 | implemented until MikMod_Reset is called. A call to MikMod_Reset may result |
||
| 644 | in a skip or pop in audio (depending on the soundcard driver and the settings |
||
| 645 | changed). */ |
||
| 646 | MIKMODAPI extern UWORD md_device; /* device */ |
||
| 647 | MIKMODAPI extern UWORD md_mixfreq; /* mixing frequency */ |
||
| 648 | MIKMODAPI extern UWORD md_mode; /* mode. See DMODE_? flags above */ |
||
| 649 | |||
| 650 | /* The following variable should not be changed! */ |
||
| 651 | MIKMODAPI extern MDRIVER* md_driver; /* Current driver in use. */ |
||
| 652 | |||
| 653 | /* Known drivers list */ |
||
| 654 | |||
| 655 | MIKMODAPI extern struct MDRIVER drv_nos; /* no sound */ |
||
| 656 | MIKMODAPI extern struct MDRIVER drv_pipe; /* piped output */ |
||
| 657 | MIKMODAPI extern struct MDRIVER drv_raw; /* raw file disk writer [music.raw] */ |
||
| 658 | MIKMODAPI extern struct MDRIVER drv_stdout; /* output to stdout */ |
||
| 659 | MIKMODAPI extern struct MDRIVER drv_wav; /* RIFF WAVE file disk writer [music.wav] */ |
||
| 660 | |||
| 661 | MIKMODAPI extern struct MDRIVER drv_ultra; /* Linux Ultrasound driver */ |
||
| 662 | MIKMODAPI extern struct MDRIVER drv_sam9407; /* Linux sam9407 driver */ |
||
| 663 | |||
| 664 | MIKMODAPI extern struct MDRIVER drv_AF; /* Dec Alpha AudioFile */ |
||
| 665 | MIKMODAPI extern struct MDRIVER drv_aix; /* AIX audio device */ |
||
| 666 | MIKMODAPI extern struct MDRIVER drv_alsa; /* Advanced Linux Sound Architecture (ALSA) */ |
||
| 667 | MIKMODAPI extern struct MDRIVER drv_esd; /* Enlightened sound daemon (EsounD) */ |
||
| 668 | MIKMODAPI extern struct MDRIVER drv_hp; /* HP-UX audio device */ |
||
| 669 | MIKMODAPI extern struct MDRIVER drv_oss; /* OpenSound System (Linux,FreeBSD...) */ |
||
| 670 | MIKMODAPI extern struct MDRIVER drv_sgi; /* SGI audio library */ |
||
| 671 | MIKMODAPI extern struct MDRIVER drv_sun; /* Sun/NetBSD/OpenBSD audio device */ |
||
| 672 | |||
| 673 | MIKMODAPI extern struct MDRIVER drv_dart; /* OS/2 Direct Audio RealTime */ |
||
| 674 | MIKMODAPI extern struct MDRIVER drv_os2; /* OS/2 MMPM/2 */ |
||
| 675 | |||
| 676 | MIKMODAPI extern struct MDRIVER drv_ds; /* Win32 DirectSound driver */ |
||
| 677 | MIKMODAPI extern struct MDRIVER drv_win; /* Win32 multimedia API driver */ |
||
| 678 | |||
| 679 | MIKMODAPI extern struct MDRIVER drv_mac; /* Macintosh Sound Manager driver */ |
||
| 680 | |||
| 681 | /*========== Virtual channel mixer interface (for user-supplied drivers only) */ |
||
| 682 | |||
| 683 | MIKMODAPI extern BOOL VC_Init(void); |
||
| 684 | MIKMODAPI extern void VC_Exit(void); |
||
| 685 | MIKMODAPI extern BOOL VC_SetNumVoices(void); |
||
| 686 | MIKMODAPI extern ULONG VC_SampleSpace(int); |
||
| 687 | MIKMODAPI extern ULONG VC_SampleLength(int,SAMPLE*); |
||
| 688 | |||
| 689 | MIKMODAPI extern BOOL VC_PlayStart(void); |
||
| 690 | MIKMODAPI extern void VC_PlayStop(void); |
||
| 691 | |||
| 692 | MIKMODAPI extern SWORD VC_SampleLoad(struct SAMPLOAD*,int); |
||
| 693 | MIKMODAPI extern void VC_SampleUnload(SWORD); |
||
| 694 | |||
| 695 | MIKMODAPI extern ULONG VC_WriteBytes(SBYTE*,ULONG); |
||
| 696 | MIKMODAPI extern ULONG VC_SilenceBytes(SBYTE*,ULONG); |
||
| 697 | |||
| 698 | MIKMODAPI extern void VC_VoiceSetVolume(UBYTE,UWORD); |
||
| 699 | MIKMODAPI extern UWORD VC_VoiceGetVolume(UBYTE); |
||
| 700 | MIKMODAPI extern void VC_VoiceSetFrequency(UBYTE,ULONG); |
||
| 701 | MIKMODAPI extern ULONG VC_VoiceGetFrequency(UBYTE); |
||
| 702 | MIKMODAPI extern void VC_VoiceSetPanning(UBYTE,ULONG); |
||
| 703 | MIKMODAPI extern ULONG VC_VoiceGetPanning(UBYTE); |
||
| 704 | MIKMODAPI extern void VC_VoicePlay(UBYTE,SWORD,ULONG,ULONG,ULONG,ULONG,UWORD); |
||
| 705 | |||
| 706 | MIKMODAPI extern void VC_VoiceStop(UBYTE); |
||
| 707 | MIKMODAPI extern BOOL VC_VoiceStopped(UBYTE); |
||
| 708 | MIKMODAPI extern SLONG VC_VoiceGetPosition(UBYTE); |
||
| 709 | MIKMODAPI extern ULONG VC_VoiceRealVolume(UBYTE); |
||
| 710 | |||
| 711 | #ifdef __cplusplus |
||
| 712 | } |
||
| 713 | #endif |
||
| 714 | |||
| 715 | #endif |
||
| 716 | |||
| 717 | /* ex:set ts=4: */ |