Fix subclassing to support nested messages.
[wine] / dlls / dmime / segment.c
1 /* IDirectMusicSegment8 Implementation
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 WINE_DECLARE_DEBUG_CHANNEL(dmfile);
24
25 /*****************************************************************************
26  * IDirectMusicSegmentImpl implementation
27  */
28 /* IDirectMusicSegment IUnknown part: */
29 HRESULT WINAPI IDirectMusicSegment8Impl_IUnknown_QueryInterface (LPUNKNOWN iface, REFIID riid, LPVOID *ppobj) {
30         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, UnknownVtbl, iface);
31         TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
32         
33         if (IsEqualIID (riid, &IID_IUnknown)) {
34                 *ppobj = (LPVOID)&This->UnknownVtbl;
35                 IDirectMusicSegment8Impl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
36                 return S_OK;    
37         } else if (IsEqualIID (riid, &IID_IDirectMusicSegment)
38         || IsEqualIID (riid, &IID_IDirectMusicSegment2)
39         || IsEqualIID (riid, &IID_IDirectMusicSegment8)) {
40                 *ppobj = (LPVOID)&This->SegmentVtbl;
41                 IDirectMusicSegment8Impl_IDirectMusicSegment8_AddRef ((LPDIRECTMUSICSEGMENT8)&This->SegmentVtbl);
42                 return S_OK;
43         } else if (IsEqualIID (riid, &IID_IDirectMusicObject)) {
44                 *ppobj = (LPVOID)&This->ObjectVtbl;
45                 IDirectMusicSegment8Impl_IDirectMusicObject_AddRef ((LPDIRECTMUSICOBJECT)&This->ObjectVtbl);            
46                 return S_OK;
47         } else if (IsEqualIID (riid, &IID_IPersistStream)) {
48                 *ppobj = (LPVOID)&This->PersistStreamVtbl;
49                 IDirectMusicSegment8Impl_IPersistStream_AddRef ((LPPERSISTSTREAM)&This->PersistStreamVtbl);             
50                 return S_OK;
51         }
52         
53         WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj);
54         return E_NOINTERFACE;
55 }
56
57 ULONG WINAPI IDirectMusicSegment8Impl_IUnknown_AddRef (LPUNKNOWN iface) {
58         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, UnknownVtbl, iface);
59         TRACE("(%p): AddRef from %ld\n", This, This->ref);
60         return ++(This->ref);
61 }
62
63 ULONG WINAPI IDirectMusicSegment8Impl_IUnknown_Release (LPUNKNOWN iface) {
64         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, UnknownVtbl, iface);
65         ULONG ref = --This->ref;
66         TRACE("(%p): ReleaseRef to %ld\n", This, This->ref);
67         if (ref == 0) {
68                 HeapFree(GetProcessHeap(), 0, This);
69         }
70         return ref;
71 }
72
73 ICOM_VTABLE(IUnknown) DirectMusicSegment8_Unknown_Vtbl = {
74     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
75         IDirectMusicSegment8Impl_IUnknown_QueryInterface,
76         IDirectMusicSegment8Impl_IUnknown_AddRef,
77         IDirectMusicSegment8Impl_IUnknown_Release
78 };
79
80 /* IDirectMusicSegmentImpl IDirectMusicSegment part: */
81 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_QueryInterface (LPDIRECTMUSICSEGMENT8 iface, REFIID riid, LPVOID *ppobj) {
82         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
83         return IDirectMusicSegment8Impl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
84 }
85
86 ULONG WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_AddRef (LPDIRECTMUSICSEGMENT8 iface) {
87         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
88         return IDirectMusicSegment8Impl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
89 }
90
91 ULONG WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_Release (LPDIRECTMUSICSEGMENT8 iface) {
92         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
93         return IDirectMusicSegment8Impl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
94 }
95
96 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetLength (LPDIRECTMUSICSEGMENT8 iface, MUSIC_TIME* pmtLength) {
97         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
98         FIXME("(%p, %p): stub\n", This, pmtLength);
99         return S_OK;
100 }
101
102 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_SetLength (LPDIRECTMUSICSEGMENT8 iface, MUSIC_TIME mtLength) {
103         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
104         FIXME("(%p, %ld): stub\n", This, mtLength);
105         return S_OK;
106 }
107
108 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetRepeats (LPDIRECTMUSICSEGMENT8 iface, DWORD* pdwRepeats) { 
109         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
110         FIXME("(%p, %p): stub\n", This, pdwRepeats);
111         return S_OK;
112 }
113
114 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_SetRepeats (LPDIRECTMUSICSEGMENT8 iface, DWORD dwRepeats) {
115         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
116         FIXME("(%p, %ld): stub\n", This, dwRepeats);    
117         return S_OK;
118 }
119
120 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetDefaultResolution (LPDIRECTMUSICSEGMENT8 iface, DWORD* pdwResolution) {
121         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
122         FIXME("(%p, %p): stub\n", This, pdwResolution);
123         return S_OK;
124 }
125
126 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_SetDefaultResolution (LPDIRECTMUSICSEGMENT8 iface, DWORD dwResolution) {
127         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
128         FIXME("(%p, %ld): stub\n", This, dwResolution);
129         return S_OK;
130 }
131
132 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetTrack (LPDIRECTMUSICSEGMENT8 iface, REFGUID rguidType, DWORD dwGroupBits, DWORD dwIndex, IDirectMusicTrack** ppTrack) {
133         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
134         FIXME("(%p, %s, %ld, %ld, %p): stub\n", This, debugstr_dmguid(rguidType), dwGroupBits, dwIndex, ppTrack);
135         return S_OK;
136 }
137
138 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetTrackGroup (LPDIRECTMUSICSEGMENT8 iface, IDirectMusicTrack* pTrack, DWORD* pdwGroupBits) {
139         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
140         FIXME("(%p, %p, %p): stub\n", This, pTrack, pdwGroupBits);
141         return S_OK;
142 }
143
144 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_InsertTrack (LPDIRECTMUSICSEGMENT8 iface, IDirectMusicTrack* pTrack, DWORD dwGroupBits) {
145         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
146         FIXME("(%p, %p, %ld): stub\n", This, pTrack, dwGroupBits);
147         return S_OK;
148 }
149
150 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_RemoveTrack (LPDIRECTMUSICSEGMENT8 iface, IDirectMusicTrack* pTrack) {
151         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
152         FIXME("(%p, %p): stub\n", This, pTrack);
153         return S_OK;
154 }
155
156 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_InitPlay (LPDIRECTMUSICSEGMENT8 iface, IDirectMusicSegmentState** ppSegState, IDirectMusicPerformance* pPerformance, DWORD dwFlags) {
157         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
158         FIXME("(%p, %p, %p, %ld): stub\n", This, ppSegState, pPerformance, dwFlags);
159         return S_OK;
160 }
161
162 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetGraph (LPDIRECTMUSICSEGMENT8 iface, IDirectMusicGraph** ppGraph) {
163         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
164         FIXME("(%p, %p): stub\n", This, ppGraph);
165         return S_OK;
166 }
167
168 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_SetGraph (LPDIRECTMUSICSEGMENT8 iface, IDirectMusicGraph* pGraph) {
169         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
170         FIXME("(%p, %p): stub\n", This, pGraph);
171         return S_OK;
172 }
173
174 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_AddNotificationType (LPDIRECTMUSICSEGMENT8 iface, REFGUID rguidNotificationType) {
175         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
176         FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidNotificationType));
177         return S_OK;
178 }
179
180 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_RemoveNotificationType (LPDIRECTMUSICSEGMENT8 iface, REFGUID rguidNotificationType) {
181         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
182         FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidNotificationType));
183         return S_OK;
184 }
185
186 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetParam (LPDIRECTMUSICSEGMENT8 iface, REFGUID rguidType, DWORD dwGroupBits, DWORD dwIndex, MUSIC_TIME mtTime, MUSIC_TIME* pmtNext, void* pParam) {
187         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
188         FIXME("(%p, %s, %ld, %ld, %ld, %p, %p): stub\n", This, debugstr_dmguid(rguidType), dwGroupBits, dwIndex, mtTime, pmtNext, pParam);
189         return S_OK;
190 }
191
192 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_SetParam (LPDIRECTMUSICSEGMENT8 iface, REFGUID rguidType, DWORD dwGroupBits, DWORD dwIndex, MUSIC_TIME mtTime, void* pParam) {
193         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
194         FIXME("(%p, %s, %ld, %ld, %ld, %p): stub\n", This, debugstr_dmguid(rguidType), dwGroupBits, dwIndex, mtTime, pParam);
195         return S_OK;
196 }
197
198 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_Clone (LPDIRECTMUSICSEGMENT8 iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicSegment** ppSegment) {
199         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
200         FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppSegment);
201         return S_OK;
202 }
203
204 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_SetStartPoint (LPDIRECTMUSICSEGMENT8 iface, MUSIC_TIME mtStart) {
205         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
206         FIXME("(%p, %ld): stub\n", This, mtStart);
207         return S_OK;
208 }
209
210 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetStartPoint (LPDIRECTMUSICSEGMENT8 iface, MUSIC_TIME* pmtStart) {
211         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
212         FIXME("(%p, %p): stub\n", This, pmtStart);
213         return S_OK;
214 }
215
216 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_SetLoopPoints (LPDIRECTMUSICSEGMENT8 iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd) {
217         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
218         FIXME("(%p, %ld, %ld): stub\n", This, mtStart, mtEnd);
219         return S_OK;
220 }
221
222 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetLoopPoints (LPDIRECTMUSICSEGMENT8 iface, MUSIC_TIME* pmtStart, MUSIC_TIME* pmtEnd) {
223         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
224         FIXME("(%p, %p, %p): stub\n", This, pmtStart, pmtEnd);
225         return S_OK;
226 }
227
228 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_SetPChannelsUsed (LPDIRECTMUSICSEGMENT8 iface, DWORD dwNumPChannels, DWORD* paPChannels) {
229         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
230         FIXME("(%p, %ld, %p): stub\n", This, dwNumPChannels, paPChannels);      
231         return S_OK;
232 }
233
234 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_SetTrackConfig (LPDIRECTMUSICSEGMENT8 iface, REFGUID rguidTrackClassID, DWORD dwGroupBits, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff) {
235         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
236         FIXME("(%p, %s, %ld, %ld, %ld, %ld): stub\n", This, debugstr_dmguid(rguidTrackClassID), dwGroupBits, dwIndex, dwFlagsOn, dwFlagsOff);
237         return S_OK;
238 }
239
240 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetAudioPathConfig (LPDIRECTMUSICSEGMENT8 iface, IUnknown** ppAudioPathConfig){
241         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
242         FIXME("(%p, %p): stub\n", This, ppAudioPathConfig);
243         return S_OK;
244 }
245
246 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_Compose (LPDIRECTMUSICSEGMENT8 iface, MUSIC_TIME mtTime, IDirectMusicSegment* pFromSegment, IDirectMusicSegment* pToSegment, IDirectMusicSegment** ppComposedSegment) {
247         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
248         FIXME("(%p, %ld, %p, %p, %p): stub\n", This, mtTime, pFromSegment, pToSegment, ppComposedSegment);
249         return S_OK;
250 }
251
252 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_Download (LPDIRECTMUSICSEGMENT8 iface, IUnknown *pAudioPath) {
253         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
254         FIXME("(%p, %p): stub\n", This, pAudioPath);
255         return S_OK;
256 }
257
258 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_Unload (LPDIRECTMUSICSEGMENT8 iface, IUnknown *pAudioPath) {
259         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, SegmentVtbl, iface);
260         FIXME("(%p, %p): stub\n", This, pAudioPath);
261         return S_OK;
262 }
263
264 ICOM_VTABLE(IDirectMusicSegment8) DirectMusicSegment8_Segment_Vtbl = {
265     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
266         IDirectMusicSegment8Impl_IDirectMusicSegment8_QueryInterface,
267         IDirectMusicSegment8Impl_IDirectMusicSegment8_AddRef,
268         IDirectMusicSegment8Impl_IDirectMusicSegment8_Release,
269         IDirectMusicSegment8Impl_IDirectMusicSegment8_GetLength,
270         IDirectMusicSegment8Impl_IDirectMusicSegment8_SetLength,
271         IDirectMusicSegment8Impl_IDirectMusicSegment8_GetRepeats,
272         IDirectMusicSegment8Impl_IDirectMusicSegment8_SetRepeats,
273         IDirectMusicSegment8Impl_IDirectMusicSegment8_GetDefaultResolution,
274         IDirectMusicSegment8Impl_IDirectMusicSegment8_SetDefaultResolution,
275         IDirectMusicSegment8Impl_IDirectMusicSegment8_GetTrack,
276         IDirectMusicSegment8Impl_IDirectMusicSegment8_GetTrackGroup,
277         IDirectMusicSegment8Impl_IDirectMusicSegment8_InsertTrack,
278         IDirectMusicSegment8Impl_IDirectMusicSegment8_RemoveTrack,
279         IDirectMusicSegment8Impl_IDirectMusicSegment8_InitPlay,
280         IDirectMusicSegment8Impl_IDirectMusicSegment8_GetGraph,
281         IDirectMusicSegment8Impl_IDirectMusicSegment8_SetGraph,
282         IDirectMusicSegment8Impl_IDirectMusicSegment8_AddNotificationType,
283         IDirectMusicSegment8Impl_IDirectMusicSegment8_RemoveNotificationType,
284         IDirectMusicSegment8Impl_IDirectMusicSegment8_GetParam,
285         IDirectMusicSegment8Impl_IDirectMusicSegment8_SetParam,
286         IDirectMusicSegment8Impl_IDirectMusicSegment8_Clone,
287         IDirectMusicSegment8Impl_IDirectMusicSegment8_SetStartPoint,
288         IDirectMusicSegment8Impl_IDirectMusicSegment8_GetStartPoint,
289         IDirectMusicSegment8Impl_IDirectMusicSegment8_SetLoopPoints,
290         IDirectMusicSegment8Impl_IDirectMusicSegment8_GetLoopPoints,
291         IDirectMusicSegment8Impl_IDirectMusicSegment8_SetPChannelsUsed,
292         IDirectMusicSegment8Impl_IDirectMusicSegment8_SetTrackConfig,
293         IDirectMusicSegment8Impl_IDirectMusicSegment8_GetAudioPathConfig,
294         IDirectMusicSegment8Impl_IDirectMusicSegment8_Compose,
295         IDirectMusicSegment8Impl_IDirectMusicSegment8_Download,
296         IDirectMusicSegment8Impl_IDirectMusicSegment8_Unload
297 };
298
299 /* IDirectMusicSegment8Impl IDirectMusicObject part: */
300 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicObject_QueryInterface (LPDIRECTMUSICOBJECT iface, REFIID riid, LPVOID *ppobj) {
301         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, ObjectVtbl, iface);
302         return IDirectMusicSegment8Impl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
303 }
304
305 ULONG WINAPI IDirectMusicSegment8Impl_IDirectMusicObject_AddRef (LPDIRECTMUSICOBJECT iface) {
306         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, ObjectVtbl, iface);
307         return IDirectMusicSegment8Impl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
308 }
309
310 ULONG WINAPI IDirectMusicSegment8Impl_IDirectMusicObject_Release (LPDIRECTMUSICOBJECT iface) {
311         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, ObjectVtbl, iface);
312         return IDirectMusicSegment8Impl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
313 }
314
315 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicObject_GetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) {
316         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, ObjectVtbl, iface);
317         TRACE("(%p, %p)\n", This, pDesc);
318         /* I think we shouldn't return pointer here since then values can be changed; it'd be a mess */
319         memcpy (pDesc, This->pDesc, This->pDesc->dwSize);
320         return S_OK;
321 }
322
323 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicObject_SetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) {
324         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, ObjectVtbl, iface);
325         TRACE("(%p, %p): setting descriptor:\n%s\n", This, pDesc, debugstr_DMUS_OBJECTDESC (pDesc));
326         
327         /* According to MSDN, we should copy only given values, not whole struct */     
328         if (pDesc->dwValidData & DMUS_OBJ_OBJECT)
329                 memcpy (&This->pDesc->guidObject, &pDesc->guidObject, sizeof (pDesc->guidObject));
330         if (pDesc->dwValidData & DMUS_OBJ_CLASS)
331                 memcpy (&This->pDesc->guidClass, &pDesc->guidClass, sizeof (pDesc->guidClass));         
332         if (pDesc->dwValidData & DMUS_OBJ_NAME)
333                 strncpyW (This->pDesc->wszName, pDesc->wszName, DMUS_MAX_NAME);
334         if (pDesc->dwValidData & DMUS_OBJ_CATEGORY)
335                 strncpyW (This->pDesc->wszCategory, pDesc->wszCategory, DMUS_MAX_CATEGORY);             
336         if (pDesc->dwValidData & DMUS_OBJ_FILENAME)
337                 strncpyW (This->pDesc->wszFileName, pDesc->wszFileName, DMUS_MAX_FILENAME);             
338         if (pDesc->dwValidData & DMUS_OBJ_VERSION)
339                 memcpy (&This->pDesc->vVersion, &pDesc->vVersion, sizeof (pDesc->vVersion));                            
340         if (pDesc->dwValidData & DMUS_OBJ_DATE)
341                 memcpy (&This->pDesc->ftDate, &pDesc->ftDate, sizeof (pDesc->ftDate));                          
342         if (pDesc->dwValidData & DMUS_OBJ_MEMORY) {
343                 memcpy (&This->pDesc->llMemLength, &pDesc->llMemLength, sizeof (pDesc->llMemLength));                           
344                 memcpy (This->pDesc->pbMemData, pDesc->pbMemData, sizeof (pDesc->pbMemData));
345         }
346         if (pDesc->dwValidData & DMUS_OBJ_STREAM) {
347                 /* according to MSDN, we copy the stream */
348                 IStream_Clone (pDesc->pStream, &This->pDesc->pStream);  
349         }
350         
351         /* add new flags */
352         This->pDesc->dwValidData |= pDesc->dwValidData;
353
354         return S_OK;
355 }
356
357 HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicObject_ParseDescriptor (LPDIRECTMUSICOBJECT iface, LPSTREAM pStream, LPDMUS_OBJECTDESC pDesc) {
358         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, ObjectVtbl, iface);
359         DMUS_PRIVATE_CHUNK Chunk;
360         DWORD StreamSize, StreamCount, ListSize[1], ListCount[1];
361         LARGE_INTEGER liMove; /* used when skipping chunks */
362
363         TRACE("(%p,%p, %p)\n", This, pStream, pDesc);
364         
365         /* FIXME: should this be determined from stream? */
366         pDesc->dwValidData |= DMUS_OBJ_CLASS;
367         memcpy (&pDesc->guidClass, &CLSID_DirectMusicSegment, sizeof(CLSID));
368         
369         IStream_Read (pStream, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
370         TRACE_(dmfile)(": %s chunk (size = 0x%04lx)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
371         switch (Chunk.fccID) {  
372                 case FOURCC_RIFF: {
373                         IStream_Read (pStream, &Chunk.fccID, sizeof(FOURCC), NULL);                             
374                         TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(Chunk.fccID));
375                         StreamSize = Chunk.dwSize - sizeof(FOURCC);
376                         StreamCount = 0;
377                         if (Chunk.fccID == DMUS_FOURCC_SEGMENT_FORM) {
378                                 TRACE_(dmfile)(": segment form\n");
379                                 do {
380                                         IStream_Read (pStream, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
381                                         StreamCount += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize;
382                                         TRACE_(dmfile)(": %s chunk (size = 0x%04lx)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
383                                         switch (Chunk.fccID) {
384                                                 case DMUS_FOURCC_GUID_CHUNK: {
385                                                         TRACE_(dmfile)(": GUID chunk\n");
386                                                         pDesc->dwValidData |= DMUS_OBJ_OBJECT;
387                                                         IStream_Read (pStream, &pDesc->guidObject, Chunk.dwSize, NULL);
388                                                         break;
389                                                 }
390                                                 case DMUS_FOURCC_VERSION_CHUNK: {
391                                                         TRACE_(dmfile)(": version chunk\n");
392                                                         pDesc->dwValidData |= DMUS_OBJ_VERSION;
393                                                         IStream_Read (pStream, &pDesc->vVersion, Chunk.dwSize, NULL);
394                                                         break;
395                                                 }
396                                                 case DMUS_FOURCC_CATEGORY_CHUNK: {
397                                                         TRACE_(dmfile)(": category chunk\n");
398                                                         pDesc->dwValidData |= DMUS_OBJ_CATEGORY;
399                                                         IStream_Read (pStream, pDesc->wszCategory, Chunk.dwSize, NULL);
400                                                         break;
401                                                 }
402                                                 case FOURCC_LIST: {
403                                                         IStream_Read (pStream, &Chunk.fccID, sizeof(FOURCC), NULL);                             
404                                                         TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID));
405                                                         ListSize[0] = Chunk.dwSize - sizeof(FOURCC);
406                                                         ListCount[0] = 0;
407                                                         switch (Chunk.fccID) {
408                                                                 /* evil M$ UNFO list, which can (!?) contain INFO elements */
409                                                                 case DMUS_FOURCC_UNFO_LIST: {
410                                                                         TRACE_(dmfile)(": UNFO list\n");
411                                                                         do {
412                                                                                 IStream_Read (pStream, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL);
413                                                                                 ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize;
414                                                                                 TRACE_(dmfile)(": %s chunk (size = 0x%04lx)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize);
415                                                                                 switch (Chunk.fccID) {
416                                                                                         /* don't ask me why, but M$ puts INFO elements in UNFO list sometimes
417                                              (though strings seem to be valid unicode) */
418                                                                                         case mmioFOURCC('I','N','A','M'):
419                                                                                         case DMUS_FOURCC_UNAM_CHUNK: {
420                                                                                                 TRACE_(dmfile)(": name chunk\n");
421                                                                                                 pDesc->dwValidData |= DMUS_OBJ_NAME;
422                                                                                                 IStream_Read (pStream, pDesc->wszName, Chunk.dwSize, NULL);
423                                                                                                 break;
424                                                                                         }
425                                                                                         case mmioFOURCC('I','A','R','T'):
426                                                                                         case DMUS_FOURCC_UART_CHUNK: {
427                                                                                                 TRACE_(dmfile)(": artist chunk (ignored)\n");
428                                                                                                 liMove.QuadPart = Chunk.dwSize;
429                                                                                                 IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL);
430                                                                                                 break;
431                                                                                         }
432                                                                                         case mmioFOURCC('I','C','O','P'):
433                                                                                         case DMUS_FOURCC_UCOP_CHUNK: {
434                                                                                                 TRACE_(dmfile)(": copyright chunk (ignored)\n");
435                                                                                                 liMove.QuadPart = Chunk.dwSize;
436                                                                                                 IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL);
437                                                                                                 break;
438                                                                                         }
439                                                                                         case mmioFOURCC('I','S','B','J'):
440                                                                                         case DMUS_FOURCC_USBJ_CHUNK: {
441                                                                                                 TRACE_(dmfile)(": subject chunk (ignored)\n");
442                                                                                                 liMove.QuadPart = Chunk.dwSize;
443                                                                                                 IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL);
444                                                                                                 break;
445                                                                                         }
446                                                                                         case mmioFOURCC('I','C','M','T'):
447                                                                                         case DMUS_FOURCC_UCMT_CHUNK: {
448                                                                                                 TRACE_(dmfile)(": comment chunk (ignored)\n");
449                                                                                                 liMove.QuadPart = Chunk.dwSize;
450                                                                                                 IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL);
451                                                                                                 break;
452                                                                                         }
453                                                                                         default: {
454                                                                                                 TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
455                                                                                                 liMove.QuadPart = Chunk.dwSize;
456                                                                                                 IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL);
457                                                                                                 break;                                          
458                                                                                         }
459                                                                                 }
460                                                                                 TRACE_(dmfile)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]);
461                                                                         } while (ListCount[0] < ListSize[0]);
462                                                                         break;
463                                                                 }
464                                                                 default: {
465                                                                         TRACE_(dmfile)(": unknown (skipping)\n");
466                                                                         liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC);
467                                                                         IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL);
468                                                                         break;                                          
469                                                                 }
470                                                         }
471                                                         break;
472                                                 }       
473                                                 default: {
474                                                         TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
475                                                         liMove.QuadPart = Chunk.dwSize;
476                                                         IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL);
477                                                         break;                                          
478                                                 }
479                                         }
480                                         TRACE_(dmfile)(": StreamCount[0] = %ld < StreamSize[0] = %ld\n", StreamCount, StreamSize);
481                                 } while (StreamCount < StreamSize);
482                                 break;
483                         } else {
484                                 TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
485                                 liMove.QuadPart = StreamSize;
486                                 IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
487                                 return E_FAIL;
488                         }
489                 
490                         TRACE_(dmfile)(": reading finished\n");
491                         break;
492                 }
493                 default: {
494                         TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
495                         liMove.QuadPart = Chunk.dwSize;
496                         IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
497                         return DMUS_E_INVALIDFILE;
498                 }
499         }       
500         
501         TRACE(": returning descriptor:\n%s\n", debugstr_DMUS_OBJECTDESC (pDesc));
502         
503         return S_OK;
504 }
505
506 ICOM_VTABLE(IDirectMusicObject) DirectMusicSegment8_Object_Vtbl = {
507     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
508         IDirectMusicSegment8Impl_IDirectMusicObject_QueryInterface,
509         IDirectMusicSegment8Impl_IDirectMusicObject_AddRef,
510         IDirectMusicSegment8Impl_IDirectMusicObject_Release,
511         IDirectMusicSegment8Impl_IDirectMusicObject_GetDescriptor,
512         IDirectMusicSegment8Impl_IDirectMusicObject_SetDescriptor,
513         IDirectMusicSegment8Impl_IDirectMusicObject_ParseDescriptor
514 };
515
516 /* IDirectMusicSegment8Impl IPersistStream part: */
517 HRESULT WINAPI IDirectMusicSegment8Impl_IPersistStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj) {
518         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, PersistStreamVtbl, iface);
519         return IDirectMusicSegment8Impl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
520 }
521
522 ULONG WINAPI IDirectMusicSegment8Impl_IPersistStream_AddRef (LPPERSISTSTREAM iface) {
523         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, PersistStreamVtbl, iface);
524         return IDirectMusicSegment8Impl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
525 }
526
527 ULONG WINAPI IDirectMusicSegment8Impl_IPersistStream_Release (LPPERSISTSTREAM iface) {
528         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, PersistStreamVtbl, iface);
529         return IDirectMusicSegment8Impl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
530 }
531
532 HRESULT WINAPI IDirectMusicSegment8Impl_IPersistStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) {
533         return E_NOTIMPL;
534 }
535
536 HRESULT WINAPI IDirectMusicSegment8Impl_IPersistStream_IsDirty (LPPERSISTSTREAM iface) {
537         return E_NOTIMPL;
538 }
539
540 HRESULT WINAPI IDirectMusicSegment8Impl_IPersistStream_Load (LPPERSISTSTREAM iface, IStream* pStm) {
541         ICOM_THIS_MULTI(IDirectMusicSegment8Impl, PersistStreamVtbl, iface);
542         FOURCC chunkID;
543         DWORD chunkSize, StreamSize, StreamCount, ListSize[3], ListCount[3];
544         LARGE_INTEGER liMove; /* used when skipping chunks */
545
546         FIXME("(%p, %p): Loading not implemented yet\n", This, pStm);
547         IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
548         IStream_Read (pStm, &chunkSize, sizeof(DWORD), NULL);
549         TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
550         switch (chunkID) {      
551                 case FOURCC_RIFF: {
552                         IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);                            
553                         TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(chunkID));
554                         StreamSize = chunkSize - sizeof(FOURCC);
555                         StreamCount = 0;
556                         switch (chunkID) {
557                                 case DMUS_FOURCC_SEGMENT_FORM: {
558                                         TRACE_(dmfile)(": segment form\n");
559                                         do {
560                                                 IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
561                                                 IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
562                                                 StreamCount += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
563                                                 TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
564                                                 switch (chunkID) {
565                                                         case DMUS_FOURCC_GUID_CHUNK: {
566                                                                 TRACE_(dmfile)(": GUID chunk\n");
567                                                                 This->pDesc->dwValidData |= DMUS_OBJ_OBJECT;
568                                                                 IStream_Read (pStm, &This->pDesc->guidObject, chunkSize, NULL);
569                                                                 break;
570                                                         }
571                                                         case DMUS_FOURCC_VERSION_CHUNK: {
572                                                                 TRACE_(dmfile)(": version chunk\n");
573                                                                 This->pDesc->dwValidData |= DMUS_OBJ_VERSION;
574                                                                 IStream_Read (pStm, &This->pDesc->vVersion, chunkSize, NULL);
575                                                                 break;
576                                                         }
577                                                         case DMUS_FOURCC_CATEGORY_CHUNK: {
578                                                                 TRACE_(dmfile)(": category chunk\n");
579                                                                 This->pDesc->dwValidData |= DMUS_OBJ_CATEGORY;
580                                                                 IStream_Read (pStm, This->pDesc->wszCategory, chunkSize, NULL);
581                                                                 break;
582                                                         }
583                                                         case FOURCC_LIST: {
584                                                                 IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);                            
585                                                                 TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
586                                                                 ListSize[0] = chunkSize - sizeof(FOURCC);
587                                                                 ListCount[0] = 0;
588                                                                 switch (chunkID) {
589                                                                         case DMUS_FOURCC_UNFO_LIST: {
590                                                                                 TRACE_(dmfile)(": UNFO list\n");
591                                                                                 do {
592                                                                                         IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
593                                                                                         IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
594                                                                                         ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
595                                                                                         TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
596                                                                                         switch (chunkID) {
597                                                                                                 /* don't ask me why, but M$ puts INFO elements in UNFO list sometimes
598                                               (though strings seem to be valid unicode) */
599                                                                                                 case mmioFOURCC('I','N','A','M'):
600                                                                                                 case DMUS_FOURCC_UNAM_CHUNK: {
601                                                                                                         TRACE_(dmfile)(": name chunk\n");
602                                                                                                         This->pDesc->dwValidData |= DMUS_OBJ_NAME;
603                                                                                                         IStream_Read (pStm, This->pDesc->wszName, chunkSize, NULL);
604                                                                                                         break;
605                                                                                                 }
606                                                                                                 case mmioFOURCC('I','A','R','T'):
607                                                                                                 case DMUS_FOURCC_UART_CHUNK: {
608                                                                                                         TRACE_(dmfile)(": artist chunk (ignored)\n");
609                                                                                                         liMove.QuadPart = chunkSize;
610                                                                                                         IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
611                                                                                                         break;
612                                                                                                 }
613                                                                                                 case mmioFOURCC('I','C','O','P'):
614                                                                                                 case DMUS_FOURCC_UCOP_CHUNK: {
615                                                                                                         TRACE_(dmfile)(": copyright chunk (ignored)\n");
616                                                                                                         liMove.QuadPart = chunkSize;
617                                                                                                         IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
618                                                                                                         break;
619                                                                                                 }
620                                                                                                 case mmioFOURCC('I','S','B','J'):
621                                                                                                 case DMUS_FOURCC_USBJ_CHUNK: {
622                                                                                                         TRACE_(dmfile)(": subject chunk (ignored)\n");
623                                                                                                         liMove.QuadPart = chunkSize;
624                                                                                                         IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
625                                                                                                         break;
626                                                                                                 }
627                                                                                                 case mmioFOURCC('I','C','M','T'):
628                                                                                                 case DMUS_FOURCC_UCMT_CHUNK: {
629                                                                                                         TRACE_(dmfile)(": comment chunk (ignored)\n");
630                                                                                                         liMove.QuadPart = chunkSize;
631                                                                                                         IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
632                                                                                                         break;
633                                                                                                 }
634                                                                                                 default: {
635                                                                                                         TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
636                                                                                                         liMove.QuadPart = chunkSize;
637                                                                                                         IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
638                                                                                                         break;                                          
639                                                                                                 }
640                                                                                         }
641                                                                                         TRACE_(dmfile)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]);
642                                                                                 } while (ListCount[0] < ListSize[0]);
643                                                                                 break;
644                                                                         }
645                                                                         default: {
646                                                                                 TRACE_(dmfile)(": unknown (skipping)\n");
647                                                                                 liMove.QuadPart = chunkSize - sizeof(FOURCC);
648                                                                                 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
649                                                                                 break;                                          
650                                                                         }
651                                                                 }
652                                                                 break;
653                                                         }       
654                                                         default: {
655                                                                 TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n");
656                                                                 liMove.QuadPart = chunkSize;
657                                                                 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
658                                                                 break;                                          
659                                                         }
660                                                 }
661                                                 TRACE_(dmfile)(": StreamCount[0] = %ld < StreamSize[0] = %ld\n", StreamCount, StreamSize);
662                                         } while (StreamCount < StreamSize);
663                                         break;
664                                 }
665                                 default: {
666                                         TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
667                                         liMove.QuadPart = StreamSize;
668                                         IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
669                                         return E_FAIL;
670                                 }
671                         }
672                         TRACE_(dmfile)(": reading finished\n");
673                         break;
674                 }
675                 default: {
676                         TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
677                         liMove.QuadPart = chunkSize;
678                         IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
679                         return E_FAIL;
680                 }
681         }
682
683         return S_OK;
684 }
685
686 HRESULT WINAPI IDirectMusicSegment8Impl_IPersistStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty) {
687         return E_NOTIMPL;
688 }
689
690 HRESULT WINAPI IDirectMusicSegment8Impl_IPersistStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize) {
691         return E_NOTIMPL;
692 }
693
694 ICOM_VTABLE(IPersistStream) DirectMusicSegment8_PersistStream_Vtbl = {
695     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
696         IDirectMusicSegment8Impl_IPersistStream_QueryInterface,
697         IDirectMusicSegment8Impl_IPersistStream_AddRef,
698         IDirectMusicSegment8Impl_IPersistStream_Release,
699         IDirectMusicSegment8Impl_IPersistStream_GetClassID,
700         IDirectMusicSegment8Impl_IPersistStream_IsDirty,
701         IDirectMusicSegment8Impl_IPersistStream_Load,
702         IDirectMusicSegment8Impl_IPersistStream_Save,
703         IDirectMusicSegment8Impl_IPersistStream_GetSizeMax
704 };
705
706 /* for ClassFactory */
707 HRESULT WINAPI DMUSIC_CreateDirectMusicSegmentImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) {
708         IDirectMusicSegment8Impl* obj;
709         
710         obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicSegment8Impl));
711         if (NULL == obj) {
712                 *ppobj = (LPVOID) NULL;
713                 return E_OUTOFMEMORY;
714         }
715         obj->UnknownVtbl = &DirectMusicSegment8_Unknown_Vtbl;
716         obj->SegmentVtbl = &DirectMusicSegment8_Segment_Vtbl;
717         obj->ObjectVtbl = &DirectMusicSegment8_Object_Vtbl;
718         obj->PersistStreamVtbl = &DirectMusicSegment8_PersistStream_Vtbl;
719         obj->pDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_OBJECTDESC));
720         DM_STRUCT_INIT(obj->pDesc);
721         obj->pDesc->dwValidData |= DMUS_OBJ_CLASS;
722         memcpy (&obj->pDesc->guidClass, &CLSID_DirectMusicSegment, sizeof (CLSID));
723         obj->ref = 0; /* will be inited by QueryInterface */
724         
725         return IDirectMusicSegment8Impl_IUnknown_QueryInterface ((LPUNKNOWN)&obj->UnknownVtbl, lpcGUID, ppobj);
726 }