1 /* IDirectMusic Implementation
2 * IDirectMusic8 Implementation
3 * IDirectMusicDownload Implementation
4 * IDirectMusicBuffer Implementation
5 * IDirectMusicObject Implementation
7 * Copyright (C) 2003 Rok Mandeljc
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Library General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 #include "wine/debug.h"
30 #include "dmusic_private.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(dmusic
);
34 /* IDirectMusic IUnknown parts follow: */
35 HRESULT WINAPI
IDirectMusicImpl_QueryInterface (LPDIRECTMUSIC iface
, REFIID riid
, LPVOID
*ppobj
)
37 ICOM_THIS(IDirectMusicImpl
,iface
);
39 if (IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_IDirectMusic
))
41 IDirectMusicImpl_AddRef(iface
);
46 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
50 ULONG WINAPI
IDirectMusicImpl_AddRef (LPDIRECTMUSIC iface
)
52 ICOM_THIS(IDirectMusicImpl
,iface
);
53 TRACE("(%p) : AddRef from %ld\n", This
, This
->ref
);
57 ULONG WINAPI
IDirectMusicImpl_Release (LPDIRECTMUSIC iface
)
59 ICOM_THIS(IDirectMusicImpl
,iface
);
60 ULONG ref
= --This
->ref
;
61 TRACE("(%p) : ReleaseRef to %ld\n", This
, This
->ref
);
64 HeapFree(GetProcessHeap(), 0, This
);
69 /* IDirectMusic Interface follow: */
70 HRESULT WINAPI
IDirectMusicImpl_EnumPort (LPDIRECTMUSIC iface
, DWORD dwIndex
, LPDMUS_PORTCAPS pPortCaps
)
72 /* FIXME: this is only for making DXCapsViewer display something */
73 static const WCHAR name_WINE_SYNTHESIZER
[] = {'W','i','n','e',' ','S','y','n','t','h','e','s','i','z','e','r',0};
77 pPortCaps
->dwSize
= sizeof(DMUS_PORTCAPS
);
78 pPortCaps
->dwFlags
= DMUS_PC_DLS
| DMUS_PC_SOFTWARESYNTH
| DMUS_PC_DIRECTSOUND
| DMUS_PC_DLS2
| DMUS_PC_AUDIOPATH
| DMUS_PC_WAVE
;
79 /*pPortCaps->guidPort;*/ /* FIXME */
80 pPortCaps
->dwClass
= DMUS_PC_OUTPUTCLASS
;
81 pPortCaps
->dwType
= DMUS_PORT_WINMM_DRIVER
;
82 pPortCaps
->dwMemorySize
= DMUS_PC_SYSTEMMEMORY
;
83 pPortCaps
->dwMaxChannelGroups
= 1000;
84 pPortCaps
->dwMaxVoices
= 1000;
85 pPortCaps
->dwMaxAudioChannels
= -1;
86 pPortCaps
->dwEffectFlags
= DMUS_EFFECT_REVERB
| DMUS_EFFECT_CHORUS
| DMUS_EFFECT_DELAY
;
87 wsprintfW(pPortCaps
->wszDescription
, name_WINE_SYNTHESIZER
);
91 FIXME("partial-stub (only first port supported)\n");
95 HRESULT WINAPI
IDirectMusicImpl_CreateMusicBuffer (LPDIRECTMUSIC iface
, LPDMUS_BUFFERDESC pBufferDesc
, LPDIRECTMUSICBUFFER
** ppBuffer
, LPUNKNOWN pUnkOuter
)
101 HRESULT WINAPI
IDirectMusicImpl_CreatePort (LPDIRECTMUSIC iface
, REFCLSID rclsidPort
, LPDMUS_PORTPARAMS pPortParams
, LPDIRECTMUSICPORT
* ppPort
, LPUNKNOWN pUnkOuter
)
103 ICOM_THIS(IDirectMusicImpl
,iface
);
104 FIXME("(%p, %s, %p, %p, %p): stub\n", This
, debugstr_guid(rclsidPort
), pPortParams
, ppPort
, pUnkOuter
);
105 return E_OUTOFMEMORY
;
109 HRESULT WINAPI
IDirectMusicImpl_EnumMasterClock (LPDIRECTMUSIC iface
, DWORD dwIndex
, LPDMUS_CLOCKINFO lpClockInfo
)
115 HRESULT WINAPI
IDirectMusicImpl_GetMasterClock (LPDIRECTMUSIC iface
, LPGUID pguidClock
, IReferenceClock
** ppReferenceClock
)
121 HRESULT WINAPI
IDirectMusicImpl_SetMasterClock (LPDIRECTMUSIC iface
, REFGUID rguidClock
)
127 HRESULT WINAPI
IDirectMusicImpl_Activate (LPDIRECTMUSIC iface
, BOOL fEnable
)
133 HRESULT WINAPI
IDirectMusicImpl_GetDefaultPort (LPDIRECTMUSIC iface
, LPGUID pguidPort
)
139 HRESULT WINAPI
IDirectMusicImpl_SetDirectSound (LPDIRECTMUSIC iface
, LPDIRECTSOUND pDirectSound
, HWND hWnd
)
145 ICOM_VTABLE(IDirectMusic
) DirectMusic_Vtbl
=
147 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
148 IDirectMusicImpl_QueryInterface
,
149 IDirectMusicImpl_AddRef
,
150 IDirectMusicImpl_Release
,
151 IDirectMusicImpl_EnumPort
,
152 IDirectMusicImpl_CreateMusicBuffer
,
153 IDirectMusicImpl_CreatePort
,
154 IDirectMusicImpl_EnumMasterClock
,
155 IDirectMusicImpl_GetMasterClock
,
156 IDirectMusicImpl_SetMasterClock
,
157 IDirectMusicImpl_Activate
,
158 IDirectMusicImpl_GetDefaultPort
,
159 IDirectMusicImpl_SetDirectSound
163 /* for ClassFactory */
164 HRESULT WINAPI
DMUSIC_CreateDirectMusic (LPCGUID lpcGUID
, LPDIRECTMUSIC
*ppDM
, LPUNKNOWN pUnkOuter
)
166 IDirectMusicImpl
*dmusic
;
168 TRACE("(%p,%p,%p)\n",lpcGUID
, ppDM
, pUnkOuter
);
170 if (IsEqualGUID(lpcGUID
, &IID_IDirectMusic
))
172 dmusic
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectMusicImpl
));
175 *ppDM
= (LPDIRECTMUSIC
)NULL
;
176 return E_OUTOFMEMORY
;
179 dmusic
->lpVtbl
= &DirectMusic_Vtbl
;
181 *ppDM
= (LPDIRECTMUSIC
)dmusic
;
185 WARN("No interface found\n");
186 return E_NOINTERFACE
;
190 /* IDirectMusic8 IUnknown parts follow: */
191 HRESULT WINAPI
IDirectMusic8Impl_QueryInterface (LPDIRECTMUSIC8 iface
, REFIID riid
, LPVOID
*ppobj
)
193 ICOM_THIS(IDirectMusic8Impl
,iface
);
195 if (IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_IDirectMusic8
))
197 IDirectMusic8Impl_AddRef(iface
);
201 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
202 return E_NOINTERFACE
;
205 ULONG WINAPI
IDirectMusic8Impl_AddRef (LPDIRECTMUSIC8 iface
)
207 ICOM_THIS(IDirectMusic8Impl
,iface
);
208 TRACE("(%p) : AddRef from %ld\n", This
, This
->ref
);
209 return ++(This
->ref
);
212 ULONG WINAPI
IDirectMusic8Impl_Release (LPDIRECTMUSIC8 iface
)
214 ICOM_THIS(IDirectMusic8Impl
,iface
);
215 ULONG ref
= --This
->ref
;
216 TRACE("(%p) : ReleaseRef to %ld\n", This
, This
->ref
);
219 HeapFree(GetProcessHeap(), 0, This
);
224 /* IDirectMusic8 Interface follow: */
225 HRESULT WINAPI
IDirectMusic8Impl_EnumPort (LPDIRECTMUSIC8 iface
, DWORD dwIndex
, LPDMUS_PORTCAPS pPortCaps
)
231 HRESULT WINAPI
IDirectMusic8Impl_CreateMusicBuffer (LPDIRECTMUSIC8 iface
, LPDMUS_BUFFERDESC pBufferDesc
, LPDIRECTMUSICBUFFER
** ppBuffer
, LPUNKNOWN pUnkOuter
)
237 HRESULT WINAPI
IDirectMusic8Impl_CreatePort (LPDIRECTMUSIC8 iface
, REFCLSID rclsidPort
, LPDMUS_PORTPARAMS pPortParams
, LPDIRECTMUSICPORT
* ppPort
, LPUNKNOWN pUnkOuter
)
239 ICOM_THIS(IDirectMusic8Impl
,iface
);
240 FIXME("(%p, %s, %p, %p, %p): stub\n", This
, debugstr_guid(rclsidPort
), pPortParams
, ppPort
, pUnkOuter
);
244 HRESULT WINAPI
IDirectMusic8Impl_EnumMasterClock (LPDIRECTMUSIC8 iface
, DWORD dwIndex
, LPDMUS_CLOCKINFO lpClockInfo
)
250 HRESULT WINAPI
IDirectMusic8Impl_GetMasterClock (LPDIRECTMUSIC8 iface
, LPGUID pguidClock
, IReferenceClock
** ppReferenceClock
)
256 HRESULT WINAPI
IDirectMusic8Impl_SetMasterClock (LPDIRECTMUSIC8 iface
, REFGUID rguidClock
)
262 HRESULT WINAPI
IDirectMusic8Impl_Activate (LPDIRECTMUSIC8 iface
, BOOL fEnable
)
268 HRESULT WINAPI
IDirectMusic8Impl_GetDefaultPort (LPDIRECTMUSIC8 iface
, LPGUID pguidPort
)
274 HRESULT WINAPI
IDirectMusic8Impl_SetDirectSound (LPDIRECTMUSIC8 iface
, LPDIRECTSOUND pDirectSound
, HWND hWnd
)
280 HRESULT WINAPI
IDirectMusic8Impl_SetExternalMasterClock (LPDIRECTMUSIC8 iface
, IReferenceClock
* pClock
)
286 ICOM_VTABLE(IDirectMusic8
) DirectMusic8_Vtbl
=
288 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
289 IDirectMusic8Impl_QueryInterface
,
290 IDirectMusic8Impl_AddRef
,
291 IDirectMusic8Impl_Release
,
292 IDirectMusic8Impl_EnumPort
,
293 IDirectMusic8Impl_CreateMusicBuffer
,
294 IDirectMusic8Impl_CreatePort
,
295 IDirectMusic8Impl_EnumMasterClock
,
296 IDirectMusic8Impl_GetMasterClock
,
297 IDirectMusic8Impl_SetMasterClock
,
298 IDirectMusic8Impl_Activate
,
299 IDirectMusic8Impl_GetDefaultPort
,
300 IDirectMusic8Impl_SetDirectSound
,
301 IDirectMusic8Impl_SetExternalMasterClock
305 /* IDirectMusicDownload IUnknown parts follow: */
306 HRESULT WINAPI
IDirectMusicDownloadImpl_QueryInterface (LPDIRECTMUSICDOWNLOAD iface
, REFIID riid
, LPVOID
*ppobj
)
308 ICOM_THIS(IDirectMusicDownloadImpl
,iface
);
310 if (IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_IDirectMusicDownload
))
312 IDirectMusicDownloadImpl_AddRef(iface
);
316 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
317 return E_NOINTERFACE
;
320 ULONG WINAPI
IDirectMusicDownloadImpl_AddRef (LPDIRECTMUSICDOWNLOAD iface
)
322 ICOM_THIS(IDirectMusicDownloadImpl
,iface
);
323 TRACE("(%p) : AddRef from %ld\n", This
, This
->ref
);
324 return ++(This
->ref
);
327 ULONG WINAPI
IDirectMusicDownloadImpl_Release (LPDIRECTMUSICDOWNLOAD iface
)
329 ICOM_THIS(IDirectMusicDownloadImpl
,iface
);
330 ULONG ref
= --This
->ref
;
331 TRACE("(%p) : ReleaseRef to %ld\n", This
, This
->ref
);
334 HeapFree(GetProcessHeap(), 0, This
);
339 /* IDirectMusicDownload Interface follow: */
340 HRESULT WINAPI
IDirectMusicDownloadImpl_GetBuffer (LPDIRECTMUSICDOWNLOAD iface
, void** ppvBuffer
, DWORD
* pdwSize
)
346 ICOM_VTABLE(IDirectMusicDownload
) DirectMusicDownload_Vtbl
=
348 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
349 IDirectMusicDownloadImpl_QueryInterface
,
350 IDirectMusicDownloadImpl_AddRef
,
351 IDirectMusicDownloadImpl_Release
,
352 IDirectMusicDownloadImpl_GetBuffer
356 /* IDirectMusicBuffer IUnknown parts follow: */
357 HRESULT WINAPI
IDirectMusicBufferImpl_QueryInterface (LPDIRECTMUSICBUFFER iface
, REFIID riid
, LPVOID
*ppobj
)
359 ICOM_THIS(IDirectMusicBufferImpl
,iface
);
361 if (IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_IDirectMusicBuffer
))
363 IDirectMusicBufferImpl_AddRef(iface
);
367 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
368 return E_NOINTERFACE
;
371 ULONG WINAPI
IDirectMusicBufferImpl_AddRef (LPDIRECTMUSICBUFFER iface
)
373 ICOM_THIS(IDirectMusicBufferImpl
,iface
);
374 TRACE("(%p) : AddRef from %ld\n", This
, This
->ref
);
375 return ++(This
->ref
);
378 ULONG WINAPI
IDirectMusicBufferImpl_Release (LPDIRECTMUSICBUFFER iface
)
380 ICOM_THIS(IDirectMusicBufferImpl
,iface
);
381 ULONG ref
= --This
->ref
;
382 TRACE("(%p) : ReleaseRef to %ld\n", This
, This
->ref
);
385 HeapFree(GetProcessHeap(), 0, This
);
390 /* IDirectMusicBuffer Interface follow: */
391 HRESULT WINAPI
IDirectMusicBufferImpl_Flush (LPDIRECTMUSICBUFFER iface
)
397 HRESULT WINAPI
IDirectMusicBufferImpl_TotalTime (LPDIRECTMUSICBUFFER iface
, LPREFERENCE_TIME prtTime
)
403 HRESULT WINAPI
IDirectMusicBufferImpl_PackStructured (LPDIRECTMUSICBUFFER iface
, REFERENCE_TIME rt
, DWORD dwChannelGroup
, DWORD dwChannelMessage
)
409 HRESULT WINAPI
IDirectMusicBufferImpl_PackUnstructured (LPDIRECTMUSICBUFFER iface
, REFERENCE_TIME rt
, DWORD dwChannelGroup
, DWORD cb
, LPBYTE lpb
)
415 HRESULT WINAPI
IDirectMusicBufferImpl_ResetReadPtr (LPDIRECTMUSICBUFFER iface
)
421 HRESULT WINAPI
IDirectMusicBufferImpl_GetNextEvent (LPDIRECTMUSICBUFFER iface
, LPREFERENCE_TIME prt
, LPDWORD pdwChannelGroup
, LPDWORD pdwLength
, LPBYTE
* ppData
)
427 HRESULT WINAPI
IDirectMusicBufferImpl_GetRawBufferPtr (LPDIRECTMUSICBUFFER iface
, LPBYTE
* ppData
)
433 HRESULT WINAPI
IDirectMusicBufferImpl_GetStartTime (LPDIRECTMUSICBUFFER iface
, LPREFERENCE_TIME prt
)
439 HRESULT WINAPI
IDirectMusicBufferImpl_GetUsedBytes (LPDIRECTMUSICBUFFER iface
, LPDWORD pcb
)
445 HRESULT WINAPI
IDirectMusicBufferImpl_GetMaxBytes (LPDIRECTMUSICBUFFER iface
, LPDWORD pcb
)
451 HRESULT WINAPI
IDirectMusicBufferImpl_GetBufferFormat (LPDIRECTMUSICBUFFER iface
, LPGUID pGuidFormat
)
457 HRESULT WINAPI
IDirectMusicBufferImpl_SetStartTime (LPDIRECTMUSICBUFFER iface
, REFERENCE_TIME rt
)
463 HRESULT WINAPI
IDirectMusicBufferImpl_SetUsedBytes (LPDIRECTMUSICBUFFER iface
, DWORD cb
)
469 ICOM_VTABLE(IDirectMusicBuffer
) DirectMusicBuffer_Vtbl
=
471 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
472 IDirectMusicBufferImpl_QueryInterface
,
473 IDirectMusicBufferImpl_AddRef
,
474 IDirectMusicBufferImpl_Release
,
475 IDirectMusicBufferImpl_Flush
,
476 IDirectMusicBufferImpl_TotalTime
,
477 IDirectMusicBufferImpl_PackStructured
,
478 IDirectMusicBufferImpl_PackUnstructured
,
479 IDirectMusicBufferImpl_ResetReadPtr
,
480 IDirectMusicBufferImpl_GetNextEvent
,
481 IDirectMusicBufferImpl_GetRawBufferPtr
,
482 IDirectMusicBufferImpl_GetStartTime
,
483 IDirectMusicBufferImpl_GetUsedBytes
,
484 IDirectMusicBufferImpl_GetMaxBytes
,
485 IDirectMusicBufferImpl_GetBufferFormat
,
486 IDirectMusicBufferImpl_SetStartTime
,
487 IDirectMusicBufferImpl_SetUsedBytes
491 /* IDirectMusicObject IUnknown parts follow: */
492 HRESULT WINAPI
IDirectMusicObjectImpl_QueryInterface (LPDIRECTMUSICOBJECT iface
, REFIID riid
, LPVOID
*ppobj
)
494 ICOM_THIS(IDirectMusicObjectImpl
,iface
);
496 if (IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_IDirectMusicObject
))
498 IDirectMusicObjectImpl_AddRef(iface
);
502 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
503 return E_NOINTERFACE
;
506 ULONG WINAPI
IDirectMusicObjectImpl_AddRef (LPDIRECTMUSICOBJECT iface
)
508 ICOM_THIS(IDirectMusicObjectImpl
,iface
);
509 TRACE("(%p) : AddRef from %ld\n", This
, This
->ref
);
510 return ++(This
->ref
);
513 ULONG WINAPI
IDirectMusicObjectImpl_Release (LPDIRECTMUSICOBJECT iface
)
515 ICOM_THIS(IDirectMusicObjectImpl
,iface
);
516 ULONG ref
= --This
->ref
;
517 TRACE("(%p) : ReleaseRef to %ld\n", This
, This
->ref
);
520 HeapFree(GetProcessHeap(), 0, This
);
525 /* IDirectMusicObject Interface follow: */
526 HRESULT WINAPI
IDirectMusicObjectImpl_GetDescriptor (LPDIRECTMUSICOBJECT iface
, LPDMUS_OBJECTDESC pDesc
)
532 HRESULT WINAPI
IDirectMusicObjectImpl_SetDescriptor (LPDIRECTMUSICOBJECT iface
, LPDMUS_OBJECTDESC pDesc
)
538 HRESULT WINAPI
IDirectMusicObjectImpl_ParseDescriptor (LPDIRECTMUSICOBJECT iface
, LPSTREAM pStream
, LPDMUS_OBJECTDESC pDesc
)
544 ICOM_VTABLE(IDirectMusicObject
) DirectMusicObject_Vtbl
=
546 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
547 IDirectMusicObjectImpl_QueryInterface
,
548 IDirectMusicObjectImpl_AddRef
,
549 IDirectMusicObjectImpl_Release
,
550 IDirectMusicObjectImpl_GetDescriptor
,
551 IDirectMusicObjectImpl_SetDescriptor
,
552 IDirectMusicObjectImpl_ParseDescriptor