mirror of
https://github.com/reactos/reactos.git
synced 2024-08-26 21:28:48 +00:00
274 lines
7.1 KiB
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;
|
|
}
|