📄 dsound.c
字号:
static HRESULT WINAPI IDirectSound8_IDirectSound_SetSpeakerConfig(
LPDIRECTSOUND iface,
DWORD config)
{
IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
TRACE("(%p,0x%08lx)\n",This,config);
return IDirectSoundImpl_SetSpeakerConfig(This->pds,config);
}
static HRESULT WINAPI IDirectSound8_IDirectSound_Initialize(
LPDIRECTSOUND iface,
LPCGUID lpcGuid)
{
IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
TRACE("(%p, %s)\n", This, debugstr_guid(lpcGuid));
return IDirectSoundImpl_Initialize(This->pds,lpcGuid);
}
static const IDirectSoundVtbl DirectSound8_DirectSound_Vtbl =
{
IDirectSound8_IDirectSound_QueryInterface,
IDirectSound8_IDirectSound_AddRef,
IDirectSound8_IDirectSound_Release,
IDirectSound8_IDirectSound_CreateSoundBuffer,
IDirectSound8_IDirectSound_GetCaps,
IDirectSound8_IDirectSound_DuplicateSoundBuffer,
IDirectSound8_IDirectSound_SetCooperativeLevel,
IDirectSound8_IDirectSound_Compact,
IDirectSound8_IDirectSound_GetSpeakerConfig,
IDirectSound8_IDirectSound_SetSpeakerConfig,
IDirectSound8_IDirectSound_Initialize
};
HRESULT WINAPI IDirectSound8_IDirectSound_Create(
LPDIRECTSOUND8 pds,
LPDIRECTSOUND * ppds)
{
IDirectSound8_IDirectSound * pdsds;
TRACE("(%p,%p)\n",pds,ppds);
if (ppds == NULL) {
ERR("invalid parameter: ppds == NULL\n");
return DSERR_INVALIDPARAM;
}
if (pds == NULL) {
ERR("invalid parameter: pds == NULL\n");
*ppds = NULL;
return DSERR_INVALIDPARAM;
}
pdsds = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsds));
if (pdsds == NULL) {
WARN("out of memory\n");
*ppds = NULL;
return DSERR_OUTOFMEMORY;
}
pdsds->lpVtbl = &DirectSound8_DirectSound_Vtbl;
pdsds->ref = 0;
pdsds->pds = pds;
IDirectSoundImpl_AddRef(pds);
*ppds = (LPDIRECTSOUND)pdsds;
return DS_OK;
}
/*******************************************************************************
* IDirectSound8_IDirectSound8
*/
static HRESULT WINAPI IDirectSound8_IDirectSound8_QueryInterface(
LPDIRECTSOUND8 iface,
REFIID riid,
LPVOID * ppobj)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
return DSOUND_QueryInterface8(This->pds, riid, ppobj);
}
static ULONG WINAPI IDirectSound8_IDirectSound8_AddRef(
LPDIRECTSOUND8 iface)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
ULONG ref = InterlockedIncrement(&(This->ref));
TRACE("(%p) ref was %ld\n", This, ref - 1);
return ref;
}
static ULONG WINAPI IDirectSound8_IDirectSound8_Release(
LPDIRECTSOUND8 iface)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
ULONG ref = InterlockedDecrement(&(This->ref));
TRACE("(%p) ref was %ld\n", This, ref + 1);
if (!ref) {
IDirectSoundImpl_Release(This->pds);
HeapFree(GetProcessHeap(), 0, This);
TRACE("(%p) released\n", This);
}
return ref;
}
static HRESULT WINAPI IDirectSound8_IDirectSound8_CreateSoundBuffer(
LPDIRECTSOUND8 iface,
LPCDSBUFFERDESC dsbd,
LPLPDIRECTSOUNDBUFFER ppdsb,
LPUNKNOWN lpunk)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
return DSOUND_CreateSoundBuffer(This->pds,dsbd,ppdsb,lpunk,TRUE);
}
static HRESULT WINAPI IDirectSound8_IDirectSound8_GetCaps(
LPDIRECTSOUND8 iface,
LPDSCAPS lpDSCaps)
{
IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
TRACE("(%p,%p)\n",This,lpDSCaps);
return IDirectSoundImpl_GetCaps(This->pds, lpDSCaps);
}
static HRESULT WINAPI IDirectSound8_IDirectSound8_DuplicateSoundBuffer(
LPDIRECTSOUND8 iface,
LPDIRECTSOUNDBUFFER psb,
LPLPDIRECTSOUNDBUFFER ppdsb)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
TRACE("(%p,%p,%p)\n",This,psb,ppdsb);
return IDirectSoundImpl_DuplicateSoundBuffer(This->pds,psb,ppdsb);
}
static HRESULT WINAPI IDirectSound8_IDirectSound8_SetCooperativeLevel(
LPDIRECTSOUND8 iface,
HWND hwnd,
DWORD level)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
TRACE("(%p,%p,%s)\n",This,hwnd,dumpCooperativeLevel(level));
return IDirectSoundImpl_SetCooperativeLevel(This->pds,hwnd,level);
}
static HRESULT WINAPI IDirectSound8_IDirectSound8_Compact(
LPDIRECTSOUND8 iface)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
TRACE("(%p)\n", This);
return IDirectSoundImpl_Compact(This->pds);
}
static HRESULT WINAPI IDirectSound8_IDirectSound8_GetSpeakerConfig(
LPDIRECTSOUND8 iface,
LPDWORD lpdwSpeakerConfig)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
TRACE("(%p, %p)\n", This, lpdwSpeakerConfig);
return IDirectSoundImpl_GetSpeakerConfig(This->pds,lpdwSpeakerConfig);
}
static HRESULT WINAPI IDirectSound8_IDirectSound8_SetSpeakerConfig(
LPDIRECTSOUND8 iface,
DWORD config)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
TRACE("(%p,0x%08lx)\n",This,config);
return IDirectSoundImpl_SetSpeakerConfig(This->pds,config);
}
static HRESULT WINAPI IDirectSound8_IDirectSound8_Initialize(
LPDIRECTSOUND8 iface,
LPCGUID lpcGuid)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
TRACE("(%p, %s)\n", This, debugstr_guid(lpcGuid));
return IDirectSoundImpl_Initialize(This->pds,lpcGuid);
}
static HRESULT WINAPI IDirectSound8_IDirectSound8_VerifyCertification(
LPDIRECTSOUND8 iface,
LPDWORD pdwCertified)
{
IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
TRACE("(%p, %p)\n", This, pdwCertified);
return IDirectSoundImpl_VerifyCertification(This->pds,pdwCertified);
}
static const IDirectSound8Vtbl DirectSound8_DirectSound8_Vtbl =
{
IDirectSound8_IDirectSound8_QueryInterface,
IDirectSound8_IDirectSound8_AddRef,
IDirectSound8_IDirectSound8_Release,
IDirectSound8_IDirectSound8_CreateSoundBuffer,
IDirectSound8_IDirectSound8_GetCaps,
IDirectSound8_IDirectSound8_DuplicateSoundBuffer,
IDirectSound8_IDirectSound8_SetCooperativeLevel,
IDirectSound8_IDirectSound8_Compact,
IDirectSound8_IDirectSound8_GetSpeakerConfig,
IDirectSound8_IDirectSound8_SetSpeakerConfig,
IDirectSound8_IDirectSound8_Initialize,
IDirectSound8_IDirectSound8_VerifyCertification
};
HRESULT WINAPI IDirectSound8_IDirectSound8_Create(
LPDIRECTSOUND8 pds,
LPDIRECTSOUND8 * ppds)
{
IDirectSound8_IDirectSound8 * pdsds;
TRACE("(%p,%p)\n",pds,ppds);
if (ppds == NULL) {
ERR("invalid parameter: ppds == NULL\n");
return DSERR_INVALIDPARAM;
}
if (pds == NULL) {
ERR("invalid parameter: pds == NULL\n");
*ppds = NULL;
return DSERR_INVALIDPARAM;
}
pdsds = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsds));
if (pdsds == NULL) {
WARN("out of memory\n");
*ppds = NULL;
return DSERR_OUTOFMEMORY;
}
pdsds->lpVtbl = &DirectSound8_DirectSound8_Vtbl;
pdsds->ref = 0;
pdsds->pds = pds;
IDirectSoundImpl_AddRef(pds);
*ppds = (LPDIRECTSOUND8)pdsds;
return DS_OK;
}
HRESULT WINAPI DSOUND_Create(
LPDIRECTSOUND *ppDS,
IUnknown *pUnkOuter)
{
LPDIRECTSOUND8 pDS;
HRESULT hr;
TRACE("(%p,%p)\n",ppDS,pUnkOuter);
/* Get dsound configuration */
setup_dsound_options();
hr = IDirectSoundImpl_Create(&pDS);
if (hr == DS_OK) {
hr = IDirectSound_IDirectSound_Create(pDS, ppDS);
if (*ppDS)
IDirectSound_IDirectSound_AddRef(*ppDS);
else {
WARN("IDirectSound_IDirectSound_Create failed\n");
IDirectSound8_Release(pDS);
}
} else {
WARN("IDirectSoundImpl_Create failed\n");
*ppDS = 0;
}
return hr;
}
/*******************************************************************************
* DirectSoundCreate (DSOUND.1)
*
* Creates and initializes a DirectSound interface.
*
* PARAMS
* lpcGUID [I] Address of the GUID that identifies the sound device.
* ppDS [O] Address of a variable to receive the interface pointer.
* pUnkOuter [I] Must be NULL.
*
* RETURNS
* Success: DS_OK
* Failure: DSERR_ALLOCATED, DSERR_INVALIDPARAM, DSERR_NOAGGREGATION,
* DSERR_NODRIVER, DSERR_OUTOFMEMORY
*/
HRESULT WINAPI DirectSoundCreate(
LPCGUID lpcGUID,
LPDIRECTSOUND *ppDS,
IUnknown *pUnkOuter)
{
HRESULT hr;
LPDIRECTSOUND pDS;
TRACE("(%s,%p,%p)\n",debugstr_guid(lpcGUID),ppDS,pUnkOuter);
if (ppDS == NULL) {
WARN("invalid parameter: ppDS == NULL\n");
return DSERR_INVALIDPARAM;
}
if (pUnkOuter != NULL) {
WARN("invalid parameter: pUnkOuter != NULL\n");
*ppDS = 0;
return DSERR_INVALIDPARAM;
}
hr = DSOUND_Create(&pDS, pUnkOuter);
if (hr == DS_OK) {
hr = IDirectSound_Initialize(pDS, lpcGUID);
if (hr != DS_OK) {
if (hr != DSERR_ALREADYINITIALIZED) {
IDirectSound_Release(pDS);
pDS = 0;
} else
hr = DS_OK;
}
}
*ppDS = pDS;
return hr;
}
HRESULT WINAPI DSOUND_Create8(
LPDIRECTSOUND8 *ppDS,
IUnknown *pUnkOuter)
{
LPDIRECTSOUND8 pDS;
HRESULT hr;
TRACE("(%p,%p)\n",ppDS,pUnkOuter);
/* Get dsound configuration */
setup_dsound_options();
hr = IDirectSoundImpl_Create(&pDS);
if (hr == DS_OK) {
hr = IDirectSound8_IDirectSound8_Create(pDS, ppDS);
if (*ppDS)
IDirectSound8_IDirectSound8_AddRef(*ppDS);
else {
WARN("IDirectSound8_IDirectSound8_Create failed\n");
IDirectSound8_Release(pDS);
}
} else {
WARN("IDirectSoundImpl_Create failed\n");
*ppDS = 0;
}
return hr;
}
/*******************************************************************************
* DirectSoundCreate8 (DSOUND.11)
*
* Creates and initializes a DirectSound8 interface.
*
* PARAMS
* lpcGUID [I] Address of the GUID that identifies the sound device.
* ppDS [O] Address of a variable to receive the interface pointer.
* pUnkOuter [I] Must be NULL.
*
* RETURNS
* Success: DS_OK
* Failure: DSERR_ALLOCATED, DSERR_INVALIDPARAM, DSERR_NOAGGREGATION,
* DSERR_NODRIVER, DSERR_OUTOFMEMORY
*/
HRESULT WINAPI DirectSoundCreate8(
LPCGUID lpcGUID,
LPDIRECTSOUND8 *ppDS,
IUnknown *pUnkOuter)
{
HRESULT hr;
LPDIRECTSOUND8 pDS;
TRACE("(%s,%p,%p)\n",debugstr_guid(lpcGUID),ppDS,pUnkOuter);
if (ppDS == NULL) {
WARN("invalid parameter: ppDS == NULL\n");
return DSERR_INVALIDPARAM;
}
if (pUnkOuter != NULL) {
WARN("invalid parameter: pUnkOuter != NULL\n");
*ppDS = 0;
return DSERR_INVALIDPARAM;
}
hr = DSOUND_Create8(&pDS, pUnkOuter);
if (hr == DS_OK) {
hr = IDirectSound8_Initialize(pDS, lpcGUID);
if (hr != DS_OK) {
if (hr != DSERR_ALREADYINITIALIZED) {
IDirectSound8_Release(pDS);
pDS = 0;
} else
hr = DS_OK;
}
}
*ppDS = pDS;
return hr;
}
/*
* Add secondary buffer to buffer list.
* Gets exclusive access to buffer for writing.
*/
HRESULT DSOUND_AddBuffer(
IDirectSoundImpl * pDS,
IDirectSoundBufferImpl * pDSB)
{
IDirectSoundBufferImpl **newbuffers;
HRESULT hr = DS_OK;
TRACE("(%p, %p)\n", pDS, pDSB);
RtlAcquireResourceExclusive(&(pDS->device->buffer_list_lock), TRUE);
if (pDS->device->buffers)
newbuffers = HeapReAlloc(GetProcessHeap(),0,pDS->device->buffers,sizeof(IDirectSoundBufferImpl*)*(pDS->device->nrofbuffers+1));
else
newbuffers = HeapAlloc(GetProcessHeap(),0,sizeof(IDirectSoundBufferImpl*)*(pDS->device->nrofbuffers+1));
if (newbuffers) {
pDS->device->buffers = newbuffers;
pDS->device->buffers[pDS->device->nrofbuffers] = pDSB;
pDS->device->nrofbuffers++;
TRACE("buffer count is now %d\n", pDS->device->nrofbuffers);
} else {
ERR("out of memory for buffer list! Current buffer count is %d\n", pDS->device->nrofbuffers);
hr = DSERR_OUTOFMEMORY;
}
RtlReleaseResource(&(pDS->device->buffer_list_lock));
return hr;
}
/*
* Remove secondary buffer from buffer list.
* Gets exclusive access to buffer for writing.
*/
HRESULT DSOUND_RemoveBuffer(
IDirectSoundImpl * pDS,
IDirectSoundBufferImpl * pDSB)
{
int i;
HRESULT hr = DS_OK;
TRACE("(%p, %p)\n", pDS, pDSB);
RtlAcquireResourceExclusive(&(pDS->device->buffer_list_lock), TRUE);
for (i = 0; i < pDS->device->nrofbuffers; i++)
if (pDS->device->buffers[i] == pDSB)
break;
if (i < pDS->device->nrofbuffers) {
/* Put the last buffer of the list in the (now empty) position */
pDS->device->buffers[i] = pDS->device->buffers[pDS->device->nrofbuffers - 1];
pDS->device->nrofbuffers--;
pDS->device->buffers = HeapReAlloc(GetProcessHeap(),0,pDS->device->buffers,sizeof(LPDIRECTSOUNDBUFFER8)*pDS->device->nrofbuffers);
TRACE("buffer count is now %d\n", pDS->device->nrofbuffers);
}
if (pDS->device->nrofbuffers == 0) {
HeapFree(GetProcessHeap(),0,pDS->device->buffers);
pDS->device->buffers = NULL;
}
RtlReleaseResource(&(pDS->device->buffer_list_lock));
return hr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -