windows-nt/Source/XPSP1/NT/multimedia/directx/dxvb/dx7vb/dsoundobj.cpp
2020-09-26 16:20:57 +08:00

181 lines
4.7 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: dsoundobj.cpp
//
//--------------------------------------------------------------------------
// dSoundObj.cpp : Implementation of CDirectApp and DLL registration.
// DHF_DS entire file
#define DIRECTSOUND_VERSION 0x600
#include "stdafx.h"
#include "Direct.h"
#include "dSound.h"
#include "dms.h"
#include "dSoundObj.h"
#include "dSoundBufferObj.h"
extern HRESULT InternalCreateSoundBufferFromFile(LPDIRECTSOUND lpDirectSound,LPDSBUFFERDESC pDesc,WCHAR *file,LPDIRECTSOUNDBUFFER *lplpDirectSoundBuffer) ;
extern HRESULT InternalCreateSoundBufferFromResource(LPDIRECTSOUND lpDirectSound,LPDSBUFFERDESC pDesc,HANDLE resHandle,WCHAR *resName,LPDIRECTSOUNDBUFFER *lplpDirectSoundBuffer);
CONSTRUCTOR(_dxj_DirectSound, {m__dxj_DirectSound=NULL;m_pDriverGuid=NULL;});
DESTRUCTOR(_dxj_DirectSound, {if (m_pDriverGuid) delete m_pDriverGuid;});
GETSET_OBJECT(_dxj_DirectSound);
//
/*** IDirectSound methods ***/
//
PASS_THROUGH_CAST_1_R(_dxj_DirectSound, getSpeakerConfig, GetSpeakerConfig, long*,(DWORD*));
PASS_THROUGH_CAST_1_R(_dxj_DirectSound, setSpeakerConfig, SetSpeakerConfig, long,(DWORD));
STDMETHODIMP C_dxj_DirectSoundObject::getCaps(DSCaps* caps)
{
caps->lSize = sizeof(DSCAPS);
return m__dxj_DirectSound->GetCaps((LPDSCAPS)caps);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_DirectSoundObject::setCooperativeLevel(HWnd h, long d)
{
if( m__dxj_DirectSound == NULL )
return E_FAIL;
return m__dxj_DirectSound->SetCooperativeLevel((HWND)h, (DWORD)d);
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_DirectSoundObject::duplicateSoundBuffer(I_dxj_DirectSoundBuffer *src,
I_dxj_DirectSoundBuffer **val)
{
if(! (src && val) )
return E_POINTER;
DO_GETOBJECT_NOTNULL(LPDIRECTSOUNDBUFFER, lpdsb, src);
//Need to create a second one
LPDIRECTSOUNDBUFFER dsb=0;
HRESULT hr=DD_OK;
hr=m__dxj_DirectSound->DuplicateSoundBuffer((LPDIRECTSOUNDBUFFER)lpdsb, &dsb);
if(hr == DD_OK)
{
INTERNAL_CREATE(_dxj_DirectSoundBuffer, dsb, val);
}
return hr;
}
#pragma message ("Consider putting waveformat back in DSBufferDesc")
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_DirectSoundObject::createSoundBuffer(DSBufferDesc *desc,
WaveFormatex *wave, I_dxj_DirectSoundBuffer **val)
{
LPDIRECTSOUNDBUFFER dsb; // Need to get the buffer first
BOOL bDirty=FALSE;
// make Java desc look like DirectX desc
desc->lSize = sizeof(DSBUFFERDESC);
for (int i=0;i<sizeof(WAVEFORMATEX);i++) {
if (((byte*)wave)[i]!=0) bDirty=TRUE;
}
if (bDirty==TRUE){
desc->lpwfxFormat = PtrToLong(wave); //bugbug SUNDOWN
}
else {
desc->lpwfxFormat = 0;
}
LPDSBUFFERDESC lpds ;
lpds = (LPDSBUFFERDESC)desc;
HRESULT hr=S_OK;
hr = m__dxj_DirectSound->CreateSoundBuffer(lpds, &dsb, NULL);
if(hr == DD_OK)
{
INTERNAL_CREATE(_dxj_DirectSoundBuffer, dsb, val);
}
return hr;
}
STDMETHODIMP C_dxj_DirectSoundObject::createSoundBufferFromFile(BSTR fileName, DSBufferDesc *desc,
WaveFormatex *wave, I_dxj_DirectSoundBuffer **val)
{
LPDIRECTSOUNDBUFFER dsb; // Need to get the buffer first
LPDSBUFFERDESC lpds ;
HRESULT hr=S_OK;
*val=NULL;
desc->lSize = sizeof(DSBUFFERDESC);
desc->lpwfxFormat = (long)PtrToLong(wave); //bugbug SUNDOWN
lpds = (LPDSBUFFERDESC)desc;
hr=InternalCreateSoundBufferFromFile(m__dxj_DirectSound,(LPDSBUFFERDESC)desc,
(WCHAR*)fileName,&dsb);
if(hr == DD_OK)
{
INTERNAL_CREATE(_dxj_DirectSoundBuffer, dsb, val);
}
return hr;
}
STDMETHODIMP C_dxj_DirectSoundObject::createSoundBufferFromResource(BSTR resFile, BSTR resName, DSBufferDesc *desc,
WaveFormatex *wave, I_dxj_DirectSoundBuffer **val)
{
LPDIRECTSOUNDBUFFER dsb; // Need to get the buffer first
LPDSBUFFERDESC lpds ;
HRESULT hr=S_OK;
HMODULE hMod=NULL;
USES_CONVERSION;
if ((resFile) &&(resFile[0]!=0)){
// NOTE
// seems that GetModuleHandleW is
// always returning 0 on w98??
// use ansi verion
LPCTSTR pszName = W2T(resFile);
hMod= GetModuleHandle(pszName);
}
*val=NULL;
desc->lSize = sizeof(DSBUFFERDESC);
desc->lpwfxFormat = (long)PtrToLong(wave); //NOTE SUNDOWN issue
lpds = (LPDSBUFFERDESC)desc;
hr=InternalCreateSoundBufferFromResource(m__dxj_DirectSound,(LPDSBUFFERDESC)desc,
(HANDLE)hMod,(WCHAR*)resName,&dsb);
if(hr == DD_OK)
{
INTERNAL_CREATE(_dxj_DirectSoundBuffer, dsb, val);
}
return hr;
}