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