Some dmusic functions implementation.
[wine/hacks.git] / dlls / dmusic / dmusic.c
blob6cf1d59b44dc9f6307dcd41e8830767a3ceae627
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.
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "wingdi.h"
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);
42 *ppobj = This;
43 return DS_OK;
46 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
47 return E_NOINTERFACE;
50 ULONG WINAPI IDirectMusicImpl_AddRef (LPDIRECTMUSIC iface)
52 ICOM_THIS(IDirectMusicImpl,iface);
53 TRACE("(%p) : AddRef from %ld\n", This, This->ref);
54 return ++(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);
62 if (ref == 0)
64 HeapFree(GetProcessHeap(), 0, This);
66 return ref;
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};
75 if (dwIndex == 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);
88 return S_OK;
91 FIXME("partial-stub (only first port supported)\n");
92 return S_FALSE;
95 HRESULT WINAPI IDirectMusicImpl_CreateMusicBuffer (LPDIRECTMUSIC iface, LPDMUS_BUFFERDESC pBufferDesc, LPDIRECTMUSICBUFFER** ppBuffer, LPUNKNOWN pUnkOuter)
97 FIXME("stub\n");
98 return DS_OK;
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)
111 FIXME("stub\n");
112 return DS_OK;
115 HRESULT WINAPI IDirectMusicImpl_GetMasterClock (LPDIRECTMUSIC iface, LPGUID pguidClock, IReferenceClock** ppReferenceClock)
117 FIXME("stub\n");
118 return DS_OK;
121 HRESULT WINAPI IDirectMusicImpl_SetMasterClock (LPDIRECTMUSIC iface, REFGUID rguidClock)
123 FIXME("stub\n");
124 return DS_OK;
127 HRESULT WINAPI IDirectMusicImpl_Activate (LPDIRECTMUSIC iface, BOOL fEnable)
129 FIXME("stub\n");
130 return DS_OK;
133 HRESULT WINAPI IDirectMusicImpl_GetDefaultPort (LPDIRECTMUSIC iface, LPGUID pguidPort)
135 FIXME("stub\n");
136 return DS_OK;
139 HRESULT WINAPI IDirectMusicImpl_SetDirectSound (LPDIRECTMUSIC iface, LPDIRECTSOUND pDirectSound, HWND hWnd)
141 FIXME("stub\n");
142 return DS_OK;
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));
173 if (NULL == dmusic)
175 *ppDM = (LPDIRECTMUSIC)NULL;
176 return E_OUTOFMEMORY;
179 dmusic->lpVtbl = &DirectMusic_Vtbl;
180 dmusic->ref = 0;
181 *ppDM = (LPDIRECTMUSIC)dmusic;
182 return S_OK;
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);
198 *ppobj = This;
199 return DS_OK;
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);
217 if (ref == 0)
219 HeapFree(GetProcessHeap(), 0, This);
221 return ref;
224 /* IDirectMusic8 Interface follow: */
225 HRESULT WINAPI IDirectMusic8Impl_EnumPort (LPDIRECTMUSIC8 iface, DWORD dwIndex, LPDMUS_PORTCAPS pPortCaps)
227 FIXME("stub\n");
228 return DS_OK;
231 HRESULT WINAPI IDirectMusic8Impl_CreateMusicBuffer (LPDIRECTMUSIC8 iface, LPDMUS_BUFFERDESC pBufferDesc, LPDIRECTMUSICBUFFER** ppBuffer, LPUNKNOWN pUnkOuter)
233 FIXME("stub\n");
234 return DS_OK;
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);
241 return S_OK;
244 HRESULT WINAPI IDirectMusic8Impl_EnumMasterClock (LPDIRECTMUSIC8 iface, DWORD dwIndex, LPDMUS_CLOCKINFO lpClockInfo)
246 FIXME("stub\n");
247 return DS_OK;
250 HRESULT WINAPI IDirectMusic8Impl_GetMasterClock (LPDIRECTMUSIC8 iface, LPGUID pguidClock, IReferenceClock** ppReferenceClock)
252 FIXME("stub\n");
253 return DS_OK;
256 HRESULT WINAPI IDirectMusic8Impl_SetMasterClock (LPDIRECTMUSIC8 iface, REFGUID rguidClock)
258 FIXME("stub\n");
259 return DS_OK;
262 HRESULT WINAPI IDirectMusic8Impl_Activate (LPDIRECTMUSIC8 iface, BOOL fEnable)
264 FIXME("stub\n");
265 return DS_OK;
268 HRESULT WINAPI IDirectMusic8Impl_GetDefaultPort (LPDIRECTMUSIC8 iface, LPGUID pguidPort)
270 FIXME("stub\n");
271 return DS_OK;
274 HRESULT WINAPI IDirectMusic8Impl_SetDirectSound (LPDIRECTMUSIC8 iface, LPDIRECTSOUND pDirectSound, HWND hWnd)
276 FIXME("stub\n");
277 return DS_OK;
280 HRESULT WINAPI IDirectMusic8Impl_SetExternalMasterClock (LPDIRECTMUSIC8 iface, IReferenceClock* pClock)
282 FIXME("stub\n");
283 return DS_OK;
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);
313 *ppobj = This;
314 return DS_OK;
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);
332 if (ref == 0)
334 HeapFree(GetProcessHeap(), 0, This);
336 return ref;
339 /* IDirectMusicDownload Interface follow: */
340 HRESULT WINAPI IDirectMusicDownloadImpl_GetBuffer (LPDIRECTMUSICDOWNLOAD iface, void** ppvBuffer, DWORD* pdwSize)
342 FIXME("stub\n");
343 return DS_OK;
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);
364 *ppobj = This;
365 return DS_OK;
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);
383 if (ref == 0)
385 HeapFree(GetProcessHeap(), 0, This);
387 return ref;
390 /* IDirectMusicBuffer Interface follow: */
391 HRESULT WINAPI IDirectMusicBufferImpl_Flush (LPDIRECTMUSICBUFFER iface)
393 FIXME("stub\n");
394 return DS_OK;
397 HRESULT WINAPI IDirectMusicBufferImpl_TotalTime (LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prtTime)
399 FIXME("stub\n");
400 return DS_OK;
403 HRESULT WINAPI IDirectMusicBufferImpl_PackStructured (LPDIRECTMUSICBUFFER iface, REFERENCE_TIME rt, DWORD dwChannelGroup, DWORD dwChannelMessage)
405 FIXME("stub\n");
406 return DS_OK;
409 HRESULT WINAPI IDirectMusicBufferImpl_PackUnstructured (LPDIRECTMUSICBUFFER iface, REFERENCE_TIME rt, DWORD dwChannelGroup, DWORD cb, LPBYTE lpb)
411 FIXME("stub\n");
412 return DS_OK;
415 HRESULT WINAPI IDirectMusicBufferImpl_ResetReadPtr (LPDIRECTMUSICBUFFER iface)
417 FIXME("stub\n");
418 return DS_OK;
421 HRESULT WINAPI IDirectMusicBufferImpl_GetNextEvent (LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prt, LPDWORD pdwChannelGroup, LPDWORD pdwLength, LPBYTE* ppData)
423 FIXME("stub\n");
424 return DS_OK;
427 HRESULT WINAPI IDirectMusicBufferImpl_GetRawBufferPtr (LPDIRECTMUSICBUFFER iface, LPBYTE* ppData)
429 FIXME("stub\n");
430 return DS_OK;
433 HRESULT WINAPI IDirectMusicBufferImpl_GetStartTime (LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prt)
435 FIXME("stub\n");
436 return DS_OK;
439 HRESULT WINAPI IDirectMusicBufferImpl_GetUsedBytes (LPDIRECTMUSICBUFFER iface, LPDWORD pcb)
441 FIXME("stub\n");
442 return DS_OK;
445 HRESULT WINAPI IDirectMusicBufferImpl_GetMaxBytes (LPDIRECTMUSICBUFFER iface, LPDWORD pcb)
447 FIXME("stub\n");
448 return DS_OK;
451 HRESULT WINAPI IDirectMusicBufferImpl_GetBufferFormat (LPDIRECTMUSICBUFFER iface, LPGUID pGuidFormat)
453 FIXME("stub\n");
454 return DS_OK;
457 HRESULT WINAPI IDirectMusicBufferImpl_SetStartTime (LPDIRECTMUSICBUFFER iface, REFERENCE_TIME rt)
459 FIXME("stub\n");
460 return DS_OK;
463 HRESULT WINAPI IDirectMusicBufferImpl_SetUsedBytes (LPDIRECTMUSICBUFFER iface, DWORD cb)
465 FIXME("stub\n");
466 return DS_OK;
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);
499 *ppobj = This;
500 return DS_OK;
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);
518 if (ref == 0)
520 HeapFree(GetProcessHeap(), 0, This);
522 return ref;
525 /* IDirectMusicObject Interface follow: */
526 HRESULT WINAPI IDirectMusicObjectImpl_GetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc)
528 FIXME("stub\n");
529 return DS_OK;
532 HRESULT WINAPI IDirectMusicObjectImpl_SetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc)
534 FIXME("stub\n");
535 return DS_OK;
538 HRESULT WINAPI IDirectMusicObjectImpl_ParseDescriptor (LPDIRECTMUSICOBJECT iface, LPSTREAM pStream, LPDMUS_OBJECTDESC pDesc)
540 FIXME("stub\n");
541 return DS_OK;
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