reactos/dll/directx/dsound_new/property.c

274 lines
7.1 KiB
C

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Configuration of network devices
* FILE: dll/directx/dsound_new/property.c
* PURPOSE: Secondary IDirectSoundBuffer8 implementation
*
* PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
*/
#include "precomp.h"
typedef struct
{
IKsPropertySetVtbl *lpVtbl;
LONG ref;
}CKsPropertySetImpl, *LPCKsPropertySetImpl;
HRESULT
WINAPI
KSPropertySetImpl_fnQueryInterface(
LPKSPROPERTYSET iface,
REFIID riid,
LPVOID * ppobj)
{
LPOLESTR pStr;
LPCKsPropertySetImpl This = (LPCKsPropertySetImpl)CONTAINING_RECORD(iface, CKsPropertySetImpl, lpVtbl);
if (IsEqualIID(riid, &IID_IUnknown) ||
IsEqualIID(riid, &IID_IKsPropertySet))
{
*ppobj = (LPVOID)&This->lpVtbl;
InterlockedIncrement(&This->ref);
return S_OK;
}
if (SUCCEEDED(StringFromIID(riid, &pStr)))
{
DPRINT("No Interface for riid %s\n", pStr);
CoTaskMemFree(pStr);
}
return E_NOINTERFACE;
}
ULONG
WINAPI
KSPropertySetImpl_fnAddRef(
LPKSPROPERTYSET iface)
{
ULONG ref;
LPCKsPropertySetImpl This = (LPCKsPropertySetImpl)CONTAINING_RECORD(iface, CKsPropertySetImpl, lpVtbl);
ref = InterlockedIncrement(&This->ref);
return ref;
}
ULONG
WINAPI
KSPropertySetImpl_fnRelease(
LPKSPROPERTYSET iface)
{
ULONG ref;
LPCKsPropertySetImpl This = (LPCKsPropertySetImpl)CONTAINING_RECORD(iface, CKsPropertySetImpl, lpVtbl);
ref = InterlockedDecrement(&(This->ref));
if (!ref)
{
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
}
HRESULT
WINAPI
KSPropertySetImpl_Get(
LPKSPROPERTYSET iface,
REFGUID guidPropSet,
ULONG dwPropID,
LPVOID pInstanceData,
ULONG cbInstanceData,
LPVOID pPropData,
ULONG cbPropData,
PULONG pcbReturned )
{
LPOLESTR pStr;
//HRESULT hr;
MMRESULT Result;
WAVEINCAPSW CapsIn;
WAVEOUTCAPSW CapsOut;
GUID DeviceGuid;
LPFILTERINFO Filter = NULL;
PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA Desc;
StringFromIID(guidPropSet, &pStr);
//DPRINT("Requested Property %ws dwPropID %u pInstanceData %p cbInstanceData %u pPropData %p cbPropData %u pcbReturned %p\n",
// pStr, dwPropID, pInstanceData, cbInstanceData, pPropData, cbPropData, pcbReturned);
CoTaskMemFree(pStr);
if (!IsEqualGUID(guidPropSet, &DSPROPSETID_DirectSoundDevice))
{
/* unsupported property set */
return E_PROP_ID_UNSUPPORTED;
}
if (dwPropID == DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1)
{
if (cbPropData < sizeof(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA))
{
/* invalid parameter */
return DSERR_INVALIDPARAM;
}
Desc = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA)pPropData;
if (IsEqualGUID(&Desc->DeviceId, &GUID_NULL))
{
if (Desc->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE)
{
DPRINT("Using default capture guid\n");
CopyMemory(&DeviceGuid, &DSDEVID_DefaultCapture, sizeof(GUID));
}
else
{
DPRINT("Using default playback guid\n");
CopyMemory(&DeviceGuid, &DSDEVID_DefaultPlayback, sizeof(GUID));
}
}
else
{
/* use provided guid */
CopyMemory(&DeviceGuid, &Desc->DeviceId, sizeof(GUID));
}
if (GetDeviceID(&DeviceGuid, &Desc->DeviceId) != DS_OK)
{
DPRINT("Unknown device guid\n");
return DSERR_INVALIDPARAM;
}
/* sanity check */
ASSERT(FindDeviceByGuid(&Desc->DeviceId, &Filter));
ASSERT(Filter != NULL);
/* fill in description */
if (IsEqualGUID(&Desc->DeviceId, &Filter->DeviceGuid[0]))
{
/* capture device */
Desc->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
Desc->WaveDeviceId = Filter->MappedId[0];
Result = waveInGetDevCapsW(Filter->MappedId[0], &CapsIn, sizeof(WAVEINCAPSW));
if (Result != MMSYSERR_NOERROR)
{
CapsIn.szPname[0] = 0;
DPRINT("waveInGetDevCaps Device %u failed with %x\n", Filter->MappedId[0], Result);
}
CapsIn.szPname[MAXPNAMELEN-1] = 0;
wcscpy(Desc->DescriptionW, CapsIn.szPname);
WideCharToMultiByte(CP_ACP, 0, CapsIn.szPname, -1, Desc->DescriptionA, sizeof(Desc->DescriptionA), NULL, NULL);
}
else
{
/* render device */
Desc->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
Desc->WaveDeviceId = Filter->MappedId[1];
Result = waveOutGetDevCapsW(Filter->MappedId[1], &CapsOut, sizeof(WAVEOUTCAPSW));
if (Result != MMSYSERR_NOERROR)
{
CapsOut.szPname[0] = 0;
DPRINT("waveOutGetDevCaps Device %u failed with %x\n", Filter->MappedId[1], Result);
}
CapsOut.szPname[MAXPNAMELEN-1] = 0;
wcscpy(Desc->DescriptionW, CapsOut.szPname);
WideCharToMultiByte(CP_ACP, 0, CapsOut.szPname, -1, Desc->DescriptionA, sizeof(Desc->DescriptionA), NULL, NULL);
}
/* ReactOS doesnt support vxd or emulated */
Desc->Type = DIRECTSOUNDDEVICE_TYPE_WDM;
Desc->ModuleA[0] = 0;
Desc->ModuleW[0] = 0;
*pcbReturned = sizeof(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA);
return S_OK;
}
UNIMPLEMENTED;
return E_PROP_ID_UNSUPPORTED;
}
HRESULT
WINAPI
KSPropertySetImpl_Set(
LPKSPROPERTYSET iface,
REFGUID guidPropSet,
ULONG dwPropID,
LPVOID pInstanceData,
ULONG cbInstanceData,
LPVOID pPropData,
ULONG cbPropData )
{
UNIMPLEMENTED;
return E_PROP_ID_UNSUPPORTED;
}
HRESULT
WINAPI
KSPropertySetImpl_QuerySupport(
LPKSPROPERTYSET iface,
REFGUID guidPropSet,
ULONG dwPropID,
PULONG pTypeSupport )
{
UNIMPLEMENTED;
return E_PROP_ID_UNSUPPORTED;
}
static IKsPropertySetVtbl vt_KsPropertySet =
{
/* IUnknown methods */
KSPropertySetImpl_fnQueryInterface,
KSPropertySetImpl_fnAddRef,
KSPropertySetImpl_fnRelease,
/* IKsPropertySet methods */
KSPropertySetImpl_Get,
KSPropertySetImpl_Set,
KSPropertySetImpl_QuerySupport
};
HRESULT
CALLBACK
NewKsPropertySet(
IUnknown* pUnkOuter,
REFIID riid,
LPVOID* ppvObject)
{
LPOLESTR pStr;
LPCKsPropertySetImpl This;
/* check requested interface */
if (!IsEqualIID(riid, &IID_IUnknown) && !IsEqualIID(riid, &IID_IKsPropertySet))
{
*ppvObject = 0;
StringFromIID(riid, &pStr);
DPRINT("KsPropertySet does not support Interface %ws\n", pStr);
CoTaskMemFree(pStr);
return E_NOINTERFACE;
}
/* allocate object */
This = HeapAlloc(GetProcessHeap(), 0, sizeof(CKsPropertySetImpl));
if (!This)
return E_OUTOFMEMORY;
/* initialize object */
This->ref = 1;
This->lpVtbl = &vt_KsPropertySet;
*ppvObject = (LPVOID)&This->lpVtbl;
return S_OK;
}