fixed adpcm, bring back PMS (using BMSLoader)

This commit is contained in:
Thai Pangsakulyanont
2011-10-10 00:31:57 +07:00
parent 0d9397c07e
commit 95fac0f969
3 changed files with 27 additions and 25 deletions
+3 -1
View File
@@ -11,7 +11,9 @@ StepMania 5.0 $next | 2011xxxx
2011/10/09 2011/10/09
---------- ----------
* [NotesLoaderBMS] Fix the bug where keysounds that points to nonexistant file * [NotesLoaderBMS] Fix the bug where keysounds that points to nonexistant file
gets assigned a random one [theDtTvB] gets assigned a random one. [theDtTvB]
* [NotesLoaderBMS] Use BMSLoader to load PMS files. [theDtTvB]
* [RageSoundReader_WAV] Fix ADPCM support. [theDtTvB]
2011/10/08 2011/10/08
---------- ----------
+1
View File
@@ -123,6 +123,7 @@ void BMSLoader::GetApplicableFiles( const RString &sPath, vector<RString> &out )
GetDirListing( sPath + RString("*.bms"), out ); GetDirListing( sPath + RString("*.bms"), out );
GetDirListing( sPath + RString("*.bme"), out ); GetDirListing( sPath + RString("*.bme"), out );
GetDirListing( sPath + RString("*.bml"), out ); GetDirListing( sPath + RString("*.bml"), out );
GetDirListing( sPath + RString("*.pms"), out );
} }
/*===========================================================================*/ /*===========================================================================*/
+23 -24
View File
@@ -300,11 +300,12 @@ public:
} }
for( int i = 0; i < m_WavData.m_iChannels; ++i ) for( int i = 0; i < m_WavData.m_iChannels; ++i )
pBuffer[m_iBufferAvail++] = iSamp2[i] / 32768.0f; pBuffer[m_iBufferAvail++] = (int16_t)iSamp2[i] / 32768.0f;
for( int i = 0; i < m_WavData.m_iChannels; ++i ) for( int i = 0; i < m_WavData.m_iChannels; ++i )
pBuffer[m_iBufferAvail++] = iSamp1[i] / 32768.0f; pBuffer[m_iBufferAvail++] = (int16_t)iSamp1[i] / 32768.0f;
int8_t iBuf = 0, iBufSize = 0; int8_t iBufSize = 0;
uint8_t iBuf = 0;
bool bDone = false; bool bDone = false;
for( int i = 2; !bDone && i < m_iFramesPerBlock; ++i ) for( int i = 2; !bDone && i < m_iFramesPerBlock; ++i )
@@ -325,37 +326,39 @@ public:
} }
/* Store the nibble in signed char, so we get an arithmetic shift. */ /* Store the nibble in signed char, so we get an arithmetic shift. */
int iErrorDelta = iBuf >> 4; int8_t iErrorDelta = (int8_t)(iBuf) >> 4;
uint8_t iErrorDeltaUnsigned = iBuf >> 4;
iBuf <<= 4; iBuf <<= 4;
--iBufSize; --iBufSize;
int32_t iPredSample = (iSamp1[c] * iCoef1[c] + iSamp2[c] * iCoef2[c]) / (1<<8); int32_t iPredSample = (iSamp1[c] * iCoef1[c] + iSamp2[c] * iCoef2[c]) / (1<<8);
int32_t iNewSample = iPredSample + (iDelta[c] * iErrorDelta); if( iPredSample < -32768 ) iPredSample = -32768;
iNewSample = clamp( iNewSample, -32768, 32767 ); if( iPredSample > 32767 ) iPredSample = 32767;
int16_t iNewSample = (int16_t)iPredSample + (iDelta[c] * iErrorDelta);
pBuffer[m_iBufferAvail++] = iNewSample / 32768.0f; pBuffer[m_iBufferAvail++] = iNewSample / 32768.0f;
static const int aAdaptionTable[] = { static const int aAdaptionTable[] = {
768, 614, 512, 409, 307, 230, 230, 230, 230, 230, 230, 230, 307, 409, 512, 614,
230, 230, 230, 230, 307, 409, 512, 614 768, 614, 512, 409, 307, 230, 230, 230
}; };
iDelta[c] = int16_t( (iDelta[c] * aAdaptionTable[iErrorDelta+8]) / (1<<8) ); iDelta[c] = int16_t( (iDelta[c] * aAdaptionTable[iErrorDeltaUnsigned]) / (1<<8) );
iDelta[c] = max( (int16_t) 16, iDelta[c] ); iDelta[c] = max( (int16_t) 16, iDelta[c] );
iSamp2[c] = iSamp1[c]; iSamp2[c] = iSamp1[c];
iSamp1[c] = (int16_t) iNewSample; iSamp1[c] = iNewSample;
} }
} }
m_iBufferAvail *= sizeof(int16_t);
return true; return true;
} }
int Read( float *buf, int iFrames ) int Read( float *buf, int iFrames )
{ {
int iSamplesPerFrame = m_WavData.m_iChannels;
int iBytesPerFrame = iSamplesPerFrame * sizeof(float);
int iGotFrames = 0; int iGotFrames = 0;
int iSample = 0;
while( iGotFrames < (int) iFrames ) while( iGotFrames < (int) iFrames )
{ {
if( m_iBufferUsed == m_iBufferAvail ) if( m_iBufferUsed == m_iBufferAvail )
@@ -370,17 +373,12 @@ public:
else else
return iGotFrames; return iGotFrames;
} }
for( int c = 0; c < m_WavData.m_iChannels; c ++ )
int iFramesToCopy = (m_iBufferAvail-m_iBufferUsed) / iBytesPerFrame; {
iFramesToCopy = min( iFramesToCopy, (int) (iFrames-iGotFrames) ); buf[iSample++] = m_pBuffer[m_iBufferUsed++];
int iSamplesToCopy = iFramesToCopy * iSamplesPerFrame; }
int iBytesToCopy = iSamplesToCopy * sizeof(float); iGotFrames++;
memcpy( buf, m_pBuffer+m_iBufferUsed, iBytesToCopy );
m_iBufferUsed += iBytesToCopy;
iGotFrames += iFramesToCopy;
buf += iSamplesToCopy;
} }
return iGotFrames; return iGotFrames;
} }
@@ -421,11 +419,12 @@ public:
m_File.Seek( iByte+m_WavData.m_iDataChunkPos ); m_File.Seek( iByte+m_WavData.m_iDataChunkPos );
} }
m_sError = ""; // please forget my errors, let's read again
if( !DecodeADPCMBlock() ) if( !DecodeADPCMBlock() )
return -1; return -1;
const int iRemainingFrames = iFrame - iBlock*m_iFramesPerBlock; const int iRemainingFrames = iFrame - iBlock*m_iFramesPerBlock;
m_iBufferUsed = iRemainingFrames * m_WavData.m_iChannels * sizeof(int16_t); m_iBufferUsed = iRemainingFrames * m_WavData.m_iChannels;
if( m_iBufferUsed > m_iBufferAvail ) if( m_iBufferUsed > m_iBufferAvail )
{ {
SetEOF(); SetEOF();