⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directsound.cpp

📁 网络游戏龙族 完整的登陆器 C++ 源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************\
* 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 + -