📄 directsound.cpp
字号:
return nReturn;
}
return nReturn;
}
int //stream 滚欺俊辑 敲饭捞矫
WaveReadFile( HMMIO hmmioIn, UINT cbRead, BYTE *pbDest, MMCKINFO *pckIn, UINT *cbActualRead, int type )
{
MMIOINFO mmioinfoIn;
int nError;
UINT cT, cbDataIn;
nError = 0;
if ( nError = mmioGetInfo( hmmioIn, &mmioinfoIn, 0 ) != 0 )
{
goto ERROR_CANNOT_READ;
}
cbDataIn = cbRead;
if ( cbDataIn > pckIn->cksize )
{
cbDataIn = pckIn->cksize;
}
pckIn->cksize -= cbDataIn;
if( type == WAVE_ENCODING_ )
{
char crc = 0;
for ( cT = 0; cT < cbDataIn; cT++ )
{
if ( mmioinfoIn.pchNext == mmioinfoIn.pchEndRead )
{
if ( ( nError = mmioAdvance( hmmioIn, &mmioinfoIn, MMIO_READ ) ) != 0 )
{
goto ERROR_CANNOT_READ;
}
if ( mmioinfoIn.pchNext == mmioinfoIn.pchEndRead )
{
nError = ER_CORRUPTWAVEFILE;
goto ERROR_CANNOT_READ;
}
}
*( ( BYTE* )pbDest+cT ) = *( ( BYTE* )mmioinfoIn.pchNext ++ ) ^ crc;
crc ++;
}
}
else
{
for ( cT = 0; cT < cbDataIn; cT++ )
{
if ( mmioinfoIn.pchNext == mmioinfoIn.pchEndRead )
{
if ( ( nError = mmioAdvance( hmmioIn, &mmioinfoIn, MMIO_READ ) ) != 0 )
{
goto ERROR_CANNOT_READ;
}
if ( mmioinfoIn.pchNext == mmioinfoIn.pchEndRead )
{
nError = ER_CORRUPTWAVEFILE;
goto ERROR_CANNOT_READ;
}
}
*( ( BYTE* )pbDest+cT ) = *( ( BYTE* )mmioinfoIn.pchNext ++ );
}
}
if ( ( nError = mmioSetInfo( hmmioIn, &mmioinfoIn, 0 ) ) != 0 )
{
goto ERROR_CANNOT_READ;
}
*cbActualRead = cbDataIn;
goto FINISHED_READING;
ERROR_CANNOT_READ:
*cbActualRead = 0;
FINISHED_READING:
return nError;
}
int
WaveCloseReadFile( HMMIO *phmmio, WAVEFORMATEX **ppwfxSrc )
{
if ( *ppwfxSrc != NULL )
{
GlobalFree( *ppwfxSrc );
*ppwfxSrc = NULL;
}
if ( *phmmio != NULL )
{
mmioClose( *phmmio, 0 );
*phmmio = NULL;
}
return 0;
}
int
WaveLoadFile( char* pszFileName, UINT* cbSize, WAVEFORMATEX** ppwfxInfo, BYTE** ppbData )
{
HMMIO hmmioIn;
MMCKINFO ckInRiff;
MMCKINFO ckIn;
int nError;
UINT cbActualRead;
int encoding = 0;
*ppbData = NULL;
*ppwfxInfo = NULL;
*cbSize = 0;
if ( ( nError = WaveOpenFile( pszFileName, &hmmioIn, ppwfxInfo, &ckInRiff, &encoding ) ) != 0 )
{
goto ERROR_LOADING;
}
if ( ( nError = WaveStartDataRead( &hmmioIn, &ckIn, &ckInRiff ) ) != 0 )
{
goto ERROR_LOADING;
}
if ( ( *ppbData = ( BYTE* )GlobalAlloc( GMEM_FIXED, ckIn.cksize ) ) == NULL )
{
nError = ER_MEM;
goto ERROR_LOADING;
}
if ( ( nError = WaveReadFile( hmmioIn, ckIn.cksize, *ppbData, &ckIn, &cbActualRead, encoding ) ) != 0 )
{
goto ERROR_LOADING;
}
*cbSize = cbActualRead;
goto DONE_LOADING;
ERROR_LOADING:
//// 0615 LKH 趣矫 荤款靛 单捞磐 拳老捞 粮犁窍瘤 臼绰 版快甫 茫扁 困茄 抛胶飘 风凭(诀单捞飘窍搁 救凳) ////
//char error_message[40];
//sprintf(error_message, "%s 拳老俊 巩力啊 乐嚼聪促.", pszFileName);
//MessageBox(NULL, error_message, 0, MB_OK);
if ( *ppbData != NULL )
{
GlobalFree( *ppbData );
*ppbData = NULL;
}
if ( *ppwfxInfo != NULL )
{
GlobalFree( *ppwfxInfo );
*ppwfxInfo = NULL;
}
DONE_LOADING:
if ( hmmioIn != NULL )
{
mmioClose( hmmioIn, 0 );
hmmioIn = NULL;
}
return nError;
}
///////////////////////////////////////////////////////////////////////////////
//
BOOL
InitSfx( HWND hWnd )
{
g_SoundInfo.bInitialized = FALSE;
if ( !InitGlobals( hWnd ) )
{
return FALSE;
}
if ( !InitFixedSounds( ) ) //檬扁俊 胶鸥平 荤款靛 单捞磐 佬绢客辑 滚欺俊 历厘
{
FreeGlobals( );
return FALSE;
}
g_SoundInfo.bInitialized = TRUE;
return TRUE;
}
void
FreeSfx( void )
{
if ( g_SoundInfo.bInitialized )
{
FreeFixedSounds( );
FreeGlobals( );
}
}
//////////////// SoundUp lkh 荐沥 ////////////////// ( BGM狼 版快 胶抛饭坷 / 瓤苞澜狼 版快 葛畴 : 2辆幅狼 滚欺 鞘夸)
BOOL InitGlobals( HWND hWnd )
{
PCMWAVEFORMAT pcmwf;
DSBUFFERDESC dsbdesc;
if ( DirectSoundCreate( NULL, &g_SoundInfo.lpDirectSound, NULL ) != DS_OK ) //IDirectSound牢磐其捞胶狼 积己苞 檬扁拳
{
// MessageBox(NULL, "IDirectSound牢磐其捞胶 积己 角菩", 0, MB_OK);
return FALSE;
}
// PCM 傀捞宏 屈怕狼 坷叼坷 单捞磐俊 措茄 汲疙
memset( &pcmwf, 0, sizeof( PCMWAVEFORMAT ) );
pcmwf.wf.wFormatTag = WAVE_FORMAT_PCM;
pcmwf.wf.nChannels = 2; //1:mono 2:stereo
pcmwf.wf.nSamplesPerSec = 22050;
pcmwf.wf.nBlockAlign = 4;
pcmwf.wf.nAvgBytesPerSec = pcmwf.wf.nSamplesPerSec * pcmwf.wf.nBlockAlign;
pcmwf.wBitsPerSample = 16;
// 促捞泛飘 荤款靛 滚欺狼 漂己阑 疙矫
memset( &dsbdesc, 0, sizeof( DSBUFFERDESC ) );
dsbdesc.dwSize = sizeof( DSBUFFERDESC );
dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRL3D | DSBCAPS_CTRLVOLUME | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_MUTE3DATMAXDISTANCE; //| DSBCAPS_CTRLPAN (2D俊辑父 荤侩)
//| DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPOSITIONNOTIFY ;
dsbdesc.dwBufferBytes = 0;
dsbdesc.lpwfxFormat = NULL;
if ( IDirectSound_SetCooperativeLevel( g_SoundInfo.lpDirectSound, hWnd, DSSCL_NORMAL ) == DS_OK ) //荤款靛 厘摹甫 荤侩且 锭狼 橇肺技辑 刀痢苞 包访等 饭骇 汲沥
{
if ( IDirectSound_CreateSoundBuffer( g_SoundInfo.lpDirectSound, &dsbdesc, &g_SoundInfo.lpPrimaryBuffer, NULL ) == DS_OK ) //促捞泛飘 荤款靛 滚欺 按眉甫 积己
{
if ( g_SoundInfo.lpPrimaryBuffer->QueryInterface( IID_IDirectSound3DListener, ( void** )&g_SoundInfo.lpDirectSound3DListener ) == DS_OK ) //lpDirectSound3DListener 牢磐其捞胶俊 措茄 器牢磐 掘绢咳
{
if ( IDirectSound3DListener_SetPosition( g_SoundInfo.lpDirectSound3DListener, 0.0f, 0.0f, 0.0f, DS3D_DEFERRED ) == DS_OK ) //lpDirectSound3DListener狼 困摹 汲沥(default:X:0,Y:0,Z:0)
{
if( IDirectSound3DListener_SetDistanceFactor( g_SoundInfo.lpDirectSound3DListener, 1.f, DS3D_DEFERRED ) == DS_OK ) //芭府狼 叼弃靛 窜困 茄 档飘寸 50Cm 固磐烙
{
if ( IDirectSound3DListener_SetDopplerFactor( g_SoundInfo.lpDirectSound3DListener, DS3D_DEFAULTDOPPLERFACTOR, DS3D_DEFERRED ) == DS_OK ) //档敲矾 棋磐 悸泼
{
//if ( IDirectSound3DListener_SetRolloffFactor( g_SoundInfo.lpDirectSound3DListener, DS3D_DEFAULTROLLOFFFACTOR*5, DS3D_DEFERRED ) == DS_OK ) //费坷橇 棋磐(芭府俊 蝶扼 家府狼 澜樊 炼沥) 悸泼
if ( IDirectSound3DListener_SetRolloffFactor( g_SoundInfo.lpDirectSound3DListener, DS3D_DEFAULTROLLOFFFACTOR*10, DS3D_DEFERRED ) == DS_OK ) //费坷橇 棋磐(芭府俊 蝶扼 家府狼 澜樊 炼沥) 悸泼
{
if ( IDirectSound3DListener_CommitDeferredSettings( g_SoundInfo.lpDirectSound3DListener ) == DS_OK ) //困狼 葛电 汲沥捞 捞 皋家靛甫 龋免窍骨肺辑 角青 贸府 等促.
{
return TRUE;
}
else MessageBox(NULL, "IDirectSound3DListener_CommitDeferredSettings Fail", 0, MB_OK);
}
else MessageBox(NULL, "IDirectSound3DListener_SetRolloffFactor Fail", 0, MB_OK);
}
else MessageBox(NULL, "IDirectSound3DListener_SetDopplerFactor Fail", 0, MB_OK);
}
else MessageBox(NULL, "IDirectSound3DListener_SetDistanceFactor Fail", 0, MB_OK);
}
else MessageBox(NULL, "IDirectSound3DListener_SetPosition Fail", 0, MB_OK);
}
else MessageBox(NULL, "lpDirectSound3DListener InterFace Fail", 0, MB_OK);
}
else MessageBox(NULL, "IDirectSound_CreateSoundBuffer Create Fail", 0, MB_OK);
}
else MessageBox(NULL, "IDirectSound_SetCooperativeLevel Fail", 0, MB_OK);
//角菩沁阑锭
FreeGlobals( );
return FALSE;
}
void
FreeGlobals( void ) //1瞒滚欺/3D 滚欺/促捞泛飘 荤款靛 按眉 朝府扁
{
if ( g_SoundInfo.lpPrimaryBuffer != NULL )
{
g_SoundInfo.lpPrimaryBuffer->Release( );
g_SoundInfo.lpPrimaryBuffer = NULL;
}
if ( g_SoundInfo.lpDirectSound3DListener != NULL )
{
IDirectSound3DListener_Release( g_SoundInfo.lpDirectSound3DListener );
g_SoundInfo.lpDirectSound3DListener = NULL;
}
if ( g_SoundInfo.lpDirectSound != NULL )
{
IDirectSound_Release( g_SoundInfo.lpDirectSound );
g_SoundInfo.lpDirectSound = NULL;
}
}
BOOL
InitFixedSounds( void ) //沥利肺爹 wave 拳老阑 胶鸥平 滚欺 积己/历厘
{
char szFilePath[ _MAX_PATH ];
int index;
BOOL bRetVal = TRUE;
FreeFixedSounds( );
for( index=0 ; index < MAX_SOUND ; index++ )
{
if( g_SoundList[index].static_Sound )
{
wsprintf( szFilePath, "%s/sound/%s", GetCurrentWorkingDirectory(), g_SoundList[index].sound_FileName);
if ( WaveInit( &g_SoundInfo.lpWaveData[ index ], g_SoundInfo.lpDirectSound, szFilePath ) == FALSE )
{
//bRetVal = FALSE;
//break;
continue;
}
if ( !WaveGetBuffers( g_SoundInfo.lpWaveData[ index ], &g_SoundInfo.lpDirectSoundBuffer[ index ], &g_SoundInfo.lpDirectSound3DBuffer[ index ] ) )
{
bRetVal = FALSE;
break;
}
}
}
return bRetVal;
}
void
FreeFixedSounds( void )
{
for ( int i = 0; i < MAX_SOUND ; i++ )
{
if( g_SoundList[i].static_Sound )
{
if ( g_SoundInfo.lpWaveData[ i ] )
{
WaveFree( g_SoundInfo.lpWaveData[ i ] );
g_SoundInfo.lpWaveData[ i ] = NULL;
}
}
}
}
void
FreeAutoSounds( int index )
{
if ( g_SoundInfo.lpDirectSound3DBuffer[ index ]!=NULL )
{
IDirectSoundBuffer_Release( g_SoundInfo.lpDirectSound3DBuffer[ index ] );
g_SoundInfo.lpDirectSound3DBuffer[ index ] = NULL;
}
if ( g_SoundInfo.lpDirectSoundBuffer[ index ]!=NULL )
{
IDirectSoundBuffer_Release( g_SoundInfo.lpDirectSoundBuffer[ index ] );
g_SoundInfo.lpDirectSoundBuffer[ index ] = NULL;
}
if ( g_SoundInfo.lpWaveData[ index ]!=NULL )
{
WaveFree( g_SoundInfo.lpWaveData[ index ] );
g_SoundInfo.lpWaveData[ index ] = NULL;
}
}
void SetListener( int x, int y )
{
IDirectSound3DListener_SetPosition( g_SoundInfo.lpDirectSound3DListener, P2M( x * TILE_SIZE ), P2M( y * TILE_SIZE ), 0.f, DS3D_IMMEDIATE );
}
// flag == 1 : looping.
// flag != 0 : 秦寸 冉荐父怒 馆汗.
// flag == 0 : 1 time.
///////////////////// SoundUp lkh 荐沥 ////////////////////
BOOL PlayListAutoSounds( int index, int x, int y, BOOL flag) //index->1~999鳖瘤
{
if(g_Volume_Off!=0) return FALSE;
if(index >= MAX_SOUND || index <= 0 ) return FALSE;
char szFilePath[ _MAX_PATH ];
if(!g_SoundList[index].static_Sound)
{
if( g_SoundInfo.bInitialized == FALSE || g_SoundInfo.lpDirectSound == NULL ) return 0;
//////////////// 荤款靛 滚欺俊 捞固 肺爹登绢 乐绰 荤款靛牢 版快 犁肺爹窍瘤 臼档废 且巴 /////////////////////
if( g_SoundInfo.lpDirectSoundBuffer[ index ] == NULL )//!IsPlaying(index) )
{
if( checkbeta == '1' )
{ //< CSD-031030
wsprintf( szFilePath, "%s/sound_b5/%s", GetCurrentWorkingDirectory(), g_SoundList[index].sound_FileName);
} //> CSD-031030
else wsprintf( szFilePath, "%s/sound/%s", GetCurrentWorkingDirectory(), g_SoundList[index].sound_FileName);
//角力 wav 拳老阑 佬绢客 胶怕平 滚欺俊 肺爹
if ( WaveInit( &g_SoundInfo.lpWaveData[ index ], g_SoundInfo.lpDirectSound, szFilePath ) == FALSE )
{
if( checkbeta == '1' )
{
wsprintf( szFilePath, "%s/sound/%s", GetCurrentWorkingDirectory(), g_SoundList[index].sound_FileName);
if ( WaveInit( &g_SoundInfo.lpWaveData[ index ], g_SoundInfo.lpDirectSound, szFilePath ) == FALSE ) return false;
}
else return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -