ReactOS 0.4.17-dev-923-g4c9a150
bandtrack.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2003-2004 Rok Mandeljc
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include "dmband_private.h"
20#include "dmusic_band.h"
21#include "dmobject.h"
22
24
26{
27 struct list entry;
29 IDirectMusicBand *band;
30};
31
33{
35 free(entry);
36}
37
39{
40 IDirectMusicTrack8 IDirectMusicTrack8_iface;
41 struct dmobject dmobj; /* IPersistStream only */
44 struct list bands;
45};
46
47static inline struct band_track *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface)
48{
50}
51
52static HRESULT WINAPI band_track_QueryInterface(IDirectMusicTrack8 *iface, REFIID riid,
53 void **ret_iface)
54{
56
57 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
58
59 *ret_iface = NULL;
60
61 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectMusicTrack) ||
62 IsEqualIID(riid, &IID_IDirectMusicTrack8))
63 *ret_iface = iface;
65 *ret_iface = &This->dmobj.IPersistStream_iface;
66 else {
67 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface);
68 return E_NOINTERFACE;
69 }
70
71 IUnknown_AddRef((IUnknown*)*ret_iface);
72 return S_OK;
73}
74
75static ULONG WINAPI band_track_AddRef(IDirectMusicTrack8 *iface)
76{
79
80 TRACE("(%p) ref=%ld\n", This, ref);
81
82 return ref;
83}
84
85static ULONG WINAPI band_track_Release(IDirectMusicTrack8 *iface)
86{
89
90 TRACE("(%p) ref=%ld\n", This, ref);
91
92 if (!ref)
93 {
94 struct band_entry *entry, *next;
95
97 {
98 list_remove(&entry->entry);
100 }
101
102 free(This);
103 }
104
105 return ref;
106}
107
108static HRESULT WINAPI band_track_Init(IDirectMusicTrack8 *iface, IDirectMusicSegment *segment)
109{
111
112 FIXME("(%p, %p): stub\n", This, segment);
113
114 if (!segment) return E_POINTER;
115 return S_OK;
116}
117
118static HRESULT WINAPI band_track_InitPlay(IDirectMusicTrack8 *iface,
119 IDirectMusicSegmentState *segment_state, IDirectMusicPerformance *performance,
120 void **state_data, DWORD virtual_track8id, DWORD flags)
121{
123 struct band_entry *entry;
124 HRESULT hr;
125
126 FIXME("(%p, %p, %p, %p, %ld, %lx): semi-stub\n", This, segment_state, performance, state_data, virtual_track8id, flags);
127
128 if (!performance) return E_POINTER;
129
130 if (This->header.bAutoDownload)
131 {
133 {
135 return hr;
136 }
137 }
138
139 return S_OK;
140}
141
142static HRESULT WINAPI band_track_EndPlay(IDirectMusicTrack8 *iface, void *state_data)
143{
145 struct band_entry *entry;
146 HRESULT hr;
147
148 FIXME("(%p, %p): semi-stub\n", This, state_data);
149
150 if (This->header.bAutoDownload)
151 {
153 {
155 return hr;
156 }
157 }
158
159 return S_OK;
160}
161
162static HRESULT WINAPI band_track_Play(IDirectMusicTrack8 *iface, void *state_data,
163 MUSIC_TIME start_time, MUSIC_TIME end_time, MUSIC_TIME time_offset, DWORD track_flags,
164 IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD track_id)
165{
167 IDirectMusicGraph *graph;
168 struct band_entry *entry;
169 HRESULT hr;
170
171 TRACE("(%p, %p, %ld, %ld, %ld, %#lx, %p, %p, %ld)\n", This, state_data, start_time, end_time,
172 time_offset, track_flags, performance, segment_state, track_id);
173
174 if (!performance) return DMUS_S_END;
175
176 if (track_flags) FIXME("track_flags %#lx not implemented\n", track_flags);
177 if (segment_state) FIXME("segment_state %p not implemented\n", segment_state);
178
180 &IID_IDirectMusicGraph, (void **)&graph)))
181 return hr;
182
184 {
185 MUSIC_TIME music_time = entry->head.lBandTimeLogical;
186 if (music_time == -1 && !(track_flags & DMUS_TRACKF_START)) continue;
187 else if (music_time != -1)
188 {
189 if (music_time < start_time || music_time >= end_time) continue;
190 music_time += time_offset;
191 }
192
193 if (FAILED(hr = band_send_messages(entry->band, performance, graph, music_time, track_id)))
194 break;
195 }
196
198 return hr;
199}
200
201static HRESULT WINAPI band_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time,
202 MUSIC_TIME *out_next, void *param)
203{
205 struct band_entry *band, *next_band;
206 DMUS_BAND_PARAM *bandparam;
207
208 TRACE("(%p, %s, %ld, %p, %p)\n", This, debugstr_dmguid(type), time, out_next, param);
209
210 if (!type)
211 return E_POINTER;
212 if (!IsEqualGUID(type, &GUID_BandParam))
214 if (list_empty(&This->bands))
215 return DMUS_E_NOT_FOUND;
216
217 bandparam = param;
218 if (out_next) *out_next = 0;
219
220 LIST_FOR_EACH_ENTRY_SAFE(band, next_band, &This->bands, struct band_entry, entry)
221 {
222 /* we want to return the first band even when there's nothing with lBandTime <= time */
223 bandparam->pBand = band->band;
224 bandparam->mtTimePhysical = band->head.lBandTimePhysical;
225 if (band->entry.next == &This->bands) break;
226 if (out_next) *out_next = next_band->head.lBandTimeLogical;
227 if (next_band->head.lBandTimeLogical > time) break;
228 }
229
230 IDirectMusicBand_AddRef(bandparam->pBand);
231 return S_OK;
232}
233
234static HRESULT WINAPI band_track_SetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time,
235 void *param)
236{
238
239 TRACE("(%p, %s, %ld, %p)\n", This, debugstr_dmguid(type), time, param);
240
241 if (!type)
242 return E_POINTER;
245
246 if (IsEqualGUID(type, &GUID_BandParam))
247 {
248 struct band_entry *new_entry = NULL, *entry, *next_entry;
249 DMUS_BAND_PARAM *band_param = param;
250 if (!band_param || !band_param->pBand)
251 return E_POINTER;
252 if (!(new_entry = calloc(1, sizeof(*new_entry))))
253 return E_OUTOFMEMORY;
254 new_entry->band = band_param->pBand;
255 new_entry->head.lBandTimeLogical = time;
256 new_entry->head.lBandTimePhysical = band_param->mtTimePhysical;
257 IDirectMusicBand_AddRef(new_entry->band);
258 if (list_empty(&This->bands))
259 list_add_tail(&This->bands, &new_entry->entry);
260 else
261 {
262 LIST_FOR_EACH_ENTRY_SAFE(entry, next_entry, &This->bands, struct band_entry, entry)
263 if (entry->entry.next == &This->bands || next_entry->head.lBandTimeLogical > time)
264 {
265 list_add_after(&entry->entry, &new_entry->entry);
266 break;
267 }
268 }
269 }
270 else if (IsEqualGUID(type, &GUID_Clear_All_Bands))
271 FIXME("GUID_Clear_All_Bands not handled yet\n");
272 else if (IsEqualGUID(type, &GUID_ConnectToDLSCollection))
273 {
274 struct band_entry *entry;
275
278 }
279 else if (IsEqualGUID(type, &GUID_Disable_Auto_Download))
280 This->header.bAutoDownload = FALSE;
281 else if (IsEqualGUID(type, &GUID_Download))
282 FIXME("GUID_Download not handled yet\n");
283 else if (IsEqualGUID(type, &GUID_DownloadToAudioPath))
284 {
285 IDirectMusicPerformance *performance;
286 IDirectMusicAudioPath *audio_path;
287 IUnknown *object = param;
288 struct band_entry *entry;
289 HRESULT hr;
290
291 if (FAILED(hr = IDirectMusicAudioPath_QueryInterface(object, &IID_IDirectMusicPerformance8, (void **)&performance))
292 && SUCCEEDED(hr = IDirectMusicAudioPath_QueryInterface(object, &IID_IDirectMusicAudioPath, (void **)&audio_path)))
293 {
295 &GUID_All_Objects, 0, &IID_IDirectMusicPerformance8, (void **)&performance);
297 }
298
299 if (FAILED(hr))
300 {
301 WARN("Failed to get IDirectMusicPerformance from param %p\n", param);
302 return hr;
303 }
304
307
309 }
310 else if (IsEqualGUID(type, &GUID_Enable_Auto_Download))
311 This->header.bAutoDownload = TRUE;
312 else if (IsEqualGUID(type, &GUID_IDirectMusicBand))
313 FIXME("GUID_IDirectMusicBand not handled yet\n");
314 else if (IsEqualGUID(type, &GUID_StandardMIDIFile))
315 FIXME("GUID_StandardMIDIFile not handled yet\n");
316 else if (IsEqualGUID(type, &GUID_UnloadFromAudioPath))
317 {
318 struct band_entry *entry;
319 HRESULT hr;
320
322 if (FAILED(hr = IDirectMusicBand_Unload(entry->band, NULL))) break;
323 }
324
325 return S_OK;
326}
327
328static HRESULT WINAPI band_track_IsParamSupported(IDirectMusicTrack8 *iface, REFGUID rguidType)
329{
331
332 TRACE("(%p, %s)\n", This, debugstr_dmguid(rguidType));
333
334 if (!rguidType)
335 return E_POINTER;
336
337 if (IsEqualGUID (rguidType, &GUID_BandParam)
338 || IsEqualGUID (rguidType, &GUID_Clear_All_Bands)
339 || IsEqualGUID (rguidType, &GUID_ConnectToDLSCollection)
340 || IsEqualGUID (rguidType, &GUID_Disable_Auto_Download)
341 || IsEqualGUID (rguidType, &GUID_Download)
342 || IsEqualGUID (rguidType, &GUID_DownloadToAudioPath)
343 || IsEqualGUID (rguidType, &GUID_Enable_Auto_Download)
344 || IsEqualGUID (rguidType, &GUID_IDirectMusicBand)
345 || IsEqualGUID (rguidType, &GUID_StandardMIDIFile)
346 || IsEqualGUID (rguidType, &GUID_Unload)
347 || IsEqualGUID (rguidType, &GUID_UnloadFromAudioPath)) {
348 TRACE("param supported\n");
349 return S_OK;
350 }
351
352 TRACE("param unsupported\n");
354}
355
356static HRESULT WINAPI band_track_AddNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype)
357{
359
360 TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype));
361 return E_NOTIMPL;
362}
363
364static HRESULT WINAPI band_track_RemoveNotificationType(IDirectMusicTrack8 *iface,
365 REFGUID notiftype)
366{
368
369 TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype));
370 return E_NOTIMPL;
371}
372
373static HRESULT WINAPI band_track_Clone(IDirectMusicTrack8 *iface, MUSIC_TIME mtStart,
374 MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
375{
377 FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack);
378 return S_OK;
379}
380
381static HRESULT WINAPI band_track_PlayEx(IDirectMusicTrack8 *iface, void *state_data,
382 REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD flags,
383 IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state,
384 DWORD virtual_id)
385{
387
388 FIXME("(%p, %p, 0x%s, 0x%s, 0x%s, %lx, %p, %p, %ld): stub\n", This, state_data, wine_dbgstr_longlong(rtStart),
390
391 return S_OK;
392}
393
394static HRESULT WINAPI band_track_GetParamEx(IDirectMusicTrack8 *iface,
395 REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *rtNext, void *param,
396 void *state_data, DWORD flags)
397{
399
400 FIXME("(%p, %s, 0x%s, %p, %p, %p, %lx): stub\n", This, debugstr_dmguid(rguidType),
401 wine_dbgstr_longlong(rtTime), rtNext, param, state_data, flags);
402
403 return S_OK;
404}
405
406static HRESULT WINAPI band_track_SetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType,
407 REFERENCE_TIME rtTime, void *param, void *state_data, DWORD flags)
408{
410
411 FIXME("(%p, %s, 0x%s, %p, %p, %lx): stub\n", This, debugstr_dmguid(rguidType),
412 wine_dbgstr_longlong(rtTime), param, state_data, flags);
413
414 return S_OK;
415}
416
417static HRESULT WINAPI band_track_Compose(IDirectMusicTrack8 *iface, IUnknown *context,
418 DWORD trackgroup, IDirectMusicTrack **track)
419{
421
422 TRACE("(%p, %p, %ld, %p): method not implemented\n", This, context, trackgroup, track);
423 return E_NOTIMPL;
424}
425
426static HRESULT WINAPI band_track_Join(IDirectMusicTrack8 *iface, IDirectMusicTrack *pNewTrack,
427 MUSIC_TIME mtJoin, IUnknown *pContext, DWORD dwTrackGroup,
428 IDirectMusicTrack **ppResultTrack)
429{
431 FIXME("(%p, %p, %ld, %p, %ld, %p): stub\n", This, pNewTrack, mtJoin, pContext, dwTrackGroup, ppResultTrack);
432 return S_OK;
433}
434
435static const IDirectMusicTrack8Vtbl band_track_vtbl =
436{
455};
456
458{
459 struct chunk_entry chunk = {.parent = parent};
461 struct band_entry *entry;
462 IDirectMusicBand *band;
463 HRESULT hr;
464
465 while ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
466 {
467 switch (MAKE_IDTYPE(chunk.id, chunk.type))
468 {
470 {
472
474 {
475 header2.lBandTimeLogical = header.lBandTime;
476 header2.lBandTimePhysical = header.lBandTime;
477 }
478
479 break;
480 }
481
483 hr = stream_chunk_get_data(stream, &chunk, &header2, sizeof(header2));
484 break;
485
487 {
488 IPersistStream *persist;
489
490 if (FAILED(hr = CoCreateInstance(&CLSID_DirectMusicBand, NULL, CLSCTX_INPROC_SERVER,
491 &IID_IDirectMusicBand, (void **)&band)))
492 break;
493
495 {
497 hr = IPersistStream_Load(persist, stream);
498 IPersistStream_Release(persist);
499 }
500
501 break;
502 }
503
504 default:
505 FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
506 break;
507 }
508
509 if (FAILED(hr)) break;
510 }
511
512 if (FAILED(hr)) return hr;
513
514 if (!(entry = calloc(1, sizeof(*entry)))) return E_OUTOFMEMORY;
515 entry->head = header2;
516 entry->band = band;
518 list_add_tail(&This->bands, &entry->entry);
519
520 return S_OK;
521}
522
524{
525 struct chunk_entry chunk = {.parent = parent};
526 HRESULT hr;
527
528 while ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
529 {
530 switch (MAKE_IDTYPE(chunk.id, chunk.type))
531 {
534 break;
535
536 default:
537 FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
538 break;
539 }
540
541 if (FAILED(hr)) break;
542 }
543
544 return S_OK;
545}
546
548{
549 struct chunk_entry chunk = {.parent = parent};
550 HRESULT hr;
551
552 if (FAILED(hr = dmobj_parsedescriptor(stream, parent, &This->dmobj.desc,
555 return hr;
556
557 while ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
558 {
559 switch (MAKE_IDTYPE(chunk.id, chunk.type))
560 {
564 /* already parsed by dmobj_parsedescriptor */
565 break;
566
568 hr = stream_chunk_get_data(stream, &chunk, &This->header, sizeof(This->header));
569 break;
570
573 break;
574
575 default:
576 FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
577 break;
578 }
579
580 if (FAILED(hr)) break;
581 }
582
583 return hr;
584}
585
587{
588 return CONTAINING_RECORD(iface, struct band_track, dmobj.IPersistStream_iface);
589}
590
592{
594 struct chunk_entry chunk = {0};
595 HRESULT hr;
596
597 TRACE("(%p, %p)\n", This, stream);
598
599 if ((hr = stream_get_chunk(stream, &chunk)) == S_OK)
600 {
601 switch (MAKE_IDTYPE(chunk.id, chunk.type))
602 {
605 break;
606
607 default:
608 WARN("Invalid band track chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
610 break;
611 }
612 }
613
615 if (FAILED(hr)) return hr;
616
617 if (TRACE_ON(dmband))
618 {
619 struct band_entry *entry;
620 int i = 0;
621
622 TRACE("Loaded DirectMusicBandTrack %p\n", This);
623 dump_DMUS_OBJECTDESC(&This->dmobj.desc);
624
625 TRACE(" - header:\n");
626 TRACE(" - bAutoDownload: %u\n", This->header.bAutoDownload);
627
628 TRACE(" - bands:\n");
630 {
631 TRACE(" - band[%u]: %p\n", i++, entry->band);
632 TRACE(" - lBandTimeLogical: %ld\n", entry->head.lBandTimeLogical);
633 TRACE(" - lBandTimePhysical: %ld\n", entry->head.lBandTimePhysical);
634 }
635 }
636
637 return S_OK;
638}
639
640static const IPersistStreamVtbl band_track_persist_stream_vtbl =
641{
650};
651
652/* for ClassFactory */
653HRESULT create_dmbandtrack(REFIID lpcGUID, void **ppobj)
654{
655 struct band_track *track;
656 HRESULT hr;
657
658 *ppobj = NULL;
659 if (!(track = calloc(1, sizeof(*track)))) return E_OUTOFMEMORY;
661 track->ref = 1;
662 dmobject_init(&track->dmobj, &CLSID_DirectMusicBandTrack, (IUnknown *)&track->IDirectMusicTrack8_iface);
663 track->dmobj.IPersistStream_iface.lpVtbl = &band_track_persist_stream_vtbl;
664 list_init(&track->bands);
665
668
669 return hr;
670}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
HRESULT band_connect_to_collection(IDirectMusicBand *iface, IDirectMusicCollection *collection)
Definition: band.c:477
HRESULT band_send_messages(IDirectMusicBand *iface, IDirectMusicPerformance *performance, IDirectMusicGraph *graph, MUSIC_TIME time, DWORD track_id)
Definition: band.c:489
static HRESULT WINAPI band_track_AddNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype)
Definition: bandtrack.c:356
static HRESULT WINAPI band_track_SetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, void *param, void *state_data, DWORD flags)
Definition: bandtrack.c:406
static struct band_track * impl_from_IPersistStream(IPersistStream *iface)
Definition: bandtrack.c:586
static HRESULT WINAPI band_track_IsParamSupported(IDirectMusicTrack8 *iface, REFGUID rguidType)
Definition: bandtrack.c:328
static HRESULT WINAPI band_track_QueryInterface(IDirectMusicTrack8 *iface, REFIID riid, void **ret_iface)
Definition: bandtrack.c:52
static void band_entry_destroy(struct band_entry *entry)
Definition: bandtrack.c:32
static HRESULT WINAPI band_track_Init(IDirectMusicTrack8 *iface, IDirectMusicSegment *segment)
Definition: bandtrack.c:108
static struct band_track * impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface)
Definition: bandtrack.c:47
static HRESULT WINAPI band_track_persist_stream_Load(IPersistStream *iface, IStream *stream)
Definition: bandtrack.c:591
static HRESULT WINAPI band_track_EndPlay(IDirectMusicTrack8 *iface, void *state_data)
Definition: bandtrack.c:142
static HRESULT WINAPI band_track_Join(IDirectMusicTrack8 *iface, IDirectMusicTrack *pNewTrack, MUSIC_TIME mtJoin, IUnknown *pContext, DWORD dwTrackGroup, IDirectMusicTrack **ppResultTrack)
Definition: bandtrack.c:426
static ULONG WINAPI band_track_AddRef(IDirectMusicTrack8 *iface)
Definition: bandtrack.c:75
static HRESULT WINAPI band_track_InitPlay(IDirectMusicTrack8 *iface, IDirectMusicSegmentState *segment_state, IDirectMusicPerformance *performance, void **state_data, DWORD virtual_track8id, DWORD flags)
Definition: bandtrack.c:118
static ULONG WINAPI band_track_Release(IDirectMusicTrack8 *iface)
Definition: bandtrack.c:85
static HRESULT WINAPI band_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, MUSIC_TIME *out_next, void *param)
Definition: bandtrack.c:201
static HRESULT parse_lbdl_list(struct band_track *This, IStream *stream, struct chunk_entry *parent)
Definition: bandtrack.c:523
static HRESULT WINAPI band_track_SetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, void *param)
Definition: bandtrack.c:234
static HRESULT WINAPI band_track_PlayEx(IDirectMusicTrack8 *iface, void *state_data, REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD flags, IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD virtual_id)
Definition: bandtrack.c:381
static const IDirectMusicTrack8Vtbl band_track_vtbl
Definition: bandtrack.c:435
HRESULT create_dmbandtrack(REFIID lpcGUID, void **ppobj)
Definition: bandtrack.c:653
static const IPersistStreamVtbl band_track_persist_stream_vtbl
Definition: bandtrack.c:640
static HRESULT parse_dmbt_chunk(struct band_track *This, IStream *stream, struct chunk_entry *parent)
Definition: bandtrack.c:547
static HRESULT WINAPI band_track_RemoveNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype)
Definition: bandtrack.c:364
static HRESULT parse_lbnd_list(struct band_track *This, IStream *stream, struct chunk_entry *parent)
Definition: bandtrack.c:457
static HRESULT WINAPI band_track_Play(IDirectMusicTrack8 *iface, void *state_data, MUSIC_TIME start_time, MUSIC_TIME end_time, MUSIC_TIME time_offset, DWORD track_flags, IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD track_id)
Definition: bandtrack.c:162
static HRESULT WINAPI band_track_Compose(IDirectMusicTrack8 *iface, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **track)
Definition: bandtrack.c:417
static HRESULT WINAPI band_track_GetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *rtNext, void *param, void *state_data, DWORD flags)
Definition: bandtrack.c:394
static HRESULT WINAPI band_track_Clone(IDirectMusicTrack8 *iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
Definition: bandtrack.c:373
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static int list_empty(struct list_entry *head)
Definition: list.h:58
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
Definition: list.h:39
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
#define TRACE_ON(x)
Definition: compat.h:75
#define DMUS_E_GET_UNSUPPORTED
Definition: dmerror.h:72
#define DMUS_E_UNSUPPORTED_STREAM
Definition: dmerror.h:100
#define DMUS_S_END
Definition: dmerror.h:44
#define DMUS_E_NOT_FOUND
Definition: dmerror.h:109
#define DMUS_E_TYPE_UNSUPPORTED
Definition: dmerror.h:112
void dmobject_init(struct dmobject *dmobj, const GUID *class, IUnknown *outer_unk)
Definition: dmobject.c:749
HRESULT stream_chunk_get_data(IStream *stream, const struct chunk_entry *chunk, void *data, ULONG size)
Definition: dmobject.c:417
HRESULT stream_next_chunk(IStream *stream, struct chunk_entry *chunk)
Definition: dmobject.c:360
ULONG WINAPI dmobj_IPersistStream_Release(IPersistStream *iface)
Definition: dmobject.c:702
HRESULT dmobj_parsedescriptor(IStream *stream, const struct chunk_entry *riff, DMUS_OBJECTDESC *desc, DWORD supported)
Definition: dmobject.c:591
HRESULT WINAPI unimpl_IPersistStream_GetSizeMax(IPersistStream *iface, ULARGE_INTEGER *size)
Definition: dmobject.c:742
void dump_DMUS_OBJECTDESC(DMUS_OBJECTDESC *desc)
Definition: dmobject.c:222
HRESULT WINAPI dmobj_IPersistStream_GetClassID(IPersistStream *iface, CLSID *class)
Definition: dmobject.c:708
ULONG WINAPI dmobj_IPersistStream_AddRef(IPersistStream *iface)
Definition: dmobject.c:696
const char * debugstr_dmguid(const GUID *id)
Definition: dmobject.c:36
HRESULT WINAPI dmobj_IPersistStream_QueryInterface(IPersistStream *iface, REFIID riid, void **ret_iface)
Definition: dmobject.c:689
HRESULT stream_skip_chunk(IStream *stream, const struct chunk_entry *chunk)
Definition: dmobject.c:351
HRESULT stream_get_chunk(IStream *stream, struct chunk_entry *chunk)
Definition: dmobject.c:307
HRESULT WINAPI unimpl_IPersistStream_IsDirty(IPersistStream *iface)
Definition: dmobject.c:729
HRESULT WINAPI unimpl_IPersistStream_Save(IPersistStream *iface, IStream *stream, BOOL clear_dirty)
Definition: dmobject.c:735
static HRESULT stream_reset_chunk_data(IStream *stream, const struct chunk_entry *chunk)
Definition: dmobject.h:50
#define DMUS_OBJ_NAME_INAM
Definition: dmobject.h:96
static HRESULT stream_reset_chunk_start(IStream *stream, const struct chunk_entry *chunk)
Definition: dmobject.h:61
#define MAKE_IDTYPE(id, type)
Definition: dmobject.h:33
#define IDirectMusicTrack8_Release(p)
Definition: dmplugin.h:275
#define IDirectMusicTrack8_IsParamSupported(p, a)
Definition: dmplugin.h:283
#define IDirectMusicTrack_Release(p)
Definition: dmplugin.h:226
LONG MUSIC_TIME
Definition: dmplugin.h:95
#define IDirectMusicTrack8_QueryInterface(p, a, b)
Definition: dmplugin.h:273
@ DMUS_TRACKF_START
Definition: dmplugin.h:113
#define DMUS_FOURCC_BAND_FORM
Definition: dmusicf.h:63
#define DMUS_FOURCC_GUID_CHUNK
Definition: dmusicf.h:42
#define DMUS_FOURCC_BANDTRACK_CHUNK
Definition: dmusicf.h:146
#define DMUS_FOURCC_VERSION_CHUNK
Definition: dmusicf.h:51
#define DMUS_FOURCC_BANDS_LIST
Definition: dmusicf.h:147
#define DMUS_FOURCC_BANDTRACK_FORM
Definition: dmusicf.h:145
#define DMUS_FOURCC_UNFO_LIST
Definition: dmusicf.h:44
#define DMUS_FOURCC_BANDITEM_CHUNK2
Definition: dmusicf.h:150
#define DMUS_FOURCC_BANDITEM_CHUNK
Definition: dmusicf.h:149
#define DMUS_FOURCC_BAND_LIST
Definition: dmusicf.h:148
#define IDirectMusicBand_Download(p, a)
Definition: dmusici.h:818
#define IDirectMusicBand_Unload(p, a)
Definition: dmusici.h:819
#define IDirectMusicBand_AddRef(p)
Definition: dmusici.h:814
#define IDirectMusicBand_QueryInterface(p, a, b)
Definition: dmusici.h:813
#define IDirectMusicPerformance_QueryInterface(p, a, b)
Definition: dmusici.h:1277
#define DMUS_OBJ_NAME
Definition: dmusici.h:267
#define IDirectMusicAudioPath_QueryInterface(p, a, b)
Definition: dmusici.h:1209
#define IDirectMusicAudioPath_GetObjectInPath(p, a, b, c, d, e, f, g)
Definition: dmusici.h:1213
#define IDirectMusicGraph_Release(p)
Definition: dmusici.h:1472
#define IDirectMusicPerformance_Release(p)
Definition: dmusici.h:1279
#define DMUS_OBJ_VERSION
Definition: dmusici.h:272
#define IDirectMusicAudioPath_Release(p)
Definition: dmusici.h:1211
#define DMUS_PATH_PERFORMANCE
Definition: dmusici.h:285
#define DMUS_PCHANNEL_ALL
Definition: dmusici.h:299
#define DMUS_OBJ_OBJECT
Definition: dmusici.h:265
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
r parent
Definition: btrfs.c:3010
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLbitfield flags
Definition: glext.h:7161
GLfloat param
Definition: glext.h:5796
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
__u16 time
Definition: mkdosfs.c:8
#define FOURCC_RIFF
Definition: mmsystem.h:564
#define FOURCC_LIST
Definition: mmsystem.h:565
long LONG
Definition: pedump.c:60
const GUID IID_IPersistStream
Definition: proxy.cpp:13
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
static unsigned __int64 next
Definition: rand_nt.c:6
#define calloc
Definition: rosglue.h:14
static __inline const char * debugstr_fourcc(unsigned int cc)
Definition: debug.h:397
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242
__WINE_SERVER_LIST_INLINE void list_add_after(struct list *elem, struct list *to_add)
Definition: list.h:80
#define TRACE(s)
Definition: solgame.cpp:4
MUSIC_TIME mtTimePhysical
Definition: dmusici.h:783
struct IDirectMusicBand * pBand
Definition: dmusici.h:784
MUSIC_TIME lBandTimeLogical
Definition: dmusicf.h:665
MUSIC_TIME lBandTimePhysical
Definition: dmusicf.h:666
Definition: scsiwmi.h:51
Definition: bandtrack.c:26
IDirectMusicBand * band
Definition: bandtrack.c:29
DMUS_IO_BAND_ITEM_HEADER2 head
Definition: bandtrack.c:28
struct list entry
Definition: bandtrack.c:27
struct dmobject dmobj
Definition: bandtrack.c:41
IDirectMusicTrack8 IDirectMusicTrack8_iface
Definition: bandtrack.c:40
LONG ref
Definition: bandtrack.c:42
struct list bands
Definition: bandtrack.c:44
DMUS_IO_BAND_TRACK_HEADER header
Definition: bandtrack.c:43
Definition: band.c:76
Definition: dmobject.h:26
Definition: http.c:7252
Definition: graph.c:32
Definition: send.c:48
Definition: parse.h:23
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_POINTER
Definition: winerror.h:3480