1 /* IDirectMusicAudioPath Implementation
3 * Copyright (C) 2003 Rok Mandeljc
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Library General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 #include "wine/debug.h"
28 #include "dmime_private.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(dmime
);
32 /* IDirectMusicAudioPath IUnknown part: */
33 HRESULT WINAPI
IDirectMusicAudioPathImpl_QueryInterface (LPDIRECTMUSICAUDIOPATH iface
, REFIID riid
, LPVOID
*ppobj
)
35 ICOM_THIS(IDirectMusicAudioPathImpl
,iface
);
37 if (IsEqualIID (riid
, &IID_IUnknown
) ||
38 IsEqualIID (riid
, &IID_IDirectMusicAudioPath
)) {
39 IDirectMusicAudioPathImpl_AddRef(iface
);
44 WARN("(%p)->(%s,%p),not found\n", This
, debugstr_guid(riid
), ppobj
);
48 ULONG WINAPI
IDirectMusicAudioPathImpl_AddRef (LPDIRECTMUSICAUDIOPATH iface
)
50 ICOM_THIS(IDirectMusicAudioPathImpl
,iface
);
51 TRACE("(%p) : AddRef from %ld\n", This
, This
->ref
);
55 ULONG WINAPI
IDirectMusicAudioPathImpl_Release (LPDIRECTMUSICAUDIOPATH iface
)
57 ICOM_THIS(IDirectMusicAudioPathImpl
,iface
);
58 ULONG ref
= --This
->ref
;
59 TRACE("(%p) : ReleaseRef to %ld\n", This
, This
->ref
);
61 HeapFree(GetProcessHeap(), 0, This
);
66 /* IDirectMusicAudioPath IDirectMusicAudioPath part: */
67 HRESULT WINAPI
IDirectMusicAudioPathImpl_GetObjectInPath (LPDIRECTMUSICAUDIOPATH iface
, DWORD dwPChannel
, DWORD dwStage
, DWORD dwBuffer
, REFGUID guidObject
, WORD dwIndex
, REFGUID iidInterface
, void** ppObject
)
69 ICOM_THIS(IDirectMusicAudioPathImpl
,iface
);
71 FIXME("(%p, %ld, %ld, %ld, %s, %d, %s, %p): stub\n", This
, dwPChannel
, dwStage
, dwBuffer
, debugstr_guid(guidObject
), dwIndex
, debugstr_guid(iidInterface
), ppObject
);
74 case DMUS_PATH_BUFFER
:
76 if (IsEqualIID (iidInterface
, &IID_IDirectSoundBuffer8
)) {
77 IDirectSoundBuffer8_QueryInterface (This
->pDSBuffer
, &IID_IDirectSoundBuffer8
, ppObject
);
78 TRACE("returning %p\n",*ppObject
);
80 } else if (IsEqualIID (iidInterface
, &IID_IDirectSound3DBuffer
)) {
81 IDirectSoundBuffer8_QueryInterface (This
->pDSBuffer
, &IID_IDirectSound3DBuffer
, ppObject
);
82 TRACE("returning %p\n",*ppObject
);
90 case DMUS_PATH_PRIMARY_BUFFER
: {
91 if (IsEqualIID (iidInterface
, &IID_IDirectSound3DListener
)) {
92 IDirectSoundBuffer8_QueryInterface (This
->pPrimary
, &IID_IDirectSound3DListener
, ppObject
);
95 FIXME("bad iid...\n");
100 case DMUS_PATH_AUDIOPATH_GRAPH
:
102 if (IsEqualIID (iidInterface
, &IID_IDirectMusicGraph
)) {
103 if (NULL
== This
->pToolGraph
) {
104 IDirectMusicGraphImpl
* pGraph
;
105 pGraph
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectMusicGraphImpl
));
106 pGraph
->lpVtbl
= &DirectMusicGraph_Vtbl
;
108 This
->pToolGraph
= (IDirectMusicGraph
*) pGraph
;
110 *ppObject
= (LPDIRECTMUSICGRAPH
) This
->pToolGraph
;
111 IDirectMusicGraphImpl_AddRef((LPDIRECTMUSICGRAPH
) *ppObject
);
117 case DMUS_PATH_AUDIOPATH_TOOL
:
123 case DMUS_PATH_PERFORMANCE
:
125 /* TODO check wanted GUID */
126 *ppObject
= (LPDIRECTMUSICPERFORMANCE8
) This
->pPerf
;
127 IDirectMusicPerformance8Impl_AddRef((LPDIRECTMUSICPERFORMANCE8
) *ppObject
);
132 case DMUS_PATH_PERFORMANCE_GRAPH
:
134 IDirectMusicGraph
* pPerfoGraph
= NULL
;
135 IDirectMusicPerformance8Impl_GetGraph((LPDIRECTMUSICPERFORMANCE8
) This
->pPerf
, &pPerfoGraph
);
136 if (NULL
== pPerfoGraph
) {
137 IDirectMusicGraphImpl
* pGraph
= NULL
;
138 pGraph
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectMusicGraphImpl
));
139 pGraph
->lpVtbl
= &DirectMusicGraph_Vtbl
;
141 IDirectMusicPerformance8Impl_SetGraph((LPDIRECTMUSICPERFORMANCE8
) This
->pPerf
, (IDirectMusicGraph
*) pGraph
);
142 /* we need release as SetGraph do an AddRef */
143 IDirectMusicGraphImpl_Release((LPDIRECTMUSICGRAPH
) pGraph
);
144 pPerfoGraph
= (LPDIRECTMUSICGRAPH
) pGraph
;
146 *ppObject
= (LPDIRECTMUSICGRAPH
) pPerfoGraph
;
151 case DMUS_PATH_PERFORMANCE_TOOL
:
160 HRESULT WINAPI
IDirectMusicAudioPathImpl_Activate (LPDIRECTMUSICAUDIOPATH iface
, BOOL fActivate
)
162 ICOM_THIS(IDirectMusicAudioPathImpl
,iface
);
164 FIXME("(%p, %d): stub\n", This
, fActivate
);
169 HRESULT WINAPI
IDirectMusicAudioPathImpl_SetVolume (LPDIRECTMUSICAUDIOPATH iface
, long lVolume
, DWORD dwDuration
)
171 ICOM_THIS(IDirectMusicAudioPathImpl
,iface
);
173 FIXME("(%p, %li, %ld): stub\n", This
, lVolume
, dwDuration
);
178 HRESULT WINAPI
IDirectMusicAudioPathImpl_ConvertPChannel (LPDIRECTMUSICAUDIOPATH iface
, DWORD dwPChannelIn
, DWORD
* pdwPChannelOut
)
180 ICOM_THIS(IDirectMusicAudioPathImpl
,iface
);
182 FIXME("(%p, %ld, %p): stub\n", This
, dwPChannelIn
, pdwPChannelOut
);
187 ICOM_VTABLE(IDirectMusicAudioPath
) DirectMusicAudioPath_Vtbl
=
189 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
190 IDirectMusicAudioPathImpl_QueryInterface
,
191 IDirectMusicAudioPathImpl_AddRef
,
192 IDirectMusicAudioPathImpl_Release
,
193 IDirectMusicAudioPathImpl_GetObjectInPath
,
194 IDirectMusicAudioPathImpl_Activate
,
195 IDirectMusicAudioPathImpl_SetVolume
,
196 IDirectMusicAudioPathImpl_ConvertPChannel
199 /* for ClassFactory */
200 HRESULT WINAPI
DMUSIC_CreateDirectMusicAudioPath (LPCGUID lpcGUID
, LPDIRECTMUSICAUDIOPATH
* ppDMCAPath
, LPUNKNOWN pUnkOuter
)
202 IDirectMusicAudioPathImpl
* path
;
204 if (IsEqualIID (lpcGUID
, &IID_IDirectMusicAudioPath
)) {
205 path
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectMusicAudioPathImpl
));
207 *ppDMCAPath
= (LPDIRECTMUSICAUDIOPATH
) NULL
;
208 return E_OUTOFMEMORY
;
210 path
->lpVtbl
= &DirectMusicAudioPath_Vtbl
;
212 *ppDMCAPath
= (LPDIRECTMUSICAUDIOPATH
) path
;
216 WARN("No interface found\n");
217 return E_NOINTERFACE
;
220 /*****************************************************************************
221 * IDirectMusicAudioPathObject implementation
223 /* IDirectMusicAudioPathObject IUnknown part: */
224 HRESULT WINAPI
IDirectMusicAudioPathObject_QueryInterface (LPDIRECTMUSICOBJECT iface
, REFIID riid
, LPVOID
*ppobj
)
226 ICOM_THIS(IDirectMusicAudioPathObject
,iface
);
228 if (IsEqualIID (riid
, &IID_IUnknown
)
229 || IsEqualIID (riid
, &IID_IDirectMusicObject
)) {
230 IDirectMusicAudioPathObject_AddRef(iface
);
233 } else if (IsEqualIID (riid
, &IID_IPersistStream
)) {
234 IPersistStream_AddRef ((LPPERSISTSTREAM
)This
->pStream
);
235 *ppobj
= (LPPERSISTSTREAM
)This
->pStream
;
237 } else if (IsEqualIID (riid
, &IID_IDirectMusicAudioPath
)) {
238 IDirectMusicAudioPath_AddRef ((LPDIRECTMUSICAUDIOPATH
)This
->pAudioPath
);
239 *ppobj
= (LPDIRECTMUSICAUDIOPATH
)This
->pAudioPath
;
243 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
244 return E_NOINTERFACE
;
247 ULONG WINAPI
IDirectMusicAudioPathObject_AddRef (LPDIRECTMUSICOBJECT iface
)
249 ICOM_THIS(IDirectMusicAudioPathObject
,iface
);
250 TRACE("(%p) : AddRef from %ld\n", This
, This
->ref
);
251 return ++(This
->ref
);
254 ULONG WINAPI
IDirectMusicAudioPathObject_Release (LPDIRECTMUSICOBJECT iface
)
256 ICOM_THIS(IDirectMusicAudioPathObject
,iface
);
257 ULONG ref
= --This
->ref
;
258 TRACE("(%p) : ReleaseRef to %ld\n", This
, This
->ref
);
260 HeapFree(GetProcessHeap(), 0, This
);
265 /* IDirectMusicAudioPathObject IDirectMusicObject part: */
266 HRESULT WINAPI
IDirectMusicAudioPathObject_GetDescriptor (LPDIRECTMUSICOBJECT iface
, LPDMUS_OBJECTDESC pDesc
)
268 ICOM_THIS(IDirectMusicAudioPathObject
,iface
);
270 TRACE("(%p, %p)\n", This
, pDesc
);
276 HRESULT WINAPI
IDirectMusicAudioPathObject_SetDescriptor (LPDIRECTMUSICOBJECT iface
, LPDMUS_OBJECTDESC pDesc
)
278 ICOM_THIS(IDirectMusicAudioPathObject
,iface
);
280 TRACE("(%p, %p)\n", This
, pDesc
);
286 HRESULT WINAPI
IDirectMusicAudioPathObject_ParseDescriptor (LPDIRECTMUSICOBJECT iface
, LPSTREAM pStream
, LPDMUS_OBJECTDESC pDesc
)
288 ICOM_THIS(IDirectMusicAudioPathObject
,iface
);
290 FIXME("(%p, %p, %p): stub\n", This
, pStream
, pDesc
);
295 ICOM_VTABLE(IDirectMusicObject
) DirectMusicAudioPathObject_Vtbl
=
297 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
298 IDirectMusicAudioPathObject_QueryInterface
,
299 IDirectMusicAudioPathObject_AddRef
,
300 IDirectMusicAudioPathObject_Release
,
301 IDirectMusicAudioPathObject_GetDescriptor
,
302 IDirectMusicAudioPathObject_SetDescriptor
,
303 IDirectMusicAudioPathObject_ParseDescriptor
306 /* for ClassFactory */
307 HRESULT WINAPI
DMUSIC_CreateDirectMusicAudioPathObject (LPCGUID lpcGUID
, LPDIRECTMUSICOBJECT
* ppObject
, LPUNKNOWN pUnkOuter
)
309 IDirectMusicAudioPathObject
*obj
;
311 TRACE("(%p,%p,%p)\n", lpcGUID
, ppObject
, pUnkOuter
);
312 if (IsEqualIID (lpcGUID
, &IID_IDirectMusicObject
)) {
313 obj
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectMusicAudioPathObject
));
315 *ppObject
= (LPDIRECTMUSICOBJECT
) NULL
;
316 return E_OUTOFMEMORY
;
318 obj
->lpVtbl
= &DirectMusicAudioPathObject_Vtbl
;
320 /* prepare IPersistStream */
321 obj
->pStream
= HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY
, sizeof(IDirectMusicAudioPathObjectStream
));
322 obj
->pStream
->lpVtbl
= &DirectMusicAudioPathObjectStream_Vtbl
;
323 obj
->pStream
->ref
= 1;
324 obj
->pStream
->pParentObject
= obj
;
325 /* prepare IDirectMusicAudioPath */
326 DMUSIC_CreateDirectMusicAudioPath (&IID_IDirectMusicAudioPath
, (LPDIRECTMUSICAUDIOPATH
*)&obj
->pAudioPath
, NULL
);
327 obj
->pAudioPath
->pObject
= obj
;
328 *ppObject
= (LPDIRECTMUSICOBJECT
) obj
;
331 WARN("No interface found\n");
333 return E_NOINTERFACE
;
336 /*****************************************************************************
337 * IDirectMusicAudioPathObjectStream implementation
339 /* IDirectMusicAudioPathObjectStream IUnknown part: */
340 HRESULT WINAPI
IDirectMusicAudioPathObjectStream_QueryInterface (LPPERSISTSTREAM iface
, REFIID riid
, LPVOID
*ppobj
)
342 ICOM_THIS(IDirectMusicAudioPathObjectStream
,iface
);
344 if (IsEqualIID (riid
, &IID_IUnknown
)
345 || IsEqualIID (riid
, &IID_IPersistStream
)) {
346 IDirectMusicAudioPathObjectStream_AddRef(iface
);
351 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
352 return E_NOINTERFACE
;
355 ULONG WINAPI
IDirectMusicAudioPathObjectStream_AddRef (LPPERSISTSTREAM iface
)
357 ICOM_THIS(IDirectMusicAudioPathObjectStream
,iface
);
358 TRACE("(%p) : AddRef from %ld\n", This
, This
->ref
);
359 return ++(This
->ref
);
362 ULONG WINAPI
IDirectMusicAudioPathObjectStream_Release (LPPERSISTSTREAM iface
)
364 ICOM_THIS(IDirectMusicAudioPathObjectStream
,iface
);
365 ULONG ref
= --This
->ref
;
366 TRACE("(%p) : ReleaseRef to %ld\n", This
, This
->ref
);
368 HeapFree(GetProcessHeap(), 0, This
);
373 /* IDirectMusicAudioPathObjectStream IPersist part: */
374 HRESULT WINAPI
IDirectMusicAudioPathObjectStream_GetClassID (LPPERSISTSTREAM iface
, CLSID
* pClassID
)
379 /* IDirectMusicAudioPathObjectStream IPersistStream part: */
380 HRESULT WINAPI
IDirectMusicAudioPathObjectStream_IsDirty (LPPERSISTSTREAM iface
)
385 HRESULT WINAPI
IDirectMusicAudioPathObjectStream_Load (LPPERSISTSTREAM iface
, IStream
* pStm
)
387 FIXME(": Loading not implemented yet\n");
391 HRESULT WINAPI
IDirectMusicAudioPathObjectStream_Save (LPPERSISTSTREAM iface
, IStream
* pStm
, BOOL fClearDirty
)
396 HRESULT WINAPI
IDirectMusicAudioPathObjectStream_GetSizeMax (LPPERSISTSTREAM iface
, ULARGE_INTEGER
* pcbSize
)
401 ICOM_VTABLE(IPersistStream
) DirectMusicAudioPathObjectStream_Vtbl
=
403 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
404 IDirectMusicAudioPathObjectStream_QueryInterface
,
405 IDirectMusicAudioPathObjectStream_AddRef
,
406 IDirectMusicAudioPathObjectStream_Release
,
407 IDirectMusicAudioPathObjectStream_GetClassID
,
408 IDirectMusicAudioPathObjectStream_IsDirty
,
409 IDirectMusicAudioPathObjectStream_Load
,
410 IDirectMusicAudioPathObjectStream_Save
,
411 IDirectMusicAudioPathObjectStream_GetSizeMax