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

📄 sound.cpp

📁 传奇2客户端源码
💻 CPP
字号:
// Sound.cpp: implementation of the CSound class.
//
//////////////////////////////////////////////////////////////////////

#include "StdAfx.h"
#define ORBIT_MAX_RADIUS        5.5f
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSound::~CSound()
{
	FreeDirectSound();
}

CSound::CSound()
{
	m_pDS = NULL;
	m_pDS3DBuffer = NULL;
//	m_pWaveSoundRead = NULL;
	m_3dSound = FALSE;				// ENABLE 3D?
	m_SoundOff = TRUE;
	m_pDSListener = NULL;
}

HRESULT CSound::GetCaps(void)
{
	if(m_pDS==NULL) return DSERR_UNINITIALIZED;
	return m_pDS->GetCaps(&m_DSCaps);
}

HRESULT CSound::ContinuousPlay( BOOL Enable )
{
	if(m_pDS==NULL) return DSERR_UNINITIALIZED;

	LPDIRECTSOUNDBUFFER lpDSB;
    DSBUFFERDESC dsbdesc;
	HRESULT rval;

	// Get primary SoundBuffer
	ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
    dsbdesc.dwSize = sizeof(DSBUFFERDESC); 
    dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER; 
	rval = m_pDS->CreateSoundBuffer(&dsbdesc, &lpDSB, NULL);
	if( FAILED(rval) ) return rval;

	if( Enable ) rval=lpDSB->Play( 0, 0, DSBPLAY_LOOPING );
	else rval=lpDSB->Stop( );
	SAFE_RELEASE( lpDSB );

	return rval;
}



HRESULT CSound::Create(void *hWnd, BOOL Exclusive)
{
	HRESULT rval;
	m_bDeferSettings = 0;

	rval = DirectSoundCreate(NULL, &m_pDS, NULL);
	if(rval != DS_OK) return rval;

	rval = m_pDS->SetCooperativeLevel((HWND)hWnd, (Exclusive) ? DSSCL_EXCLUSIVE : DSSCL_NORMAL );
	if(rval != DS_OK) return rval;

	m_SoundOff=FALSE;
	if( Exclusive )
		return SetFormat( 22050, TRUE, TRUE );

	return DS_OK;
}


HRESULT CSound::SetFormat(long Frequency, BOOL Bit16, BOOL stereo)
{
	if(m_pDS==NULL) return DSERR_UNINITIALIZED;
	LPDIRECTSOUNDBUFFER pDSB;
    DSBUFFERDESC dsbdesc;
	WAVEFORMATEX wfx;
	HRESULT rval;

	// Get primary SoundBuffer
	ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
    dsbdesc.dwSize = sizeof(DSBUFFERDESC); 
    dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER; 
	rval = m_pDS->CreateSoundBuffer(&dsbdesc, &pDSB, NULL); 
	if( FAILED(rval) ) return rval;

	// Set the desired Format
	ZeroMemory( &wfx, sizeof(WAVEFORMATEX) );
	wfx.wFormatTag=WAVE_FORMAT_PCM;
	wfx.nSamplesPerSec=Frequency;
	wfx.wBitsPerSample=(Bit16) ? 16 : 8;
	wfx.nChannels=(stereo) ? 2 : 1;
	wfx.nBlockAlign=wfx.wBitsPerSample/8*wfx.nChannels;
	wfx.nAvgBytesPerSec=Frequency*wfx.nBlockAlign;
	rval=pDSB->SetFormat( &wfx );

	SAFE_RELEASE( pDSB );
	return rval;
}

VOID CSound::FreeDirectSound(VOID)
{
    // Release DirectSound interfaces
    SAFE_RELEASE( m_pDSListener );
    SAFE_RELEASE( m_pDS ); 
}

