PageRenderTime 70ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/Chapter8/1_Game/src/include/modplug/sndfile.cpp

https://gitlab.com/hounge.mobile/Android-NDK-Game-Development-Cookbook
C++ | 2305 lines | 1672 code | 510 blank | 123 comment | 450 complexity | 8b3b3d902c3b01a599140f4ec3bbdcc1 MD5 | raw file
  1. /*
  2. * This source code is public domain.
  3. *
  4. * Authors: Olivier Lapicque <olivierl@jps.net>,
  5. * Adam Goode <adam@evdebs.org> (endian and char fixes for PPC)
  6. */
  7. #include <math.h> //for GCCFIX
  8. #include "stdafx.h"
  9. #include "sndfile.h"
  10. #define MMCMP_SUPPORT
  11. #ifdef MMCMP_SUPPORT
  12. extern BOOL MMCMP_Unpack( LPCBYTE* ppMemFile, LPDWORD pdwMemLength );
  13. #endif
  14. // External decompressors
  15. extern void AMSUnpack( const char* psrc, UINT inputlen, char* pdest, UINT dmax, char packcharacter );
  16. extern WORD MDLReadBits( DWORD& bitbuf, UINT& bitnum, LPBYTE& ibuf, CHAR n );
  17. extern int DMFUnpack( LPBYTE psample, LPBYTE ibuf, LPBYTE ibufmax, UINT maxlen );
  18. extern DWORD ITReadBits( DWORD& bitbuf, UINT& bitnum, LPBYTE& ibuf, CHAR n );
  19. extern void ITUnpack8Bit( signed char* pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dwMemLength, BOOL b215 );
  20. extern void ITUnpack16Bit( signed char* pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dwMemLength, BOOL b215 );
  21. #define MAX_PACK_TABLES 3
  22. // Compression table
  23. static const signed char UnpackTable[MAX_PACK_TABLES][16] =
  24. //--------------------------------------------
  25. {
  26. // CPU-generated dynamic table
  27. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  28. // u-Law table
  29. {
  30. 0, 1, 2, 4, 8, 16, 32, 64,
  31. -1, -2, -4, -8, -16, -32, -48, -64
  32. },
  33. // Linear table
  34. {
  35. 0, 1, 2, 3, 5, 7, 12, 19,
  36. -1, -2, -3, -5, -7, -12, -19, -31
  37. }
  38. };
  39. //////////////////////////////////////////////////////////
  40. // CSoundFile
  41. CSoundFile::CSoundFile()
  42. //----------------------
  43. {
  44. m_nType = MOD_TYPE_NONE;
  45. m_dwSongFlags = 0;
  46. m_nChannels = 0;
  47. m_nMixChannels = 0;
  48. m_nSamples = 0;
  49. m_nInstruments = 0;
  50. m_nPatternNames = 0;
  51. m_lpszPatternNames = NULL;
  52. m_lpszSongComments = NULL;
  53. m_nFreqFactor = m_nTempoFactor = 128;
  54. m_nMasterVolume = 128;
  55. m_nMinPeriod = 0x20;
  56. m_nMaxPeriod = 0x7FFF;
  57. m_nRepeatCount = 0;
  58. memset( Chn, 0, sizeof( Chn ) );
  59. memset( ChnMix, 0, sizeof( ChnMix ) );
  60. memset( Ins, 0, sizeof( Ins ) );
  61. memset( ChnSettings, 0, sizeof( ChnSettings ) );
  62. memset( Headers, 0, sizeof( Headers ) );
  63. memset( Order, 0xFF, sizeof( Order ) );
  64. memset( Patterns, 0, sizeof( Patterns ) );
  65. memset( m_szNames, 0, sizeof( m_szNames ) );
  66. memset( m_MixPlugins, 0, sizeof( m_MixPlugins ) );
  67. }
  68. CSoundFile::~CSoundFile()
  69. //-----------------------
  70. {
  71. Destroy();
  72. }
  73. BOOL CSoundFile::Create( LPCBYTE lpStream, DWORD dwMemLength )
  74. //----------------------------------------------------------
  75. {
  76. int i;
  77. m_nType = MOD_TYPE_NONE;
  78. m_dwSongFlags = 0;
  79. m_nChannels = 0;
  80. m_nMixChannels = 0;
  81. m_nSamples = 0;
  82. m_nInstruments = 0;
  83. m_nFreqFactor = m_nTempoFactor = 128;
  84. m_nMasterVolume = 128;
  85. m_nDefaultGlobalVolume = 256;
  86. m_nGlobalVolume = 256;
  87. m_nOldGlbVolSlide = 0;
  88. m_nDefaultSpeed = 6;
  89. m_nDefaultTempo = 125;
  90. m_nPatternDelay = 0;
  91. m_nFrameDelay = 0;
  92. m_nNextRow = 0;
  93. m_nRow = 0;
  94. m_nPattern = 0;
  95. m_nCurrentPattern = 0;
  96. m_nNextPattern = 0;
  97. m_nRestartPos = 0;
  98. m_nMinPeriod = 16;
  99. m_nMaxPeriod = 32767;
  100. m_nSongPreAmp = 0x30;
  101. m_nPatternNames = 0;
  102. m_nMaxOrderPosition = 0;
  103. m_lpszPatternNames = NULL;
  104. m_lpszSongComments = NULL;
  105. memset( Ins, 0, sizeof( Ins ) );
  106. memset( ChnMix, 0, sizeof( ChnMix ) );
  107. memset( Chn, 0, sizeof( Chn ) );
  108. memset( Headers, 0, sizeof( Headers ) );
  109. memset( Order, 0xFF, sizeof( Order ) );
  110. memset( Patterns, 0, sizeof( Patterns ) );
  111. memset( m_szNames, 0, sizeof( m_szNames ) );
  112. memset( m_MixPlugins, 0, sizeof( m_MixPlugins ) );
  113. ResetMidiCfg();
  114. for ( UINT npt = 0; npt < MAX_PATTERNS; npt++ ) { PatternSize[npt] = 64; }
  115. for ( UINT nch = 0; nch < MAX_BASECHANNELS; nch++ )
  116. {
  117. ChnSettings[nch].nPan = 128;
  118. ChnSettings[nch].nVolume = 64;
  119. ChnSettings[nch].dwFlags = 0;
  120. ChnSettings[nch].szName[0] = 0;
  121. }
  122. if ( lpStream )
  123. {
  124. #ifdef MMCMP_SUPPORT
  125. BOOL bMMCmp = MMCMP_Unpack( &lpStream, &dwMemLength );
  126. #endif
  127. if ( ( !ReadXM( lpStream, dwMemLength ) )
  128. && ( !ReadS3M( lpStream, dwMemLength ) )
  129. && ( !ReadIT( lpStream, dwMemLength ) )
  130. && ( !ReadWav( lpStream, dwMemLength ) )
  131. #ifndef MODPLUG_BASIC_SUPPORT
  132. /* Sequencer File Format Support */
  133. && ( !ReadABC( lpStream, dwMemLength ) )
  134. && ( !ReadMID( lpStream, dwMemLength ) )
  135. && ( !ReadPAT( lpStream, dwMemLength ) )
  136. && ( !ReadSTM( lpStream, dwMemLength ) )
  137. && ( !ReadMed( lpStream, dwMemLength ) )
  138. && ( !ReadMTM( lpStream, dwMemLength ) )
  139. && ( !ReadMDL( lpStream, dwMemLength ) )
  140. && ( !ReadDBM( lpStream, dwMemLength ) )
  141. && ( !Read669( lpStream, dwMemLength ) )
  142. && ( !ReadFAR( lpStream, dwMemLength ) )
  143. && ( !ReadAMS( lpStream, dwMemLength ) )
  144. && ( !ReadOKT( lpStream, dwMemLength ) )
  145. && ( !ReadPTM( lpStream, dwMemLength ) )
  146. && ( !ReadUlt( lpStream, dwMemLength ) )
  147. && ( !ReadDMF( lpStream, dwMemLength ) )
  148. && ( !ReadDSM( lpStream, dwMemLength ) )
  149. && ( !ReadUMX( lpStream, dwMemLength ) )
  150. && ( !ReadAMF( lpStream, dwMemLength ) )
  151. && ( !ReadPSM( lpStream, dwMemLength ) )
  152. && ( !ReadMT2( lpStream, dwMemLength ) )
  153. #endif // MODPLUG_BASIC_SUPPORT
  154. && ( !ReadMod( lpStream, dwMemLength ) ) ) { m_nType = MOD_TYPE_NONE; }
  155. #ifdef MMCMP_SUPPORT
  156. if ( bMMCmp )
  157. {
  158. GlobalFreePtr( lpStream );
  159. lpStream = NULL;
  160. }
  161. #endif
  162. }
  163. // Adjust song names
  164. for ( i = 0; i < MAX_SAMPLES; i++ )
  165. {
  166. LPSTR p = m_szNames[i];
  167. int j = 31;
  168. p[j] = 0;
  169. while ( ( j >= 0 ) && ( p[j] <= ' ' ) ) { p[j--] = 0; }
  170. while ( j >= 0 )
  171. {
  172. if ( ( ( BYTE )p[j] ) < ' ' ) { p[j] = ' '; }
  173. j--;
  174. }
  175. }
  176. // Adjust channels
  177. for ( i = 0; i < MAX_BASECHANNELS; i++ )
  178. {
  179. if ( ChnSettings[i].nVolume > 64 ) { ChnSettings[i].nVolume = 64; }
  180. if ( ChnSettings[i].nPan > 256 ) { ChnSettings[i].nPan = 128; }
  181. Chn[i].nPan = ChnSettings[i].nPan;
  182. Chn[i].nGlobalVol = ChnSettings[i].nVolume;
  183. Chn[i].dwFlags = ChnSettings[i].dwFlags;
  184. Chn[i].nVolume = 256;
  185. Chn[i].nCutOff = 0x7F;
  186. }
  187. // Checking instruments
  188. MODINSTRUMENT* pins = Ins;
  189. for ( i = 0; i < MAX_INSTRUMENTS; i++, pins++ )
  190. {
  191. if ( pins->pSample )
  192. {
  193. if ( pins->nLoopEnd > pins->nLength ) { pins->nLoopEnd = pins->nLength; }
  194. if ( pins->nLoopStart + 3 >= pins->nLoopEnd )
  195. {
  196. pins->nLoopStart = 0;
  197. pins->nLoopEnd = 0;
  198. }
  199. if ( pins->nSustainEnd > pins->nLength ) { pins->nSustainEnd = pins->nLength; }
  200. if ( pins->nSustainStart + 3 >= pins->nSustainEnd )
  201. {
  202. pins->nSustainStart = 0;
  203. pins->nSustainEnd = 0;
  204. }
  205. }
  206. else
  207. {
  208. pins->nLength = 0;
  209. pins->nLoopStart = 0;
  210. pins->nLoopEnd = 0;
  211. pins->nSustainStart = 0;
  212. pins->nSustainEnd = 0;
  213. }
  214. if ( !pins->nLoopEnd ) { pins->uFlags &= ~CHN_LOOP; }
  215. if ( !pins->nSustainEnd ) { pins->uFlags &= ~CHN_SUSTAINLOOP; }
  216. if ( pins->nGlobalVol > 64 ) { pins->nGlobalVol = 64; }
  217. }
  218. // Check invalid instruments
  219. while ( ( m_nInstruments > 0 ) && ( !Headers[m_nInstruments] ) )
  220. {
  221. m_nInstruments--;
  222. }
  223. // Set default values
  224. if ( m_nSongPreAmp < 0x20 ) { m_nSongPreAmp = 0x20; }
  225. if ( m_nDefaultTempo < 32 ) { m_nDefaultTempo = 125; }
  226. if ( !m_nDefaultSpeed ) { m_nDefaultSpeed = 6; }
  227. m_nMusicSpeed = m_nDefaultSpeed;
  228. m_nMusicTempo = m_nDefaultTempo;
  229. m_nGlobalVolume = m_nDefaultGlobalVolume;
  230. m_nNextPattern = 0;
  231. m_nCurrentPattern = 0;
  232. m_nPattern = 0;
  233. m_nBufferCount = 0;
  234. m_nTickCount = m_nMusicSpeed;
  235. m_nNextRow = 0;
  236. m_nRow = 0;
  237. if ( ( m_nRestartPos >= MAX_ORDERS ) || ( Order[m_nRestartPos] >= MAX_PATTERNS ) ) { m_nRestartPos = 0; }
  238. // Load plugins
  239. if ( gpMixPluginCreateProc )
  240. {
  241. for ( UINT iPlug = 0; iPlug < MAX_MIXPLUGINS; iPlug++ )
  242. {
  243. if ( ( m_MixPlugins[iPlug].Info.dwPluginId1 )
  244. || ( m_MixPlugins[iPlug].Info.dwPluginId2 ) )
  245. {
  246. gpMixPluginCreateProc( &m_MixPlugins[iPlug] );
  247. if ( m_MixPlugins[iPlug].pMixPlugin )
  248. {
  249. m_MixPlugins[iPlug].pMixPlugin->RestoreAllParameters();
  250. }
  251. }
  252. }
  253. }
  254. if ( m_nType )
  255. {
  256. UINT maxpreamp = 0x10 + ( m_nChannels * 8 );
  257. if ( maxpreamp > 100 ) { maxpreamp = 100; }
  258. if ( m_nSongPreAmp > maxpreamp ) { m_nSongPreAmp = maxpreamp; }
  259. return TRUE;
  260. }
  261. return FALSE;
  262. }
  263. BOOL CSoundFile::Destroy()
  264. //------------------------
  265. {
  266. int i;
  267. for ( i = 0; i < MAX_PATTERNS; i++ ) if ( Patterns[i] )
  268. {
  269. FreePattern( Patterns[i] );
  270. Patterns[i] = NULL;
  271. }
  272. m_nPatternNames = 0;
  273. if ( m_lpszPatternNames )
  274. {
  275. delete [] m_lpszPatternNames;
  276. m_lpszPatternNames = NULL;
  277. }
  278. if ( m_lpszSongComments )
  279. {
  280. delete [] m_lpszSongComments;
  281. m_lpszSongComments = NULL;
  282. }
  283. for ( i = 1; i < MAX_SAMPLES; i++ )
  284. {
  285. MODINSTRUMENT* pins = &Ins[i];
  286. if ( pins->pSample )
  287. {
  288. FreeSample( pins->pSample );
  289. pins->pSample = NULL;
  290. }
  291. }
  292. for ( i = 0; i < MAX_INSTRUMENTS; i++ )
  293. {
  294. if ( Headers[i] )
  295. {
  296. delete Headers[i];
  297. Headers[i] = NULL;
  298. }
  299. }
  300. for ( i = 0; i < MAX_MIXPLUGINS; i++ )
  301. {
  302. if ( ( m_MixPlugins[i].nPluginDataSize ) && ( m_MixPlugins[i].pPluginData ) )
  303. {
  304. m_MixPlugins[i].nPluginDataSize = 0;
  305. delete [] ( signed char* )m_MixPlugins[i].pPluginData;
  306. m_MixPlugins[i].pPluginData = NULL;
  307. }
  308. m_MixPlugins[i].pMixState = NULL;
  309. if ( m_MixPlugins[i].pMixPlugin )
  310. {
  311. m_MixPlugins[i].pMixPlugin->Release();
  312. m_MixPlugins[i].pMixPlugin = NULL;
  313. }
  314. }
  315. m_nType = MOD_TYPE_NONE;
  316. m_nChannels = m_nSamples = m_nInstruments = 0;
  317. return TRUE;
  318. }
  319. //////////////////////////////////////////////////////////////////////////
  320. // Memory Allocation
  321. MODCOMMAND* CSoundFile::AllocatePattern( UINT rows, UINT nchns )
  322. //------------------------------------------------------------
  323. {
  324. MODCOMMAND* p = new MODCOMMAND[rows * nchns];
  325. if ( p ) { memset( p, 0, rows * nchns * sizeof( MODCOMMAND ) ); }
  326. return p;
  327. }
  328. void CSoundFile::FreePattern( LPVOID pat )
  329. //--------------------------------------
  330. {
  331. if ( pat ) { delete [] ( signed char* )pat; }
  332. }
  333. signed char* CSoundFile::AllocateSample( UINT nbytes )
  334. //-------------------------------------------
  335. {
  336. signed char* p = ( signed char* )GlobalAllocPtr( GHND, ( nbytes + 39 ) & ~7 );
  337. if ( p ) { p += 16; }
  338. return p;
  339. }
  340. void CSoundFile::FreeSample( LPVOID p )
  341. //-----------------------------------
  342. {
  343. if ( p )
  344. {
  345. GlobalFreePtr( ( ( LPSTR )p ) - 16 );
  346. }
  347. }
  348. //////////////////////////////////////////////////////////////////////////
  349. // Misc functions
  350. void CSoundFile::ResetMidiCfg()
  351. //-----------------------------
  352. {
  353. memset( &m_MidiCfg, 0, sizeof( m_MidiCfg ) );
  354. lstrcpy( &m_MidiCfg.szMidiGlb[MIDIOUT_START * 32], "FF" );
  355. lstrcpy( &m_MidiCfg.szMidiGlb[MIDIOUT_STOP * 32], "FC" );
  356. lstrcpy( &m_MidiCfg.szMidiGlb[MIDIOUT_NOTEON * 32], "9c n v" );
  357. lstrcpy( &m_MidiCfg.szMidiGlb[MIDIOUT_NOTEOFF * 32], "9c n 0" );
  358. lstrcpy( &m_MidiCfg.szMidiGlb[MIDIOUT_PROGRAM * 32], "Cc p" );
  359. lstrcpy( &m_MidiCfg.szMidiSFXExt[0], "F0F000z" );
  360. for ( int iz = 0; iz < 16; iz++ ) { wsprintf( &m_MidiCfg.szMidiZXXExt[iz * 32], "F0F001%02X", iz * 8 ); }
  361. }
  362. UINT CSoundFile::GetNumChannels() const
  363. //-------------------------------------
  364. {
  365. UINT n = 0;
  366. for ( UINT i = 0; i < m_nChannels; i++ ) if ( ChnSettings[i].nVolume ) { n++; }
  367. return n;
  368. }
  369. UINT CSoundFile::GetSongComments( LPSTR s, UINT len, UINT linesize )
  370. //----------------------------------------------------------------
  371. {
  372. LPCSTR p = m_lpszSongComments;
  373. if ( !p ) { return 0; }
  374. UINT i = 2, ln = 0;
  375. if ( ( len ) && ( s ) ) { s[0] = '\x0D'; }
  376. if ( ( len > 1 ) && ( s ) ) { s[1] = '\x0A'; }
  377. while ( ( *p ) && ( i + 2 < len ) )
  378. {
  379. BYTE c = ( BYTE ) * p++;
  380. if ( ( c == 0x0D ) || ( ( c == ' ' ) && ( ln >= linesize ) ) )
  381. { if ( s ) { s[i++] = '\x0D'; s[i++] = '\x0A'; } else { i += 2; } ln = 0; }
  382. else if ( c >= 0x20 ) { if ( s ) { s[i++] = c; } else { i++; } ln++; }
  383. }
  384. if ( s ) { s[i] = 0; }
  385. return i;
  386. }
  387. UINT CSoundFile::GetRawSongComments( LPSTR s, UINT len, UINT linesize )
  388. //-------------------------------------------------------------------
  389. {
  390. LPCSTR p = m_lpszSongComments;
  391. if ( !p ) { return 0; }
  392. UINT i = 0, ln = 0;
  393. while ( ( *p ) && ( i < len - 1 ) )
  394. {
  395. BYTE c = ( BYTE ) * p++;
  396. if ( ( c == 0x0D ) || ( c == 0x0A ) )
  397. {
  398. if ( ln )
  399. {
  400. while ( ln < linesize ) { if ( s ) { s[i] = ' '; } i++; ln++; }
  401. ln = 0;
  402. }
  403. }
  404. else if ( ( c == ' ' ) && ( !ln ) )
  405. {
  406. UINT k = 0;
  407. while ( ( p[k] ) && ( p[k] >= ' ' ) ) { k++; }
  408. if ( k <= linesize )
  409. {
  410. if ( s ) { s[i] = ' '; }
  411. i++;
  412. ln++;
  413. }
  414. }
  415. else
  416. {
  417. if ( s ) { s[i] = c; }
  418. i++;
  419. ln++;
  420. if ( ln == linesize ) { ln = 0; }
  421. }
  422. }
  423. if ( ln )
  424. {
  425. while ( ( ln < linesize ) && ( i < len ) )
  426. {
  427. if ( s ) { s[i] = ' '; }
  428. i++;
  429. ln++;
  430. }
  431. }
  432. if ( s ) { s[i] = 0; }
  433. return i;
  434. }
  435. BOOL CSoundFile::SetWaveConfig( UINT nRate, UINT nBits, UINT nChannels, BOOL bMMX )
  436. //----------------------------------------------------------------------------
  437. {
  438. BOOL bReset = FALSE;
  439. DWORD d = gdwSoundSetup & ~SNDMIX_ENABLEMMX;
  440. if ( bMMX ) { d |= SNDMIX_ENABLEMMX; }
  441. if ( ( gdwMixingFreq != nRate ) || ( gnBitsPerSample != nBits ) || ( gnChannels != nChannels ) || ( d != gdwSoundSetup ) ) { bReset = TRUE; }
  442. gnChannels = nChannels;
  443. gdwSoundSetup = d;
  444. gdwMixingFreq = nRate;
  445. gnBitsPerSample = nBits;
  446. InitPlayer( bReset );
  447. return TRUE;
  448. }
  449. BOOL CSoundFile::SetMixConfig( UINT nStereoSeparation, UINT nMaxMixChannels )
  450. //-------------------------------------------------------------------------
  451. {
  452. if ( nMaxMixChannels < 2 ) { return FALSE; }
  453. m_nMaxMixChannels = nMaxMixChannels;
  454. m_nStereoSeparation = nStereoSeparation;
  455. return TRUE;
  456. }
  457. BOOL CSoundFile::SetResamplingMode( UINT nMode )
  458. //--------------------------------------------
  459. {
  460. DWORD d = gdwSoundSetup & ~( SNDMIX_NORESAMPLING | SNDMIX_HQRESAMPLER | SNDMIX_ULTRAHQSRCMODE );
  461. switch ( nMode )
  462. {
  463. case SRCMODE_NEAREST:
  464. d |= SNDMIX_NORESAMPLING;
  465. break;
  466. case SRCMODE_LINEAR:
  467. break;
  468. case SRCMODE_SPLINE:
  469. d |= SNDMIX_HQRESAMPLER;
  470. break;
  471. case SRCMODE_POLYPHASE:
  472. d |= ( SNDMIX_HQRESAMPLER | SNDMIX_ULTRAHQSRCMODE );
  473. break;
  474. default:
  475. return FALSE;
  476. }
  477. gdwSoundSetup = d;
  478. return TRUE;
  479. }
  480. BOOL CSoundFile::SetMasterVolume( UINT nVol, BOOL bAdjustAGC )
  481. //----------------------------------------------------------
  482. {
  483. if ( nVol < 1 ) { nVol = 1; }
  484. if ( nVol > 0x200 ) { nVol = 0x200; } // x4 maximum
  485. if ( ( nVol < m_nMasterVolume ) && ( nVol ) && ( gdwSoundSetup & SNDMIX_AGC ) && ( bAdjustAGC ) )
  486. {
  487. gnAGC = gnAGC * m_nMasterVolume / nVol;
  488. if ( gnAGC > AGC_UNITY ) { gnAGC = AGC_UNITY; }
  489. }
  490. m_nMasterVolume = nVol;
  491. return TRUE;
  492. }
  493. void CSoundFile::SetAGC( BOOL b )
  494. //-----------------------------
  495. {
  496. if ( b )
  497. {
  498. if ( !( gdwSoundSetup & SNDMIX_AGC ) )
  499. {
  500. gdwSoundSetup |= SNDMIX_AGC;
  501. gnAGC = AGC_UNITY;
  502. }
  503. }
  504. else { gdwSoundSetup &= ~SNDMIX_AGC; }
  505. }
  506. UINT CSoundFile::GetNumPatterns() const
  507. //-------------------------------------
  508. {
  509. UINT i = 0;
  510. while ( ( i < MAX_ORDERS ) && ( Order[i] < 0xFF ) ) { i++; }
  511. return i;
  512. }
  513. UINT CSoundFile::GetNumInstruments() const
  514. //----------------------------------------
  515. {
  516. UINT n = 0;
  517. for ( UINT i = 0; i < MAX_INSTRUMENTS; i++ ) if ( Ins[i].pSample ) { n++; }
  518. return n;
  519. }
  520. UINT CSoundFile::GetMaxPosition() const
  521. //-------------------------------------
  522. {
  523. UINT max = 0;
  524. UINT i = 0;
  525. while ( ( i < MAX_ORDERS ) && ( Order[i] != 0xFF ) )
  526. {
  527. if ( Order[i] < MAX_PATTERNS ) { max += PatternSize[Order[i]]; }
  528. i++;
  529. }
  530. return max;
  531. }
  532. UINT CSoundFile::GetCurrentPos() const
  533. //------------------------------------
  534. {
  535. UINT pos = 0;
  536. for ( UINT i = 0; i < m_nCurrentPattern; i++ ) if ( Order[i] < MAX_PATTERNS )
  537. {
  538. pos += PatternSize[Order[i]];
  539. }
  540. return pos + m_nRow;
  541. }
  542. void CSoundFile::SetCurrentPos( UINT nPos )
  543. //---------------------------------------
  544. {
  545. UINT i, nPattern;
  546. for ( i = 0; i < MAX_CHANNELS; i++ )
  547. {
  548. Chn[i].nNote = Chn[i].nNewNote = Chn[i].nNewIns = 0;
  549. Chn[i].pInstrument = NULL;
  550. Chn[i].pHeader = NULL;
  551. Chn[i].nPortamentoDest = 0;
  552. Chn[i].nCommand = 0;
  553. Chn[i].nPatternLoopCount = 0;
  554. Chn[i].nPatternLoop = 0;
  555. Chn[i].nFadeOutVol = 0;
  556. Chn[i].dwFlags |= CHN_KEYOFF | CHN_NOTEFADE;
  557. Chn[i].nTremorCount = 0;
  558. }
  559. if ( !nPos )
  560. {
  561. for ( i = 0; i < MAX_CHANNELS; i++ )
  562. {
  563. Chn[i].nPeriod = 0;
  564. Chn[i].nPos = Chn[i].nLength = 0;
  565. Chn[i].nLoopStart = 0;
  566. Chn[i].nLoopEnd = 0;
  567. Chn[i].nROfs = Chn[i].nLOfs = 0;
  568. Chn[i].pSample = NULL;
  569. Chn[i].pInstrument = NULL;
  570. Chn[i].pHeader = NULL;
  571. Chn[i].nCutOff = 0x7F;
  572. Chn[i].nResonance = 0;
  573. Chn[i].nLeftVol = Chn[i].nRightVol = 0;
  574. Chn[i].nNewLeftVol = Chn[i].nNewRightVol = 0;
  575. Chn[i].nLeftRamp = Chn[i].nRightRamp = 0;
  576. Chn[i].nVolume = 256;
  577. if ( i < MAX_BASECHANNELS )
  578. {
  579. Chn[i].dwFlags = ChnSettings[i].dwFlags;
  580. Chn[i].nPan = ChnSettings[i].nPan;
  581. Chn[i].nGlobalVol = ChnSettings[i].nVolume;
  582. }
  583. else
  584. {
  585. Chn[i].dwFlags = 0;
  586. Chn[i].nPan = 128;
  587. Chn[i].nGlobalVol = 64;
  588. }
  589. }
  590. m_nGlobalVolume = m_nDefaultGlobalVolume;
  591. m_nMusicSpeed = m_nDefaultSpeed;
  592. m_nMusicTempo = m_nDefaultTempo;
  593. }
  594. m_dwSongFlags &= ~( SONG_PATTERNLOOP | SONG_CPUVERYHIGH | SONG_FADINGSONG | SONG_ENDREACHED | SONG_GLOBALFADE );
  595. for ( nPattern = 0; nPattern < MAX_ORDERS; nPattern++ )
  596. {
  597. UINT ord = Order[nPattern];
  598. if ( ord == 0xFE ) { continue; }
  599. if ( ord == 0xFF ) { break; }
  600. if ( ord < MAX_PATTERNS )
  601. {
  602. if ( nPos < ( UINT )PatternSize[ord] ) { break; }
  603. nPos -= PatternSize[ord];
  604. }
  605. }
  606. // Buggy position ?
  607. if ( ( nPattern >= MAX_ORDERS )
  608. || ( Order[nPattern] >= MAX_PATTERNS )
  609. || ( nPos >= PatternSize[Order[nPattern]] ) )
  610. {
  611. nPos = 0;
  612. nPattern = 0;
  613. }
  614. UINT nRow = nPos;
  615. if ( ( nRow ) && ( Order[nPattern] < MAX_PATTERNS ) )
  616. {
  617. MODCOMMAND* p = Patterns[Order[nPattern]];
  618. if ( ( p ) && ( nRow < PatternSize[Order[nPattern]] ) )
  619. {
  620. BOOL bOk = FALSE;
  621. while ( ( !bOk ) && ( nRow > 0 ) )
  622. {
  623. UINT n = nRow * m_nChannels;
  624. for ( UINT k = 0; k < m_nChannels; k++, n++ )
  625. {
  626. if ( p[n].note )
  627. {
  628. bOk = TRUE;
  629. break;
  630. }
  631. }
  632. if ( !bOk ) { nRow--; }
  633. }
  634. }
  635. }
  636. m_nNextPattern = nPattern;
  637. m_nNextRow = nRow;
  638. m_nTickCount = m_nMusicSpeed;
  639. m_nBufferCount = 0;
  640. m_nPatternDelay = 0;
  641. m_nFrameDelay = 0;
  642. }
  643. void CSoundFile::SetCurrentOrder( UINT nPos )
  644. //-----------------------------------------
  645. {
  646. while ( ( nPos < MAX_ORDERS ) && ( Order[nPos] == 0xFE ) ) { nPos++; }
  647. if ( ( nPos >= MAX_ORDERS ) || ( Order[nPos] >= MAX_PATTERNS ) ) { return; }
  648. for ( UINT j = 0; j < MAX_CHANNELS; j++ )
  649. {
  650. Chn[j].nPeriod = 0;
  651. Chn[j].nNote = 0;
  652. Chn[j].nPortamentoDest = 0;
  653. Chn[j].nCommand = 0;
  654. Chn[j].nPatternLoopCount = 0;
  655. Chn[j].nPatternLoop = 0;
  656. Chn[j].nTremorCount = 0;
  657. }
  658. if ( !nPos )
  659. {
  660. SetCurrentPos( 0 );
  661. }
  662. else
  663. {
  664. m_nNextPattern = nPos;
  665. m_nRow = m_nNextRow = 0;
  666. m_nPattern = 0;
  667. m_nTickCount = m_nMusicSpeed;
  668. m_nBufferCount = 0;
  669. m_nTotalCount = 0;
  670. m_nPatternDelay = 0;
  671. m_nFrameDelay = 0;
  672. }
  673. m_dwSongFlags &= ~( SONG_PATTERNLOOP | SONG_CPUVERYHIGH | SONG_FADINGSONG | SONG_ENDREACHED | SONG_GLOBALFADE );
  674. }
  675. void CSoundFile::ResetChannels()
  676. //------------------------------
  677. {
  678. m_dwSongFlags &= ~( SONG_CPUVERYHIGH | SONG_FADINGSONG | SONG_ENDREACHED | SONG_GLOBALFADE );
  679. m_nBufferCount = 0;
  680. for ( UINT i = 0; i < MAX_CHANNELS; i++ )
  681. {
  682. Chn[i].nROfs = Chn[i].nLOfs = 0;
  683. }
  684. }
  685. void CSoundFile::LoopPattern( int nPat, int nRow )
  686. //----------------------------------------------
  687. {
  688. if ( ( nPat < 0 ) || ( nPat >= MAX_PATTERNS ) || ( !Patterns[nPat] ) )
  689. {
  690. m_dwSongFlags &= ~SONG_PATTERNLOOP;
  691. }
  692. else
  693. {
  694. if ( ( nRow < 0 ) || ( nRow >= PatternSize[nPat] ) ) { nRow = 0; }
  695. m_nPattern = nPat;
  696. m_nRow = m_nNextRow = nRow;
  697. m_nTickCount = m_nMusicSpeed;
  698. m_nPatternDelay = 0;
  699. m_nFrameDelay = 0;
  700. m_nBufferCount = 0;
  701. m_dwSongFlags |= SONG_PATTERNLOOP;
  702. }
  703. }
  704. UINT CSoundFile::GetBestSaveFormat() const
  705. //----------------------------------------
  706. {
  707. if ( ( !m_nSamples ) || ( !m_nChannels ) ) { return MOD_TYPE_NONE; }
  708. if ( !m_nType ) { return MOD_TYPE_NONE; }
  709. if ( m_nType & ( MOD_TYPE_MOD | MOD_TYPE_OKT ) )
  710. {
  711. return MOD_TYPE_MOD;
  712. }
  713. if ( m_nType & ( MOD_TYPE_S3M | MOD_TYPE_STM | MOD_TYPE_ULT | MOD_TYPE_FAR | MOD_TYPE_PTM ) )
  714. {
  715. return MOD_TYPE_S3M;
  716. }
  717. if ( m_nType & ( MOD_TYPE_XM | MOD_TYPE_MED | MOD_TYPE_MTM | MOD_TYPE_MT2 ) )
  718. {
  719. return MOD_TYPE_XM;
  720. }
  721. return MOD_TYPE_IT;
  722. }
  723. UINT CSoundFile::GetSaveFormats() const
  724. //-------------------------------------
  725. {
  726. UINT n = 0;
  727. if ( ( !m_nSamples ) || ( !m_nChannels ) || ( m_nType == MOD_TYPE_NONE ) ) { return 0; }
  728. switch ( m_nType )
  729. {
  730. case MOD_TYPE_MOD:
  731. n = MOD_TYPE_MOD;
  732. case MOD_TYPE_S3M:
  733. n = MOD_TYPE_S3M;
  734. }
  735. n |= MOD_TYPE_XM | MOD_TYPE_IT;
  736. if ( !m_nInstruments )
  737. {
  738. if ( m_nSamples < 32 ) { n |= MOD_TYPE_MOD; }
  739. n |= MOD_TYPE_S3M;
  740. }
  741. return n;
  742. }
  743. UINT CSoundFile::GetSampleName( UINT nSample, LPSTR s ) const
  744. //--------------------------------------------------------
  745. {
  746. char sztmp[40] = ""; // changed from CHAR
  747. memcpy( sztmp, m_szNames[nSample], 32 );
  748. sztmp[31] = 0;
  749. if ( s ) { strcpy( s, sztmp ); }
  750. return strlen( sztmp );
  751. }
  752. UINT CSoundFile::GetInstrumentName( UINT nInstr, LPSTR s ) const
  753. //-----------------------------------------------------------
  754. {
  755. char sztmp[40] = ""; // changed from CHAR
  756. if ( ( nInstr >= MAX_INSTRUMENTS ) || ( !Headers[nInstr] ) )
  757. {
  758. if ( s ) { *s = 0; }
  759. return 0;
  760. }
  761. INSTRUMENTHEADER* penv = Headers[nInstr];
  762. memcpy( sztmp, penv->name, 32 );
  763. sztmp[31] = 0;
  764. if ( s ) { strcpy( s, sztmp ); }
  765. return strlen( sztmp );
  766. }
  767. #ifndef NO_PACKING
  768. UINT CSoundFile::PackSample( int& sample, int next )
  769. //------------------------------------------------
  770. {
  771. UINT i = 0;
  772. int delta = next - sample;
  773. if ( delta >= 0 )
  774. {
  775. for ( i = 0; i < 7; i++ ) if ( delta <= ( int )CompressionTable[i + 1] ) { break; }
  776. }
  777. else
  778. {
  779. for ( i = 8; i < 15; i++ ) if ( delta >= ( int )CompressionTable[i + 1] ) { break; }
  780. }
  781. sample += ( int )CompressionTable[i];
  782. return i;
  783. }
  784. BOOL CSoundFile::CanPackSample( LPSTR pSample, UINT nLen, UINT nPacking, BYTE* result )
  785. //-----------------------------------------------------------------------------------
  786. {
  787. int pos, old, oldpos, besttable = 0;
  788. DWORD dwErr, dwTotal, dwResult;
  789. int i, j;
  790. if ( result ) { *result = 0; }
  791. if ( ( !pSample ) || ( nLen < 1024 ) ) { return FALSE; }
  792. // Try packing with different tables
  793. dwResult = 0;
  794. for ( j = 1; j < MAX_PACK_TABLES; j++ )
  795. {
  796. memcpy( CompressionTable, UnpackTable[j], 16 );
  797. dwErr = 0;
  798. dwTotal = 1;
  799. old = pos = oldpos = 0;
  800. for ( i = 0; i < ( int )nLen; i++ )
  801. {
  802. int s = ( int )pSample[i];
  803. PackSample( pos, s );
  804. dwErr += abs( pos - oldpos );
  805. dwTotal += abs( s - old );
  806. old = s;
  807. oldpos = pos;
  808. }
  809. dwErr = _muldiv( dwErr, 100, dwTotal );
  810. if ( dwErr >= dwResult )
  811. {
  812. dwResult = dwErr;
  813. besttable = j;
  814. }
  815. }
  816. memcpy( CompressionTable, UnpackTable[besttable], 16 );
  817. if ( result )
  818. {
  819. if ( dwResult > 100 ) { *result = 100; }
  820. else { *result = ( BYTE )dwResult; }
  821. }
  822. return ( dwResult >= nPacking ) ? TRUE : FALSE;
  823. }
  824. #endif // NO_PACKING
  825. #ifndef MODPLUG_NO_FILESAVE
  826. UINT CSoundFile::WriteSample( FILE* f, MODINSTRUMENT* pins, UINT nFlags, UINT nMaxLen )
  827. //-----------------------------------------------------------------------------------
  828. {
  829. UINT len = 0, bufcount;
  830. signed char buffer[4096];
  831. signed char* pSample = ( signed char* )pins->pSample;
  832. UINT nLen = pins->nLength;
  833. if ( ( nMaxLen ) && ( nLen > nMaxLen ) ) { nLen = nMaxLen; }
  834. if ( ( !pSample ) || ( f == NULL ) || ( !nLen ) ) { return 0; }
  835. switch ( nFlags )
  836. {
  837. #ifndef NO_PACKING
  838. // 3: 4-bit ADPCM data
  839. case RS_ADPCM4:
  840. {
  841. int pos;
  842. len = ( nLen + 1 ) / 2;
  843. fwrite( CompressionTable, 16, 1, f );
  844. bufcount = 0;
  845. pos = 0;
  846. for ( UINT j = 0; j < len; j++ )
  847. {
  848. BYTE b;
  849. // Sample #1
  850. b = PackSample( pos, ( int )pSample[j * 2] );
  851. // Sample #2
  852. b |= PackSample( pos, ( int )pSample[j * 2 + 1] ) << 4;
  853. buffer[bufcount++] = ( signed char )b;
  854. if ( bufcount >= sizeof( buffer ) )
  855. {
  856. fwrite( buffer, 1, bufcount, f );
  857. bufcount = 0;
  858. }
  859. }
  860. if ( bufcount ) { fwrite( buffer, 1, bufcount, f ); }
  861. len += 16;
  862. }
  863. break;
  864. #endif // NO_PACKING
  865. // 16-bit samples
  866. case RS_PCM16U:
  867. case RS_PCM16D:
  868. case RS_PCM16S:
  869. {
  870. int16_t* p = ( int16_t* )pSample;
  871. int s_old = 0, s_ofs;
  872. len = nLen * 2;
  873. bufcount = 0;
  874. s_ofs = ( nFlags == RS_PCM16U ) ? 0x8000 : 0;
  875. for ( UINT j = 0; j < nLen; j++ )
  876. {
  877. int s_new = *p;
  878. p++;
  879. if ( pins->uFlags & CHN_STEREO )
  880. {
  881. s_new = ( s_new + ( *p ) + 1 ) >> 1;
  882. p++;
  883. }
  884. if ( nFlags == RS_PCM16D )
  885. {
  886. int16_t temp = bswapLE16( ( int16_t )( s_new - s_old ) );
  887. *( ( int16_t* )( &buffer[bufcount] ) ) = temp;
  888. s_old = s_new;
  889. }
  890. else
  891. {
  892. int16_t temp = bswapLE16( ( int16_t )( s_new + s_ofs ) );
  893. *( ( int16_t* )( &buffer[bufcount] ) ) = temp;
  894. }
  895. bufcount += 2;
  896. if ( bufcount >= sizeof( buffer ) - 1 )
  897. {
  898. fwrite( buffer, 1, bufcount, f );
  899. bufcount = 0;
  900. }
  901. }
  902. if ( bufcount ) { fwrite( buffer, 1, bufcount, f ); }
  903. }
  904. break;
  905. // 8-bit Stereo samples (not interleaved)
  906. case RS_STPCM8S:
  907. case RS_STPCM8U:
  908. case RS_STPCM8D:
  909. {
  910. int s_ofs = ( nFlags == RS_STPCM8U ) ? 0x80 : 0;
  911. for ( UINT iCh = 0; iCh < 2; iCh++ )
  912. {
  913. signed char* p = pSample + iCh;
  914. int s_old = 0;
  915. bufcount = 0;
  916. for ( UINT j = 0; j < nLen; j++ )
  917. {
  918. int s_new = *p;
  919. p += 2;
  920. if ( nFlags == RS_STPCM8D )
  921. {
  922. buffer[bufcount++] = ( signed char )( s_new - s_old );
  923. s_old = s_new;
  924. }
  925. else
  926. {
  927. buffer[bufcount++] = ( signed char )( s_new + s_ofs );
  928. }
  929. if ( bufcount >= sizeof( buffer ) )
  930. {
  931. fwrite( buffer, 1, bufcount, f );
  932. bufcount = 0;
  933. }
  934. }
  935. if ( bufcount ) { fwrite( buffer, 1, bufcount, f ); }
  936. }
  937. }
  938. len = nLen * 2;
  939. break;
  940. // 16-bit Stereo samples (not interleaved)
  941. case RS_STPCM16S:
  942. case RS_STPCM16U:
  943. case RS_STPCM16D:
  944. {
  945. int s_ofs = ( nFlags == RS_STPCM16U ) ? 0x8000 : 0;
  946. for ( UINT iCh = 0; iCh < 2; iCh++ )
  947. {
  948. int16_t* p = ( ( int16_t* )pSample ) + iCh;
  949. int s_old = 0;
  950. bufcount = 0;
  951. for ( UINT j = 0; j < nLen; j++ )
  952. {
  953. int s_new = *p;
  954. p += 2;
  955. if ( nFlags == RS_STPCM16D )
  956. {
  957. int16_t temp = bswapLE16( ( int16_t )( s_new - s_old ) );
  958. *( ( int16_t* )( &buffer[bufcount] ) ) = temp;
  959. s_old = s_new;
  960. }
  961. else
  962. {
  963. int16_t temp = bswapLE16( ( int16_t )( s_new - s_ofs ) );
  964. *( ( int16_t* )( &buffer[bufcount] ) ) = temp;
  965. }
  966. bufcount += 2;
  967. if ( bufcount >= sizeof( buffer ) )
  968. {
  969. fwrite( buffer, 1, bufcount, f );
  970. bufcount = 0;
  971. }
  972. }
  973. if ( bufcount ) { fwrite( buffer, 1, bufcount, f ); }
  974. }
  975. }
  976. len = nLen * 4;
  977. break;
  978. // Stereo signed interleaved
  979. case RS_STIPCM8S:
  980. case RS_STIPCM16S:
  981. len = nLen * 2;
  982. if ( nFlags == RS_STIPCM16S ) { len *= 2; }
  983. fwrite( pSample, 1, len, f );
  984. break;
  985. // Default: assume 8-bit PCM data
  986. default:
  987. len = nLen;
  988. bufcount = 0;
  989. {
  990. signed char* p = pSample;
  991. int sinc = ( pins->uFlags & CHN_16BIT ) ? 2 : 1;
  992. int s_old = 0, s_ofs = ( nFlags == RS_PCM8U ) ? 0x80 : 0;
  993. if ( pins->uFlags & CHN_16BIT ) { p++; }
  994. for ( UINT j = 0; j < len; j++ )
  995. {
  996. int s_new = ( signed char )( *p );
  997. p += sinc;
  998. if ( pins->uFlags & CHN_STEREO )
  999. {
  1000. s_new = ( s_new + ( ( int ) * p ) + 1 ) >> 1;
  1001. p += sinc;
  1002. }
  1003. if ( nFlags == RS_PCM8D )
  1004. {
  1005. buffer[bufcount++] = ( signed char )( s_new - s_old );
  1006. s_old = s_new;
  1007. }
  1008. else
  1009. {
  1010. buffer[bufcount++] = ( signed char )( s_new + s_ofs );
  1011. }
  1012. if ( bufcount >= sizeof( buffer ) )
  1013. {
  1014. fwrite( buffer, 1, bufcount, f );
  1015. bufcount = 0;
  1016. }
  1017. }
  1018. if ( bufcount ) { fwrite( buffer, 1, bufcount, f ); }
  1019. }
  1020. }
  1021. return len;
  1022. }
  1023. #endif // MODPLUG_NO_FILESAVE
  1024. // Flags:
  1025. // 0 = signed 8-bit PCM data (default)
  1026. // 1 = unsigned 8-bit PCM data
  1027. // 2 = 8-bit ADPCM data with linear table
  1028. // 3 = 4-bit ADPCM data
  1029. // 4 = 16-bit ADPCM data with linear table
  1030. // 5 = signed 16-bit PCM data
  1031. // 6 = unsigned 16-bit PCM data
  1032. UINT CSoundFile::ReadSample( MODINSTRUMENT* pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength )
  1033. //------------------------------------------------------------------------------
  1034. {
  1035. UINT len = 0, mem = pIns->nLength + 6;
  1036. // Disable >2Gb samples,(preventing buffer overflow in AllocateSample)
  1037. if ( ( !pIns ) || ( ( int )pIns->nLength < 4 ) || ( !lpMemFile ) ) { return 0; }
  1038. if ( pIns->nLength > MAX_SAMPLE_LENGTH ) { pIns->nLength = MAX_SAMPLE_LENGTH; }
  1039. pIns->uFlags &= ~( CHN_16BIT | CHN_STEREO );
  1040. if ( nFlags & RSF_16BIT )
  1041. {
  1042. mem *= 2;
  1043. pIns->uFlags |= CHN_16BIT;
  1044. }
  1045. if ( nFlags & RSF_STEREO )
  1046. {
  1047. mem *= 2;
  1048. pIns->uFlags |= CHN_STEREO;
  1049. }
  1050. if ( ( pIns->pSample = AllocateSample( mem ) ) == NULL )
  1051. {
  1052. pIns->nLength = 0;
  1053. return 0;
  1054. }
  1055. switch ( nFlags )
  1056. {
  1057. // 1: 8-bit unsigned PCM data
  1058. case RS_PCM8U:
  1059. {
  1060. len = pIns->nLength;
  1061. if ( len > dwMemLength ) { len = pIns->nLength = dwMemLength; }
  1062. signed char* pSample = pIns->pSample;
  1063. for ( UINT j = 0; j < len; j++ ) { pSample[j] = ( signed char )( lpMemFile[j] - 0x80 ); }
  1064. }
  1065. break;
  1066. // 2: 8-bit ADPCM data with linear table
  1067. case RS_PCM8D:
  1068. {
  1069. len = pIns->nLength;
  1070. if ( len > dwMemLength ) { break; }
  1071. signed char* pSample = pIns->pSample;
  1072. const signed char* p = ( const signed char* )lpMemFile;
  1073. int delta = 0;
  1074. for ( UINT j = 0; j < len; j++ )
  1075. {
  1076. delta += p[j];
  1077. *pSample++ = ( signed char )delta;
  1078. }
  1079. }
  1080. break;
  1081. // 3: 4-bit ADPCM data
  1082. case RS_ADPCM4:
  1083. {
  1084. len = ( pIns->nLength + 1 ) / 2;
  1085. if ( len > dwMemLength - 16 ) { break; }
  1086. memcpy( CompressionTable, lpMemFile, 16 );
  1087. lpMemFile += 16;
  1088. signed char* pSample = pIns->pSample;
  1089. signed char delta = 0;
  1090. for ( UINT j = 0; j < len; j++ )
  1091. {
  1092. BYTE b0 = ( BYTE )lpMemFile[j];
  1093. BYTE b1 = ( BYTE )( lpMemFile[j] >> 4 );
  1094. delta = ( signed char )GetDeltaValue( ( int )delta, b0 );
  1095. pSample[0] = delta;
  1096. delta = ( signed char )GetDeltaValue( ( int )delta, b1 );
  1097. pSample[1] = delta;
  1098. pSample += 2;
  1099. }
  1100. len += 16;
  1101. }
  1102. break;
  1103. // 4: 16-bit ADPCM data with linear table
  1104. case RS_PCM16D:
  1105. {
  1106. len = pIns->nLength * 2;
  1107. if ( len > dwMemLength ) { break; }
  1108. int16_t* pSample = ( int16_t* )pIns->pSample;
  1109. int16_t* p = ( int16_t* )lpMemFile;
  1110. int delta16 = 0;
  1111. for ( UINT j = 0; j < len; j += 2 )
  1112. {
  1113. delta16 += bswapLE16( *p++ );
  1114. *pSample++ = ( int16_t )delta16;
  1115. }
  1116. }
  1117. break;
  1118. // 5: 16-bit signed PCM data
  1119. case RS_PCM16S:
  1120. {
  1121. len = pIns->nLength * 2;
  1122. if ( len <= dwMemLength ) { memcpy( pIns->pSample, lpMemFile, len ); }
  1123. int16_t* pSample = ( int16_t* )pIns->pSample;
  1124. for ( UINT j = 0; j < len; j += 2 )
  1125. {
  1126. int16_t rawSample = *pSample;
  1127. *pSample++ = bswapLE16( rawSample );
  1128. }
  1129. }
  1130. break;
  1131. // 16-bit signed mono PCM motorola byte order
  1132. case RS_PCM16M:
  1133. len = pIns->nLength * 2;
  1134. if ( len > dwMemLength ) { len = dwMemLength & ~1; }
  1135. if ( len > 1 )
  1136. {
  1137. signed char* pSample = ( signed char* )pIns->pSample;
  1138. signed char* pSrc = ( signed char* )lpMemFile;
  1139. for ( UINT j = 0; j < len; j += 2 )
  1140. {
  1141. // pSample[j] = pSrc[j+1];
  1142. // pSample[j+1] = pSrc[j];
  1143. *( ( uint16_t* )( pSample + j ) ) = bswapBE16( *( ( uint16_t* )( pSrc + j ) ) );
  1144. }
  1145. }
  1146. break;
  1147. // 6: 16-bit unsigned PCM data
  1148. case RS_PCM16U:
  1149. {
  1150. len = pIns->nLength * 2;
  1151. if ( len > dwMemLength ) { break; }
  1152. int16_t* pSample = ( int16_t* )pIns->pSample;
  1153. int16_t* pSrc = ( int16_t* )lpMemFile;
  1154. for ( UINT j = 0; j < len; j += 2 ) { *pSample++ = bswapLE16( *( pSrc++ ) ) - 0x8000; }
  1155. }
  1156. break;
  1157. // 16-bit signed stereo big endian
  1158. case RS_STPCM16M:
  1159. len = pIns->nLength * 2;
  1160. if ( len * 2 <= dwMemLength )
  1161. {
  1162. signed char* pSample = ( signed char* )pIns->pSample;
  1163. signed char* pSrc = ( signed char* )lpMemFile;
  1164. for ( UINT j = 0; j < len; j += 2 )
  1165. {
  1166. // pSample[j*2] = pSrc[j+1];
  1167. // pSample[j*2+1] = pSrc[j];
  1168. // pSample[j*2+2] = pSrc[j+1+len];
  1169. // pSample[j*2+3] = pSrc[j+len];
  1170. *( ( uint16_t* )( pSample + j * 2 ) ) = bswapBE16( *( ( uint16_t* )( pSrc + j ) ) );
  1171. *( ( uint16_t* )( pSample + j * 2 + 2 ) ) = bswapBE16( *( ( uint16_t* )( pSrc + j + len ) ) );
  1172. }
  1173. len *= 2;
  1174. }
  1175. break;
  1176. // 8-bit stereo samples
  1177. case RS_STPCM8S:
  1178. case RS_STPCM8U:
  1179. case RS_STPCM8D:
  1180. {
  1181. int iadd_l = 0, iadd_r = 0;
  1182. if ( nFlags == RS_STPCM8U ) { iadd_l = iadd_r = -128; }
  1183. len = pIns->nLength;
  1184. signed char* psrc = ( signed char* )lpMemFile;
  1185. signed char* pSample = ( signed char* )pIns->pSample;
  1186. if ( len * 2 > dwMemLength ) { break; }
  1187. for ( UINT j = 0; j < len; j++ )
  1188. {
  1189. pSample[j * 2] = ( signed char )( psrc[0] + iadd_l );
  1190. pSample[j * 2 + 1] = ( signed char )( psrc[len] + iadd_r );
  1191. psrc++;
  1192. if ( nFlags == RS_STPCM8D )
  1193. {
  1194. iadd_l = pSample[j * 2];
  1195. iadd_r = pSample[j * 2 + 1];
  1196. }
  1197. }
  1198. len *= 2;
  1199. }
  1200. break;
  1201. // 16-bit stereo samples
  1202. case RS_STPCM16S:
  1203. case RS_STPCM16U:
  1204. case RS_STPCM16D:
  1205. {
  1206. int iadd_l = 0, iadd_r = 0;
  1207. if ( nFlags == RS_STPCM16U ) { iadd_l = iadd_r = -0x8000; }
  1208. len = pIns->nLength;
  1209. int16_t* psrc = ( int16_t* )lpMemFile;
  1210. int16_t* pSample = ( int16_t* )pIns->pSample;
  1211. if ( len * 4 > dwMemLength ) { break; }
  1212. for ( UINT j = 0; j < len; j++ )
  1213. {
  1214. pSample[j * 2] = ( int16_t ) ( bswapLE16( psrc[0] ) + iadd_l );
  1215. pSample[j * 2 + 1] = ( int16_t ) ( bswapLE16( psrc[len] ) + iadd_r );
  1216. psrc++;
  1217. if ( nFlags == RS_STPCM16D )
  1218. {
  1219. iadd_l = pSample[j * 2];
  1220. iadd_r = pSample[j * 2 + 1];
  1221. }
  1222. }
  1223. len *= 4;
  1224. }
  1225. break;
  1226. // IT 2.14 compressed samples
  1227. case RS_IT2148:
  1228. case RS_IT21416:
  1229. case RS_IT2158:
  1230. case RS_IT21516:
  1231. len = dwMemLength;
  1232. if ( len < 4 ) { break; }
  1233. if ( ( nFlags == RS_IT2148 ) || ( nFlags == RS_IT2158 ) )
  1234. {
  1235. ITUnpack8Bit( pIns->pSample, pIns->nLength, ( LPBYTE )lpMemFile, dwMemLength, ( nFlags == RS_IT2158 ) );
  1236. }
  1237. else
  1238. {
  1239. ITUnpack16Bit( pIns->pSample, pIns->nLength, ( LPBYTE )lpMemFile, dwMemLength, ( nFlags == RS_IT21516 ) );
  1240. }
  1241. break;
  1242. #ifndef MODPLUG_BASIC_SUPPORT
  1243. #ifndef MODPLUG_FASTSOUNDLIB
  1244. // 8-bit interleaved stereo samples
  1245. case RS_STIPCM8S:
  1246. case RS_STIPCM8U:
  1247. {
  1248. int iadd = 0;
  1249. if ( nFlags == RS_STIPCM8U ) { iadd = -0x80; }
  1250. len = pIns->nLength;
  1251. if ( len * 2 > dwMemLength ) { len = dwMemLength >> 1; }
  1252. LPBYTE psrc = ( LPBYTE )lpMemFile;
  1253. LPBYTE pSample = ( LPBYTE )pIns->pSample;
  1254. for ( UINT j = 0; j < len; j++ )
  1255. {
  1256. pSample[j * 2] = ( signed char )( psrc[0] + iadd );
  1257. pSample[j * 2 + 1] = ( signed char )( psrc[1] + iadd );
  1258. psrc += 2;
  1259. }
  1260. len *= 2;
  1261. }
  1262. break;
  1263. // 16-bit interleaved stereo samples
  1264. case RS_STIPCM16S:
  1265. case RS_STIPCM16U:
  1266. {
  1267. int iadd = 0;
  1268. if ( nFlags == RS_STIPCM16U ) { iadd = -32768; }
  1269. len = pIns->nLength;
  1270. if ( len * 4 > dwMemLength ) { len = dwMemLength >> 2; }
  1271. int16_t* psrc = ( int16_t* )lpMemFile;
  1272. int16_t* pSample = ( int16_t* )pIns->pSample;
  1273. for ( UINT j = 0; j < len; j++ )
  1274. {
  1275. pSample[j * 2] = ( int16_t )( bswapLE16( psrc[0] ) + iadd );
  1276. pSample[j * 2 + 1] = ( int16_t )( bswapLE16( psrc[1] ) + iadd );
  1277. psrc += 2;
  1278. }
  1279. len *= 4;
  1280. }
  1281. break;
  1282. // AMS compressed samples
  1283. case RS_AMS8:
  1284. case RS_AMS16:
  1285. len = 9;
  1286. if ( dwMemLength > 9 )
  1287. {
  1288. const char* psrc = lpMemFile;
  1289. char packcharacter = lpMemFile[8], *pdest = ( char* )pIns->pSample;
  1290. len += bswapLE32( *( ( LPDWORD )( lpMemFile + 4 ) ) );
  1291. if ( len > dwMemLength ) { len = dwMemLength; }
  1292. UINT dmax = pIns->nLength;
  1293. if ( pIns->uFlags & CHN_16BIT ) { dmax <<= 1; }
  1294. AMSUnpack( psrc + 9, len - 9, pdest, dmax, packcharacter );
  1295. }
  1296. break;
  1297. // PTM 8bit delta to 16-bit sample
  1298. case RS_PTM8DTO16:
  1299. {
  1300. len = pIns->nLength * 2;
  1301. if ( len > dwMemLength ) { break; }
  1302. int8_t* pSample = ( int8_t* )pIns->pSample;
  1303. int8_t delta8 = 0;
  1304. for ( UINT j = 0; j < len; j++ )
  1305. {
  1306. delta8 += lpMemFile[j];
  1307. *pSample++ = delta8;
  1308. }
  1309. uint16_t* pSampleW = ( uint16_t* )pIns->pSample;
  1310. for ( UINT j = 0; j < len; j += 2 ) // swaparoni!
  1311. {
  1312. uint16_t rawSample = *pSampleW;
  1313. *pSampleW++ = bswapLE16( rawSample );
  1314. }
  1315. }
  1316. break;
  1317. // Huffman MDL compressed samples
  1318. case RS_MDL8:
  1319. case RS_MDL16:
  1320. len = dwMemLength;
  1321. if ( len >= 4 )
  1322. {
  1323. LPBYTE pSample = ( LPBYTE )pIns->pSample;
  1324. LPBYTE ibuf = ( LPBYTE )lpMemFile;
  1325. DWORD bitbuf = bswapLE32( *( ( DWORD* )ibuf ) );
  1326. UINT bitnum = 32;
  1327. BYTE dlt = 0, lowbyte = 0;
  1328. ibuf += 4;
  1329. for ( UINT j = 0; j < pIns->nLength; j++ )
  1330. {
  1331. BYTE hibyte;
  1332. BYTE sign;
  1333. if ( nFlags == RS_MDL16 ) { lowbyte = ( BYTE )MDLReadBits( bitbuf, bitnum, ibuf, 8 ); }
  1334. sign = ( BYTE )MDLReadBits( bitbuf, bitnum, ibuf, 1 );
  1335. if ( MDLReadBits( bitbuf, bitnum, ibuf, 1 ) )
  1336. {
  1337. hibyte = ( BYTE )MDLReadBits( bitbuf, bitnum, ibuf, 3 );
  1338. }
  1339. else
  1340. {
  1341. hibyte = 8;
  1342. while ( !MDLReadBits( bitbuf, bitnum, ibuf, 1 ) ) { hibyte += 0x10; }
  1343. hibyte += MDLReadBits( bitbuf, bitnum, ibuf, 4 );
  1344. }
  1345. if ( sign ) { hibyte = ~hibyte; }
  1346. dlt += hibyte;
  1347. if ( nFlags != RS_MDL16 )
  1348. {
  1349. pSample[j] = dlt;
  1350. }
  1351. else
  1352. {
  1353. pSample[j << 1] = lowbyte;
  1354. pSample[( j << 1 ) + 1] = dlt;
  1355. }
  1356. }
  1357. }
  1358. break;
  1359. case RS_DMF8:
  1360. case RS_DMF16:
  1361. len = dwMemLength;
  1362. if ( len >= 4 )
  1363. {
  1364. UINT maxlen = pIns->nLength;
  1365. if ( pIns->uFlags & CHN_16BIT ) { maxlen <<= 1; }
  1366. LPBYTE ibuf = ( LPBYTE )lpMemFile, ibufmax = ( LPBYTE )( lpMemFile + dwMemLength );
  1367. len = DMFUnpack( ( LPBYTE )pIns->pSample, ibuf, ibufmax, maxlen );
  1368. }
  1369. break;
  1370. #ifdef MODPLUG_TRACKER
  1371. // PCM 24-bit signed -> load sample, and normalize it to 16-bit
  1372. case RS_PCM24S:
  1373. case RS_PCM32S:
  1374. len = pIns->nLength * 3;
  1375. if ( nFlags == RS_PCM32S ) { len += pIns->nLength; }
  1376. if ( len > dwMemLength ) { break; }
  1377. if ( len > 4 * 8 )
  1378. {
  1379. UINT slsize = ( nFlags == RS_PCM32S ) ? 4 : 3;
  1380. LPBYTE pSrc = ( LPBYTE )lpMemFile;
  1381. LONG max = 255;
  1382. if ( nFlags == RS_PCM32S ) { pSrc++; }
  1383. for ( UINT j = 0; j < len; j += slsize )
  1384. {
  1385. LONG l = ( ( ( ( pSrc[j + 2] << 8 ) + pSrc[j + 1] ) << 8 ) + pSrc[j] ) << 8;
  1386. l /= 256;
  1387. if ( l > max ) { max = l; }
  1388. if ( -l > max ) { max = -l; }
  1389. }
  1390. max = ( max / 128 ) + 1;
  1391. int16_t* pDest = ( int16_t* )pIns->pSample;
  1392. for ( UINT k = 0; k < len; k += slsize )
  1393. {
  1394. LONG l = ( ( ( ( pSrc[k + 2] << 8 ) + pSrc[k + 1] ) << 8 ) + pSrc[k] ) << 8;
  1395. *pDest++ = ( uint16_t )( l / max );
  1396. }
  1397. }
  1398. break;
  1399. // Stereo PCM 24-bit signed -> load sample, and normalize it to 16-bit
  1400. case RS_STIPCM24S:
  1401. case RS_STIPCM32S:
  1402. len = pIns->nLength * 6;
  1403. if ( nFlags == RS_STIPCM32S ) { len += pIns->nLength * 2; }
  1404. if ( len > dwMemLength ) { break; }
  1405. if ( len > 8 * 8 )
  1406. {
  1407. UINT slsize = ( nFlags == RS_STIPCM32S ) ? 4 : 3;
  1408. LPBYTE pSrc = ( LPBYTE )lpMemFile;
  1409. LONG max = 255;
  1410. if ( nFlags == RS_STIPCM32S ) { pSrc++; }
  1411. for ( UINT j = 0; j < len; j += slsize )
  1412. {
  1413. LONG l = ( ( ( ( pSrc[j + 2] << 8 ) + pSrc[j + 1] ) << 8 ) + pSrc[j] ) << 8;
  1414. l /= 256;
  1415. if ( l > max ) { max = l; }
  1416. if ( -l > max ) { max = -l; }
  1417. }
  1418. max = ( max / 128 ) + 1;
  1419. int16_t* pDest = ( int16_t* )pIns->pSample;
  1420. for ( UINT k = 0; k < len; k += slsize )
  1421. {
  1422. LONG lr = ( ( ( ( pSrc[k + 2] << 8 ) + pSrc[k + 1] ) << 8 ) + pSrc[k] ) << 8;
  1423. k += slsize;
  1424. LONG ll = ( ( ( ( pSrc[k + 2] << 8 ) + pSrc[k + 1] ) << 8 ) + pSrc[k] ) << 8;
  1425. pDest[0] = ( int16_t )ll;
  1426. pDest[1] = ( int16_t )lr;
  1427. pDest += 2;
  1428. }
  1429. }
  1430. break;
  1431. // 16-bit signed big endian interleaved stereo
  1432. case RS_STIPCM16M:
  1433. {
  1434. len = pIns->nLength;
  1435. if ( len * 4 > dwMemLength ) { len = dwMemLength >> 2; }
  1436. LPCBYTE psrc = ( LPCBYTE )lpMemFile;
  1437. int16_t* pSample = ( int16_t* )pIns->pSample;
  1438. for ( UINT j = 0; j < len; j++ )
  1439. {
  1440. pSample[j * 2] = ( int16_t )( ( ( UINT )psrc[0] << 8 ) | ( psrc[1] ) );
  1441. pSample[j * 2 + 1] = ( int16_t )( ( ( UINT )psrc[2] << 8 ) | ( psrc[3] ) );
  1442. psrc += 4;
  1443. }
  1444. len *= 4;
  1445. }
  1446. break;
  1447. #endif // MODPLUG_TRACKER
  1448. #endif // !MODPLUG_FASTSOUNDLIB
  1449. #endif // !MODPLUG_BASIC_SUPPORT
  1450. // Default: 8-bit signed PCM data
  1451. default:
  1452. len = pIns->nLength;
  1453. if ( len > dwMemLength ) { len = pIns->nLength = dwMemLength; }
  1454. memcpy( pIns->pSample, lpMemFile, len );
  1455. }
  1456. if ( len > dwMemLength )
  1457. {
  1458. if ( pIns->pSample )
  1459. {
  1460. pIns->nLength = 0;
  1461. FreeSample( pIns->pSample );
  1462. pIns->pSample = NULL;
  1463. }
  1464. return 0;
  1465. }
  1466. AdjustSampleLoop( pIns );
  1467. return len;
  1468. }
  1469. void CSoundFile::AdjustSampleLoop( MODINSTRUMENT* pIns )
  1470. //----------------------------------------------------
  1471. {
  1472. if ( !pIns->pSample ) { return; }
  1473. if ( pIns->nLoopEnd > pIns->nLength ) { pIns->nLoopEnd = pIns->nLength; }
  1474. if ( pIns->nLoopStart + 2 >= pIns->nLoopEnd )
  1475. {
  1476. pIns->nLoopStart = pIns->nLoopEnd = 0;
  1477. pIns->uFlags &= ~CHN_LOOP;
  1478. }
  1479. UINT len = pIns->nLength;
  1480. if ( pIns->uFlags & CHN_16BIT )
  1481. {
  1482. int16_t* pSample = ( int16_t* )pIns->pSample;
  1483. // Adjust end of sample
  1484. if ( pIns->uFlags & CHN_STEREO )
  1485. {
  1486. pSample[len * 2 + 6] = pSample[len * 2 + 4] = pSample[len * 2 + 2] = pSample[len * 2] = 0;
  1487. pSample[len * 2 + 7] = pSample[len * 2 + 5] = pSample[len * 2 + 3] = pSample[len * 2 + 1] = 0;
  1488. }
  1489. else
  1490. {
  1491. pSample[len + 4] = pSample[len + 3] = pSample[len + 2] = pSample[len + 1] = pSample[len] = 0;
  1492. }
  1493. if ( ( pIns->uFlags & ( CHN_LOOP | CHN_PINGPONGLOOP | CHN_STEREO ) ) == CHN_LOOP )
  1494. {
  1495. // Fix bad loops
  1496. if ( ( pIns->nLoopEnd + 3 >= pIns->nLength ) || ( m_nType & MOD_TYPE_S3M ) )
  1497. {
  1498. pSample[pIns->nLoopEnd] = pSample[pIns->nLoopStart];
  1499. pSample[pIns->nLoopEnd + 1] = pSample[pIns->nLoopStart + 1];
  1500. pSample[pIns->nLoopEnd + 2] = pSample[pIns->nLoopStart + 2];
  1501. pSample[pIns->nLoopEnd + 3] = pSample[pIns->nLoopStart + 3];
  1502. pSample[pIns->nLoopEnd + 4] = pSample[pIns->nLoopStart + 4];
  1503. }
  1504. }
  1505. }
  1506. else
  1507. {
  1508. signed char* pSample = pIns->pSample;
  1509. #ifndef MODPLUG_FASTSOUNDLIB
  1510. // Crappy samples (except chiptunes) ?
  1511. if ( ( pIns->nLength > 0x100 ) && ( m_nType & ( MOD_TYPE_MOD | MOD_TYPE_S3M ) )
  1512. && ( !( pIns->uFlags & CHN_STEREO ) ) )
  1513. {
  1514. int smpend = pSample[pIns->nLength - 1], smpfix = 0, kscan;
  1515. for ( kscan = pIns->nLength - 1; kscan > 0; kscan-- )
  1516. {
  1517. smpfix = pSample[kscan - 1];
  1518. if ( smpfix != smpend ) { break; }
  1519. }
  1520. int delta = smpfix - smpend;
  1521. if ( ( ( !( pIns->uFlags & CHN_LOOP ) ) || ( kscan > ( int )pIns->nLoopEnd ) )
  1522. && ( ( delta < -8 ) || ( delta > 8 ) ) )
  1523. {
  1524. while ( kscan < ( int )pIns->nLength )
  1525. {
  1526. if ( !( kscan & 7 ) )
  1527. {
  1528. if ( smpfix > 0 ) { smpfix--; }
  1529. if ( smpfix < 0 ) { smpfix++; }
  1530. }
  1531. pSample[kscan] = ( signed char )smpfix;
  1532. kscan++;
  1533. }
  1534. }
  1535. }
  1536. #endif
  1537. // Adjust end of sample
  1538. if ( pIns->uFlags & CHN_STEREO )
  1539. {
  1540. pSample[len * 2 + 6] = pSample[len * 2 + 4] = pSample[len * 2 + 2] = pSample[len * 2] = 0;
  1541. pSample[len * 2 + 7] = pSample[len * 2 + 5] = pSample[len * 2 + 3] = pSample[len * 2 + 1] = 0;
  1542. }
  1543. else
  1544. {
  1545. pSample[len + 4] = pSample[len + 3] = pSample[len + 2] = pSample[len + 1] = pSample[len] = 0;
  1546. }
  1547. if ( ( pIns->uFlags & ( CHN_LOOP | CHN_PINGPONGLOOP | CHN_STEREO ) ) == CHN_LOOP )
  1548. {
  1549. if ( ( pIns->nLoopEnd + 3 >= pIns->nLength ) || ( m_nType & ( MOD_TYPE_MOD | MOD_TYPE_S3M ) ) )
  1550. {
  1551. pSample[pIns->nLoopEnd] = pSample[pIns->nLoopStart];
  1552. pSample[pIns->nLoopEnd + 1] = pSample[pIns->nLoopStart + 1];
  1553. pSample[pIns->nLoopEnd + 2] = pSample[pIns->nLoopStart + 2];
  1554. pSample[pIns->nLoopEnd + 3] = pSample[pIns->nLoopStart + 3];
  1555. pSample[pIns->nLoopEnd + 4] = pSample[pIns->nLoopStart + 4];
  1556. }
  1557. }
  1558. }
  1559. }
  1560. /////////////////////////////////////////////////////////////
  1561. // Transpose <-> Frequency conversions
  1562. // returns 8363*2^((transp*128+ftune)/(12*128))
  1563. DWORD CSoundFile::TransposeToFrequency( int transp, int ftune )
  1564. //-----------------------------------------------------------
  1565. {
  1566. #ifdef MSC_VER
  1567. const float _fbase = 8363;
  1568. const float _factor = 1.0f / ( 12.0f * 128.0f );
  1569. int result;
  1570. DWORD freq;
  1571. transp = ( transp << 7 ) + ftune;
  1572. _asm
  1573. {
  1574. fild transp
  1575. fld _factor
  1576. fmulp st( 1 ), st( 0 )
  1577. fist result
  1578. fisub result
  1579. f2xm1
  1580. fild result
  1581. fld _fbase
  1582. fscale
  1583. fstp st( 1 )
  1584. fmul st( 1 ), st( 0 )
  1585. faddp st( 1 ), st( 0 )
  1586. fistp freq
  1587. }
  1588. UINT derr = freq % 11025;
  1589. if ( derr <= 8 ) { freq -= derr; }
  1590. if ( derr >= 11015 ) { freq += 11025 - derr; }
  1591. derr = freq % 1000;
  1592. if ( derr <= 5 ) { freq -= derr; }
  1593. if ( derr >= 995 ) { freq += 1000 - derr; }
  1594. return freq;
  1595. #else
  1596. //---GCCFIX: Removed assembly.
  1597. return ( DWORD )( 8363 * pow( 2, ( double )( transp * 128 + ftune ) / ( 1536 ) ) );
  1598. #endif
  1599. }
  1600. // returns 12*128*log2(freq/8363)
  1601. int CSoundFile::FrequencyToTranspose( DWORD freq )
  1602. //----------------------------------------------
  1603. {
  1604. #ifdef MSC_VER
  1605. const float _f1_8363 = 1.0f / 8363.0f;
  1606. const float _factor = 128 * 12;
  1607. LONG result;
  1608. if ( !freq ) { return 0; }
  1609. _asm
  1610. {
  1611. fld _factor
  1612. fild freq
  1613. fld _f1_8363
  1614. fmulp st( 1 ), st( 0 )
  1615. fyl2x
  1616. fistp result
  1617. }
  1618. return result;
  1619. #else
  1620. //---GCCFIX: Removed assembly.
  1621. return int( 1536 * ( log( freq / 8363.0 ) / log( 2.0 ) ) );
  1622. #endif
  1623. }
  1624. void CSoundFile::FrequencyToTranspose( MODINSTRUMENT* psmp )
  1625. //--------------------------------------------------------
  1626. {
  1627. int f2t = FrequencyToTranspose( psmp->nC4Speed );
  1628. int transp = f2t >> 7;
  1629. int ftune = f2t & 0x7F;
  1630. if ( ftune > 80 )
  1631. {
  1632. transp++;
  1633. ftune -= 128;
  1634. }
  1635. if ( transp > 127 ) { transp = 127; }
  1636. if ( transp < -127 ) { transp = -127; }
  1637. psmp->RelativeTone = transp;
  1638. psmp->nFineTune = ftune;
  1639. }
  1640. void CSoundFile::CheckCPUUsage( UINT nCPU )
  1641. //---------------------------------------
  1642. {
  1643. if ( nCPU > 100 ) { nCPU = 100; }
  1644. gnCPUUsage = nCPU;
  1645. if ( nCPU < 90 )
  1646. {
  1647. m_dwSongFlags &= ~SONG_CPUVERYHIGH;
  1648. }
  1649. else if ( ( m_dwSongFlags & SONG_CPUVERYHIGH ) && ( nCPU >= 94 ) )
  1650. {
  1651. UINT i = MAX_CHANNELS;
  1652. while ( i >= 8 )
  1653. {
  1654. i--;
  1655. if ( Chn[i].nLength )
  1656. {
  1657. Chn[i].nLength = Chn[i].nPos = 0;
  1658. nCPU -= 2;
  1659. if ( nCPU < 94 ) { break; }
  1660. }
  1661. }
  1662. }
  1663. else if ( nCPU > 90 )
  1664. {
  1665. m_dwSongFlags |= SONG_CPUVERYHIGH;
  1666. }
  1667. }
  1668. BOOL CSoundFile::SetPatternName( UINT nPat, LPCSTR lpszName )
  1669. //---------------------------------------------------------
  1670. {
  1671. char szName[MAX_PATTERNNAME] = ""; // changed from CHAR
  1672. if ( nPat >= MAX_PATTERNS ) { return FALSE; }
  1673. if ( lpszName ) { lstrcpyn( szName, lpszName, MAX_PATTERNNAME ); }
  1674. szName[MAX_PATTERNNAME - 1] = 0;
  1675. if ( !m_lpszPatternNames ) { m_nPatternNames = 0; }
  1676. if ( nPat >= m_nPatternNames )
  1677. {
  1678. if ( !lpszName[0] ) { return TRUE; }
  1679. UINT len = ( nPat + 1 ) * MAX_PATTERNNAME;
  1680. char* p = new char[len]; // changed from CHAR
  1681. if ( !p ) { return FALSE; }
  1682. memset( p, 0, len );
  1683. if ( m_lpszPatternNames )
  1684. {
  1685. memcpy( p, m_lpszPatternNames, m_nPatternNames * MAX_PATTERNNAME );
  1686. delete [] m_lpszPatternNames;
  1687. m_lpszPatternNames = NULL;
  1688. }
  1689. m_lpszPatternNames = p;
  1690. m_nPatternNames = nPat + 1;
  1691. }
  1692. memcpy( m_lpszPatternNames + nPat * MAX_PATTERNNAME, szName, MAX_PATTERNNAME );
  1693. return TRUE;
  1694. }
  1695. BOOL CSoundFile::GetPatternName( UINT nPat, LPSTR lpszName, UINT cbSize ) const
  1696. //---------------------------------------------------------------------------
  1697. {
  1698. if ( ( !lpszName ) || ( !cbSize ) ) { return FALSE; }
  1699. lpszName[0] = 0;
  1700. if ( cbSize > MAX_PATTERNNAME ) { cbSize = MAX_PATTERNNAME; }
  1701. if ( ( m_lpszPatternNames ) && ( nPat < m_nPatternNames ) )
  1702. {
  1703. memcpy( lpszName, m_lpszPatternNames + nPat * MAX_PATTERNNAME, cbSize );
  1704. lpszName[cbSize - 1] = 0;
  1705. return TRUE;
  1706. }
  1707. return FALSE;
  1708. }
  1709. #ifndef MODPLUG_FASTSOUNDLIB
  1710. UINT CSoundFile::DetectUnusedSamples( BOOL* pbIns )
  1711. //-----------------------------------------------
  1712. {
  1713. UINT nExt = 0;
  1714. if ( !pbIns ) { return 0; }
  1715. if ( m_nInstruments )
  1716. {
  1717. memset( pbIns, 0, MAX_SAMPLES * sizeof( BOOL ) );
  1718. for ( UINT ipat = 0; ipat < MAX_PATTERNS; ipat++ )
  1719. {
  1720. MODCOMMAND* p = Patterns[ipat];
  1721. if ( p )
  1722. {
  1723. UINT jmax = PatternSize[ipat] * m_nChannels;
  1724. for ( UINT j = 0; j < jmax; j++, p++ )
  1725. {
  1726. if ( ( p->note ) && ( p->note <= NOTE_MAX ) )
  1727. {
  1728. if ( ( p->instr ) && ( p->instr < MAX_INSTRUMENTS ) )
  1729. {
  1730. INSTRUMENTHEADER* penv = Headers[p->instr];
  1731. if ( penv )
  1732. {
  1733. UINT n = penv->Keyboard[p->note - 1];
  1734. if ( n < MAX_SAMPLES ) { pbIns[n] = TRUE; }
  1735. }
  1736. }
  1737. else
  1738. {
  1739. for ( UINT k = 1; k <= m_nInstruments; k++ )
  1740. {
  1741. INSTRUMENTHEADER* penv = Headers[k];
  1742. if ( penv )
  1743. {
  1744. UINT n = penv->Keyboard[p->note - 1];
  1745. if ( n < MAX_SAMPLES ) { pbIns[n] = TRUE; }
  1746. }
  1747. }
  1748. }
  1749. }
  1750. }
  1751. }
  1752. }
  1753. for ( UINT ichk = 1; ichk <= m_nSamples; ichk++ )
  1754. {
  1755. if ( ( !pbIns[ichk] ) && ( Ins[ichk].pSample ) ) { nExt++; }
  1756. }
  1757. }
  1758. return nExt;
  1759. }
  1760. BOOL CSoundFile::RemoveSelectedSamples( BOOL* pbIns )
  1761. //-------------------------------------------------
  1762. {
  1763. if ( !pbIns ) { return FALSE; }
  1764. for ( UINT j = 1; j < MAX_SAMPLES; j++ )
  1765. {
  1766. if ( ( !pbIns[j] ) && ( Ins[j].pSample ) )
  1767. {
  1768. DestroySample( j );
  1769. if ( ( j == m_nSamples ) && ( j > 1 ) ) { m_nSamples--; }
  1770. }
  1771. }
  1772. return TRUE;
  1773. }
  1774. BOOL CSoundFile::DestroySample( UINT nSample )
  1775. //------------------------------------------
  1776. {
  1777. if ( ( !nSample ) || ( nSample >= MAX_SAMPLES ) ) { return FALSE; }
  1778. if ( !Ins[nSample].pSample ) { return TRUE; }
  1779. MODINSTRUMENT* pins = &Ins[nSample];
  1780. signed char* pSample = pins->pSample;
  1781. pins->pSample = NULL;
  1782. pins->nLength = 0;
  1783. pins->uFlags &= ~( CHN_16BIT );
  1784. for ( UINT i = 0; i < MAX_CHANNELS; i++ )
  1785. {
  1786. if ( Chn[i].pSample == pSample )
  1787. {
  1788. Chn[i].nPos = Chn[i].nLength = 0;
  1789. Chn[i].pSample = Chn[i].pCurrentSample = NULL;
  1790. }
  1791. }
  1792. FreeSample( pSample );
  1793. return TRUE;
  1794. }
  1795. #endif // MODPLU