Mercurial > audlegacy-plugins
comparison src/modplug/sndfile.h @ 2218:6907fc39b53f
That didn't merge properly. I'll try again at some other point.
author | William Pitcock <nenolod@atheme.org> |
---|---|
date | Fri, 07 Dec 2007 12:13:37 -0600 |
parents | 3673c7ec4ea2 |
children | 107c1fed3d92 |
comparison
equal
deleted
inserted
replaced
2217:6a4d667a9183 | 2218:6907fc39b53f |
---|---|
3 * | 3 * |
4 * Authors: Olivier Lapicque <olivierl@jps.net>, | 4 * Authors: Olivier Lapicque <olivierl@jps.net>, |
5 * Adam Goode <adam@evdebs.org> (endian and char fixes for PPC) | 5 * Adam Goode <adam@evdebs.org> (endian and char fixes for PPC) |
6 */ | 6 */ |
7 | 7 |
8 #ifdef HAVE_CONFIG_H | 8 #include "config.h" |
9 # include <config.h> | |
10 #endif | |
11 | |
12 #include "diskwriter.h" | |
13 | 9 |
14 #ifndef __SNDFILE_H | 10 #ifndef __SNDFILE_H |
15 #define __SNDFILE_H | 11 #define __SNDFILE_H |
16 | |
17 #define MODPLUG_TRACKER 1 | |
18 #define MODPLUG_PLAYER 1 | |
19 | 12 |
20 #ifdef UNDER_CE | 13 #ifdef UNDER_CE |
21 int _strnicmp(const char *str1,const char *str2, int n); | 14 int _strnicmp(const char *str1,const char *str2, int n); |
22 #endif | 15 #endif |
23 | 16 |
33 #define MAX_SAMPLES 240 | 26 #define MAX_SAMPLES 240 |
34 #define MAX_INSTRUMENTS MAX_SAMPLES | 27 #define MAX_INSTRUMENTS MAX_SAMPLES |
35 #ifdef MODPLUG_FASTSOUNDLIB | 28 #ifdef MODPLUG_FASTSOUNDLIB |
36 #define MAX_CHANNELS 80 | 29 #define MAX_CHANNELS 80 |
37 #else | 30 #else |
38 #define MAX_CHANNELS 256 | 31 #define MAX_CHANNELS 128 |
39 #endif | 32 #endif |
40 #define MAX_BASECHANNELS 64 | 33 #define MAX_BASECHANNELS 64 |
41 #define MAX_ENVPOINTS 32 | 34 #define MAX_ENVPOINTS 32 |
42 #define MIN_PERIOD 0x0020 | 35 #define MIN_PERIOD 0x0020 |
43 #define MAX_PERIOD 0xFFFF | 36 #define MAX_PERIOD 0xFFFF |
70 #define MOD_TYPE_PTM 0x40000 | 63 #define MOD_TYPE_PTM 0x40000 |
71 #define MOD_TYPE_DBM 0x80000 | 64 #define MOD_TYPE_DBM 0x80000 |
72 #define MOD_TYPE_MT2 0x100000 | 65 #define MOD_TYPE_MT2 0x100000 |
73 #define MOD_TYPE_AMF0 0x200000 | 66 #define MOD_TYPE_AMF0 0x200000 |
74 #define MOD_TYPE_PSM 0x400000 | 67 #define MOD_TYPE_PSM 0x400000 |
68 #define MOD_TYPE_J2B 0x800000 | |
75 #define MOD_TYPE_UMX 0x80000000 // Fake type | 69 #define MOD_TYPE_UMX 0x80000000 // Fake type |
76 #define MAX_MODTYPE 23 | 70 #define MAX_MODTYPE 23 |
77 | 71 |
78 | 72 |
79 | 73 |
106 #define CHN_PITCHENV 0x800000 | 100 #define CHN_PITCHENV 0x800000 |
107 #define CHN_FASTVOLRAMP 0x1000000 | 101 #define CHN_FASTVOLRAMP 0x1000000 |
108 #define CHN_EXTRALOUD 0x2000000 | 102 #define CHN_EXTRALOUD 0x2000000 |
109 #define CHN_REVERB 0x4000000 | 103 #define CHN_REVERB 0x4000000 |
110 #define CHN_NOREVERB 0x8000000 | 104 #define CHN_NOREVERB 0x8000000 |
111 // used to turn off mute but have it reset later | |
112 #define CHN_NNAMUTE 0x10000000 | |
113 | 105 |
114 | 106 |
115 #define ENV_VOLUME 0x0001 | 107 #define ENV_VOLUME 0x0001 |
116 #define ENV_VOLSUSTAIN 0x0002 | 108 #define ENV_VOLSUSTAIN 0x0002 |
117 #define ENV_VOLLOOP 0x0004 | 109 #define ENV_VOLLOOP 0x0004 |
124 #define ENV_SETPANNING 0x0200 | 116 #define ENV_SETPANNING 0x0200 |
125 #define ENV_FILTER 0x0400 | 117 #define ENV_FILTER 0x0400 |
126 #define ENV_VOLCARRY 0x0800 | 118 #define ENV_VOLCARRY 0x0800 |
127 #define ENV_PANCARRY 0x1000 | 119 #define ENV_PANCARRY 0x1000 |
128 #define ENV_PITCHCARRY 0x2000 | 120 #define ENV_PITCHCARRY 0x2000 |
129 #define ENV_MUTE 0x4000 | |
130 | 121 |
131 #define CMD_NONE 0 | 122 #define CMD_NONE 0 |
132 #define CMD_ARPEGGIO 1 | 123 #define CMD_ARPEGGIO 1 |
133 #define CMD_PORTAMENTOUP 2 | 124 #define CMD_PORTAMENTOUP 2 |
134 #define CMD_PORTAMENTODOWN 3 | 125 #define CMD_PORTAMENTODOWN 3 |
261 #define SONG_FIRSTTICK 0x1000 | 252 #define SONG_FIRSTTICK 0x1000 |
262 #define SONG_MPTFILTERMODE 0x2000 | 253 #define SONG_MPTFILTERMODE 0x2000 |
263 #define SONG_SURROUNDPAN 0x4000 | 254 #define SONG_SURROUNDPAN 0x4000 |
264 #define SONG_EXFILTERRANGE 0x8000 | 255 #define SONG_EXFILTERRANGE 0x8000 |
265 #define SONG_AMIGALIMITS 0x10000 | 256 #define SONG_AMIGALIMITS 0x10000 |
266 #define SONG_INSTRUMENTMODE 0x20000 | |
267 #define SONG_ORDERLOCKED 0x40000 | |
268 #define SONG_NOSTEREO 0x80000 | |
269 | 257 |
270 // Global Options (Renderer) | 258 // Global Options (Renderer) |
271 #define SNDMIX_REVERSESTEREO 0x0001 | 259 #define SNDMIX_REVERSESTEREO 0x0001 |
272 #define SNDMIX_NOISEREDUCTION 0x0002 | 260 #define SNDMIX_NOISEREDUCTION 0x0002 |
273 #define SNDMIX_AGC 0x0004 | 261 #define SNDMIX_AGC 0x0004 |
282 // Misc Flags (can safely be turned on or off) | 270 // Misc Flags (can safely be turned on or off) |
283 #define SNDMIX_DIRECTTODISK 0x10000 | 271 #define SNDMIX_DIRECTTODISK 0x10000 |
284 #define SNDMIX_ENABLEMMX 0x20000 | 272 #define SNDMIX_ENABLEMMX 0x20000 |
285 #define SNDMIX_NOBACKWARDJUMPS 0x40000 | 273 #define SNDMIX_NOBACKWARDJUMPS 0x40000 |
286 #define SNDMIX_MAXDEFAULTPAN 0x80000 // Used by the MOD loader | 274 #define SNDMIX_MAXDEFAULTPAN 0x80000 // Used by the MOD loader |
287 #define SNDMIX_MUTECHNMODE 0x100000 // Notes are not played on muted channels | 275 |
288 #define SNDMIX_NOSURROUND 0x200000 | |
289 #define SNDMIX_NOMIXING 0x400000 // don't actually do any mixing (values only) | |
290 #define SNDMIX_NORAMPING 0x800000 | |
291 | 276 |
292 // Reverb Types (GM2 Presets) | 277 // Reverb Types (GM2 Presets) |
293 enum { | 278 enum { |
294 REVERBTYPE_SMALLROOM, | 279 REVERBTYPE_SMALLROOM, |
295 REVERBTYPE_MEDIUMROOM, | 280 REVERBTYPE_MEDIUMROOM, |
315 { | 300 { |
316 UINT nLength,nLoopStart,nLoopEnd; | 301 UINT nLength,nLoopStart,nLoopEnd; |
317 UINT nSustainStart, nSustainEnd; | 302 UINT nSustainStart, nSustainEnd; |
318 signed char *pSample; | 303 signed char *pSample; |
319 UINT nC4Speed; | 304 UINT nC4Speed; |
320 UINT nPan; | 305 WORD nPan; |
321 UINT nVolume; | 306 WORD nVolume; |
322 UINT nGlobalVol; | 307 WORD nGlobalVol; |
323 UINT uFlags; | 308 WORD uFlags; |
324 int RelativeTone; | 309 signed char RelativeTone; |
325 int nFineTune; | 310 signed char nFineTune; |
326 UINT nVibType; | 311 BYTE nVibType; |
327 UINT nVibSweep; | 312 BYTE nVibSweep; |
328 UINT nVibDepth; | 313 BYTE nVibDepth; |
329 UINT nVibRate; | 314 BYTE nVibRate; |
330 CHAR name[22]; | 315 CHAR name[22]; |
331 int played; // for note playback dots | |
332 } MODINSTRUMENT; | 316 } MODINSTRUMENT; |
333 | |
334 typedef struct _INSTRUMENTENVELOPE { | |
335 int Ticks[32]; | |
336 BYTE Values[32]; | |
337 int nNodes; | |
338 int nLoopStart; | |
339 int nLoopEnd; | |
340 int nSustainStart; | |
341 int nSustainEnd; | |
342 } INSTRUMENTENVELOPE; | |
343 | 317 |
344 | 318 |
345 // Instrument Struct | 319 // Instrument Struct |
346 typedef struct _INSTRUMENTHEADER | 320 typedef struct _INSTRUMENTHEADER |
347 { | 321 { |
348 UINT nFadeOut; | 322 UINT nFadeOut; |
349 DWORD dwFlags; | 323 DWORD dwFlags; |
350 unsigned int nGlobalVol; | 324 WORD nGlobalVol; |
351 unsigned int nPan; | 325 WORD nPan; |
352 unsigned int Keyboard[128]; | 326 WORD VolPoints[MAX_ENVPOINTS]; |
353 unsigned int NoteMap[128]; | 327 WORD PanPoints[MAX_ENVPOINTS]; |
354 INSTRUMENTENVELOPE VolEnv; | 328 WORD PitchPoints[MAX_ENVPOINTS]; |
355 INSTRUMENTENVELOPE PanEnv; | 329 BYTE VolEnv[MAX_ENVPOINTS]; |
356 INSTRUMENTENVELOPE PitchEnv; | 330 BYTE PanEnv[MAX_ENVPOINTS]; |
357 unsigned int nNNA; | 331 BYTE PitchEnv[MAX_ENVPOINTS]; |
358 unsigned int nDCT; | 332 BYTE Keyboard[128]; |
359 unsigned int nDNA; | 333 BYTE NoteMap[128]; |
360 unsigned int nPanSwing; | 334 |
361 unsigned int nVolSwing; | 335 BYTE nVolEnv; |
362 unsigned int nIFC; | 336 BYTE nPanEnv; |
363 unsigned int nIFR; | 337 BYTE nPitchEnv; |
364 unsigned int wMidiBank; | 338 BYTE nVolLoopStart; |
365 unsigned int nMidiProgram; | 339 BYTE nVolLoopEnd; |
366 unsigned int nMidiChannel; | 340 BYTE nVolSustainBegin; |
367 unsigned int nMidiDrumKey; | 341 BYTE nVolSustainEnd; |
368 int nPPS; | 342 BYTE nPanLoopStart; |
369 unsigned int nPPC; | 343 BYTE nPanLoopEnd; |
344 BYTE nPanSustainBegin; | |
345 BYTE nPanSustainEnd; | |
346 BYTE nPitchLoopStart; | |
347 BYTE nPitchLoopEnd; | |
348 BYTE nPitchSustainBegin; | |
349 BYTE nPitchSustainEnd; | |
350 BYTE nNNA; | |
351 BYTE nDCT; | |
352 BYTE nDNA; | |
353 BYTE nPanSwing; | |
354 BYTE nVolSwing; | |
355 BYTE nIFC; | |
356 BYTE nIFR; | |
357 WORD wMidiBank; | |
358 BYTE nMidiProgram; | |
359 BYTE nMidiChannel; | |
360 BYTE nMidiDrumKey; | |
361 signed char nPPS; | |
362 unsigned char nPPC; | |
370 CHAR name[32]; | 363 CHAR name[32]; |
371 CHAR filename[12]; | 364 CHAR filename[12]; |
372 int played; // for note playback dots | |
373 } INSTRUMENTHEADER; | 365 } INSTRUMENTHEADER; |
374 | 366 |
375 | 367 |
376 // Channel Struct | 368 // Channel Struct |
377 typedef struct _MODCHANNEL | 369 typedef struct _MODCHANNEL |
378 { | 370 { |
379 // First 32-bytes: Most used mixing information: don't change it | 371 // First 32-bytes: Most used mixing information: don't change it |
380 signed char * pCurrentSample; | 372 signed char * pCurrentSample; |
381 DWORD nPos; | 373 DWORD nPos; |
382 DWORD nPosLo; // actually 16-bit | 374 DWORD nPosLo; // actually 16-bit |
383 unsigned int topnote_offset; | |
384 LONG nInc; // 16.16 | 375 LONG nInc; // 16.16 |
385 LONG nRightVol; | 376 LONG nRightVol; |
386 LONG nLeftVol; | 377 LONG nLeftVol; |
387 LONG nRightRamp; | 378 LONG nRightRamp; |
388 LONG nLeftRamp; | 379 LONG nLeftRamp; |
391 DWORD dwFlags; | 382 DWORD dwFlags; |
392 DWORD nLoopStart; | 383 DWORD nLoopStart; |
393 DWORD nLoopEnd; | 384 DWORD nLoopEnd; |
394 LONG nRampRightVol; | 385 LONG nRampRightVol; |
395 LONG nRampLeftVol; | 386 LONG nRampLeftVol; |
396 | 387 LONG nFilter_Y1, nFilter_Y2, nFilter_Y3, nFilter_Y4; |
397 double nFilter_Y1, nFilter_Y2, nFilter_Y3, nFilter_Y4; | 388 LONG nFilter_A0, nFilter_B0, nFilter_B1; |
398 double nFilter_A0, nFilter_B0, nFilter_B1; | |
399 | |
400 LONG nROfs, nLOfs; | 389 LONG nROfs, nLOfs; |
401 LONG nRampLength; | 390 LONG nRampLength; |
402 // Information not used in the mixer | 391 // Information not used in the mixer |
403 signed char * pSample; | 392 signed char * pSample; |
404 LONG nNewRightVol, nNewLeftVol; | 393 LONG nNewRightVol, nNewLeftVol; |
405 LONG nRealVolume, nRealPan; | 394 LONG nRealVolume, nRealPan; |
406 LONG nVolume, nPan, nFadeOutVol; | 395 LONG nVolume, nPan, nFadeOutVol; |
407 LONG nPeriod, nC4Speed, sample_freq, nPortamentoDest; | 396 LONG nPeriod, nC4Speed, nPortamentoDest; |
408 INSTRUMENTHEADER *pHeader; | 397 INSTRUMENTHEADER *pHeader; |
409 MODINSTRUMENT *pInstrument; | 398 MODINSTRUMENT *pInstrument; |
410 int nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition; | 399 DWORD nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition; |
411 DWORD nMasterChn, nVUMeter; | 400 DWORD nMasterChn, nVUMeter; |
412 LONG nGlobalVol, nInsVol; | 401 LONG nGlobalVol, nInsVol; |
413 LONG nFineTune, nTranspose; | 402 LONG nFineTune, nTranspose; |
414 LONG nPortamentoSlide, nAutoVibDepth; | 403 LONG nPortamentoSlide, nAutoVibDepth; |
415 UINT nAutoVibPos, nVibratoPos, nTremoloPos, nPanbrelloPos; | 404 UINT nAutoVibPos, nVibratoPos, nTremoloPos, nPanbrelloPos; |
416 // 16-bit members | 405 // 16-bit members |
417 int nVolSwing, nPanSwing; | 406 signed short nVolSwing, nPanSwing; |
418 | 407 // 8-bit members |
419 // formally 8-bit members | 408 BYTE nNote, nNNA; |
420 unsigned int nNote, nNNA; | 409 BYTE nNewNote, nNewIns, nCommand, nArpeggio; |
421 unsigned int nNewNote, nNewIns, nCommand, nArpeggio; | 410 BYTE nOldVolumeSlide, nOldFineVolUpDown; |
422 unsigned int nOldVolumeSlide, nOldFineVolUpDown; | 411 BYTE nOldPortaUpDown, nOldFinePortaUpDown; |
423 unsigned int nOldPortaUpDown, nOldFinePortaUpDown; | 412 BYTE nOldPanSlide, nOldChnVolSlide; |
424 unsigned int nOldPanSlide, nOldChnVolSlide; | 413 BYTE nVibratoType, nVibratoSpeed, nVibratoDepth; |
425 unsigned int nVibratoType, nVibratoSpeed, nVibratoDepth; | 414 BYTE nTremoloType, nTremoloSpeed, nTremoloDepth; |
426 unsigned int nTremoloType, nTremoloSpeed, nTremoloDepth; | 415 BYTE nPanbrelloType, nPanbrelloSpeed, nPanbrelloDepth; |
427 unsigned int nPanbrelloType, nPanbrelloSpeed, nPanbrelloDepth; | 416 BYTE nOldCmdEx, nOldVolParam, nOldTempo; |
428 unsigned int nOldCmdEx, nOldVolParam, nOldTempo; | 417 BYTE nOldOffset, nOldHiOffset; |
429 unsigned int nOldOffset, nOldHiOffset; | 418 BYTE nCutOff, nResonance; |
430 unsigned int nCutOff, nResonance; | 419 BYTE nRetrigCount, nRetrigParam; |
431 unsigned int nRetrigCount, nRetrigParam; | 420 BYTE nTremorCount, nTremorParam; |
432 unsigned int nTremorCount, nTremorParam; | 421 BYTE nPatternLoop, nPatternLoopCount; |
433 unsigned int nPatternLoop, nPatternLoopCount; | 422 BYTE nRowNote, nRowInstr; |
434 unsigned int nRowNote, nRowInstr; | 423 BYTE nRowVolCmd, nRowVolume; |
435 unsigned int nRowVolCmd, nRowVolume; | 424 BYTE nRowCommand, nRowParam; |
436 unsigned int nRowCommand, nRowParam; | 425 BYTE nLeftVU, nRightVU; |
437 unsigned int nLeftVU, nRightVU; | 426 BYTE nActiveMacro, nPadding; |
438 unsigned int nActiveMacro, nLastInstr; | |
439 unsigned int nTickStart; | |
440 unsigned int nRealtime; | |
441 BYTE stupid_gcc_workaround; | |
442 | |
443 } MODCHANNEL; | 427 } MODCHANNEL; |
444 | 428 |
445 | 429 |
446 typedef struct _MODCHANNELSETTINGS | 430 typedef struct _MODCHANNELSETTINGS |
447 { | 431 { |
468 #define MIXPLUG_MIXREADY 0x01 // Set when cleared | 452 #define MIXPLUG_MIXREADY 0x01 // Set when cleared |
469 | 453 |
470 class IMixPlugin | 454 class IMixPlugin |
471 { | 455 { |
472 public: | 456 public: |
473 virtual ~IMixPlugin() = 0; | |
474 virtual int AddRef() = 0; | 457 virtual int AddRef() = 0; |
475 virtual int Release() = 0; | 458 virtual int Release() = 0; |
476 virtual void SaveAllParameters() = 0; | 459 virtual void SaveAllParameters() = 0; |
477 virtual void RestoreAllParameters() = 0; | 460 virtual void RestoreAllParameters() = 0; |
478 virtual void Process(float *pOutL, float *pOutR, unsigned int nSamples) = 0; | 461 virtual void Process(float *pOutL, float *pOutR, unsigned long nSamples) = 0; |
479 virtual void Init(unsigned int nFreq, int bReset) = 0; | 462 virtual void Init(unsigned long nFreq, int bReset) = 0; |
480 virtual void MidiSend(DWORD dwMidiCode) = 0; | 463 virtual void MidiSend(DWORD dwMidiCode) = 0; |
481 virtual void MidiCommand(UINT nMidiCh, UINT nMidiProg, UINT note, UINT vol) = 0; | 464 virtual void MidiCommand(UINT nMidiCh, UINT nMidiProg, UINT note, UINT vol) = 0; |
482 }; | 465 }; |
483 | 466 |
484 | 467 |
538 char szMidiSFXExt[16*32]; // changed from CHAR | 521 char szMidiSFXExt[16*32]; // changed from CHAR |
539 char szMidiZXXExt[128*32]; // changed from CHAR | 522 char szMidiZXXExt[128*32]; // changed from CHAR |
540 } MODMIDICFG, *LPMODMIDICFG; | 523 } MODMIDICFG, *LPMODMIDICFG; |
541 | 524 |
542 | 525 |
543 typedef VOID (* LPSNDMIXHOOKPROC)(int *, unsigned int, unsigned int); // buffer, samples, channels | 526 typedef VOID (* LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long); // buffer, samples, channels |
544 | 527 |
545 | 528 |
546 | 529 |
547 //============== | 530 //============== |
548 class CSoundFile | 531 class CSoundFile |
550 { | 533 { |
551 public: // Static Members | 534 public: // Static Members |
552 static UINT m_nXBassDepth, m_nXBassRange; | 535 static UINT m_nXBassDepth, m_nXBassRange; |
553 static UINT m_nReverbDepth, m_nReverbDelay, gnReverbType; | 536 static UINT m_nReverbDepth, m_nReverbDelay, gnReverbType; |
554 static UINT m_nProLogicDepth, m_nProLogicDelay; | 537 static UINT m_nProLogicDepth, m_nProLogicDelay; |
538 static UINT m_nStereoSeparation; | |
555 static UINT m_nMaxMixChannels; | 539 static UINT m_nMaxMixChannels; |
556 static LONG m_nStreamVolume; | 540 static LONG m_nStreamVolume; |
557 static DWORD gdwSysInfo, gdwSoundSetup, gdwMixingFreq, gnBitsPerSample, gnChannels; | 541 static DWORD gdwSysInfo, gdwSoundSetup, gdwMixingFreq, gnBitsPerSample, gnChannels; |
558 static UINT gnAGC, gnVolumeRampSamples, gnCPUUsage; | 542 static UINT gnAGC, gnVolumeRampSamples, gnVUMeter, gnCPUUsage; |
559 static UINT gnVULeft, gnVURight; | |
560 static LPSNDMIXHOOKPROC gpSndMixHook; | 543 static LPSNDMIXHOOKPROC gpSndMixHook; |
561 static PMIXPLUGINCREATEPROC gpMixPluginCreateProc; | 544 static PMIXPLUGINCREATEPROC gpMixPluginCreateProc; |
562 | 545 |
563 public: // for Editing | 546 public: // for Editing |
564 MODCHANNEL Chn[MAX_CHANNELS]; // Channels | 547 MODCHANNEL Chn[MAX_CHANNELS]; // Channels |
566 MODINSTRUMENT Ins[MAX_SAMPLES]; // Instruments | 549 MODINSTRUMENT Ins[MAX_SAMPLES]; // Instruments |
567 INSTRUMENTHEADER *Headers[MAX_INSTRUMENTS]; // Instrument Headers | 550 INSTRUMENTHEADER *Headers[MAX_INSTRUMENTS]; // Instrument Headers |
568 MODCHANNELSETTINGS ChnSettings[MAX_BASECHANNELS]; // Channels settings | 551 MODCHANNELSETTINGS ChnSettings[MAX_BASECHANNELS]; // Channels settings |
569 MODCOMMAND *Patterns[MAX_PATTERNS]; // Patterns | 552 MODCOMMAND *Patterns[MAX_PATTERNS]; // Patterns |
570 WORD PatternSize[MAX_PATTERNS]; // Patterns Lengths | 553 WORD PatternSize[MAX_PATTERNS]; // Patterns Lengths |
571 WORD PatternAllocSize[MAX_PATTERNS]; // Allocated pattern lengths (for async. resizing/playback) | |
572 BYTE Order[MAX_ORDERS]; // Pattern Orders | 554 BYTE Order[MAX_ORDERS]; // Pattern Orders |
573 MODMIDICFG m_MidiCfg; // Midi macro config table | 555 MODMIDICFG m_MidiCfg; // Midi macro config table |
574 SNDMIXPLUGIN m_MixPlugins[MAX_MIXPLUGINS]; // Mix plugins | 556 SNDMIXPLUGIN m_MixPlugins[MAX_MIXPLUGINS]; // Mix plugins |
575 UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume; | 557 UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume; |
576 DWORD m_dwSongFlags; // Song flags SONG_XXXX | 558 DWORD m_dwSongFlags; // Song flags SONG_XXXX |
577 UINT m_nStereoSeparation; | |
578 UINT m_nChannels, m_nMixChannels, m_nMixStat, m_nBufferCount; | 559 UINT m_nChannels, m_nMixChannels, m_nMixStat, m_nBufferCount; |
579 UINT m_nType, m_nSamples, m_nInstruments; | 560 UINT m_nType, m_nSamples, m_nInstruments; |
580 UINT m_nTickCount, m_nTotalCount, m_nPatternDelay, m_nFrameDelay; | 561 UINT m_nTickCount, m_nTotalCount, m_nPatternDelay, m_nFrameDelay; |
581 UINT m_nMusicSpeed, m_nMusicTempo; | 562 UINT m_nMusicSpeed, m_nMusicTempo; |
582 UINT m_nNextRow, m_nRow; | 563 UINT m_nNextRow, m_nRow; |
583 UINT m_nPattern,m_nCurrentPattern,m_nNextPattern,m_nLockedPattern,m_nRestartPos; | 564 UINT m_nPattern,m_nCurrentPattern,m_nNextPattern,m_nRestartPos; |
584 UINT m_nMasterVolume, m_nGlobalVolume, m_nSongPreAmp; | 565 UINT m_nMasterVolume, m_nGlobalVolume, m_nSongPreAmp; |
585 UINT m_nFreqFactor, m_nTempoFactor, m_nOldGlbVolSlide; | 566 UINT m_nFreqFactor, m_nTempoFactor, m_nOldGlbVolSlide; |
586 LONG m_nMinPeriod, m_nMaxPeriod, m_nRepeatCount, m_nInitialRepeatCount; | 567 LONG m_nMinPeriod, m_nMaxPeriod, m_nRepeatCount, m_nInitialRepeatCount; |
587 DWORD m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples; | 568 DWORD m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples; |
588 BYTE m_rowHighlightMajor, m_rowHighlightMinor; | 569 UINT m_nMaxOrderPosition; |
589 UINT m_nPatternNames; | 570 UINT m_nPatternNames; |
590 LPSTR m_lpszSongComments, m_lpszPatternNames; | 571 LPSTR m_lpszSongComments, m_lpszPatternNames; |
591 char m_szNames[MAX_INSTRUMENTS][32]; // changed from CHAR | 572 char m_szNames[MAX_INSTRUMENTS][32]; // changed from CHAR |
592 CHAR CompressionTable[16]; | 573 CHAR CompressionTable[16]; |
593 | 574 |
594 // chaseback | |
595 int stop_at_order; | |
596 int stop_at_row; | |
597 unsigned int stop_at_time; | |
598 | |
599 public: | 575 public: |
600 CSoundFile(); | 576 CSoundFile(); |
601 ~CSoundFile(); | 577 ~CSoundFile(); |
602 | 578 |
603 public: | 579 public: |
604 BOOL Create(LPCBYTE lpStream, DWORD dwMemLength=0); | 580 BOOL Create(LPCBYTE lpStream, DWORD dwMemLength=0); |
605 BOOL Destroy(); | 581 BOOL Destroy(); |
606 UINT GetHighestUsedChannel(); | |
607 UINT GetType() const { return m_nType; } | 582 UINT GetType() const { return m_nType; } |
608 UINT GetNumChannels() const; | 583 UINT GetNumChannels() const; |
609 UINT GetLogicalChannels() const { return m_nChannels; } | 584 UINT GetLogicalChannels() const { return m_nChannels; } |
610 BOOL SetMasterVolume(UINT vol, BOOL bAdjustAGC=FALSE); | 585 BOOL SetMasterVolume(UINT vol, BOOL bAdjustAGC=FALSE); |
611 UINT GetMasterVolume() const { return m_nMasterVolume; } | 586 UINT GetMasterVolume() const { return m_nMasterVolume; } |
656 BOOL ReadPTM(LPCBYTE lpStream, DWORD dwMemLength); | 631 BOOL ReadPTM(LPCBYTE lpStream, DWORD dwMemLength); |
657 BOOL ReadDBM(LPCBYTE lpStream, DWORD dwMemLength); | 632 BOOL ReadDBM(LPCBYTE lpStream, DWORD dwMemLength); |
658 BOOL ReadAMF(LPCBYTE lpStream, DWORD dwMemLength); | 633 BOOL ReadAMF(LPCBYTE lpStream, DWORD dwMemLength); |
659 BOOL ReadMT2(LPCBYTE lpStream, DWORD dwMemLength); | 634 BOOL ReadMT2(LPCBYTE lpStream, DWORD dwMemLength); |
660 BOOL ReadPSM(LPCBYTE lpStream, DWORD dwMemLength); | 635 BOOL ReadPSM(LPCBYTE lpStream, DWORD dwMemLength); |
636 BOOL ReadJ2B(LPCBYTE lpStream, DWORD dwMemLength); | |
661 BOOL ReadUMX(LPCBYTE lpStream, DWORD dwMemLength); | 637 BOOL ReadUMX(LPCBYTE lpStream, DWORD dwMemLength); |
662 BOOL ReadMID(LPCBYTE lpStream, DWORD dwMemLength); | |
663 // Save Functions | 638 // Save Functions |
664 #ifndef MODPLUG_NO_FILESAVE | 639 #ifndef MODPLUG_NO_FILESAVE |
665 UINT WriteSample(diskwriter_driver_t *f, MODINSTRUMENT *pins, UINT nFlags, UINT nMaxLen=0); | 640 UINT WriteSample(FILE *f, MODINSTRUMENT *pins, UINT nFlags, UINT nMaxLen=0); |
666 BOOL SaveXM(diskwriter_driver_t *f, UINT nPacking=0); | 641 BOOL SaveXM(LPCSTR lpszFileName, UINT nPacking=0); |
667 BOOL SaveS3M(diskwriter_driver_t *f, UINT nPacking=0); | 642 BOOL SaveS3M(LPCSTR lpszFileName, UINT nPacking=0); |
668 BOOL SaveMod(diskwriter_driver_t *f, UINT nPacking=0); | 643 BOOL SaveMod(LPCSTR lpszFileName, UINT nPacking=0); |
669 #if 0 | |
670 BOOL SaveIT(LPCSTR lpszFileName, UINT nPacking=0); | 644 BOOL SaveIT(LPCSTR lpszFileName, UINT nPacking=0); |
671 #endif | |
672 #endif // MODPLUG_NO_FILESAVE | 645 #endif // MODPLUG_NO_FILESAVE |
673 // MOD Convert function | 646 // MOD Convert function |
674 UINT GetBestSaveFormat() const; | 647 UINT GetBestSaveFormat() const; |
675 UINT GetSaveFormats() const; | 648 UINT GetSaveFormats() const; |
676 void ConvertModCommand(MODCOMMAND *) const; | 649 void ConvertModCommand(MODCOMMAND *) const; |
677 void S3MConvert(MODCOMMAND *m, BOOL bIT) const; | 650 void S3MConvert(MODCOMMAND *m, BOOL bIT) const; |
678 void S3MSaveConvert(UINT *pcmd, UINT *pprm, BOOL bIT) const; | 651 void S3MSaveConvert(UINT *pcmd, UINT *pprm, BOOL bIT) const; |
679 WORD ModSaveCommand(const MODCOMMAND *m, BOOL bXM) const; | 652 WORD ModSaveCommand(const MODCOMMAND *m, BOOL bXM) const; |
680 public: | |
681 // backhooks :) | |
682 static void (*_midi_out_note)(int chan, const MODCOMMAND *m); | |
683 static void (*_midi_out_raw)(unsigned char *,unsigned int, unsigned int); | |
684 | 653 |
685 public: | 654 public: |
686 // Real-time sound functions | 655 // Real-time sound functions |
687 VOID ResetChannels(); | 656 VOID ResetChannels(); |
688 | 657 |
706 // AGC | 675 // AGC |
707 static BOOL GetAGC() { return (gdwSoundSetup & SNDMIX_AGC) ? TRUE : FALSE; } | 676 static BOOL GetAGC() { return (gdwSoundSetup & SNDMIX_AGC) ? TRUE : FALSE; } |
708 static void SetAGC(BOOL b); | 677 static void SetAGC(BOOL b); |
709 static void ResetAGC(); | 678 static void ResetAGC(); |
710 static void ProcessAGC(int count); | 679 static void ProcessAGC(int count); |
711 | |
712 // Floats | |
713 static VOID StereoMixToFloat(const int *pSrc, float *pOut1, float *pOut2, UINT nCount); | |
714 static VOID FloatToStereoMix(const float *pIn1, const float *pIn2, int *pOut, UINT nCount); | |
715 static VOID MonoMixToFloat(const int *pSrc, float *pOut, UINT nCount); | |
716 static VOID FloatToMonoMix(const float *pIn, int *pOut, UINT nCount); | |
717 | |
718 | |
719 | |
720 | |
721 | |
722 // wee... | |
723 static void InitializeEQ(BOOL bReset=TRUE); | |
724 static void SetEQGains(const UINT *pGains, UINT nBands, const UINT *pFreqs=NULL, BOOL bReset=FALSE); // 0=-12dB, 32=+12dB | |
725 /*static*/ void EQStereo(int *pbuffer, UINT nCount); | |
726 /*static*/ void EQMono(int *pbuffer, UINT nCount); | |
727 | |
728 | 680 |
729 //GCCFIX -- added these functions back in! | 681 //GCCFIX -- added these functions back in! |
730 static BOOL SetWaveConfigEx(BOOL bSurround,BOOL bNoOverSampling,BOOL bReverb,BOOL hqido,BOOL bMegaBass,BOOL bNR,BOOL bEQ); | 682 static BOOL SetWaveConfigEx(BOOL bSurround,BOOL bNoOverSampling,BOOL bReverb,BOOL hqido,BOOL bMegaBass,BOOL bNR,BOOL bEQ); |
731 // DSP Effects | 683 // DSP Effects |
732 static void InitializeDSP(BOOL bReset); | 684 static void InitializeDSP(BOOL bReset); |
740 static BOOL SetSurroundParameters(UINT nDepth, UINT nDelay); | 692 static BOOL SetSurroundParameters(UINT nDepth, UINT nDelay); |
741 public: | 693 public: |
742 BOOL ReadNote(); | 694 BOOL ReadNote(); |
743 BOOL ProcessRow(); | 695 BOOL ProcessRow(); |
744 BOOL ProcessEffects(); | 696 BOOL ProcessEffects(); |
745 UINT GetNNAChannel(UINT nChn); | 697 UINT GetNNAChannel(UINT nChn) const; |
746 void CheckNNA(UINT nChn, UINT instr, int note, BOOL bForceCut); | 698 void CheckNNA(UINT nChn, UINT instr, int note, BOOL bForceCut); |
747 void NoteChange(UINT nChn, int note, BOOL bPorta=FALSE, BOOL bResetEnv=TRUE, BOOL bManual=FALSE); | 699 void NoteChange(UINT nChn, int note, BOOL bPorta=FALSE, BOOL bResetEnv=TRUE); |
748 void InstrumentChange(MODCHANNEL *pChn, UINT instr, BOOL bPorta=FALSE,BOOL bUpdVol=TRUE,BOOL bResetEnv=TRUE); | 700 void InstrumentChange(MODCHANNEL *pChn, UINT instr, BOOL bPorta=FALSE,BOOL bUpdVol=TRUE,BOOL bResetEnv=TRUE); |
749 // Channel Effects | 701 // Channel Effects |
750 void PortamentoUp(MODCHANNEL *pChn, UINT param); | 702 void PortamentoUp(MODCHANNEL *pChn, UINT param); |
751 void PortamentoDown(MODCHANNEL *pChn, UINT param); | 703 void PortamentoDown(MODCHANNEL *pChn, UINT param); |
752 void FinePortamentoUp(MODCHANNEL *pChn, UINT param); | 704 void FinePortamentoUp(MODCHANNEL *pChn, UINT param); |
768 void KeyOff(UINT nChn); | 720 void KeyOff(UINT nChn); |
769 int PatternLoop(MODCHANNEL *, UINT param); | 721 int PatternLoop(MODCHANNEL *, UINT param); |
770 void ExtendedMODCommands(UINT nChn, UINT param); | 722 void ExtendedMODCommands(UINT nChn, UINT param); |
771 void ExtendedS3MCommands(UINT nChn, UINT param); | 723 void ExtendedS3MCommands(UINT nChn, UINT param); |
772 void ExtendedChannelEffect(MODCHANNEL *, UINT param); | 724 void ExtendedChannelEffect(MODCHANNEL *, UINT param); |
773 void MidiSend(unsigned char *data, unsigned int len, UINT nChn=0, int fake = 0); | 725 void ProcessMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0); |
774 void ProcessMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0, | 726 void SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier=256) const; |
775 UINT note=0, UINT velocity=0, UINT use_instr=0); | |
776 void SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier=256,int freq=0) const; | |
777 // Low-Level effect processing | 727 // Low-Level effect processing |
778 void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide); | 728 void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide); |
779 // Global Effects | 729 // Global Effects |
780 void SetTempo(UINT param); | 730 void SetTempo(UINT param); |
781 void SetSpeed(UINT param); | 731 void SetSpeed(UINT param); |
799 BOOL ReadInstrumentFromSong(UINT nInstr, CSoundFile *, UINT nSrcInstrument); | 749 BOOL ReadInstrumentFromSong(UINT nInstr, CSoundFile *, UINT nSrcInstrument); |
800 BOOL ReadSampleFromSong(UINT nSample, CSoundFile *, UINT nSrcSample); | 750 BOOL ReadSampleFromSong(UINT nSample, CSoundFile *, UINT nSrcSample); |
801 // Period/Note functions | 751 // Period/Note functions |
802 UINT GetNoteFromPeriod(UINT period) const; | 752 UINT GetNoteFromPeriod(UINT period) const; |
803 UINT GetPeriodFromNote(UINT note, int nFineTune, UINT nC4Speed) const; | 753 UINT GetPeriodFromNote(UINT note, int nFineTune, UINT nC4Speed) const; |
804 UINT GetLinearPeriodFromNote(UINT note, int nFineTune, UINT nC4Speed) const; | |
805 UINT GetFreqFromPeriod(UINT period, UINT nC4Speed, int nPeriodFrac=0) const; | 754 UINT GetFreqFromPeriod(UINT period, UINT nC4Speed, int nPeriodFrac=0) const; |
806 // Misc functions | 755 // Misc functions |
807 MODINSTRUMENT *GetSample(UINT n) { return Ins+n; } | 756 MODINSTRUMENT *GetSample(UINT n) { return Ins+n; } |
808 void ResetMidiCfg(); | 757 void ResetMidiCfg(); |
809 UINT MapMidiInstrument(DWORD dwProgram, UINT nChannel, UINT nNote); | 758 UINT MapMidiInstrument(DWORD dwProgram, UINT nChannel, UINT nNote); |
810 BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers); | 759 BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers); |
811 UINT SaveMixPlugins(FILE *f=NULL, BOOL bUpdate=TRUE); | 760 UINT SaveMixPlugins(FILE *f=NULL, BOOL bUpdate=TRUE); |
812 UINT LoadMixPlugins(const void *pData, UINT nLen); | 761 UINT LoadMixPlugins(const void *pData, UINT nLen); |
813 void ResetTimestamps(); // for note playback dots | 762 #ifndef NO_FILTER |
763 DWORD CutOffToFrequency(UINT nCutOff, int flt_modifier=256) const; // [0-255] => [1-10KHz] | |
764 #endif | |
814 | 765 |
815 // Static helper functions | 766 // Static helper functions |
816 public: | 767 public: |
817 static DWORD TransposeToFrequency(int transp, int ftune=0); | 768 static DWORD TransposeToFrequency(int transp, int ftune=0); |
818 static int FrequencyToTranspose(DWORD freq); | 769 static int FrequencyToTranspose(DWORD freq); |
956 /////////////////////////////////////////////////////////// | 907 /////////////////////////////////////////////////////////// |
957 // Low-level Mixing functions | 908 // Low-level Mixing functions |
958 | 909 |
959 #define MIXBUFFERSIZE 512 | 910 #define MIXBUFFERSIZE 512 |
960 #define MIXING_ATTENUATION 4 | 911 #define MIXING_ATTENUATION 4 |
961 #define MIXING_CLIPMIN (-0x04000000) | 912 #define MIXING_CLIPMIN (-0x08000000) |
962 #define MIXING_CLIPMAX (0x03FFFFFF) | 913 #define MIXING_CLIPMAX (0x07FFFFFF) |
963 #define VOLUMERAMPPRECISION 12 | 914 #define VOLUMERAMPPRECISION 12 |
964 #define FADESONGDELAY 100 | 915 #define FADESONGDELAY 100 |
965 #define EQ_BUFFERSIZE (MIXBUFFERSIZE) | 916 #define EQ_BUFFERSIZE (MIXBUFFERSIZE) |
966 #define AGC_PRECISION 9 | 917 #define AGC_PRECISION 9 |
967 #define AGC_UNITY (1 << AGC_PRECISION) | 918 #define AGC_UNITY (1 << AGC_PRECISION) |
976 #endif | 927 #endif |
977 | 928 |
978 #define MOD2XMFineTune(k) ((int)( (signed char)((k)<<4) )) | 929 #define MOD2XMFineTune(k) ((int)( (signed char)((k)<<4) )) |
979 #define XM2MODFineTune(k) ((int)( (k>>4)&0x0f )) | 930 #define XM2MODFineTune(k) ((int)( (k>>4)&0x0f )) |
980 | 931 |
981 // Return (a*b)/c - no divide error | 932 int _muldiv(long a, long b, long c); |
982 static inline int _muldiv(int a, int b, int c) | 933 int _muldivr(long a, long b, long c); |
983 { | 934 |
984 return ((unsigned long long) a * (unsigned long long) b ) / c; | 935 |
936 // Byte swapping functions from the GNU C Library and libsdl | |
937 | |
938 /* Swap bytes in 16 bit value. */ | |
939 #ifdef __GNUC__ | |
940 # define bswap_16(x) \ | |
941 (__extension__ \ | |
942 ({ unsigned short int __bsx = (x); \ | |
943 ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); })) | |
944 #else | |
945 static __inline unsigned short int | |
946 bswap_16 (unsigned short int __bsx) | |
947 { | |
948 return ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); | |
985 } | 949 } |
986 | 950 #endif |
987 | 951 |
988 // Return (a*b+c/2)/c - no divide error | 952 /* Swap bytes in 32 bit value. */ |
989 static inline int _muldivr(int a, int b, int c) | 953 #ifdef __GNUC__ |
990 { | 954 # define bswap_32(x) \ |
991 return ((unsigned long long) a * (unsigned long long) b + (c >> 1)) / c; | 955 (__extension__ \ |
956 ({ unsigned int __bsx = (x); \ | |
957 ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | \ | |
958 (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); })) | |
959 #else | |
960 static __inline unsigned int | |
961 bswap_32 (unsigned int __bsx) | |
962 { | |
963 return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | | |
964 (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); | |
992 } | 965 } |
993 | |
994 | |
995 #define NEED_BYTESWAP | |
996 #include "headers.h" | |
997 | |
998 #endif | 966 #endif |
967 | |
968 #if (defined ARM) && (defined _WIN32_WCE) | |
969 static __inline unsigned short int | |
970 ARM_get16(const void *data) | |
971 { | |
972 unsigned short int s; | |
973 memcpy(&s,data,sizeof(s)); | |
974 return s; | |
975 } | |
976 | |
977 static __inline unsigned int | |
978 ARM_get32(const void *data) | |
979 { | |
980 unsigned int s; | |
981 memcpy(&s,data,sizeof(s)); | |
982 return s; | |
983 } | |
984 | |
985 #define bswapLE16(X) ARM_get16(&X) | |
986 #define bswapLE32(X) ARM_get32(&X) | |
987 #define bswapBE16(X) bswap_16(ARM_get16(&X)) | |
988 #define bswapBE32(X) bswap_32(ARM_get32(&X)) | |
989 | |
990 // From libsdl | |
991 #elif WORDS_BIGENDIAN | |
992 #define bswapLE16(X) bswap_16(X) | |
993 #define bswapLE32(X) bswap_32(X) | |
994 #define bswapBE16(X) (X) | |
995 #define bswapBE32(X) (X) | |
996 #else | |
997 #define bswapLE16(X) (X) | |
998 #define bswapLE32(X) (X) | |
999 #define bswapBE16(X) bswap_16(X) | |
1000 #define bswapBE32(X) bswap_32(X) | |
1001 #endif | |
1002 | |
1003 #endif |