📄 directsound.cpp
字号:
/*****************************************************************************\
* Copyright (c), Future Entertainment World / Seoul, Republic of Korea *
* All Rights Reserved. *
* *
* This document contains proprietary and confidential information. No *
* parts of this document or the computer program it embodies may be in *
* any way copied, duplicated, reproduced, translated into a different *
* programming language, or distributed to any person, company, or *
* corporation without the prior written consent of Future Entertainment World *
\*****************************************************************************/
#include "stdafx.h"
#include "stdio.h"
#include "dragon.h"
#include "directsound.h"
#include "gameproc.h"
//////////////////////// SoundUp lkh 荐沥 //////////////////////////
#include "menu.h"
#include "Music.h"
#include "Tool.h"
#include "Hong_Sub.h"
#define MemAlloc(x, y) __Alloc( (char **)(&##x), (y), __FILE__, __LINE__ )
#define CHECKSUM_ERROR_SOUNDLIST 20005
#define WAVE_ENCODING_ 10
extern void __Alloc( char **s, int size, const char *file, int line );
///////////////////////////////////////////////////////////////////////////////
// global variables
SOUNDINFO g_SoundInfo;
SOUNDLIST* g_SoundList;
D3DVECTOR d3dvPos;
extern int RainAmount;
extern BOOL Statue_Weather;
extern int MapNumber;
int BGM_SoundVolume=0;
BOOL BGM_FadeInOut=0;
///////////////////////////////////////////////////////////////////////////////
// function prototypes
BOOL WaveInit( LPWAVEDATA* lplpWaveData, LPDIRECTSOUND lpDirectSound, LPSTR lpName ); //拳老肺 何磐 Wav 拳老 佬绢甸咯 滚欺俊 历厘
BOOL WaveGetBuffers( LPWAVEDATA lpWaveData, LPDIRECTSOUNDBUFFER* lplpDirectSoundBuffer, LPDIRECTSOUND3DBUFFER* lplpDirectSound3DBuffer ); //促捞泛飘 荤款靛 滚欺俊辑 秦寸 wav甫 啊廉咳
void WaveFree( LPWAVEDATA lpWaveData ); //wav 滚欺器牢磐 棺 捞抚 / 角力 单捞磐 朝府扁
void WaveReleaseSoundBuffer( LPDIRECTSOUNDBUFFER* lplpDirectSoundBuffer, LPDIRECTSOUND3DBUFFER* lplpDirectSound3DBuffer ); //荤款靛 滚欺 肯傈洒 朝府扁(**DirectSoundBuffer/**DirectSoundBuffer3DBuffer)
BOOL WaveReload( LPWAVEDATA lpWaveData ); //巩力积败 朝扼埃 wave 拳老 犁肺爹
BOOL DSFillSoundBuffer( IDirectSoundBuffer* pDSB, BYTE* pbWaveData, DWORD cbWaveSize ); //荤款靛 滚欺俊 傀捞宏 单捞磐 盲快扁
BOOL DSReloadSoundBuffer( IDirectSoundBuffer* pDSB, LPCTSTR lpName ); //朝扼埃 wave 拳老 犁肺爹
int WaveOpenFile( char* pszFileName, HMMIO* phmmioIn, WAVEFORMATEX** ppwfxInfo, MMCKINFO* pckInRIFF, int *encoding );
int WaveStartDataRead( HMMIO* phmmioIn, MMCKINFO* pckIn, MMCKINFO* pckInRIFF );
int WaveReadFile( HMMIO hmmioIn, UINT cbRead, BYTE *pbDest, MMCKINFO *pckIn, UINT *cbActualRead, int type );
int WaveCloseReadFile( HMMIO *phmmio, WAVEFORMATEX **ppwfxSrc );
int WaveLoadFile( char* pszFileName, UINT* cbSize, WAVEFORMATEX** ppwfxInfo, BYTE** ppbData );
BOOL InitSfx( HWND hWnd );
void FreeSfx( void );
BOOL InitGlobals( HWND hWnd );
void FreeGlobals( void ); //1瞒滚欺/3D 滚欺/促捞泛飘 荤款靛 按眉 朝府扁
BOOL InitFixedSounds( void ); //沥利肺爹 wave 拳老阑 胶鸥平 滚欺 积己/历厘
void FreeFixedSounds( void );
BOOL InitAutoSounds( int index );
void FreeAutoSounds( int index );
void SetListener( int x, int y );
void PlayWave( int index, int x, int y, int flag );
void StopWave( int index );
void MoveWave( int index, int x, int y );
void SetVolume( int volume );
void SetVolumeMusic( int volume );
BOOL IsPlaying( int index );
///////////////////////////////////////////////////////////////////////////////
// functions
BOOL LoadSoundList( void )
{
FILE* file;
////////////// 0330 lkh 荐沥 //////////////////
g_SoundList=NULL;
MemAlloc( g_SoundList, sizeof(SOUNDLIST)*MAX_SOUND );
file = Fopen( "./SOUND/SOUNDLIST.DAT", "rt" ); //read only+text file
if(file)
{
for(int i=0; i<MAX_SOUND; i++) //0-1999
{
fscanf( file, "%d", &g_SoundList[i].list_Index );
fscanf( file, "%d", &g_SoundList[i].static_Sound );
fscanf( file, "%s\n", &g_SoundList[i].sound_FileName);
}
fclose( file );
file=Fopen( "./SOUND/SOUNDLIST.BIN", "wb" );
if(file)
{
char *tt = (char *)g_SoundList; //漂沥 拳老沥焊甫 1官捞飘 窜困肺 佬绢 甸捞扁 困秦 某胶飘 屈函券(Byte point)
char crc = 0;
for( int i = 0 ; i < sizeof(SOUNDLIST)*MAX_SOUND ; i ++) //Byte荐 父怒 刘啊
{
crc += (*tt); //器牢磐啊 啊福虐绰 烙狼 荐甫 穿利矫糯
tt ++; //促澜 器牢磐肺
}
fwrite( &crc, 1,1, file );
fwrite( g_SoundList, sizeof(SOUNDLIST), MAX_SOUND, file);
fwrite( &crc, 1,1, file );
fclose(file);
}
}
else
{
char *tt = (char *)g_SoundList;
char crc = 0, crc1, crc2;
file = Fopen( "./SOUND/SOUNDLIST.BIN", "rb" );
///////////////////// 0615 LKH 眠啊 /////////////////////////
if( file == NULL )
{
MessageBox(NULL, "./SOUND/SOUNDLIST.BIN is Null", 0, MB_OK);//010215 lsw
return FALSE;
}
fread( &crc1, 1,1, file ); //CheckSum 茄 官捞飘甫 佬绢客辑 Header函荐俊 悸泼
fread( g_SoundList, sizeof(SOUNDLIST), MAX_SOUND, file);
fread( &crc2, 1,1, file ); //CheckSum 茄 官捞飘甫 佬绢客辑 Teil函荐俊 悸泼
fclose(file);
for( int i = 0 ; i < sizeof(SOUNDLIST)*MAX_SOUND ; i ++)
{
crc += *tt;
tt ++;
}
if( crc != crc1 ) if( CheckSumError == 0 ) CheckSumError = CHECKSUM_ERROR_SOUNDLIST;
if( crc != crc2 ) if( CheckSumError == 0 ) CheckSumError = CHECKSUM_ERROR_SOUNDLIST;
}
return TRUE;
}
BOOL //拳老肺 何磐 Wav 拳老 佬绢甸咯 滚欺俊 历厘
WaveInit( LPWAVEDATA* lplpWaveData, LPDIRECTSOUND lpDirectSound, LPSTR lpName )
{
DSBUFFERDESC dsbd = { 0 };
LPBYTE lpbWaveData;
LPWAVEDATA lpWaveData;
HRESULT hResult;
lpWaveData = ( *lplpWaveData ) = ( LPWAVEDATA )GlobalAlloc( GPTR, sizeof( WAVEDATA ) );
lpWaveData->lpDirectSoundBuffer = NULL;
lpWaveData->lpName = NULL;
lpWaveData->lpDS = NULL;
lpWaveData->lpName = ( LPSTR )GlobalAlloc( GPTR, strlen( lpName ) + 1 );
if ( lpWaveData->lpName != NULL )
{
strcpy( lpWaveData->lpName, lpName );
if ( !WaveLoadFile( lpWaveData->lpName, (unsigned int *)&dsbd.dwBufferBytes, &dsbd.lpwfxFormat, &lpbWaveData ) )
{
dsbd.dwSize = sizeof( DSBUFFERDESC );
dsbd.dwFlags = DSBCAPS_STATIC | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRL3D; //| DSBCAPS_CTRLPAN (CTRL3D客 窃膊 静搁 救凳)
hResult = IDirectSound_CreateSoundBuffer( lpDirectSound, &dsbd, &lpWaveData->lpDirectSoundBuffer, NULL );
if ( hResult == DS_OK )
{
if ( DSFillSoundBuffer( lpWaveData->lpDirectSoundBuffer, lpbWaveData, dsbd.dwBufferBytes ) )
{
GlobalFree(lpbWaveData);
GlobalFree(dsbd.lpwfxFormat);
lpWaveData->lpDS = lpDirectSound;
return TRUE;
}
IDirectSoundBuffer_Release( lpWaveData->lpDirectSoundBuffer );
lpWaveData->lpDirectSoundBuffer = NULL;
}
}
GlobalFree(lpWaveData->lpName );
lpWaveData->lpName = NULL;
}
GlobalFree( *lplpWaveData );
*lplpWaveData = NULL;
return FALSE;
}
BOOL //促捞泛飘 荤款靛 滚欺俊辑 秦寸 wav甫 啊廉咳
WaveGetBuffers( LPWAVEDATA lpWaveData, LPDIRECTSOUNDBUFFER* lplpDirectSoundBuffer, LPDIRECTSOUND3DBUFFER* lplpDirectSound3DBuffer )
{
*lplpDirectSound3DBuffer = NULL;
*lplpDirectSoundBuffer = lpWaveData->lpDirectSoundBuffer;
if ( lpWaveData->lpDirectSoundBuffer->QueryInterface( IID_IDirectSound3DBuffer, ( LPVOID* )lplpDirectSound3DBuffer ) != DS_OK )
{
MessageBox(NULL, "DirectSound3DBuffer Query Error!", 0, MB_OK );
WaveReleaseSoundBuffer( lplpDirectSoundBuffer, lplpDirectSound3DBuffer );
return FALSE;
}
return TRUE;
}
void
WaveFree( LPWAVEDATA lpWaveData ) //wav 滚欺器牢磐 棺 捞抚 / 角力 单捞磐 朝府扁
{
if ( lpWaveData != NULL )
{
if ( lpWaveData->lpName != NULL )
{
GlobalFree( lpWaveData->lpName );
lpWaveData->lpName = NULL;
}
GlobalFree( lpWaveData );
lpWaveData = NULL;
}
}
void //荤款靛 滚欺 肯傈洒 朝府扁(**DirectSoundBuffer/**DirectSoundBuffer3DBuffer)
WaveReleaseSoundBuffer( LPDIRECTSOUNDBUFFER* lplpDirectSoundBuffer, LPDIRECTSOUND3DBUFFER* lplpDirectSound3DBuffer )
{
if ( *lplpDirectSoundBuffer != NULL )
{
IDirectSoundBuffer_Release( *lplpDirectSoundBuffer );
*lplpDirectSoundBuffer = NULL;
}
if ( *lplpDirectSound3DBuffer != NULL )
{
IDirectSoundBuffer_Release( *lplpDirectSound3DBuffer );
*lplpDirectSound3DBuffer = NULL;
}
}
BOOL
WaveReload( LPWAVEDATA lpWaveData )
{
return DSReloadSoundBuffer( lpWaveData->lpDirectSoundBuffer, lpWaveData->lpName );
}
BOOL
DSFillSoundBuffer( IDirectSoundBuffer* pDSB, BYTE* pbWaveData, DWORD cbWaveSize )
{
if ( pDSB && pbWaveData && cbWaveSize )
{
LPVOID pMem1, pMem2;
DWORD dwSize1, dwSize2;
if ( SUCCEEDED( IDirectSoundBuffer_Lock( pDSB, 0, cbWaveSize, &pMem1, &dwSize1, &pMem2, &dwSize2, 0 ) ) )
{
ZeroMemory( pMem1, dwSize1 );
CopyMemory( pMem1, pbWaveData, dwSize1 );
if ( dwSize2 != 0 )
{
CopyMemory( pMem2, pbWaveData+dwSize1, dwSize2 );
}
IDirectSoundBuffer_Unlock( pDSB, pMem1, dwSize1, pMem2, dwSize2 );
return TRUE;
}
}
return FALSE;
}
BOOL
DSReloadSoundBuffer( IDirectSoundBuffer* pDSB, LPCTSTR lpName )
{
BOOL result = FALSE;
BYTE* pbWaveData;
DWORD cbWaveSize;
if ( !WaveLoadFile( ( char* )lpName, (unsigned int *)&cbWaveSize, NULL, &pbWaveData ) )
{
if ( SUCCEEDED( IDirectSoundBuffer_Restore( pDSB ) ) )
{
if ( DSFillSoundBuffer( pDSB, pbWaveData, cbWaveSize ) )
{
result = TRUE;
}
}
}
return result;
}
int
WaveOpenFile( char* pszFileName, HMMIO* phmmioIn, WAVEFORMATEX** ppwfxInfo, MMCKINFO* pckInRIFF, int *encoding )
{
HMMIO hmmioIn;
MMCKINFO ckIn;
PCMWAVEFORMAT pcmWaveFormat;
WORD cbExtraAlloc;
int nError;
*ppwfxInfo = NULL;
nError = 0;
hmmioIn = NULL;
if ( ( hmmioIn = mmioOpen( pszFileName, NULL, MMIO_ALLOCBUF | MMIO_READ ) ) == NULL )
{
nError = ER_CANNOTOPEN;
goto ERROR_READING_WAVE;
}
if ( ( nError = ( int )mmioDescend( hmmioIn, pckInRIFF, NULL, 0 ) ) != 0 )
{
goto ERROR_READING_WAVE;
}
if( pckInRIFF->ckid == mmioFOURCC('D', 'R', 'A', ' ') )
{
*encoding = WAVE_ENCODING_;
pckInRIFF->ckid = FOURCC_RIFF;
}
if ( ( pckInRIFF->ckid != FOURCC_RIFF ) || ( pckInRIFF->fccType != mmioFOURCC( 'W', 'A', 'V', 'E' ) ) )
{
nError = ER_NOTWAVEFILE;
goto ERROR_READING_WAVE;
}
ckIn.ckid = mmioFOURCC( 'f', 'm', 't', ' ' );
if ( ( nError = ( int )mmioDescend( hmmioIn, &ckIn, pckInRIFF, MMIO_FINDCHUNK ) ) != 0 )
{
goto ERROR_READING_WAVE;
}
if ( ckIn.cksize < ( long )sizeof( PCMWAVEFORMAT ) )
{
nError = ER_NOTWAVEFILE;
goto ERROR_READING_WAVE;
}
if ( mmioRead( hmmioIn, ( HPSTR )&pcmWaveFormat, ( long )sizeof( pcmWaveFormat ) ) != ( long )sizeof( pcmWaveFormat ) )
{
nError = ER_CANNOTREAD;
goto ERROR_READING_WAVE;
}
if ( pcmWaveFormat.wf.wFormatTag == WAVE_FORMAT_PCM )
{
cbExtraAlloc = 0;
}
else
{
if ( mmioRead( hmmioIn, ( LPTSTR )&cbExtraAlloc, ( long )sizeof( cbExtraAlloc ) ) != ( long )sizeof( cbExtraAlloc ) )
{
nError = ER_CANNOTREAD;
goto ERROR_READING_WAVE;
}
}
if ( ( *ppwfxInfo = (WAVEFORMATEX*)GlobalAlloc( GMEM_FIXED, sizeof( WAVEFORMATEX ) + cbExtraAlloc ) ) == NULL )
{
nError = ER_MEM;
goto ERROR_READING_WAVE;
}
memcpy( *ppwfxInfo, &pcmWaveFormat, sizeof( pcmWaveFormat ) );
( *ppwfxInfo )->cbSize = cbExtraAlloc;
if ( cbExtraAlloc != 0 )
{
if ( mmioRead( hmmioIn, ( LPTSTR )( ( ( BYTE* )&( ( *ppwfxInfo )->cbSize ) ) + sizeof( cbExtraAlloc ) ), ( long )( cbExtraAlloc ) ) != ( long )( cbExtraAlloc ) )
{
nError = ER_NOTWAVEFILE;
goto ERROR_READING_WAVE;
}
}
if ( ( nError = mmioAscend( hmmioIn, &ckIn, 0 ) ) != 0 )
{
goto ERROR_READING_WAVE;
}
goto TEMPCLEANUP;
ERROR_READING_WAVE:
if ( *ppwfxInfo != NULL )
{
GlobalFree( *ppwfxInfo );
*ppwfxInfo = NULL;
}
if ( hmmioIn != NULL )
{
mmioClose( hmmioIn, 0 );
hmmioIn = NULL;
}
TEMPCLEANUP:
*phmmioIn = hmmioIn;
return nError;
}
int
WaveStartDataRead( HMMIO* phmmioIn, MMCKINFO* pckIn, MMCKINFO* pckInRIFF )
{
int nReturn = 0;
if ( ( nReturn = mmioSeek( *phmmioIn, pckInRIFF->dwDataOffset + sizeof( FOURCC ), SEEK_SET ) ) == -1 )
{
return nReturn;
}
nReturn = 0;
pckIn->ckid = mmioFOURCC( 'd', 'a', 't', 'a' );
if ( ( nReturn = mmioDescend( *phmmioIn, pckIn, pckInRIFF, MMIO_FINDCHUNK ) ) != 0 )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -