Get rid of the non-standard ICOM_VFIELD macro.
[wine] / dlls / dmime / dmime_main.c
1 /* DirectMusicInteractiveEngine Main
2  *
3  * Copyright (C) 2003-2004 Rok Mandeljc
4  * Copyright (C) 2003-2004 Raphael Junqueira
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  */
20
21 #include "dmime_private.h"
22
23 WINE_DEFAULT_DEBUG_CHANNEL(dmime);
24 WINE_DECLARE_DEBUG_CHANNEL(dmfile);
25
26 typedef struct {
27     /* IUnknown fields */
28     IClassFactoryVtbl          *lpVtbl;
29     DWORD                       ref;
30 } IClassFactoryImpl;
31
32 /******************************************************************
33  *              DirectMusicPerformance ClassFactory
34  */
35 static HRESULT WINAPI PerformanceCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
36         ICOM_THIS(IClassFactoryImpl,iface);
37         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
38         return E_NOINTERFACE;
39 }
40
41 static ULONG WINAPI PerformanceCF_AddRef(LPCLASSFACTORY iface) {
42         ICOM_THIS(IClassFactoryImpl,iface);
43         return ++(This->ref);
44 }
45
46 static ULONG WINAPI PerformanceCF_Release(LPCLASSFACTORY iface) {
47         ICOM_THIS(IClassFactoryImpl,iface);
48         /* static class, won't be  freed */
49         return --(This->ref);
50 }
51
52 static HRESULT WINAPI PerformanceCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
53         ICOM_THIS(IClassFactoryImpl,iface);
54         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
55         return DMUSIC_CreateDirectMusicPerformanceImpl (riid, ppobj, pOuter);
56 }
57
58 static HRESULT WINAPI PerformanceCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
59         ICOM_THIS(IClassFactoryImpl,iface);
60         FIXME("(%p, %d): stub\n", This, dolock);
61         return S_OK;
62 }
63
64 static ICOM_VTABLE(IClassFactory) PerformanceCF_Vtbl = {
65         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
66         PerformanceCF_QueryInterface,
67         PerformanceCF_AddRef,
68         PerformanceCF_Release,
69         PerformanceCF_CreateInstance,
70         PerformanceCF_LockServer
71 };
72
73 static IClassFactoryImpl Performance_CF = {&PerformanceCF_Vtbl, 1 };
74
75 /******************************************************************
76  *              DirectMusicSegment ClassFactory
77  */
78 static HRESULT WINAPI SegmentCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
79         ICOM_THIS(IClassFactoryImpl,iface);
80         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
81         return E_NOINTERFACE;
82 }
83
84 static ULONG WINAPI SegmentCF_AddRef(LPCLASSFACTORY iface) {
85         ICOM_THIS(IClassFactoryImpl,iface);
86         return ++(This->ref);
87 }
88
89 static ULONG WINAPI SegmentCF_Release(LPCLASSFACTORY iface) {
90         ICOM_THIS(IClassFactoryImpl,iface);
91         /* static class, won't be  freed */
92         return --(This->ref);
93 }
94
95 static HRESULT WINAPI SegmentCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
96         ICOM_THIS(IClassFactoryImpl,iface);
97         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
98         return DMUSIC_CreateDirectMusicSegmentImpl (riid, ppobj, pOuter);
99 }
100
101 static HRESULT WINAPI SegmentCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
102         ICOM_THIS(IClassFactoryImpl,iface);
103         FIXME("(%p, %d): stub\n", This, dolock);
104         return S_OK;
105 }
106
107 static ICOM_VTABLE(IClassFactory) SegmentCF_Vtbl = {
108         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
109         SegmentCF_QueryInterface,
110         SegmentCF_AddRef,
111         SegmentCF_Release,
112         SegmentCF_CreateInstance,
113         SegmentCF_LockServer
114 };
115
116 static IClassFactoryImpl Segment_CF = {&SegmentCF_Vtbl, 1 };
117
118 /******************************************************************
119  *              DirectMusicSegmentState ClassFactory
120  */
121 static HRESULT WINAPI SegmentStateCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
122         ICOM_THIS(IClassFactoryImpl,iface);
123         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
124         return E_NOINTERFACE;
125 }
126
127 static ULONG WINAPI SegmentStateCF_AddRef(LPCLASSFACTORY iface) {
128         ICOM_THIS(IClassFactoryImpl,iface);
129         return ++(This->ref);
130 }
131
132 static ULONG WINAPI SegmentStateCF_Release(LPCLASSFACTORY iface) {
133         ICOM_THIS(IClassFactoryImpl,iface);
134         /* static class, won't be  freed */
135         return --(This->ref);
136 }
137
138 static HRESULT WINAPI SegmentStateCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
139         ICOM_THIS(IClassFactoryImpl,iface);
140         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
141         return DMUSIC_CreateDirectMusicSegmentStateImpl (riid, ppobj, pOuter);
142 }
143
144 static HRESULT WINAPI SegmentStateCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
145         ICOM_THIS(IClassFactoryImpl,iface);
146         FIXME("(%p, %d): stub\n", This, dolock);
147         return S_OK;
148 }
149
150 static ICOM_VTABLE(IClassFactory) SegmentStateCF_Vtbl = {
151         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
152         SegmentStateCF_QueryInterface,
153         SegmentStateCF_AddRef,
154         SegmentStateCF_Release,
155         SegmentStateCF_CreateInstance,
156         SegmentStateCF_LockServer
157 };
158
159 static IClassFactoryImpl SegmentState_CF = {&SegmentStateCF_Vtbl, 1 };
160
161 /******************************************************************
162  *              DirectMusicGraph ClassFactory
163  */
164 static HRESULT WINAPI GraphCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
165         ICOM_THIS(IClassFactoryImpl,iface);
166         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
167         return E_NOINTERFACE;
168 }
169
170 static ULONG WINAPI GraphCF_AddRef(LPCLASSFACTORY iface) {
171         ICOM_THIS(IClassFactoryImpl,iface);
172         return ++(This->ref);
173 }
174
175 static ULONG WINAPI GraphCF_Release(LPCLASSFACTORY iface) {
176         ICOM_THIS(IClassFactoryImpl,iface);
177         /* static class, won't be  freed */
178         return --(This->ref);
179 }
180
181 static HRESULT WINAPI GraphCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
182         ICOM_THIS(IClassFactoryImpl,iface);
183         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
184         return DMUSIC_CreateDirectMusicGraphImpl (riid, ppobj, pOuter);
185 }
186
187 static HRESULT WINAPI GraphCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
188         ICOM_THIS(IClassFactoryImpl,iface);
189         FIXME("(%p, %d): stub\n", This, dolock);
190         return S_OK;
191 }
192
193 static ICOM_VTABLE(IClassFactory) GraphCF_Vtbl = {
194         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
195         GraphCF_QueryInterface,
196         GraphCF_AddRef,
197         GraphCF_Release,
198         GraphCF_CreateInstance,
199         GraphCF_LockServer
200 };
201
202 static IClassFactoryImpl Graph_CF = {&GraphCF_Vtbl, 1 };
203
204 /******************************************************************
205  *              DirectMusicTempoTrack ClassFactory
206  */
207 static HRESULT WINAPI TempoTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
208         ICOM_THIS(IClassFactoryImpl,iface);
209         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
210         return E_NOINTERFACE;
211 }
212
213 static ULONG WINAPI TempoTrackCF_AddRef(LPCLASSFACTORY iface) {
214         ICOM_THIS(IClassFactoryImpl,iface);
215         return ++(This->ref);
216 }
217
218 static ULONG WINAPI TempoTrackCF_Release(LPCLASSFACTORY iface) {
219         ICOM_THIS(IClassFactoryImpl,iface);
220         /* static class, won't be  freed */
221         return --(This->ref);
222 }
223
224 static HRESULT WINAPI TempoTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
225         ICOM_THIS(IClassFactoryImpl,iface);
226         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
227         return DMUSIC_CreateDirectMusicTempoTrack (riid, ppobj, pOuter);
228 }
229
230 static HRESULT WINAPI TempoTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
231         ICOM_THIS(IClassFactoryImpl,iface);
232         FIXME("(%p, %d): stub\n", This, dolock);
233         return S_OK;
234 }
235
236 static ICOM_VTABLE(IClassFactory) TempoTrackCF_Vtbl = {
237         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
238         TempoTrackCF_QueryInterface,
239         TempoTrackCF_AddRef,
240         TempoTrackCF_Release,
241         TempoTrackCF_CreateInstance,
242         TempoTrackCF_LockServer
243 };
244
245 static IClassFactoryImpl TempoTrack_CF = {&TempoTrackCF_Vtbl, 1 };
246
247 /******************************************************************
248  *              DirectMusicSeqTrack ClassFactory
249  */
250 static HRESULT WINAPI SeqTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
251         ICOM_THIS(IClassFactoryImpl,iface);
252         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
253         return E_NOINTERFACE;
254 }
255
256 static ULONG WINAPI SeqTrackCF_AddRef(LPCLASSFACTORY iface) {
257         ICOM_THIS(IClassFactoryImpl,iface);
258         return ++(This->ref);
259 }
260
261 static ULONG WINAPI SeqTrackCF_Release(LPCLASSFACTORY iface) {
262         ICOM_THIS(IClassFactoryImpl,iface);
263         /* static class, won't be  freed */
264         return --(This->ref);
265 }
266
267 static HRESULT WINAPI SeqTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
268         ICOM_THIS(IClassFactoryImpl,iface);
269         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
270         return DMUSIC_CreateDirectMusicSeqTrack (riid, ppobj, pOuter);
271 }
272
273 static HRESULT WINAPI SeqTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
274         ICOM_THIS(IClassFactoryImpl,iface);
275         FIXME("(%p, %d): stub\n", This, dolock);
276         return S_OK;
277 }
278
279 static ICOM_VTABLE(IClassFactory) SeqTrackCF_Vtbl = {
280         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
281         SeqTrackCF_QueryInterface,
282         SeqTrackCF_AddRef,
283         SeqTrackCF_Release,
284         SeqTrackCF_CreateInstance,
285         SeqTrackCF_LockServer
286 };
287
288 static IClassFactoryImpl SeqTrack_CF = {&SeqTrackCF_Vtbl, 1 };
289
290 /******************************************************************
291  *              DirectMusicSysExTrack ClassFactory
292  */
293 static HRESULT WINAPI SysExTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
294         ICOM_THIS(IClassFactoryImpl,iface);
295         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
296         return E_NOINTERFACE;
297 }
298
299 static ULONG WINAPI SysExTrackCF_AddRef(LPCLASSFACTORY iface) {
300         ICOM_THIS(IClassFactoryImpl,iface);
301         return ++(This->ref);
302 }
303
304 static ULONG WINAPI SysExTrackCF_Release(LPCLASSFACTORY iface) {
305         ICOM_THIS(IClassFactoryImpl,iface);
306         /* static class, won't be  freed */
307         return --(This->ref);
308 }
309
310 static HRESULT WINAPI SysExTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
311         ICOM_THIS(IClassFactoryImpl,iface);
312         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
313         return DMUSIC_CreateDirectMusicSysExTrack (riid, ppobj, pOuter);
314 }
315
316 static HRESULT WINAPI SysExTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
317         ICOM_THIS(IClassFactoryImpl,iface);
318         FIXME("(%p, %d): stub\n", This, dolock);
319         return S_OK;
320 }
321
322 static ICOM_VTABLE(IClassFactory) SysExTrackCF_Vtbl = {
323         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
324         SysExTrackCF_QueryInterface,
325         SysExTrackCF_AddRef,
326         SysExTrackCF_Release,
327         SysExTrackCF_CreateInstance,
328         SysExTrackCF_LockServer
329 };
330
331 static IClassFactoryImpl SysExTrack_CF = {&SysExTrackCF_Vtbl, 1 };
332
333 /******************************************************************
334  *              DirectMusicTimeSigTrack ClassFactory
335  */
336 static HRESULT WINAPI TimeSigTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
337         ICOM_THIS(IClassFactoryImpl,iface);
338         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
339         return E_NOINTERFACE;
340 }
341
342 static ULONG WINAPI TimeSigTrackCF_AddRef(LPCLASSFACTORY iface) {
343         ICOM_THIS(IClassFactoryImpl,iface);
344         return ++(This->ref);
345 }
346
347 static ULONG WINAPI TimeSigTrackCF_Release(LPCLASSFACTORY iface) {
348         ICOM_THIS(IClassFactoryImpl,iface);
349         /* static class, won't be  freed */
350         return --(This->ref);
351 }
352
353 static HRESULT WINAPI TimeSigTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
354         ICOM_THIS(IClassFactoryImpl,iface);
355         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
356         return DMUSIC_CreateDirectMusicTimeSigTrack (riid, ppobj, pOuter);
357 }
358
359 static HRESULT WINAPI TimeSigTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
360         ICOM_THIS(IClassFactoryImpl,iface);
361         FIXME("(%p, %d): stub\n", This, dolock);
362         return S_OK;
363 }
364
365 static ICOM_VTABLE(IClassFactory) TimeSigTrackCF_Vtbl = {
366         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
367         TimeSigTrackCF_QueryInterface,
368         TimeSigTrackCF_AddRef,
369         TimeSigTrackCF_Release,
370         TimeSigTrackCF_CreateInstance,
371         TimeSigTrackCF_LockServer
372 };
373
374 static IClassFactoryImpl TimeSigTrack_CF = {&TimeSigTrackCF_Vtbl, 1 };
375
376 /******************************************************************
377  *              DirectMusicParamControlTrack ClassFactory
378  */
379 static HRESULT WINAPI ParamControlTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
380         ICOM_THIS(IClassFactoryImpl,iface);
381         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
382         return E_NOINTERFACE;
383 }
384
385 static ULONG WINAPI ParamControlTrackCF_AddRef(LPCLASSFACTORY iface) {
386         ICOM_THIS(IClassFactoryImpl,iface);
387         return ++(This->ref);
388 }
389
390 static ULONG WINAPI ParamControlTrackCF_Release(LPCLASSFACTORY iface) {
391         ICOM_THIS(IClassFactoryImpl,iface);
392         /* static class, won't be  freed */
393         return --(This->ref);
394 }
395
396 static HRESULT WINAPI ParamControlTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
397         ICOM_THIS(IClassFactoryImpl,iface);
398         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
399         return DMUSIC_CreateDirectMusicParamControlTrack (riid, ppobj, pOuter);
400 }
401
402 static HRESULT WINAPI ParamControlTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
403         ICOM_THIS(IClassFactoryImpl,iface);
404         FIXME("(%p, %d): stub\n", This, dolock);
405         return S_OK;
406 }
407
408 static ICOM_VTABLE(IClassFactory) ParamControlTrackCF_Vtbl = {
409         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
410         ParamControlTrackCF_QueryInterface,
411         ParamControlTrackCF_AddRef,
412         ParamControlTrackCF_Release,
413         ParamControlTrackCF_CreateInstance,
414         ParamControlTrackCF_LockServer
415 };
416
417 static IClassFactoryImpl ParamControlTrack_CF = {&ParamControlTrackCF_Vtbl, 1 };
418
419 /******************************************************************
420  *              DirectMusicMarkerTrack ClassFactory
421  */
422 static HRESULT WINAPI MarkerTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
423         ICOM_THIS(IClassFactoryImpl,iface);
424         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
425         return E_NOINTERFACE;
426 }
427
428 static ULONG WINAPI MarkerTrackCF_AddRef(LPCLASSFACTORY iface) {
429         ICOM_THIS(IClassFactoryImpl,iface);
430         return ++(This->ref);
431 }
432
433 static ULONG WINAPI MarkerTrackCF_Release(LPCLASSFACTORY iface) {
434         ICOM_THIS(IClassFactoryImpl,iface);
435         /* static class, won't be  freed */
436         return --(This->ref);
437 }
438
439 static HRESULT WINAPI MarkerTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
440         ICOM_THIS(IClassFactoryImpl,iface);
441         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
442         return DMUSIC_CreateDirectMusicMarkerTrack (riid, ppobj, pOuter);
443 }
444
445 static HRESULT WINAPI MarkerTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
446         ICOM_THIS(IClassFactoryImpl,iface);
447         FIXME("(%p, %d): stub\n", This, dolock);
448         return S_OK;
449 }
450
451 static ICOM_VTABLE(IClassFactory) MarkerTrackCF_Vtbl = {
452         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
453         MarkerTrackCF_QueryInterface,
454         MarkerTrackCF_AddRef,
455         MarkerTrackCF_Release,
456         MarkerTrackCF_CreateInstance,
457         MarkerTrackCF_LockServer
458 };
459
460 static IClassFactoryImpl MarkerTrack_CF = {&MarkerTrackCF_Vtbl, 1 };
461
462 /******************************************************************
463  *              DirectMusicLyricsTrack ClassFactory
464  */
465 static HRESULT WINAPI LyricsTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
466         ICOM_THIS(IClassFactoryImpl,iface);
467         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
468         return E_NOINTERFACE;
469 }
470
471 static ULONG WINAPI LyricsTrackCF_AddRef(LPCLASSFACTORY iface) {
472         ICOM_THIS(IClassFactoryImpl,iface);
473         return ++(This->ref);
474 }
475
476 static ULONG WINAPI LyricsTrackCF_Release(LPCLASSFACTORY iface) {
477         ICOM_THIS(IClassFactoryImpl,iface);
478         /* static class, won't be  freed */
479         return --(This->ref);
480 }
481
482 static HRESULT WINAPI LyricsTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
483         ICOM_THIS(IClassFactoryImpl,iface);
484         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
485         return DMUSIC_CreateDirectMusicLyricsTrack (riid, ppobj, pOuter);
486 }
487
488 static HRESULT WINAPI LyricsTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
489         ICOM_THIS(IClassFactoryImpl,iface);
490         FIXME("(%p, %d): stub\n", This, dolock);
491         return S_OK;
492 }
493
494 static ICOM_VTABLE(IClassFactory) LyricsTrackCF_Vtbl = {
495         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
496         LyricsTrackCF_QueryInterface,
497         LyricsTrackCF_AddRef,
498         LyricsTrackCF_Release,
499         LyricsTrackCF_CreateInstance,
500         LyricsTrackCF_LockServer
501 };
502
503 static IClassFactoryImpl LyricsTrack_CF = {&LyricsTrackCF_Vtbl, 1 };
504
505
506 /******************************************************************
507  *              DirectMusicSegTriggerTrack ClassFactory
508  */
509 static HRESULT WINAPI SegTriggerTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
510         ICOM_THIS(IClassFactoryImpl,iface);
511         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
512         return E_NOINTERFACE;
513 }
514
515 static ULONG WINAPI SegTriggerTrackCF_AddRef(LPCLASSFACTORY iface) {
516         ICOM_THIS(IClassFactoryImpl,iface);
517         return ++(This->ref);
518 }
519
520 static ULONG WINAPI SegTriggerTrackCF_Release(LPCLASSFACTORY iface) {
521         ICOM_THIS(IClassFactoryImpl,iface);
522         /* static class, won't be  freed */
523         return --(This->ref);
524 }
525
526 static HRESULT WINAPI SegTriggerTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
527         ICOM_THIS(IClassFactoryImpl,iface);
528         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
529         return DMUSIC_CreateDirectMusicSegTriggerTrack (riid, ppobj, pOuter);
530 }
531
532 static HRESULT WINAPI SegTriggerTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
533         ICOM_THIS(IClassFactoryImpl,iface);
534         FIXME("(%p, %d): stub\n", This, dolock);
535         return S_OK;
536 }
537
538 static ICOM_VTABLE(IClassFactory) SegTriggerTrackCF_Vtbl = {
539         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
540         SegTriggerTrackCF_QueryInterface,
541         SegTriggerTrackCF_AddRef,
542         SegTriggerTrackCF_Release,
543         SegTriggerTrackCF_CreateInstance,
544         SegTriggerTrackCF_LockServer
545 };
546
547 static IClassFactoryImpl SegTriggerTrack_CF = {&SegTriggerTrackCF_Vtbl, 1 };
548
549 /******************************************************************
550  *              DirectMusicAudioPath ClassFactory
551  */
552 static HRESULT WINAPI AudioPathCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
553         ICOM_THIS(IClassFactoryImpl,iface);
554         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
555         return E_NOINTERFACE;
556 }
557
558 static ULONG WINAPI AudioPathCF_AddRef(LPCLASSFACTORY iface) {
559         ICOM_THIS(IClassFactoryImpl,iface);
560         return ++(This->ref);
561 }
562
563 static ULONG WINAPI AudioPathCF_Release(LPCLASSFACTORY iface) {
564         ICOM_THIS(IClassFactoryImpl,iface);
565         /* static class, won't be  freed */
566         return --(This->ref);
567 }
568
569 static HRESULT WINAPI AudioPathCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
570         ICOM_THIS(IClassFactoryImpl,iface);
571         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
572         return DMUSIC_CreateDirectMusicAudioPathImpl (riid, ppobj, pOuter);
573 }
574
575 static HRESULT WINAPI AudioPathCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
576         ICOM_THIS(IClassFactoryImpl,iface);
577         FIXME("(%p, %d): stub\n", This, dolock);
578         return S_OK;
579 }
580
581 static ICOM_VTABLE(IClassFactory) AudioPathCF_Vtbl = {
582         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
583         AudioPathCF_QueryInterface,
584         AudioPathCF_AddRef,
585         AudioPathCF_Release,
586         AudioPathCF_CreateInstance,
587         AudioPathCF_LockServer
588 };
589
590 static IClassFactoryImpl AudioPath_CF = {&AudioPathCF_Vtbl, 1 };
591
592 /******************************************************************
593  *              DirectMusicWaveTrack ClassFactory
594  */
595 static HRESULT WINAPI WaveTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
596         ICOM_THIS(IClassFactoryImpl,iface);
597         FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
598         return E_NOINTERFACE;
599 }
600
601 static ULONG WINAPI WaveTrackCF_AddRef(LPCLASSFACTORY iface) {
602         ICOM_THIS(IClassFactoryImpl,iface);
603         return ++(This->ref);
604 }
605
606 static ULONG WINAPI WaveTrackCF_Release(LPCLASSFACTORY iface) {
607         ICOM_THIS(IClassFactoryImpl,iface);
608         /* static class, won't be  freed */
609         return --(This->ref);
610 }
611
612 static HRESULT WINAPI WaveTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
613         ICOM_THIS(IClassFactoryImpl,iface);
614         TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
615         return DMUSIC_CreateDirectMusicWaveTrack (riid, ppobj, pOuter);
616 }
617
618 static HRESULT WINAPI WaveTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
619         ICOM_THIS(IClassFactoryImpl,iface);
620         FIXME("(%p, %d): stub\n", This, dolock);
621         return S_OK;
622 }
623
624 static ICOM_VTABLE(IClassFactory) WaveTrackCF_Vtbl = {
625         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
626         WaveTrackCF_QueryInterface,
627         WaveTrackCF_AddRef,
628         WaveTrackCF_Release,
629         WaveTrackCF_CreateInstance,
630         WaveTrackCF_LockServer
631 };
632
633 static IClassFactoryImpl WaveTrack_CF = {&WaveTrackCF_Vtbl, 1 };
634
635 /******************************************************************
636  *              DllMain
637  *
638  *
639  */
640 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
641         if (fdwReason == DLL_PROCESS_ATTACH) {
642                 DisableThreadLibraryCalls(hinstDLL);
643                 /* FIXME: Initialisation */
644         }
645         else if (fdwReason == DLL_PROCESS_DETACH) {
646                 /* FIXME: Cleanup */
647         }
648
649         return TRUE;
650 }
651
652
653 /******************************************************************
654  *              DllCanUnloadNow (DMIME.1)
655  *
656  *
657  */
658 HRESULT WINAPI DMIME_DllCanUnloadNow(void) {
659     FIXME("(void): stub\n");
660     return S_FALSE;
661 }
662
663
664 /******************************************************************
665  *              DllGetClassObject (DMIME.2)
666  *
667  *
668  */
669 HRESULT WINAPI DMIME_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
670 {
671     TRACE("(%s, %s, %p)\n", debugstr_dmguid(rclsid), debugstr_dmguid(riid), ppv);
672     if (IsEqualCLSID (rclsid, &CLSID_DirectMusicPerformance) && IsEqualIID (riid, &IID_IClassFactory)) {
673                 *ppv = (LPVOID) &Performance_CF;
674                 IClassFactory_AddRef((IClassFactory*)*ppv);
675                 return S_OK;
676         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegment) && IsEqualIID (riid, &IID_IClassFactory)) {
677                 *ppv = (LPVOID) &Segment_CF;
678                 IClassFactory_AddRef((IClassFactory*)*ppv);
679                 return S_OK;
680         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegmentState) && IsEqualIID (riid, &IID_IClassFactory)) {
681                 *ppv = (LPVOID) &SegmentState_CF;
682                 IClassFactory_AddRef((IClassFactory*)*ppv);
683                 return S_OK;
684         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicGraph) && IsEqualIID (riid, &IID_IClassFactory)) {
685                 *ppv = (LPVOID) &Graph_CF;
686                 IClassFactory_AddRef((IClassFactory*)*ppv);
687                 return S_OK;
688         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicTempoTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
689                 *ppv = (LPVOID) &TempoTrack_CF;
690                 IClassFactory_AddRef((IClassFactory*)*ppv);
691                 return S_OK;
692         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSeqTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
693                 *ppv = (LPVOID) &SeqTrack_CF;
694                 IClassFactory_AddRef((IClassFactory*)*ppv);
695                 return S_OK;
696         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSysExTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
697                 *ppv = (LPVOID) &SysExTrack_CF;
698                 IClassFactory_AddRef((IClassFactory*)*ppv);
699                 return S_OK;
700         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicTimeSigTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
701                 *ppv = (LPVOID) &TimeSigTrack_CF;
702                 IClassFactory_AddRef((IClassFactory*)*ppv);
703                 return S_OK;
704         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicParamControlTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
705                 *ppv = (LPVOID) &ParamControlTrack_CF;
706                 IClassFactory_AddRef((IClassFactory*)*ppv);
707                 return S_OK;
708         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicMarkerTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
709                 *ppv = (LPVOID) &MarkerTrack_CF;
710                 IClassFactory_AddRef((IClassFactory*)*ppv);
711                 return S_OK;
712         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicLyricsTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
713                 *ppv = (LPVOID) &LyricsTrack_CF;
714                 IClassFactory_AddRef((IClassFactory*)*ppv);
715                 return S_OK;
716         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegTriggerTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
717                 *ppv = (LPVOID) &SegTriggerTrack_CF;
718                 IClassFactory_AddRef((IClassFactory*)*ppv);
719                 return S_OK;
720         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicAudioPath) && IsEqualIID (riid, &IID_IClassFactory)) {
721                 *ppv = (LPVOID) &AudioPath_CF;
722                 IClassFactory_AddRef((IClassFactory*)*ppv);
723                 return S_OK;
724         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicWaveTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
725                 *ppv = (LPVOID) &WaveTrack_CF;
726                 IClassFactory_AddRef((IClassFactory*)*ppv);
727                 return S_OK;
728         } 
729         
730     WARN("(%s, %s, %p): no interface found.\n", debugstr_dmguid(rclsid), debugstr_dmguid(riid), ppv);
731     return CLASS_E_CLASSNOTAVAILABLE;
732 }