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

📄 csoundinterface.cpp

📁 Visual C++ 游戏开发与设计实例 源代码(所有)
💻 CPP
字号:
// CMAIN LIB - APPLICATION AND DIRECT WRAPPER
//
// Written by Mauricio Teichmann Ritter
//
// Copyright (C) 2002, Brazil. All rights reserved.
// 
//

// cSoundInterface.cpp: implementation of the cSoundInterface class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "cSoundInterface.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

LPDIRECTSOUND8 cSoundInterface::m_pDS = NULL;
LPDIRECTSOUNDBUFFER cSoundInterface::m_pDSBPrimary = NULL;

cSoundInterface::cSoundInterface()
{

}

cSoundInterface::~cSoundInterface()
{

}

HRESULT cSoundInterface::Initialize( HWND  hWnd, 
                                   DWORD dwCoopLevel, 
                                   DWORD dwPrimaryChannels, 
                                   DWORD dwPrimaryFreq, 
                                   DWORD dwPrimaryBitRate)
{
    HRESULT             hr;

    if( m_pDS )
	{
		m_pDS->Release();
		m_pDS = NULL;
	}

    // Create IDirectSound using the primary sound device
    if( FAILED( hr = DirectSoundCreate8( NULL, &m_pDS, NULL ) ) )
        return DXTRACE_ERR( TEXT("DirectSoundCreate8"), hr );

    // Set DirectSound coop level 
    if( FAILED( hr = m_pDS->SetCooperativeLevel( hWnd, dwCoopLevel ) ) )
        return DXTRACE_ERR( TEXT("SetCooperativeLevel"), hr );
    
    // Set primary buffer format
    if( FAILED( hr = SetPrimaryBufferFormat( dwPrimaryChannels, dwPrimaryFreq, dwPrimaryBitRate ) ) )
        return DXTRACE_ERR( TEXT("SetPrimaryBufferFormat"), hr );

    return S_OK;
}

HRESULT cSoundInterface::SetPrimaryBufferFormat( DWORD dwPrimaryChannels, 
                                               DWORD dwPrimaryFreq, 
                                               DWORD dwPrimaryBitRate )
{
    HRESULT             hr;
   

   if( m_pDS == NULL )
        return CO_E_NOTINITIALIZED;

    // Get the primary buffer 
    DSBUFFERDESC dsbd;
    ZeroMemory( &dsbd, sizeof(DSBUFFERDESC) );
    dsbd.dwSize        = sizeof(DSBUFFERDESC);
    dsbd.dwFlags       = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRL3D;
    dsbd.dwBufferBytes = 0;
    dsbd.lpwfxFormat   = NULL;
       
    if( FAILED( hr = m_pDS->CreateSoundBuffer( &dsbd, &m_pDSBPrimary, NULL ) ) )
        return DXTRACE_ERR( TEXT("CreateSoundBuffer"), hr );

    WAVEFORMATEX wfx;
    ZeroMemory( &wfx, sizeof(WAVEFORMATEX) ); 
    wfx.wFormatTag      = WAVE_FORMAT_PCM; 
    wfx.nChannels       = (WORD) dwPrimaryChannels; 
    wfx.nSamplesPerSec  = dwPrimaryFreq; 
    wfx.wBitsPerSample  = (WORD) dwPrimaryBitRate; 
    wfx.nBlockAlign     = (WORD) (wfx.wBitsPerSample / 8 * wfx.nChannels);
    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;

    if( FAILED( hr = m_pDSBPrimary->SetFormat(&wfx) ) )
        return DXTRACE_ERR( TEXT("SetFormat"), hr );


    return S_OK;
}

LPDIRECTSOUND8 cSoundInterface::GetDirectSound()
{
	return m_pDS;
}

void cSoundInterface::Destroy()
{

    if( m_pDSBPrimary )
	{
		m_pDSBPrimary->Release();
		m_pDSBPrimary = NULL;
	}

	if(m_pDS)
	{
		m_pDS->Release();
		m_pDS = NULL;
	}
}

void cSoundInterface::SetListernerPosition(float fX, float fY, float fZ)
{
	IDirectSound3DListener8 *pListener=NULL;

	m_pDSBPrimary->QueryInterface(IID_IDirectSound3DListener, (void**) &pListener);
	
	if(pListener)
	{
		pListener->SetPosition(fX, fY, fZ, DS3D_IMMEDIATE);
		pListener->SetOrientation(fX, fY, fZ + 1.0f, fX, fY + 1.0f, fZ, DS3D_IMMEDIATE );
	}
	else
		DXTRACE_MSG("NO LISTENER INTERFACE");
}

⌨️ 快捷键说明

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