ReactOS 0.4.17-dev-923-g4c9a150
wavetrack.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 "dmime_private.h"
20#include "dmusic_wave.h"
21
23
24struct wave_item {
25 struct list entry;
27 IDirectMusicObject *object;
28 IDirectSoundBuffer *buffer;
29};
30
31struct wave_part {
32 struct list entry;
34 struct list items;
35};
36
38{
39 IDirectMusicTrack8 IDirectMusicTrack8_iface;
40 struct dmobject dmobj; /* IPersistStream only */
43 struct list parts;
44};
45
46/* struct wave_track IDirectMusicTrack8 part: */
47static inline struct wave_track *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface)
48{
50}
51
53{
54 return CONTAINING_RECORD(iface, struct wave_track, dmobj.IPersistStream_iface);
55}
56
57static HRESULT WINAPI wave_track_QueryInterface(IDirectMusicTrack8 *iface, REFIID riid,
58 void **ret_iface)
59{
61
62 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
63
64 *ret_iface = NULL;
65
66 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectMusicTrack) ||
67 IsEqualIID(riid, &IID_IDirectMusicTrack8))
68 *ret_iface = iface;
70 *ret_iface = &This->dmobj.IPersistStream_iface;
71 else {
72 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface);
73 return E_NOINTERFACE;
74 }
75
76 IUnknown_AddRef((IUnknown*)*ret_iface);
77 return S_OK;
78}
79
80static ULONG WINAPI wave_track_AddRef(IDirectMusicTrack8 *iface)
81{
84
85 TRACE("(%p) ref=%ld\n", This, ref);
86
87 return ref;
88}
89
90static ULONG WINAPI wave_track_Release(IDirectMusicTrack8 *iface)
91{
94
95 TRACE("(%p) ref=%ld\n", This, ref);
96
97 if (!ref) {
98 struct wave_item *item, *item2;
99 struct wave_part *part, *part2;
100
101 LIST_FOR_EACH_ENTRY_SAFE(part, part2, &This->parts, struct wave_part, entry)
102 {
103 list_remove(&part->entry);
104
106 {
107 list_remove(&item->entry);
108 if (item->buffer) IDirectSoundBuffer_Release(item->buffer);
109 if (item->object) IDirectMusicObject_Release(item->object);
110 free(item);
111 }
112
113 free(part);
114 }
115
116 free(This);
117 }
118
119 return ref;
120}
121
122static HRESULT WINAPI wave_track_Init(IDirectMusicTrack8 *iface, IDirectMusicSegment *pSegment)
123{
125 FIXME("(%p, %p): stub\n", This, pSegment);
126 return S_OK;
127}
128
129static HRESULT WINAPI wave_track_InitPlay(IDirectMusicTrack8 *iface,
130 IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance,
131 void **ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
132{
134 FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This, pSegmentState, pPerformance, ppStateData,
135 dwVirtualTrack8ID, dwFlags);
136 return S_OK;
137}
138
139static HRESULT WINAPI wave_track_EndPlay(IDirectMusicTrack8 *iface, void *pStateData)
140{
142 FIXME("(%p, %p): stub\n", This, pStateData);
143 return S_OK;
144}
145
146static HRESULT WINAPI wave_track_Play(IDirectMusicTrack8 *iface, void *state_data,
147 MUSIC_TIME start_time, MUSIC_TIME end_time, MUSIC_TIME time_offset, DWORD track_flags,
148 IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD track_id)
149{
150 static const DWORD handled_track_flags = DMUS_TRACKF_START | DMUS_TRACKF_SEEK | DMUS_TRACKF_DIRTY | DMUS_TRACKF_LOOP;
152 LONG volume = This->header.lVolume;
153 IDirectMusicGraph *graph;
154 struct wave_part *part;
155 struct wave_item *item;
156 HRESULT hr;
157
158 TRACE("(%p, %p, %ld, %ld, %ld, %#lx, %p, %p, %ld)\n", This, state_data, start_time, end_time,
159 time_offset, track_flags, performance, segment_state, track_id);
160
161 if (track_flags & ~handled_track_flags)
162 FIXME("track_flags %#lx not implemented\n", track_flags & ~handled_track_flags);
163 if (!(track_flags & (DMUS_TRACKF_START | DMUS_TRACKF_LOOP))) return S_OK;
164
166 &IID_IDirectMusicGraph, (void **)&graph)) &&
168 &IID_IDirectMusicGraph, (void **)&graph)))
169 return hr;
170
171 LIST_FOR_EACH_ENTRY(part, &This->parts, struct wave_part, entry)
172 {
173 volume += part->header.lVolume;
174
176 {
178
179 if (!item->buffer) continue;
180 if (item->header.rtTime < start_time) continue;
181 if (item->header.rtTime >= end_time) continue;
182
184 (DMUS_PMSG **)&msg)))
185 break;
186
187 msg->mtTime = item->header.rtTime + time_offset;
188 msg->dwFlags = DMUS_PMSGF_MUSICTIME;
189 msg->dwPChannel = part->header.dwPChannel;
190 msg->dwVirtualTrackID = track_id;
191 msg->dwType = DMUS_PMSGT_WAVE;
192 msg->punkUser = (IUnknown *)item->buffer;
194
195 msg->rtStartOffset = item->header.rtStartOffset;
196 msg->rtDuration = item->header.rtDuration;
197 msg->lVolume = volume + item->header.lVolume;
198 msg->lPitch = item->header.lPitch;
199
202 {
204 break;
205 }
206 }
207
208 volume -= part->header.lVolume;
209 }
210
212 return hr;
213}
214
215static HRESULT WINAPI wave_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time,
216 MUSIC_TIME *next, void *param)
217{
219
220 TRACE("(%p, %s, %ld, %p, %p): not supported\n", This, debugstr_dmguid(type), time, next, param);
222}
223
224static HRESULT WINAPI wave_track_SetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time,
225 void *param)
226{
228
229 TRACE("(%p, %s, %ld, %p)\n", This, debugstr_dmguid(type), time, param);
230
231 if (IsEqualGUID(type, &GUID_Disable_Auto_Download)) {
232 FIXME("GUID_Disable_Auto_Download not handled yet\n");
233 return S_OK;
234 }
235 if (IsEqualGUID(type, &GUID_Download)) {
236 FIXME("GUID_Download not handled yet\n");
237 return S_OK;
238 }
239 if (IsEqualGUID(type, &GUID_DownloadToAudioPath))
240 {
241 IDirectMusicPerformance8 *performance;
242 IDirectMusicAudioPath *audio_path;
243 IUnknown *object = param;
244 struct wave_part *part;
245 struct wave_item *item;
246 IDirectSound *dsound;
247 HRESULT hr;
248
249 if (FAILED(hr = IDirectMusicAudioPath_QueryInterface(object, &IID_IDirectMusicPerformance8, (void **)&performance))
250 && SUCCEEDED(hr = IDirectMusicAudioPath_QueryInterface(object, &IID_IDirectMusicAudioPath, (void **)&audio_path)))
251 {
253 &GUID_All_Objects, 0, &IID_IDirectMusicPerformance8, (void **)&performance);
255 }
256
257 if (SUCCEEDED(hr))
260
261 if (FAILED(hr))
262 {
263 WARN("Failed to get direct sound from param %p, hr %#lx\n", param, hr);
264 return hr;
265 }
266
267 LIST_FOR_EACH_ENTRY(part, &This->parts, struct wave_part, entry)
268 {
270 {
271 if (item->buffer) continue;
272 if (FAILED(hr = wave_download_to_dsound(item->object, dsound, &item->buffer)))
273 {
274 WARN("Failed to download wave %p to direct sound, hr %#lx\n", item->object, hr);
275 return hr;
276 }
277 }
278 }
279
280 return hr;
281 }
282 if (IsEqualGUID(type, &GUID_Enable_Auto_Download)) {
283 FIXME("GUID_Enable_Auto_Download not handled yet\n");
284 return S_OK;
285 }
286 if (IsEqualGUID(type, &GUID_Unload)) {
287 FIXME("GUID_Unload not handled yet\n");
288 return S_OK;
289 }
290 if (IsEqualGUID(type, &GUID_UnloadFromAudioPath))
291 {
292 struct wave_part *part;
293 struct wave_item *item;
294
295 LIST_FOR_EACH_ENTRY(part, &This->parts, struct wave_part, entry)
296 {
298 {
299 if (!item->buffer) continue;
301 item->buffer = NULL;
302 }
303 }
304
305 return S_OK;
306 }
307
309}
310
311static HRESULT WINAPI wave_track_IsParamSupported(IDirectMusicTrack8 *iface, REFGUID type)
312{
314 static const GUID *valid[] = {
315 &GUID_Disable_Auto_Download,
316 &GUID_Download,
317 &GUID_DownloadToAudioPath,
318 &GUID_Enable_Auto_Download,
319 &GUID_Unload,
320 &GUID_UnloadFromAudioPath
321 };
322 unsigned int i;
323
324 TRACE("(%p, %s)\n", This, debugstr_dmguid(type));
325
326 for (i = 0; i < ARRAY_SIZE(valid); i++)
327 if (IsEqualGUID(type, valid[i]))
328 return S_OK;
329
330 TRACE("param unsupported\n");
332}
333
334static HRESULT WINAPI wave_track_AddNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype)
335{
337
338 TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype));
339 return E_NOTIMPL;
340}
341
342static HRESULT WINAPI wave_track_RemoveNotificationType(IDirectMusicTrack8 *iface,
343 REFGUID notiftype)
344{
346
347 TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype));
348 return E_NOTIMPL;
349}
350
351static HRESULT WINAPI wave_track_Clone(IDirectMusicTrack8 *iface, MUSIC_TIME mtStart,
352 MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
353{
355 FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack);
356 return S_OK;
357}
358
359static HRESULT WINAPI wave_track_PlayEx(IDirectMusicTrack8 *iface, void *pStateData,
360 REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD dwFlags,
361 IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID)
362{
364 FIXME("(%p, %p, 0x%s, 0x%s, 0x%s, %ld, %p, %p, %ld): stub\n", This, pStateData,
366 wine_dbgstr_longlong(rtOffset), dwFlags, pPerf, pSegSt, dwVirtualID);
367 return S_OK;
368}
369
370static HRESULT WINAPI wave_track_GetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType,
371 REFERENCE_TIME rtTime, REFERENCE_TIME *prtNext, void *pParam, void *pStateData,
373{
375 FIXME("(%p, %s, 0x%s, %p, %p, %p, %ld): stub\n", This, debugstr_dmguid(rguidType),
376 wine_dbgstr_longlong(rtTime), prtNext, pParam, pStateData, dwFlags);
377 return S_OK;
378}
379
380static HRESULT WINAPI wave_track_SetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType,
381 REFERENCE_TIME rtTime, void *pParam, void *pStateData, DWORD dwFlags)
382{
384 FIXME("(%p, %s, 0x%s, %p, %p, %ld): stub\n", This, debugstr_dmguid(rguidType),
385 wine_dbgstr_longlong(rtTime), pParam, pStateData, dwFlags);
386 return S_OK;
387}
388
389static HRESULT WINAPI wave_track_Compose(IDirectMusicTrack8 *iface, IUnknown *context,
390 DWORD trackgroup, IDirectMusicTrack **track)
391{
393
394 TRACE("(%p, %p, %ld, %p): method not implemented\n", This, context, trackgroup, track);
395 return E_NOTIMPL;
396}
397
398static HRESULT WINAPI wave_track_Join(IDirectMusicTrack8 *iface, IDirectMusicTrack *newtrack,
399 MUSIC_TIME join, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **resulttrack)
400{
402 TRACE("(%p, %p, %ld, %p, %ld, %p): method not implemented\n", This, newtrack, join, context,
403 trackgroup, resulttrack);
404 return E_NOTIMPL;
405}
406
407static const IDirectMusicTrack8Vtbl dmtrack8_vtbl = {
426};
427
428static HRESULT parse_wave_item(struct wave_part *part, IStream *stream, struct chunk_entry *wavi)
429{
430 struct chunk_entry wave = {.parent = wavi};
431 struct chunk_entry chunk = {.parent = &wave};
432 struct wave_item *item;
433 HRESULT hr;
434
435 /* Nested list with two chunks */
437 return hr;
438 if (wave.id != FOURCC_LIST || wave.type != DMUS_FOURCC_WAVE_LIST)
440
441 if (!(item = calloc(1, sizeof(*item)))) return E_OUTOFMEMORY;
442
443 /* Wave item header chunk */
445 goto error;
448 goto error;
449 }
450
451 if (FAILED(hr = stream_chunk_get_data(stream, &chunk, &item->header, sizeof(item->header)))) {
452 WARN("Failed to read data of %s\n", debugstr_chunk(&chunk));
453 goto error;
454 }
455
456 TRACE("Found DMUS_IO_WAVE_ITEM_HEADER\n");
457 TRACE("\tlVolume %ld\n", item->header.lVolume);
458 TRACE("\tdwVariations %ld\n", item->header.dwVariations);
459 TRACE("\trtTime %s\n", wine_dbgstr_longlong(item->header.rtTime));
460 TRACE("\trtStartOffset %s\n", wine_dbgstr_longlong(item->header.rtStartOffset));
461 TRACE("\trtReserved %s\n", wine_dbgstr_longlong(item->header.rtReserved));
462 TRACE("\trtDuration %s\n", wine_dbgstr_longlong(item->header.rtDuration));
463 TRACE("\tdwLoopStart %ld\n", item->header.dwLoopStart);
464 TRACE("\tdwLoopEnd %ld\n", item->header.dwLoopEnd);
465 TRACE("\tdwFlags %#08lx\n", item->header.dwFlags);
466 TRACE("\twVolumeRange %d\n", item->header.wVolumeRange);
467 TRACE("\twPitchRange %d\n", item->header.wPitchRange);
468
469 /* Second chunk is a reference list */
470 if (stream_next_chunk(stream, &chunk) != S_OK || chunk.id != FOURCC_LIST ||
471 chunk.type != DMUS_FOURCC_REF_LIST) {
473 goto error;
474 }
475 if (FAILED(hr = dmobj_parsereference(stream, &chunk, &item->object)))
476 goto error;
477
478 list_add_tail(&part->items, &item->entry);
479
480 return S_OK;
481
482error:
483 free(item);
484 return hr;
485}
486
488{
489 struct chunk_entry chunk = {.parent = wavp};
490 struct wave_part *part;
491 HRESULT hr;
492
493 /* Wave part header chunk */
495 return hr;
498
499 if (!(part = calloc(1, sizeof(*part)))) return E_OUTOFMEMORY;
500 list_init(&part->items);
501
502 if (FAILED(hr = stream_chunk_get_data(stream, &chunk, &part->header, sizeof(part->header)))) {
503 WARN("Failed to read data of %s\n", debugstr_chunk(&chunk));
504 goto error;
505 }
506
507 TRACE("Found DMUS_IO_WAVE_PART_HEADER\n");
508 TRACE("\tlVolume %ld\n", part->header.lVolume);
509 TRACE("\tdwVariations %ld\n", part->header.dwVariations);
510 TRACE("\tdwPChannel %ld\n", part->header.dwPChannel);
511 TRACE("\tdwLockToPart %ld\n", part->header.dwLockToPart);
512 TRACE("\tdwFlags %#08lx\n", part->header.dwFlags);
513 TRACE("\tdwIndex %ld\n", part->header.dwIndex);
514
515 /* Array of wave items */
516 while ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
518 if (FAILED(hr = parse_wave_item(part, stream, &chunk)))
519 break;
520
521 if (FAILED(hr))
522 goto error;
523
524 list_add_tail(&This->parts, &part->entry);
525
526 return S_OK;
527
528error:
529 free(part);
530 return hr;
531}
532
534{
536 struct chunk_entry wavt = {0};
537 struct chunk_entry chunk = {.parent = &wavt};
538 HRESULT hr;
539
540 TRACE("%p, %p\n", This, stream);
541
542 if (!stream)
543 return E_POINTER;
544
545 if ((hr = stream_get_chunk(stream, &wavt) != S_OK))
546 return hr;
547 if (wavt.id != FOURCC_LIST || wavt.type != DMUS_FOURCC_WAVETRACK_LIST)
549
550 TRACE("Parsing segment form in %p: %s\n", stream, debugstr_chunk(&wavt));
551
552 /* Track header chunk */
554 return hr;
557 if (FAILED(hr = stream_chunk_get_data(stream, &chunk, &This->header, sizeof(This->header))))
558 return hr;
559
560 TRACE("Found DMUS_IO_WAVE_TRACK_HEADER\n");
561 TRACE("\tlVolume %ld\n", This->header.lVolume);
562 TRACE("\tdwFlags %#08lx\n", This->header.dwFlags);
563
564 /* Array of wave parts */
565 while ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
568 break;
569
570 return SUCCEEDED(hr) ? S_OK : hr;
571}
572
573static const IPersistStreamVtbl persiststream_vtbl = {
582};
583
584/* for ClassFactory */
585HRESULT create_dmwavetrack(REFIID lpcGUID, void **ppobj)
586{
587 struct wave_track *track;
588 HRESULT hr;
589
590 *ppobj = NULL;
591 if (!(track = calloc(1, sizeof(*track)))) return E_OUTOFMEMORY;
593 track->ref = 1;
594 dmobject_init(&track->dmobj, &CLSID_DirectMusicWaveTrack,
596 track->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl;
597 list_init(&track->parts);
598
601
602 return hr;
603}
604
606 IDirectMusicTrack8 **ret_iface)
607{
608 IDirectMusicTrack8 *iface;
609 struct wave_track *This;
610 struct wave_item *item;
611 struct wave_part *part;
612 HRESULT hr;
613
614 if (FAILED(hr = create_dmwavetrack(&IID_IDirectMusicTrack8, (void **)&iface))) return hr;
616
617 if (!(part = calloc(1, sizeof(*part))))
618 {
620 return E_OUTOFMEMORY;
621 }
622 list_init(&part->items);
623 list_add_tail(&This->parts, &part->entry);
624
625 if (!(item = calloc(1, sizeof(*item)))
627 {
629 free(item);
630 return hr;
631 }
632 if (FAILED(hr = wave_get_duration(item->object, &item->header.rtDuration)))
633 WARN("Failed to get wave duration, hr %#lx\n", hr);
634 list_add_tail(&part->items, &item->entry);
635
636 *ret_iface = iface;
637 return S_OK;
638}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
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
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
#define DMUS_E_GET_UNSUPPORTED
Definition: dmerror.h:72
#define DMUS_E_UNSUPPORTED_STREAM
Definition: dmerror.h:100
#define DMUS_E_TYPE_UNSUPPORTED
Definition: dmerror.h:112
HRESULT performance_get_dsound(IDirectMusicPerformance8 *iface, IDirectSound **dsound)
Definition: performance.c:2316
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 WINAPI unimpl_IPersistStream_GetSizeMax(IPersistStream *iface, ULARGE_INTEGER *size)
Definition: dmobject.c:742
const char * debugstr_chunk(const struct chunk_entry *chunk)
Definition: dmobject.c:279
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 dmobj_parsereference(IStream *stream, const struct chunk_entry *list, IDirectMusicObject **dmobj)
Definition: dmobject.c:654
HRESULT WINAPI dmobj_IPersistStream_QueryInterface(IPersistStream *iface, REFIID riid, void **ret_iface)
Definition: dmobject.c:689
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
#define IDirectMusicTrack8_Release(p)
Definition: dmplugin.h:275
LONG MUSIC_TIME
Definition: dmplugin.h:95
#define IDirectMusicTrack8_QueryInterface(p, a, b)
Definition: dmplugin.h:273
@ DMUS_TRACKF_SEEK
Definition: dmplugin.h:111
@ DMUS_TRACKF_START
Definition: dmplugin.h:113
@ DMUS_TRACKF_DIRTY
Definition: dmplugin.h:115
@ DMUS_TRACKF_LOOP
Definition: dmplugin.h:112
HRESULT wave_get_duration(IDirectMusicObject *iface, REFERENCE_TIME *duration)
Definition: wave.c:521
HRESULT wave_download_to_dsound(IDirectMusicObject *iface, IDirectSound *dsound, IDirectSoundBuffer **ret_iface)
Definition: wave.c:481
HRESULT wave_create_from_chunk(IStream *stream, struct chunk_entry *parent, IDirectMusicObject **out)
Definition: wave.c:292
#define DMUS_FOURCC_WAVE_LIST
Definition: dmusicf.h:218
#define DMUS_FOURCC_WAVETRACK_LIST
Definition: dmusicf.h:213
#define DMUS_FOURCC_WAVETRACK_CHUNK
Definition: dmusicf.h:214
#define DMUS_FOURCC_REF_LIST
Definition: dmusicf.h:102
#define DMUS_FOURCC_WAVEITEM_LIST
Definition: dmusicf.h:217
#define DMUS_FOURCC_WAVEPART_LIST
Definition: dmusicf.h:215
#define DMUS_FOURCC_WAVEITEM_CHUNK
Definition: dmusicf.h:219
#define DMUS_FOURCC_WAVEPART_CHUNK
Definition: dmusicf.h:216
#define IDirectMusicObject_Release(p)
Definition: dmusici.h:844
#define IDirectMusicPerformance_QueryInterface(p, a, b)
Definition: dmusici.h:1277
@ DMUS_PMSGF_MUSICTIME
Definition: dmusici.h:446
#define IDirectMusicSegmentState_QueryInterface(p, a, b)
Definition: dmusici.h:1138
#define IDirectMusicAudioPath_QueryInterface(p, a, b)
Definition: dmusici.h:1209
#define IDirectMusicPerformance_SendPMsg(p, a)
Definition: dmusici.h:1289
#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 IDirectMusicAudioPath_Release(p)
Definition: dmusici.h:1211
#define IDirectMusicPerformance_FreePMsg(p, a)
Definition: dmusici.h:1295
#define IDirectMusicGraph_StampPMsg(p, a)
Definition: dmusici.h:1474
#define DMUS_PATH_PERFORMANCE
Definition: dmusici.h:285
#define DMUS_PCHANNEL_ALL
Definition: dmusici.h:299
#define IDirectMusicPerformance_AllocPMsg(p, a, b)
Definition: dmusici.h:1294
@ DMUS_PMSGT_WAVE
Definition: dmusici.h:468
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
r parent
Definition: btrfs.c:3010
#define IDirectSoundBuffer_AddRef(p)
Definition: dsound.h:573
#define IDirectSoundBuffer_Release(p)
Definition: dsound.h:574
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOLEAN valid
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
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 error(str)
Definition: mkdosfs.c:1605
LOCAL int join(int *aux, int a, int b)
Definition: match.c:560
#define FOURCC_LIST
Definition: mmsystem.h:565
static const struct metadata_item item2[]
Definition: metadata.c:3608
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
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
#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
#define TRACE(s)
Definition: solgame.cpp:4
Definition: scsiwmi.h:51
Definition: dmobject.h:26
FOURCC id
Definition: dmobject.h:27
FOURCC type
Definition: dmobject.h:29
Definition: http.c:7252
Definition: graph.c:32
Definition: send.c:48
Definition: parse.h:23
IDirectSoundBuffer * buffer
Definition: wavetrack.c:28
struct list entry
Definition: wavetrack.c:25
IDirectMusicObject * object
Definition: wavetrack.c:27
DMUS_IO_WAVE_ITEM_HEADER header
Definition: wavetrack.c:26
struct list entry
Definition: wavetrack.c:32
struct list items
Definition: wavetrack.c:34
DMUS_IO_WAVE_PART_HEADER header
Definition: wavetrack.c:33
struct dmobject dmobj
Definition: wavetrack.c:40
IDirectMusicTrack8 IDirectMusicTrack8_iface
Definition: wavetrack.c:39
struct list parts
Definition: wavetrack.c:43
LONG ref
Definition: wavetrack.c:41
DMUS_IO_WAVE_TRACK_HEADER header
Definition: wavetrack.c:42
Definition: wave.c:37
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
HRESULT create_dmwavetrack(REFIID lpcGUID, void **ppobj)
Definition: wavetrack.c:585
static HRESULT WINAPI wave_track_RemoveNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype)
Definition: wavetrack.c:342
static HRESULT WINAPI wave_track_PlayEx(IDirectMusicTrack8 *iface, void *pStateData, REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD dwFlags, IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID)
Definition: wavetrack.c:359
static HRESULT WINAPI wave_track_Compose(IDirectMusicTrack8 *iface, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **track)
Definition: wavetrack.c:389
static HRESULT WINAPI wave_track_QueryInterface(IDirectMusicTrack8 *iface, REFIID riid, void **ret_iface)
Definition: wavetrack.c:57
static ULONG WINAPI wave_track_AddRef(IDirectMusicTrack8 *iface)
Definition: wavetrack.c:80
static HRESULT WINAPI wave_track_SetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, void *param)
Definition: wavetrack.c:224
static HRESULT WINAPI wave_track_InitPlay(IDirectMusicTrack8 *iface, IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance, void **ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
Definition: wavetrack.c:129
static HRESULT WINAPI wave_track_Clone(IDirectMusicTrack8 *iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
Definition: wavetrack.c:351
static HRESULT parse_wave_item(struct wave_part *part, IStream *stream, struct chunk_entry *wavi)
Definition: wavetrack.c:428
static struct wave_track * impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface)
Definition: wavetrack.c:47
static HRESULT WINAPI wave_track_EndPlay(IDirectMusicTrack8 *iface, void *pStateData)
Definition: wavetrack.c:139
static ULONG WINAPI wave_track_Release(IDirectMusicTrack8 *iface)
Definition: wavetrack.c:90
static HRESULT WINAPI wave_track_Init(IDirectMusicTrack8 *iface, IDirectMusicSegment *pSegment)
Definition: wavetrack.c:122
static HRESULT WINAPI wave_track_Join(IDirectMusicTrack8 *iface, IDirectMusicTrack *newtrack, MUSIC_TIME join, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **resulttrack)
Definition: wavetrack.c:398
static HRESULT WINAPI wave_track_AddNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype)
Definition: wavetrack.c:334
static const IPersistStreamVtbl persiststream_vtbl
Definition: wavetrack.c:573
static HRESULT WINAPI wave_track_IsParamSupported(IDirectMusicTrack8 *iface, REFGUID type)
Definition: wavetrack.c:311
HRESULT wave_track_create_from_chunk(IStream *stream, struct chunk_entry *parent, IDirectMusicTrack8 **ret_iface)
Definition: wavetrack.c:605
static HRESULT WINAPI wave_track_GetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *prtNext, void *pParam, void *pStateData, DWORD dwFlags)
Definition: wavetrack.c:370
static HRESULT WINAPI wave_IPersistStream_Load(IPersistStream *iface, IStream *stream)
Definition: wavetrack.c:533
static const IDirectMusicTrack8Vtbl dmtrack8_vtbl
Definition: wavetrack.c:407
static HRESULT WINAPI wave_track_SetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, void *pParam, void *pStateData, DWORD dwFlags)
Definition: wavetrack.c:380
static HRESULT WINAPI wave_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: wavetrack.c:146
static HRESULT parse_wave_part(struct wave_track *This, IStream *stream, struct chunk_entry *wavp)
Definition: wavetrack.c:487
static HRESULT WINAPI wave_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, MUSIC_TIME *next, void *param)
Definition: wavetrack.c:215
static struct wave_track * impl_from_IPersistStream(IPersistStream *iface)
Definition: wavetrack.c:52
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_POINTER
Definition: winerror.h:3480