xref: /reactos/dll/directx/dsound_new/property.c (revision 25e98eb0)
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS Configuration of network devices
4  * FILE:            dll/directx/dsound_new/property.c
5  * PURPOSE:         Secondary IDirectSoundBuffer8 implementation
6  *
7  * PROGRAMMERS:     Johannes Anderwald (johannes.anderwald@reactos.org)
8  */
9 
10 
11 #include "precomp.h"
12 
13 typedef struct
14 {
15     IKsPropertySetVtbl *lpVtbl;
16     LONG ref;
17 
18 }CKsPropertySetImpl, *LPCKsPropertySetImpl;
19 
20 HRESULT
21 WINAPI
KSPropertySetImpl_fnQueryInterface(LPKSPROPERTYSET iface,REFIID riid,LPVOID * ppobj)22 KSPropertySetImpl_fnQueryInterface(
23     LPKSPROPERTYSET iface,
24     REFIID riid,
25     LPVOID * ppobj)
26 {
27     LPOLESTR pStr;
28     LPCKsPropertySetImpl This = (LPCKsPropertySetImpl)CONTAINING_RECORD(iface, CKsPropertySetImpl, lpVtbl);
29 
30 
31     if (IsEqualIID(riid, &IID_IUnknown) ||
32         IsEqualIID(riid, &IID_IKsPropertySet))
33     {
34         *ppobj = (LPVOID)&This->lpVtbl;
35         InterlockedIncrement(&This->ref);
36         return S_OK;
37     }
38 
39     if (SUCCEEDED(StringFromIID(riid, &pStr)))
40     {
41         DPRINT("No Interface for riid %s\n", pStr);
42         CoTaskMemFree(pStr);
43     }
44     return E_NOINTERFACE;
45 }
46 
47 ULONG
48 WINAPI
KSPropertySetImpl_fnAddRef(LPKSPROPERTYSET iface)49 KSPropertySetImpl_fnAddRef(
50     LPKSPROPERTYSET iface)
51 {
52     ULONG ref;
53     LPCKsPropertySetImpl This = (LPCKsPropertySetImpl)CONTAINING_RECORD(iface, CKsPropertySetImpl, lpVtbl);
54 
55     ref = InterlockedIncrement(&This->ref);
56 
57     return ref;
58 }
59 
60 ULONG
61 WINAPI
KSPropertySetImpl_fnRelease(LPKSPROPERTYSET iface)62 KSPropertySetImpl_fnRelease(
63     LPKSPROPERTYSET iface)
64 {
65     ULONG ref;
66     LPCKsPropertySetImpl This = (LPCKsPropertySetImpl)CONTAINING_RECORD(iface, CKsPropertySetImpl, lpVtbl);
67 
68     ref = InterlockedDecrement(&(This->ref));
69 
70     if (!ref)
71     {
72         HeapFree(GetProcessHeap(), 0, This);
73     }
74 
75     return ref;
76 }
77 
78 
79 HRESULT
80 WINAPI
KSPropertySetImpl_Get(LPKSPROPERTYSET iface,REFGUID guidPropSet,ULONG dwPropID,LPVOID pInstanceData,ULONG cbInstanceData,LPVOID pPropData,ULONG cbPropData,PULONG pcbReturned)81 KSPropertySetImpl_Get(
82     LPKSPROPERTYSET iface,
83     REFGUID guidPropSet,
84     ULONG dwPropID,
85     LPVOID pInstanceData,
86     ULONG cbInstanceData,
87     LPVOID pPropData,
88     ULONG cbPropData,
89     PULONG pcbReturned )
90 {
91     LPOLESTR pStr;
92     //HRESULT hr;
93     MMRESULT Result;
94     WAVEINCAPSW CapsIn;
95     WAVEOUTCAPSW CapsOut;
96 
97     GUID DeviceGuid;
98     LPFILTERINFO Filter = NULL;
99     PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA Desc;
100 
101     StringFromIID(guidPropSet, &pStr);
102 
103     //DPRINT("Requested Property %ws dwPropID %u pInstanceData %p cbInstanceData %u pPropData %p cbPropData %u pcbReturned %p\n",
104     //       pStr, dwPropID, pInstanceData, cbInstanceData, pPropData, cbPropData, pcbReturned);
105     CoTaskMemFree(pStr);
106 
107     if (!IsEqualGUID(guidPropSet, &DSPROPSETID_DirectSoundDevice))
108     {
109         /* unsupported property set */
110         return E_PROP_ID_UNSUPPORTED;
111     }
112 
113     if (dwPropID == DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1)
114     {
115         if (cbPropData < sizeof(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA))
116         {
117             /* invalid parameter */
118             return DSERR_INVALIDPARAM;
119         }
120 
121         Desc = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA)pPropData;
122 
123         if (IsEqualGUID(&Desc->DeviceId, &GUID_NULL))
124         {
125             if (Desc->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE)
126             {
127                 DPRINT("Using default capture guid\n");
128                 CopyMemory(&DeviceGuid, &DSDEVID_DefaultCapture, sizeof(GUID));
129             }
130             else
131             {
132                 DPRINT("Using default playback guid\n");
133                 CopyMemory(&DeviceGuid, &DSDEVID_DefaultPlayback, sizeof(GUID));
134             }
135         }
136         else
137         {
138             /* use provided guid */
139             CopyMemory(&DeviceGuid, &Desc->DeviceId, sizeof(GUID));
140         }
141 
142         if (GetDeviceID(&DeviceGuid, &Desc->DeviceId) != DS_OK)
143         {
144             DPRINT("Unknown device guid\n");
145             return DSERR_INVALIDPARAM;
146         }
147 
148          /* sanity check */
149          ASSERT(FindDeviceByGuid(&Desc->DeviceId, &Filter));
150          ASSERT(Filter != NULL);
151 
152          /* fill in description */
153          if (IsEqualGUID(&Desc->DeviceId, &Filter->DeviceGuid[0]))
154          {
155              /* capture device */
156              Desc->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
157              Desc->WaveDeviceId = Filter->MappedId[0];
158 
159              Result = waveInGetDevCapsW(Filter->MappedId[0], &CapsIn, sizeof(WAVEINCAPSW));
160              if (Result != MMSYSERR_NOERROR)
161              {
162                  CapsIn.szPname[0] = 0;
163                  DPRINT("waveInGetDevCaps Device %u failed with %x\n", Filter->MappedId[0], Result);
164              }
165 
166              CapsIn.szPname[MAXPNAMELEN-1] = 0;
167              wcscpy(Desc->DescriptionW, CapsIn.szPname);
168              WideCharToMultiByte(CP_ACP, 0, CapsIn.szPname, -1, Desc->DescriptionA, sizeof(Desc->DescriptionA), NULL, NULL);
169 
170          }
171          else
172          {
173              /* render device */
174              Desc->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
175              Desc->WaveDeviceId = Filter->MappedId[1];
176 
177              Result = waveOutGetDevCapsW(Filter->MappedId[1], &CapsOut, sizeof(WAVEOUTCAPSW));
178              if (Result != MMSYSERR_NOERROR)
179              {
180                  CapsOut.szPname[0] = 0;
181                  DPRINT("waveOutGetDevCaps Device %u failed with %x\n", Filter->MappedId[1], Result);
182              }
183 
184              CapsOut.szPname[MAXPNAMELEN-1] = 0;
185              wcscpy(Desc->DescriptionW, CapsOut.szPname);
186              WideCharToMultiByte(CP_ACP, 0, CapsOut.szPname, -1, Desc->DescriptionA, sizeof(Desc->DescriptionA), NULL, NULL);
187          }
188 
189           /* ReactOS doesnt support vxd or emulated */
190           Desc->Type = DIRECTSOUNDDEVICE_TYPE_WDM;
191           Desc->ModuleA[0] = 0;
192           Desc->ModuleW[0] = 0;
193 
194           *pcbReturned = sizeof(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA);
195           return S_OK;
196     }
197 
198 
199     UNIMPLEMENTED;
200     return E_PROP_ID_UNSUPPORTED;
201 }
202 
203 HRESULT
204 WINAPI
KSPropertySetImpl_Set(LPKSPROPERTYSET iface,REFGUID guidPropSet,ULONG dwPropID,LPVOID pInstanceData,ULONG cbInstanceData,LPVOID pPropData,ULONG cbPropData)205 KSPropertySetImpl_Set(
206     LPKSPROPERTYSET iface,
207     REFGUID guidPropSet,
208     ULONG dwPropID,
209     LPVOID pInstanceData,
210     ULONG cbInstanceData,
211     LPVOID pPropData,
212     ULONG cbPropData )
213 {
214     UNIMPLEMENTED;
215     return E_PROP_ID_UNSUPPORTED;
216 }
217 
218 HRESULT
219 WINAPI
KSPropertySetImpl_QuerySupport(LPKSPROPERTYSET iface,REFGUID guidPropSet,ULONG dwPropID,PULONG pTypeSupport)220 KSPropertySetImpl_QuerySupport(
221     LPKSPROPERTYSET iface,
222     REFGUID guidPropSet,
223     ULONG dwPropID,
224     PULONG pTypeSupport )
225 {
226     UNIMPLEMENTED;
227     return E_PROP_ID_UNSUPPORTED;
228 }
229 
230 static IKsPropertySetVtbl vt_KsPropertySet =
231 {
232     /* IUnknown methods */
233     KSPropertySetImpl_fnQueryInterface,
234     KSPropertySetImpl_fnAddRef,
235     KSPropertySetImpl_fnRelease,
236     /* IKsPropertySet methods */
237     KSPropertySetImpl_Get,
238     KSPropertySetImpl_Set,
239     KSPropertySetImpl_QuerySupport
240 };
241 
242 HRESULT
243 CALLBACK
NewKsPropertySet(IUnknown * pUnkOuter,REFIID riid,LPVOID * ppvObject)244 NewKsPropertySet(
245     IUnknown* pUnkOuter,
246     REFIID riid,
247     LPVOID* ppvObject)
248 {
249     LPOLESTR pStr;
250     LPCKsPropertySetImpl This;
251 
252     /* check requested interface */
253     if (!IsEqualIID(riid, &IID_IUnknown) && !IsEqualIID(riid, &IID_IKsPropertySet))
254     {
255         *ppvObject = 0;
256         StringFromIID(riid, &pStr);
257         DPRINT("KsPropertySet does not support Interface %ws\n", pStr);
258         CoTaskMemFree(pStr);
259         return E_NOINTERFACE;
260     }
261 
262     /* allocate object */
263     This = HeapAlloc(GetProcessHeap(), 0, sizeof(CKsPropertySetImpl));
264     if (!This)
265         return E_OUTOFMEMORY;
266 
267     /* initialize object */
268     This->ref = 1;
269     This->lpVtbl = &vt_KsPropertySet;
270     *ppvObject = (LPVOID)&This->lpVtbl;
271 
272     return S_OK;
273 }
274