- fix DirectSound Creation by dmusic (fix recent Unreal2 regression)
[wine] / dlls / dmime / dmime_main.c
1 /* DirectMusicInteractiveEngine Main
2  *
3  * Copyright (C) 2003-2004 Rok Mandeljc
4  *
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.
9  *
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.
14  *
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.
18  */
19
20 #include "dmime_private.h"
21
22 WINE_DEFAULT_DEBUG_CHANNEL(dmime);
23
24 typedef struct {
25     /* IUnknown fields */
26     ICOM_VFIELD(IClassFactory);
27     DWORD                       ref;
28 } IClassFactoryImpl;
29
30 /******************************************************************
31  *              DirectMusicPerformance ClassFactory
32  */
33 static HRESULT WINAPI PerformanceCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
34         ICOM_THIS(IClassFactoryImpl,iface);
35         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
36         return E_NOINTERFACE;
37 }
38
39 static ULONG WINAPI PerformanceCF_AddRef(LPCLASSFACTORY iface) {
40         ICOM_THIS(IClassFactoryImpl,iface);
41         return ++(This->ref);
42 }
43
44 static ULONG WINAPI PerformanceCF_Release(LPCLASSFACTORY iface) {
45         ICOM_THIS(IClassFactoryImpl,iface);
46         /* static class, won't be  freed */
47         return --(This->ref);
48 }
49
50 static HRESULT WINAPI PerformanceCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
51         ICOM_THIS(IClassFactoryImpl,iface);
52         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
53         return DMUSIC_CreateDirectMusicPerformanceImpl (riid, ppobj, pOuter);
54 }
55
56 static HRESULT WINAPI PerformanceCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
57         ICOM_THIS(IClassFactoryImpl,iface);
58         FIXME("(%p, %d): stub\n", This, dolock);
59         return S_OK;
60 }
61
62 static ICOM_VTABLE(IClassFactory) PerformanceCF_Vtbl = {
63         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
64         PerformanceCF_QueryInterface,
65         PerformanceCF_AddRef,
66         PerformanceCF_Release,
67         PerformanceCF_CreateInstance,
68         PerformanceCF_LockServer
69 };
70
71 static IClassFactoryImpl Performance_CF = {&PerformanceCF_Vtbl, 1 };
72
73 /******************************************************************
74  *              DirectMusicSegment ClassFactory
75  */
76 static HRESULT WINAPI SegmentCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
77         ICOM_THIS(IClassFactoryImpl,iface);
78         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
79         return E_NOINTERFACE;
80 }
81
82 static ULONG WINAPI SegmentCF_AddRef(LPCLASSFACTORY iface) {
83         ICOM_THIS(IClassFactoryImpl,iface);
84         return ++(This->ref);
85 }
86
87 static ULONG WINAPI SegmentCF_Release(LPCLASSFACTORY iface) {
88         ICOM_THIS(IClassFactoryImpl,iface);
89         /* static class, won't be  freed */
90         return --(This->ref);
91 }
92
93 static HRESULT WINAPI SegmentCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
94         ICOM_THIS(IClassFactoryImpl,iface);
95         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
96         return DMUSIC_CreateDirectMusicSegmentImpl (riid, ppobj, pOuter);
97 }
98
99 static HRESULT WINAPI SegmentCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
100         ICOM_THIS(IClassFactoryImpl,iface);
101         FIXME("(%p, %d): stub\n", This, dolock);
102         return S_OK;
103 }
104
105 static ICOM_VTABLE(IClassFactory) SegmentCF_Vtbl = {
106         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
107         SegmentCF_QueryInterface,
108         SegmentCF_AddRef,
109         SegmentCF_Release,
110         SegmentCF_CreateInstance,
111         SegmentCF_LockServer
112 };
113
114 static IClassFactoryImpl Segment_CF = {&SegmentCF_Vtbl, 1 };
115
116 /******************************************************************
117  *              DirectMusicSegmentState ClassFactory
118  */
119 static HRESULT WINAPI SegmentStateCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
120         ICOM_THIS(IClassFactoryImpl,iface);
121         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
122         return E_NOINTERFACE;
123 }
124
125 static ULONG WINAPI SegmentStateCF_AddRef(LPCLASSFACTORY iface) {
126         ICOM_THIS(IClassFactoryImpl,iface);
127         return ++(This->ref);
128 }
129
130 static ULONG WINAPI SegmentStateCF_Release(LPCLASSFACTORY iface) {
131         ICOM_THIS(IClassFactoryImpl,iface);
132         /* static class, won't be  freed */
133         return --(This->ref);
134 }
135
136 static HRESULT WINAPI SegmentStateCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
137         ICOM_THIS(IClassFactoryImpl,iface);
138         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
139         return DMUSIC_CreateDirectMusicSegmentStateImpl (riid, ppobj, pOuter);
140 }
141
142 static HRESULT WINAPI SegmentStateCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
143         ICOM_THIS(IClassFactoryImpl,iface);
144         FIXME("(%p, %d): stub\n", This, dolock);
145         return S_OK;
146 }
147
148 static ICOM_VTABLE(IClassFactory) SegmentStateCF_Vtbl = {
149         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
150         SegmentStateCF_QueryInterface,
151         SegmentStateCF_AddRef,
152         SegmentStateCF_Release,
153         SegmentStateCF_CreateInstance,
154         SegmentStateCF_LockServer
155 };
156
157 static IClassFactoryImpl SegmentState_CF = {&SegmentStateCF_Vtbl, 1 };
158
159 /******************************************************************
160  *              DirectMusicGraph ClassFactory
161  */
162 static HRESULT WINAPI GraphCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
163         ICOM_THIS(IClassFactoryImpl,iface);
164         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
165         return E_NOINTERFACE;
166 }
167
168 static ULONG WINAPI GraphCF_AddRef(LPCLASSFACTORY iface) {
169         ICOM_THIS(IClassFactoryImpl,iface);
170         return ++(This->ref);
171 }
172
173 static ULONG WINAPI GraphCF_Release(LPCLASSFACTORY iface) {
174         ICOM_THIS(IClassFactoryImpl,iface);
175         /* static class, won't be  freed */
176         return --(This->ref);
177 }
178
179 static HRESULT WINAPI GraphCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
180         ICOM_THIS(IClassFactoryImpl,iface);
181         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
182         return DMUSIC_CreateDirectMusicGraphImpl (riid, ppobj, pOuter);
183 }
184
185 static HRESULT WINAPI GraphCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
186         ICOM_THIS(IClassFactoryImpl,iface);
187         FIXME("(%p, %d): stub\n", This, dolock);
188         return S_OK;
189 }
190
191 static ICOM_VTABLE(IClassFactory) GraphCF_Vtbl = {
192         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
193         GraphCF_QueryInterface,
194         GraphCF_AddRef,
195         GraphCF_Release,
196         GraphCF_CreateInstance,
197         GraphCF_LockServer
198 };
199
200 static IClassFactoryImpl Graph_CF = {&GraphCF_Vtbl, 1 };
201
202 /******************************************************************
203  *              DirectMusicTempoTrack ClassFactory
204  */
205 static HRESULT WINAPI TempoTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
206         ICOM_THIS(IClassFactoryImpl,iface);
207         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
208         return E_NOINTERFACE;
209 }
210
211 static ULONG WINAPI TempoTrackCF_AddRef(LPCLASSFACTORY iface) {
212         ICOM_THIS(IClassFactoryImpl,iface);
213         return ++(This->ref);
214 }
215
216 static ULONG WINAPI TempoTrackCF_Release(LPCLASSFACTORY iface) {
217         ICOM_THIS(IClassFactoryImpl,iface);
218         /* static class, won't be  freed */
219         return --(This->ref);
220 }
221
222 static HRESULT WINAPI TempoTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
223         ICOM_THIS(IClassFactoryImpl,iface);
224         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
225         return DMUSIC_CreateDirectMusicTempoTrack (riid, ppobj, pOuter);
226 }
227
228 static HRESULT WINAPI TempoTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
229         ICOM_THIS(IClassFactoryImpl,iface);
230         FIXME("(%p, %d): stub\n", This, dolock);
231         return S_OK;
232 }
233
234 static ICOM_VTABLE(IClassFactory) TempoTrackCF_Vtbl = {
235         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
236         TempoTrackCF_QueryInterface,
237         TempoTrackCF_AddRef,
238         TempoTrackCF_Release,
239         TempoTrackCF_CreateInstance,
240         TempoTrackCF_LockServer
241 };
242
243 static IClassFactoryImpl TempoTrack_CF = {&TempoTrackCF_Vtbl, 1 };
244
245 /******************************************************************
246  *              DirectMusicSeqTrack ClassFactory
247  */
248 static HRESULT WINAPI SeqTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
249         ICOM_THIS(IClassFactoryImpl,iface);
250         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
251         return E_NOINTERFACE;
252 }
253
254 static ULONG WINAPI SeqTrackCF_AddRef(LPCLASSFACTORY iface) {
255         ICOM_THIS(IClassFactoryImpl,iface);
256         return ++(This->ref);
257 }
258
259 static ULONG WINAPI SeqTrackCF_Release(LPCLASSFACTORY iface) {
260         ICOM_THIS(IClassFactoryImpl,iface);
261         /* static class, won't be  freed */
262         return --(This->ref);
263 }
264
265 static HRESULT WINAPI SeqTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
266         ICOM_THIS(IClassFactoryImpl,iface);
267         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
268         return DMUSIC_CreateDirectMusicSeqTrack (riid, ppobj, pOuter);
269 }
270
271 static HRESULT WINAPI SeqTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
272         ICOM_THIS(IClassFactoryImpl,iface);
273         FIXME("(%p, %d): stub\n", This, dolock);
274         return S_OK;
275 }
276
277 static ICOM_VTABLE(IClassFactory) SeqTrackCF_Vtbl = {
278         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
279         SeqTrackCF_QueryInterface,
280         SeqTrackCF_AddRef,
281         SeqTrackCF_Release,
282         SeqTrackCF_CreateInstance,
283         SeqTrackCF_LockServer
284 };
285
286 static IClassFactoryImpl SeqTrack_CF = {&SeqTrackCF_Vtbl, 1 };
287
288 /******************************************************************
289  *              DirectMusicSysExTrack ClassFactory
290  */
291 static HRESULT WINAPI SysExTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
292         ICOM_THIS(IClassFactoryImpl,iface);
293         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
294         return E_NOINTERFACE;
295 }
296
297 static ULONG WINAPI SysExTrackCF_AddRef(LPCLASSFACTORY iface) {
298         ICOM_THIS(IClassFactoryImpl,iface);
299         return ++(This->ref);
300 }
301
302 static ULONG WINAPI SysExTrackCF_Release(LPCLASSFACTORY iface) {
303         ICOM_THIS(IClassFactoryImpl,iface);
304         /* static class, won't be  freed */
305         return --(This->ref);
306 }
307
308 static HRESULT WINAPI SysExTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
309         ICOM_THIS(IClassFactoryImpl,iface);
310         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
311         return DMUSIC_CreateDirectMusicSysExTrack (riid, ppobj, pOuter);
312 }
313
314 static HRESULT WINAPI SysExTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
315         ICOM_THIS(IClassFactoryImpl,iface);
316         FIXME("(%p, %d): stub\n", This, dolock);
317         return S_OK;
318 }
319
320 static ICOM_VTABLE(IClassFactory) SysExTrackCF_Vtbl = {
321         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
322         SysExTrackCF_QueryInterface,
323         SysExTrackCF_AddRef,
324         SysExTrackCF_Release,
325         SysExTrackCF_CreateInstance,
326         SysExTrackCF_LockServer
327 };
328
329 static IClassFactoryImpl SysExTrack_CF = {&SysExTrackCF_Vtbl, 1 };
330
331 /******************************************************************
332  *              DirectMusicTimeSigTrack ClassFactory
333  */
334 static HRESULT WINAPI TimeSigTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
335         ICOM_THIS(IClassFactoryImpl,iface);
336         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
337         return E_NOINTERFACE;
338 }
339
340 static ULONG WINAPI TimeSigTrackCF_AddRef(LPCLASSFACTORY iface) {
341         ICOM_THIS(IClassFactoryImpl,iface);
342         return ++(This->ref);
343 }
344
345 static ULONG WINAPI TimeSigTrackCF_Release(LPCLASSFACTORY iface) {
346         ICOM_THIS(IClassFactoryImpl,iface);
347         /* static class, won't be  freed */
348         return --(This->ref);
349 }
350
351 static HRESULT WINAPI TimeSigTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
352         ICOM_THIS(IClassFactoryImpl,iface);
353         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
354         return DMUSIC_CreateDirectMusicTimeSigTrack (riid, ppobj, pOuter);
355 }
356
357 static HRESULT WINAPI TimeSigTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
358         ICOM_THIS(IClassFactoryImpl,iface);
359         FIXME("(%p, %d): stub\n", This, dolock);
360         return S_OK;
361 }
362
363 static ICOM_VTABLE(IClassFactory) TimeSigTrackCF_Vtbl = {
364         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
365         TimeSigTrackCF_QueryInterface,
366         TimeSigTrackCF_AddRef,
367         TimeSigTrackCF_Release,
368         TimeSigTrackCF_CreateInstance,
369         TimeSigTrackCF_LockServer
370 };
371
372 static IClassFactoryImpl TimeSigTrack_CF = {&TimeSigTrackCF_Vtbl, 1 };
373
374 /******************************************************************
375  *              DirectMusicParamControlTrack ClassFactory
376  */
377 static HRESULT WINAPI ParamControlTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
378         ICOM_THIS(IClassFactoryImpl,iface);
379         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
380         return E_NOINTERFACE;
381 }
382
383 static ULONG WINAPI ParamControlTrackCF_AddRef(LPCLASSFACTORY iface) {
384         ICOM_THIS(IClassFactoryImpl,iface);
385         return ++(This->ref);
386 }
387
388 static ULONG WINAPI ParamControlTrackCF_Release(LPCLASSFACTORY iface) {
389         ICOM_THIS(IClassFactoryImpl,iface);
390         /* static class, won't be  freed */
391         return --(This->ref);
392 }
393
394 static HRESULT WINAPI ParamControlTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
395         ICOM_THIS(IClassFactoryImpl,iface);
396         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
397         return DMUSIC_CreateDirectMusicParamControlTrack (riid, ppobj, pOuter);
398 }
399
400 static HRESULT WINAPI ParamControlTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
401         ICOM_THIS(IClassFactoryImpl,iface);
402         FIXME("(%p, %d): stub\n", This, dolock);
403         return S_OK;
404 }
405
406 static ICOM_VTABLE(IClassFactory) ParamControlTrackCF_Vtbl = {
407         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
408         ParamControlTrackCF_QueryInterface,
409         ParamControlTrackCF_AddRef,
410         ParamControlTrackCF_Release,
411         ParamControlTrackCF_CreateInstance,
412         ParamControlTrackCF_LockServer
413 };
414
415 static IClassFactoryImpl ParamControlTrack_CF = {&ParamControlTrackCF_Vtbl, 1 };
416
417 /******************************************************************
418  *              DirectMusicMarkerTrack ClassFactory
419  */
420 static HRESULT WINAPI MarkerTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
421         ICOM_THIS(IClassFactoryImpl,iface);
422         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
423         return E_NOINTERFACE;
424 }
425
426 static ULONG WINAPI MarkerTrackCF_AddRef(LPCLASSFACTORY iface) {
427         ICOM_THIS(IClassFactoryImpl,iface);
428         return ++(This->ref);
429 }
430
431 static ULONG WINAPI MarkerTrackCF_Release(LPCLASSFACTORY iface) {
432         ICOM_THIS(IClassFactoryImpl,iface);
433         /* static class, won't be  freed */
434         return --(This->ref);
435 }
436
437 static HRESULT WINAPI MarkerTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
438         ICOM_THIS(IClassFactoryImpl,iface);
439         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
440         return DMUSIC_CreateDirectMusicMarkerTrack (riid, ppobj, pOuter);
441 }
442
443 static HRESULT WINAPI MarkerTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
444         ICOM_THIS(IClassFactoryImpl,iface);
445         FIXME("(%p, %d): stub\n", This, dolock);
446         return S_OK;
447 }
448
449 static ICOM_VTABLE(IClassFactory) MarkerTrackCF_Vtbl = {
450         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
451         MarkerTrackCF_QueryInterface,
452         MarkerTrackCF_AddRef,
453         MarkerTrackCF_Release,
454         MarkerTrackCF_CreateInstance,
455         MarkerTrackCF_LockServer
456 };
457
458 static IClassFactoryImpl MarkerTrack_CF = {&MarkerTrackCF_Vtbl, 1 };
459
460 /******************************************************************
461  *              DirectMusicLyricsTrack ClassFactory
462  */
463 static HRESULT WINAPI LyricsTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
464         ICOM_THIS(IClassFactoryImpl,iface);
465         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
466         return E_NOINTERFACE;
467 }
468
469 static ULONG WINAPI LyricsTrackCF_AddRef(LPCLASSFACTORY iface) {
470         ICOM_THIS(IClassFactoryImpl,iface);
471         return ++(This->ref);
472 }
473
474 static ULONG WINAPI LyricsTrackCF_Release(LPCLASSFACTORY iface) {
475         ICOM_THIS(IClassFactoryImpl,iface);
476         /* static class, won't be  freed */
477         return --(This->ref);
478 }
479
480 static HRESULT WINAPI LyricsTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
481         ICOM_THIS(IClassFactoryImpl,iface);
482         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
483         return DMUSIC_CreateDirectMusicLyricsTrack (riid, ppobj, pOuter);
484 }
485
486 static HRESULT WINAPI LyricsTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
487         ICOM_THIS(IClassFactoryImpl,iface);
488         FIXME("(%p, %d): stub\n", This, dolock);
489         return S_OK;
490 }
491
492 static ICOM_VTABLE(IClassFactory) LyricsTrackCF_Vtbl = {
493         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
494         LyricsTrackCF_QueryInterface,
495         LyricsTrackCF_AddRef,
496         LyricsTrackCF_Release,
497         LyricsTrackCF_CreateInstance,
498         LyricsTrackCF_LockServer
499 };
500
501 static IClassFactoryImpl LyricsTrack_CF = {&LyricsTrackCF_Vtbl, 1 };
502
503
504 /******************************************************************
505  *              DirectMusicSegTriggerTrack ClassFactory
506  */
507 static HRESULT WINAPI SegTriggerTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
508         ICOM_THIS(IClassFactoryImpl,iface);
509         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
510         return E_NOINTERFACE;
511 }
512
513 static ULONG WINAPI SegTriggerTrackCF_AddRef(LPCLASSFACTORY iface) {
514         ICOM_THIS(IClassFactoryImpl,iface);
515         return ++(This->ref);
516 }
517
518 static ULONG WINAPI SegTriggerTrackCF_Release(LPCLASSFACTORY iface) {
519         ICOM_THIS(IClassFactoryImpl,iface);
520         /* static class, won't be  freed */
521         return --(This->ref);
522 }
523
524 static HRESULT WINAPI SegTriggerTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
525         ICOM_THIS(IClassFactoryImpl,iface);
526         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
527         return DMUSIC_CreateDirectMusicSegTriggerTrack (riid, ppobj, pOuter);
528 }
529
530 static HRESULT WINAPI SegTriggerTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
531         ICOM_THIS(IClassFactoryImpl,iface);
532         FIXME("(%p, %d): stub\n", This, dolock);
533         return S_OK;
534 }
535
536 static ICOM_VTABLE(IClassFactory) SegTriggerTrackCF_Vtbl = {
537         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
538         SegTriggerTrackCF_QueryInterface,
539         SegTriggerTrackCF_AddRef,
540         SegTriggerTrackCF_Release,
541         SegTriggerTrackCF_CreateInstance,
542         SegTriggerTrackCF_LockServer
543 };
544
545 static IClassFactoryImpl SegTriggerTrack_CF = {&SegTriggerTrackCF_Vtbl, 1 };
546
547 /******************************************************************
548  *              DirectMusicAudioPath ClassFactory
549  */
550 static HRESULT WINAPI AudioPathCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
551         ICOM_THIS(IClassFactoryImpl,iface);
552         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
553         return E_NOINTERFACE;
554 }
555
556 static ULONG WINAPI AudioPathCF_AddRef(LPCLASSFACTORY iface) {
557         ICOM_THIS(IClassFactoryImpl,iface);
558         return ++(This->ref);
559 }
560
561 static ULONG WINAPI AudioPathCF_Release(LPCLASSFACTORY iface) {
562         ICOM_THIS(IClassFactoryImpl,iface);
563         /* static class, won't be  freed */
564         return --(This->ref);
565 }
566
567 static HRESULT WINAPI AudioPathCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
568         ICOM_THIS(IClassFactoryImpl,iface);
569         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
570         return DMUSIC_CreateDirectMusicAudioPathImpl (riid, ppobj, pOuter);
571 }
572
573 static HRESULT WINAPI AudioPathCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
574         ICOM_THIS(IClassFactoryImpl,iface);
575         FIXME("(%p, %d): stub\n", This, dolock);
576         return S_OK;
577 }
578
579 static ICOM_VTABLE(IClassFactory) AudioPathCF_Vtbl = {
580         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
581         AudioPathCF_QueryInterface,
582         AudioPathCF_AddRef,
583         AudioPathCF_Release,
584         AudioPathCF_CreateInstance,
585         AudioPathCF_LockServer
586 };
587
588 static IClassFactoryImpl AudioPath_CF = {&AudioPathCF_Vtbl, 1 };
589
590 /******************************************************************
591  *              DirectMusicWaveTrack ClassFactory
592  */
593 static HRESULT WINAPI WaveTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
594         ICOM_THIS(IClassFactoryImpl,iface);
595         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
596         return E_NOINTERFACE;
597 }
598
599 static ULONG WINAPI WaveTrackCF_AddRef(LPCLASSFACTORY iface) {
600         ICOM_THIS(IClassFactoryImpl,iface);
601         return ++(This->ref);
602 }
603
604 static ULONG WINAPI WaveTrackCF_Release(LPCLASSFACTORY iface) {
605         ICOM_THIS(IClassFactoryImpl,iface);
606         /* static class, won't be  freed */
607         return --(This->ref);
608 }
609
610 static HRESULT WINAPI WaveTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
611         ICOM_THIS(IClassFactoryImpl,iface);
612         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
613         return DMUSIC_CreateDirectMusicWaveTrack (riid, ppobj, pOuter);
614 }
615
616 static HRESULT WINAPI WaveTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
617         ICOM_THIS(IClassFactoryImpl,iface);
618         FIXME("(%p, %d): stub\n", This, dolock);
619         return S_OK;
620 }
621
622 static ICOM_VTABLE(IClassFactory) WaveTrackCF_Vtbl = {
623         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
624         WaveTrackCF_QueryInterface,
625         WaveTrackCF_AddRef,
626         WaveTrackCF_Release,
627         WaveTrackCF_CreateInstance,
628         WaveTrackCF_LockServer
629 };
630
631 static IClassFactoryImpl WaveTrack_CF = {&WaveTrackCF_Vtbl, 1 };
632
633 /******************************************************************
634  *              DllMain
635  *
636  *
637  */
638 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
639         if (fdwReason == DLL_PROCESS_ATTACH) {
640                 DisableThreadLibraryCalls(hinstDLL);
641                 /* FIXME: Initialisation */
642         }
643         else if (fdwReason == DLL_PROCESS_DETACH) {
644                 /* FIXME: Cleanup */
645         }
646
647         return TRUE;
648 }
649
650
651 /******************************************************************
652  *              DllCanUnloadNow (DMIME.1)
653  *
654  *
655  */
656 HRESULT WINAPI DMIME_DllCanUnloadNow(void) {
657     FIXME("(void): stub\n");
658     return S_FALSE;
659 }
660
661
662 /******************************************************************
663  *              DllGetClassObject (DMIME.2)
664  *
665  *
666  */
667 HRESULT WINAPI DMIME_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
668 {
669     TRACE("(%s, %s, %p)\n", debugstr_dmguid(rclsid), debugstr_dmguid(riid), ppv);
670     if (IsEqualCLSID (rclsid, &CLSID_DirectMusicPerformance) && IsEqualIID (riid, &IID_IClassFactory)) {
671                 *ppv = (LPVOID) &Performance_CF;
672                 IClassFactory_AddRef((IClassFactory*)*ppv);
673                 return S_OK;
674         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegment) && IsEqualIID (riid, &IID_IClassFactory)) {
675                 *ppv = (LPVOID) &Segment_CF;
676                 IClassFactory_AddRef((IClassFactory*)*ppv);
677                 return S_OK;
678         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegmentState) && IsEqualIID (riid, &IID_IClassFactory)) {
679                 *ppv = (LPVOID) &SegmentState_CF;
680                 IClassFactory_AddRef((IClassFactory*)*ppv);
681                 return S_OK;
682         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicGraph) && IsEqualIID (riid, &IID_IClassFactory)) {
683                 *ppv = (LPVOID) &Graph_CF;
684                 IClassFactory_AddRef((IClassFactory*)*ppv);
685                 return S_OK;
686         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicTempoTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
687                 *ppv = (LPVOID) &TempoTrack_CF;
688                 IClassFactory_AddRef((IClassFactory*)*ppv);
689                 return S_OK;
690         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSeqTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
691                 *ppv = (LPVOID) &SeqTrack_CF;
692                 IClassFactory_AddRef((IClassFactory*)*ppv);
693                 return S_OK;
694         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSysExTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
695                 *ppv = (LPVOID) &SysExTrack_CF;
696                 IClassFactory_AddRef((IClassFactory*)*ppv);
697                 return S_OK;
698         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicTimeSigTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
699                 *ppv = (LPVOID) &TimeSigTrack_CF;
700                 IClassFactory_AddRef((IClassFactory*)*ppv);
701                 return S_OK;
702         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicParamControlTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
703                 *ppv = (LPVOID) &ParamControlTrack_CF;
704                 IClassFactory_AddRef((IClassFactory*)*ppv);
705                 return S_OK;
706         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicMarkerTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
707                 *ppv = (LPVOID) &MarkerTrack_CF;
708                 IClassFactory_AddRef((IClassFactory*)*ppv);
709                 return S_OK;
710         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicLyricsTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
711                 *ppv = (LPVOID) &LyricsTrack_CF;
712                 IClassFactory_AddRef((IClassFactory*)*ppv);
713                 return S_OK;
714         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegTriggerTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
715                 *ppv = (LPVOID) &SegTriggerTrack_CF;
716                 IClassFactory_AddRef((IClassFactory*)*ppv);
717                 return S_OK;
718         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicAudioPath) && IsEqualIID (riid, &IID_IClassFactory)) {
719                 *ppv = (LPVOID) &AudioPath_CF;
720                 IClassFactory_AddRef((IClassFactory*)*ppv);
721                 return S_OK;
722         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicWaveTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
723                 *ppv = (LPVOID) &WaveTrack_CF;
724                 IClassFactory_AddRef((IClassFactory*)*ppv);
725                 return S_OK;
726         } 
727         
728     WARN("(%s, %s, %p): no interface found.\n", debugstr_dmguid(rclsid), debugstr_dmguid(riid), ppv);
729     return CLASS_E_CLASSNOTAVAILABLE;
730 }
731
732
733 /******************************************************************
734  *              Helper functions
735  *
736  *
737  */
738 /* check whether the given DWORD is even (return 0) or odd (return 1) */
739 int even_or_odd (DWORD number) {
740         return (number & 0x1); /* basically, check if bit 0 is set ;) */
741 }
742
743 /* FOURCC to string conversion for debug messages */
744 const char *debugstr_fourcc (DWORD fourcc) {
745     if (!fourcc) return "'null'";
746     return wine_dbg_sprintf ("\'%c%c%c%c\'",
747                 (char)(fourcc), (char)(fourcc >> 8),
748         (char)(fourcc >> 16), (char)(fourcc >> 24));
749 }
750
751 /* DMUS_VERSION struct to string conversion for debug messages */
752 const char *debugstr_dmversion (LPDMUS_VERSION version) {
753         if (!version) return "'null'";
754         return wine_dbg_sprintf ("\'%i,%i,%i,%i\'",
755                 (int)((version->dwVersionMS && 0xFFFF0000) >> 8), (int)(version->dwVersionMS && 0x0000FFFF), 
756                 (int)((version->dwVersionLS && 0xFFFF0000) >> 8), (int)(version->dwVersionLS && 0x0000FFFF));
757 }
758
759 /* returns name of given GUID */
760 const char *debugstr_dmguid (const GUID *id) {
761         static const guid_info guids[] = {
762                 /* CLSIDs */
763                 GE(CLSID_AudioVBScript),
764                 GE(CLSID_DirectMusic),
765                 GE(CLSID_DirectMusicAudioPath),
766                 GE(CLSID_DirectMusicAudioPathConfig),
767                 GE(CLSID_DirectMusicAuditionTrack),
768                 GE(CLSID_DirectMusicBand),
769                 GE(CLSID_DirectMusicBandTrack),
770                 GE(CLSID_DirectMusicChordMapTrack),
771                 GE(CLSID_DirectMusicChordMap),
772                 GE(CLSID_DirectMusicChordTrack),
773                 GE(CLSID_DirectMusicCollection),
774                 GE(CLSID_DirectMusicCommandTrack),
775                 GE(CLSID_DirectMusicComposer),
776                 GE(CLSID_DirectMusicContainer),
777                 GE(CLSID_DirectMusicGraph),
778                 GE(CLSID_DirectMusicLoader),
779                 GE(CLSID_DirectMusicLyricsTrack),
780                 GE(CLSID_DirectMusicMarkerTrack),
781                 GE(CLSID_DirectMusicMelodyFormulationTrack),
782                 GE(CLSID_DirectMusicMotifTrack),
783                 GE(CLSID_DirectMusicMuteTrack),
784                 GE(CLSID_DirectMusicParamControlTrack),
785                 GE(CLSID_DirectMusicPatternTrack),
786                 GE(CLSID_DirectMusicPerformance),
787                 GE(CLSID_DirectMusicScript),
788                 GE(CLSID_DirectMusicScriptAutoImpSegment),
789                 GE(CLSID_DirectMusicScriptAutoImpPerformance),
790                 GE(CLSID_DirectMusicScriptAutoImpSegmentState),
791                 GE(CLSID_DirectMusicScriptAutoImpAudioPathConfig),
792                 GE(CLSID_DirectMusicScriptAutoImpAudioPath),
793                 GE(CLSID_DirectMusicScriptAutoImpSong),
794                 GE(CLSID_DirectMusicScriptSourceCodeLoader),
795                 GE(CLSID_DirectMusicScriptTrack),
796                 GE(CLSID_DirectMusicSection),
797                 GE(CLSID_DirectMusicSegment),
798                 GE(CLSID_DirectMusicSegmentState),
799                 GE(CLSID_DirectMusicSegmentTriggerTrack),
800                 GE(CLSID_DirectMusicSegTriggerTrack),
801                 GE(CLSID_DirectMusicSeqTrack),
802                 GE(CLSID_DirectMusicSignPostTrack),
803                 GE(CLSID_DirectMusicSong),
804                 GE(CLSID_DirectMusicStyle),
805                 GE(CLSID_DirectMusicStyleTrack),
806                 GE(CLSID_DirectMusicSynth),
807                 GE(CLSID_DirectMusicSynthSink),
808                 GE(CLSID_DirectMusicSysExTrack),
809                 GE(CLSID_DirectMusicTemplate),
810                 GE(CLSID_DirectMusicTempoTrack),
811                 GE(CLSID_DirectMusicTimeSigTrack),
812                 GE(CLSID_DirectMusicWaveTrack),
813                 GE(CLSID_DirectSoundWave),
814                 /* IIDs */
815                 GE(IID_IDirectMusic),
816                 GE(IID_IDirectMusic2),
817                 GE(IID_IDirectMusic8),
818                 GE(IID_IDirectMusicAudioPath),
819                 GE(IID_IDirectMusicBand),
820                 GE(IID_IDirectMusicBuffer),
821                 GE(IID_IDirectMusicChordMap),
822                 GE(IID_IDirectMusicCollection),
823                 GE(IID_IDirectMusicComposer),
824                 GE(IID_IDirectMusicContainer),
825                 GE(IID_IDirectMusicDownload),
826                 GE(IID_IDirectMusicDownloadedInstrument),
827                 GE(IID_IDirectMusicGetLoader),
828                 GE(IID_IDirectMusicGraph),
829                 GE(IID_IDirectMusicInstrument),
830                 GE(IID_IDirectMusicLoader),
831                 GE(IID_IDirectMusicLoader8),
832                 GE(IID_IDirectMusicObject),
833                 GE(IID_IDirectMusicPatternTrack),
834                 GE(IID_IDirectMusicPerformance),
835                 GE(IID_IDirectMusicPerformance2),
836                 GE(IID_IDirectMusicPerformance8),
837                 GE(IID_IDirectMusicPort),
838                 GE(IID_IDirectMusicPortDownload),
839                 GE(IID_IDirectMusicScript),
840                 GE(IID_IDirectMusicSegment),
841                 GE(IID_IDirectMusicSegment2),
842                 GE(IID_IDirectMusicSegment8),
843                 GE(IID_IDirectMusicSegmentState),
844                 GE(IID_IDirectMusicSegmentState8),
845                 GE(IID_IDirectMusicStyle),
846                 GE(IID_IDirectMusicStyle8),
847                 GE(IID_IDirectMusicSynth),
848                 GE(IID_IDirectMusicSynth8),
849                 GE(IID_IDirectMusicSynthSink),
850                 GE(IID_IDirectMusicThru),
851                 GE(IID_IDirectMusicTool),
852                 GE(IID_IDirectMusicTool8),
853                 GE(IID_IDirectMusicTrack),
854                 GE(IID_IDirectMusicTrack8),
855                 GE(IID_IUnknown),
856                 GE(IID_IPersistStream),
857                 GE(IID_IStream),
858                 GE(IID_IClassFactory),
859                 /* GUIDs */
860                 GE(GUID_DirectMusicAllTypes),
861                 GE(GUID_NOTIFICATION_CHORD),
862                 GE(GUID_NOTIFICATION_COMMAND),
863                 GE(GUID_NOTIFICATION_MEASUREANDBEAT),
864                 GE(GUID_NOTIFICATION_PERFORMANCE),
865                 GE(GUID_NOTIFICATION_RECOMPOSE),
866                 GE(GUID_NOTIFICATION_SEGMENT),
867                 GE(GUID_BandParam),
868                 GE(GUID_ChordParam),
869                 GE(GUID_CommandParam),
870                 GE(GUID_CommandParam2),
871                 GE(GUID_CommandParamNext),
872                 GE(GUID_IDirectMusicBand),
873                 GE(GUID_IDirectMusicChordMap),
874                 GE(GUID_IDirectMusicStyle),
875                 GE(GUID_MuteParam),
876                 GE(GUID_Play_Marker),
877                 GE(GUID_RhythmParam),
878                 GE(GUID_TempoParam),
879                 GE(GUID_TimeSignature),
880                 GE(GUID_Valid_Start_Time),
881                 GE(GUID_Clear_All_Bands),
882                 GE(GUID_ConnectToDLSCollection),
883                 GE(GUID_Disable_Auto_Download),
884                 GE(GUID_DisableTempo),
885                 GE(GUID_DisableTimeSig),
886                 GE(GUID_Download),
887                 GE(GUID_DownloadToAudioPath),
888                 GE(GUID_Enable_Auto_Download),
889                 GE(GUID_EnableTempo),
890                 GE(GUID_EnableTimeSig),
891                 GE(GUID_IgnoreBankSelectForGM),
892                 GE(GUID_SeedVariations),
893                 GE(GUID_StandardMIDIFile),
894                 GE(GUID_Unload),
895                 GE(GUID_UnloadFromAudioPath),
896                 GE(GUID_Variations),
897                 GE(GUID_PerfMasterTempo),
898                 GE(GUID_PerfMasterVolume),
899                 GE(GUID_PerfMasterGrooveLevel),
900                 GE(GUID_PerfAutoDownload),
901                 GE(GUID_DefaultGMCollection),
902                 GE(GUID_Synth_Default),
903                 GE(GUID_Buffer_Reverb),
904                 GE(GUID_Buffer_EnvReverb),
905                 GE(GUID_Buffer_Stereo),
906                 GE(GUID_Buffer_3D_Dry),
907                 GE(GUID_Buffer_Mono),
908                 GE(GUID_DMUS_PROP_GM_Hardware),
909                 GE(GUID_DMUS_PROP_GS_Capable),
910                 GE(GUID_DMUS_PROP_GS_Hardware),
911                 GE(GUID_DMUS_PROP_DLS1),
912                 GE(GUID_DMUS_PROP_DLS2),
913                 GE(GUID_DMUS_PROP_Effects),
914                 GE(GUID_DMUS_PROP_INSTRUMENT2),
915                 GE(GUID_DMUS_PROP_LegacyCaps),
916                 GE(GUID_DMUS_PROP_MemorySize),
917                 GE(GUID_DMUS_PROP_SampleMemorySize),
918                 GE(GUID_DMUS_PROP_SamplePlaybackRate),
919                 GE(GUID_DMUS_PROP_SetSynthSink),
920                 GE(GUID_DMUS_PROP_SinkUsesDSound),
921                 GE(GUID_DMUS_PROP_SynthSink_DSOUND),
922                 GE(GUID_DMUS_PROP_SynthSink_WAVE),
923                 GE(GUID_DMUS_PROP_Volume),
924                 GE(GUID_DMUS_PROP_WavesReverb),
925                 GE(GUID_DMUS_PROP_WriteLatency),
926                 GE(GUID_DMUS_PROP_WritePeriod),
927                 GE(GUID_DMUS_PROP_XG_Capable),
928                 GE(GUID_DMUS_PROP_XG_Hardware)
929         };
930
931         unsigned int i;
932
933         if (!id) return "(null)";
934
935         for (i = 0; i < sizeof(guids)/sizeof(guids[0]); i++) {
936                 if (IsEqualGUID(id, &guids[i].guid))
937                         return guids[i].name;
938         }
939         /* if we didn't find it, act like standard debugstr_guid */     
940         return debugstr_guid(id);
941 }       
942
943 /* returns name of given error code */
944 const char *debugstr_dmreturn (DWORD code) {
945         static const flag_info codes[] = {
946                 FE(S_OK),
947                 FE(S_FALSE),
948                 FE(DMUS_S_PARTIALLOAD),
949                 FE(DMUS_S_PARTIALDOWNLOAD),
950                 FE(DMUS_S_REQUEUE),
951                 FE(DMUS_S_FREE),
952                 FE(DMUS_S_END),
953                 FE(DMUS_S_STRING_TRUNCATED),
954                 FE(DMUS_S_LAST_TOOL),
955                 FE(DMUS_S_OVER_CHORD),
956                 FE(DMUS_S_UP_OCTAVE),
957                 FE(DMUS_S_DOWN_OCTAVE),
958                 FE(DMUS_S_NOBUFFERCONTROL),
959                 FE(DMUS_S_GARBAGE_COLLECTED),
960                 FE(DMUS_E_DRIVER_FAILED),
961                 FE(DMUS_E_PORTS_OPEN),
962                 FE(DMUS_E_DEVICE_IN_USE),
963                 FE(DMUS_E_INSUFFICIENTBUFFER),
964                 FE(DMUS_E_BUFFERNOTSET),
965                 FE(DMUS_E_BUFFERNOTAVAILABLE),
966                 FE(DMUS_E_NOTADLSCOL),
967                 FE(DMUS_E_INVALIDOFFSET),
968                 FE(DMUS_E_ALREADY_LOADED),
969                 FE(DMUS_E_INVALIDPOS),
970                 FE(DMUS_E_INVALIDPATCH),
971                 FE(DMUS_E_CANNOTSEEK),
972                 FE(DMUS_E_CANNOTWRITE),
973                 FE(DMUS_E_CHUNKNOTFOUND),
974                 FE(DMUS_E_INVALID_DOWNLOADID),
975                 FE(DMUS_E_NOT_DOWNLOADED_TO_PORT),
976                 FE(DMUS_E_ALREADY_DOWNLOADED),
977                 FE(DMUS_E_UNKNOWN_PROPERTY),
978                 FE(DMUS_E_SET_UNSUPPORTED),
979                 FE(DMUS_E_GET_UNSUPPORTED),
980                 FE(DMUS_E_NOTMONO),
981                 FE(DMUS_E_BADARTICULATION),
982                 FE(DMUS_E_BADINSTRUMENT),
983                 FE(DMUS_E_BADWAVELINK),
984                 FE(DMUS_E_NOARTICULATION),
985                 FE(DMUS_E_NOTPCM),
986                 FE(DMUS_E_BADWAVE),
987                 FE(DMUS_E_BADOFFSETTABLE),
988                 FE(DMUS_E_UNKNOWNDOWNLOAD),
989                 FE(DMUS_E_NOSYNTHSINK),
990                 FE(DMUS_E_ALREADYOPEN),
991                 FE(DMUS_E_ALREADYCLOSED),
992                 FE(DMUS_E_SYNTHNOTCONFIGURED),
993                 FE(DMUS_E_SYNTHACTIVE),
994                 FE(DMUS_E_CANNOTREAD),
995                 FE(DMUS_E_DMUSIC_RELEASED),
996                 FE(DMUS_E_BUFFER_EMPTY),
997                 FE(DMUS_E_BUFFER_FULL),
998                 FE(DMUS_E_PORT_NOT_CAPTURE),
999                 FE(DMUS_E_PORT_NOT_RENDER),
1000                 FE(DMUS_E_DSOUND_NOT_SET),
1001                 FE(DMUS_E_ALREADY_ACTIVATED),
1002                 FE(DMUS_E_INVALIDBUFFER),
1003                 FE(DMUS_E_WAVEFORMATNOTSUPPORTED),
1004                 FE(DMUS_E_SYNTHINACTIVE),
1005                 FE(DMUS_E_DSOUND_ALREADY_SET),
1006                 FE(DMUS_E_INVALID_EVENT),
1007                 FE(DMUS_E_UNSUPPORTED_STREAM),
1008                 FE(DMUS_E_ALREADY_INITED),
1009                 FE(DMUS_E_INVALID_BAND),
1010                 FE(DMUS_E_TRACK_HDR_NOT_FIRST_CK),
1011                 FE(DMUS_E_TOOL_HDR_NOT_FIRST_CK),
1012                 FE(DMUS_E_INVALID_TRACK_HDR),
1013                 FE(DMUS_E_INVALID_TOOL_HDR),
1014                 FE(DMUS_E_ALL_TOOLS_FAILED),
1015                 FE(DMUS_E_ALL_TRACKS_FAILED),
1016                 FE(DMUS_E_NOT_FOUND),
1017                 FE(DMUS_E_NOT_INIT),
1018                 FE(DMUS_E_TYPE_DISABLED),
1019                 FE(DMUS_E_TYPE_UNSUPPORTED),
1020                 FE(DMUS_E_TIME_PAST),
1021                 FE(DMUS_E_TRACK_NOT_FOUND),
1022                 FE(DMUS_E_TRACK_NO_CLOCKTIME_SUPPORT),
1023                 FE(DMUS_E_NO_MASTER_CLOCK),
1024                 FE(DMUS_E_LOADER_NOCLASSID),
1025                 FE(DMUS_E_LOADER_BADPATH),
1026                 FE(DMUS_E_LOADER_FAILEDOPEN),
1027                 FE(DMUS_E_LOADER_FORMATNOTSUPPORTED),
1028                 FE(DMUS_E_LOADER_FAILEDCREATE),
1029                 FE(DMUS_E_LOADER_OBJECTNOTFOUND),
1030                 FE(DMUS_E_LOADER_NOFILENAME),
1031                 FE(DMUS_E_INVALIDFILE),
1032                 FE(DMUS_E_ALREADY_EXISTS),
1033                 FE(DMUS_E_OUT_OF_RANGE),
1034                 FE(DMUS_E_SEGMENT_INIT_FAILED),
1035                 FE(DMUS_E_ALREADY_SENT),
1036                 FE(DMUS_E_CANNOT_FREE),
1037                 FE(DMUS_E_CANNOT_OPEN_PORT),
1038                 FE(DMUS_E_CANNOT_CONVERT),
1039                 FE(DMUS_E_DESCEND_CHUNK_FAIL),
1040                 FE(DMUS_E_NOT_LOADED),
1041                 FE(DMUS_E_SCRIPT_LANGUAGE_INCOMPATIBLE),
1042                 FE(DMUS_E_SCRIPT_UNSUPPORTED_VARTYPE),
1043                 FE(DMUS_E_SCRIPT_ERROR_IN_SCRIPT),
1044                 FE(DMUS_E_SCRIPT_CANTLOAD_OLEAUT32),
1045                 FE(DMUS_E_SCRIPT_LOADSCRIPT_ERROR),
1046                 FE(DMUS_E_SCRIPT_INVALID_FILE),
1047                 FE(DMUS_E_INVALID_SCRIPTTRACK),
1048                 FE(DMUS_E_SCRIPT_VARIABLE_NOT_FOUND),
1049                 FE(DMUS_E_SCRIPT_ROUTINE_NOT_FOUND),
1050                 FE(DMUS_E_SCRIPT_CONTENT_READONLY),
1051                 FE(DMUS_E_SCRIPT_NOT_A_REFERENCE),
1052                 FE(DMUS_E_SCRIPT_VALUE_NOT_SUPPORTED),
1053                 FE(DMUS_E_INVALID_SEGMENTTRIGGERTRACK),
1054                 FE(DMUS_E_INVALID_LYRICSTRACK),
1055                 FE(DMUS_E_INVALID_PARAMCONTROLTRACK),
1056                 FE(DMUS_E_AUDIOVBSCRIPT_SYNTAXERROR),
1057                 FE(DMUS_E_AUDIOVBSCRIPT_RUNTIMEERROR),
1058                 FE(DMUS_E_AUDIOVBSCRIPT_OPERATIONFAILURE),
1059                 FE(DMUS_E_AUDIOPATHS_NOT_VALID),
1060                 FE(DMUS_E_AUDIOPATHS_IN_USE),
1061                 FE(DMUS_E_NO_AUDIOPATH_CONFIG),
1062                 FE(DMUS_E_AUDIOPATH_INACTIVE),
1063                 FE(DMUS_E_AUDIOPATH_NOBUFFER),
1064                 FE(DMUS_E_AUDIOPATH_NOPORT),
1065                 FE(DMUS_E_NO_AUDIOPATH),
1066                 FE(DMUS_E_INVALIDCHUNK),
1067                 FE(DMUS_E_AUDIOPATH_NOGLOBALFXBUFFER),
1068                 FE(DMUS_E_INVALID_CONTAINER_OBJECT)
1069         };
1070         unsigned int i;
1071         for (i = 0; i < sizeof(codes)/sizeof(codes[0]); i++) {
1072                 if (code == codes[i].val)
1073                         return codes[i].name;
1074         }
1075         /* if we didn't find it, return value */
1076         return wine_dbg_sprintf("0x%08lx", code);
1077 }
1078
1079 /* generic flag-dumping function */
1080 const char* debugstr_flags (DWORD flags, const flag_info* names, size_t num_names){
1081         char buffer[128] = "", *ptr = &buffer[0];
1082         unsigned int i, size = sizeof(buffer);
1083         
1084         for (i=0; i < num_names; i++)
1085         {
1086                 if ((flags & names[i].val) ||   /* standard flag*/
1087                         ((!flags) && (!names[i].val))) { /* zero value only */
1088                                 int cnt = snprintf(ptr, size, "%s ", names[i].name);
1089                                 if (cnt < 0 || cnt >= size) break;
1090                                 size -= cnt;
1091                                 ptr += cnt;
1092                 }
1093         }
1094         
1095         return wine_dbg_sprintf("%s", buffer);
1096 }
1097
1098 /* dump DMUS_OBJ flags */
1099 const char *debugstr_DMUS_OBJ_FLAGS (DWORD flagmask) {
1100     static const flag_info flags[] = {
1101             FE(DMUS_OBJ_OBJECT),
1102             FE(DMUS_OBJ_CLASS),
1103             FE(DMUS_OBJ_NAME),
1104             FE(DMUS_OBJ_CATEGORY),
1105             FE(DMUS_OBJ_FILENAME),
1106             FE(DMUS_OBJ_FULLPATH),
1107             FE(DMUS_OBJ_URL),
1108             FE(DMUS_OBJ_VERSION),
1109             FE(DMUS_OBJ_DATE),
1110             FE(DMUS_OBJ_LOADED),
1111             FE(DMUS_OBJ_MEMORY),
1112             FE(DMUS_OBJ_STREAM)
1113         };
1114     return debugstr_flags (flagmask, flags, sizeof(flags)/sizeof(flags[0]));
1115 }
1116
1117 /* dump whole DMUS_OBJECTDESC struct */
1118 const char *debugstr_DMUS_OBJECTDESC (LPDMUS_OBJECTDESC pDesc) {
1119         if (pDesc) {
1120                 char buffer[1024] = "", *ptr = &buffer[0];
1121                 
1122                 ptr += sprintf(ptr, "DMUS_OBJECTDESC (%p):\n", pDesc);
1123                 ptr += sprintf(ptr, " - dwSize = %ld\n", pDesc->dwSize);
1124                 ptr += sprintf(ptr, " - dwValidData = %s\n", debugstr_DMUS_OBJ_FLAGS (pDesc->dwValidData));
1125                 if (pDesc->dwValidData & DMUS_OBJ_CLASS) ptr += sprintf(ptr, " - guidClass = %s\n", debugstr_dmguid(&pDesc->guidClass));
1126                 if (pDesc->dwValidData & DMUS_OBJ_OBJECT) ptr += sprintf(ptr, " - guidObject = %s\n", debugstr_guid(&pDesc->guidObject));
1127                 if (pDesc->dwValidData & DMUS_OBJ_DATE) ptr += sprintf(ptr, " - ftDate = FIXME\n");
1128                 if (pDesc->dwValidData & DMUS_OBJ_VERSION) ptr += sprintf(ptr, " - vVersion = %s\n", debugstr_dmversion(&pDesc->vVersion));
1129                 if (pDesc->dwValidData & DMUS_OBJ_NAME) ptr += sprintf(ptr, " - wszName = %s\n", debugstr_w(pDesc->wszName));
1130                 if (pDesc->dwValidData & DMUS_OBJ_CATEGORY) ptr += sprintf(ptr, " - wszCategory = %s\n", debugstr_w(pDesc->wszCategory));
1131                 if (pDesc->dwValidData & DMUS_OBJ_FILENAME) ptr += sprintf(ptr, " - wszFileName = %s\n", debugstr_w(pDesc->wszFileName));
1132                 if (pDesc->dwValidData & DMUS_OBJ_MEMORY) ptr += sprintf(ptr, " - llMemLength = %lli\n  - pbMemData = %p\n", pDesc->llMemLength, pDesc->pbMemData);
1133                 if (pDesc->dwValidData & DMUS_OBJ_STREAM) ptr += sprintf(ptr, " - pStream = %p", pDesc->pStream);
1134
1135                 return wine_dbg_sprintf("%s", buffer);
1136         } else {
1137                 return wine_dbg_sprintf("(NULL)");
1138         }
1139 }