HRESULT CSound::Enable3d(VOID)
{
	if(m_pDS==NULL) return DSERR_UNINITIALIZED;
	LPDIRECTSOUNDBUFFER lpDSB;
    DSBUFFERDESC dsbdesc;
	HRESULT rval;

	// Get primary SoundBuffer
	ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
    dsbdesc.dwSize = sizeof(DSBUFFERDESC); 
    dsbdesc.dwFlags = DSBCAPS_CTRL3D|DSBCAPS_PRIMARYBUFFER; 
	rval = m_pDS->CreateSoundBuffer(&dsbdesc, &lpDSB, NULL);
	if( FAILED(rval) ) return rval;

	rval=lpDSB->QueryInterface(IID_IDirectSound3DListener, (LPVOID *)&m_pDSListener);
	if( FAILED(rval) ) return rval;
	SAFE_RELEASE( lpDSB );

	m_3dSound = TRUE;
	return DS_OK;
}

HRESULT CSound::Set3dFactors( float DopplerFactor, float RolloffFactor, float DistanceFactor )
{
	HRESULT rval;
	if(m_pDSListener==NULL) return DSERR_UNINITIALIZED;

	rval=m_pDSListener->SetDopplerFactor( DopplerFactor, DS3D_DEFERRED );
	if(FAILED(rval)) return rval;

	rval=m_pDSListener->SetRolloffFactor( RolloffFactor, DS3D_DEFERRED );
	if(FAILED(rval)) return rval;

	rval=m_pDSListener->SetDistanceFactor( DistanceFactor, DS3D_DEFERRED );
	if(FAILED(rval)) return rval;

	return m_pDSListener->CommitDeferredSettings();
}

HRESULT CSound::Place3dListener( float posX, float posY, float posZ, float frontX, float frontY, float frontZ, float topX, float topY, float topZ, BOOL setOrientation )
{
	HRESULT rval;
	if(m_pDSListener==NULL) return DSERR_UNINITIALIZED;

	rval=m_pDSListener->SetPosition( posX, posY, posZ, DS3D_DEFERRED ); //DS3D_IMMEDIATE
	if(FAILED(rval)) return rval;

	if( setOrientation )
	{
		rval=m_pDSListener->SetOrientation( frontX, frontY, frontZ, topX, topY, topZ, DS3D_DEFERRED );
		if(FAILED(rval)) return rval;
	}

	return m_pDSListener->CommitDeferredSettings();
}

HRESULT CSound::SetMIDIVolume( BYTE rvol, BYTE lvol )
{
	MIDIOUTCAPS midiCaps;
	if( FAILED( midiOutGetDevCaps(0, &midiCaps, sizeof(midiCaps)) ) ) 
		return DSERR_NODRIVER;

	if( midiCaps.dwSupport&MIDICAPS_VOLUME )
		return midiOutSetVolume( 0, MAKEVOL(rvol, lvol) );

	return DSERR_UNSUPPORTED;
}


HRESULT CSound::SetDIGIVolume( BYTE rvol, BYTE lvol )
{
	WAVEOUTCAPS waveCaps;
	if( FAILED( waveOutGetDevCaps(0, &waveCaps, sizeof(waveCaps)) ) )
		return DSERR_NODRIVER;

	if( waveCaps.dwSupport&WAVECAPS_VOLUME )
		return waveOutSetVolume( 0, MAKEVOL(rvol, lvol) );

	return DSERR_UNSUPPORTED;
}

HRESULT CSound::SetCDVolume( BYTE rvol, BYTE lvol )
{
	AUXCAPS auxCaps;
	if( FAILED( auxGetDevCaps(0, &auxCaps, sizeof(auxCaps)) ) )
		return DSERR_NODRIVER;

	if( auxCaps.dwSupport&AUXCAPS_VOLUME )
		return auxSetVolume( 0, MAKEVOL(rvol, lvol) );

	return DSERR_UNSUPPORTED;
}

DWORD CSound::GetMIDIVolume( void )
{
	DWORD vol;
	midiOutGetVolume(0, &vol);
	return vol;
}

DWORD CSound::GetDIGIVolume( void )
{
	DWORD vol;
	waveOutGetVolume(0, &vol);
	return vol;
}

DWORD CSound::GetCDVolume( void )
{
	DWORD vol;
	auxGetVolume(0, &vol);
	return vol;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -