ReactOS 0.4.17-dev-934-g091855f
segmentstate.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
22
24
25struct track_entry
26{
27 struct list entry;
28
29 IDirectMusicTrack *track;
32};
33
35{
36 HRESULT hr;
37
38 if (FAILED(hr = IDirectMusicTrack_EndPlay(entry->track, entry->state_data)))
39 WARN("track %p EndPlay failed, hr %#lx\n", entry->track, hr);
40
42 free(entry);
43}
44
46{
47 IDirectMusicSegmentState8 IDirectMusicSegmentState8_iface;
48 IDirectMusicGraph IDirectMusicGraph_iface;
50
51 IDirectMusicGraph *parent_graph;
52 IDirectMusicSegment *segment;
57
60
64
65 struct list tracks;
66};
67
68static inline struct segment_state *impl_from_IDirectMusicSegmentState8(IDirectMusicSegmentState8 *iface)
69{
71}
72
73static HRESULT WINAPI segment_state_QueryInterface(IDirectMusicSegmentState8 *iface, REFIID riid, void **ppobj)
74{
76
77 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
78
79 if (!ppobj)
80 return E_POINTER;
81
82 *ppobj = NULL;
83
85 IsEqualIID(riid, &IID_IDirectMusicSegmentState) ||
86 IsEqualIID(riid, &IID_IDirectMusicSegmentState8))
87 {
89 *ppobj = &This->IDirectMusicSegmentState8_iface;
90 return S_OK;
91 }
92 if (IsEqualIID(riid, &IID_IDirectMusicGraph))
93 {
95 *ppobj = &This->IDirectMusicGraph_iface;
96 return S_OK;
97 }
98 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj);
99 return E_NOINTERFACE;
100}
101
102static ULONG WINAPI segment_state_AddRef(IDirectMusicSegmentState8 *iface)
103{
106
107 TRACE("(%p): %ld\n", This, ref);
108
109 return ref;
110}
111
112static ULONG WINAPI segment_state_Release(IDirectMusicSegmentState8 *iface)
113{
116
117 TRACE("(%p): %ld\n", This, ref);
118
119 if (!ref)
120 {
121 segment_state_end_play((IDirectMusicSegmentState *)iface, NULL);
122 if (This->segment) IDirectMusicSegment_Release(This->segment);
123 if (This->parent_graph) IDirectMusicGraph_Release(This->parent_graph);
124 free(This);
125 }
126
127 return ref;
128}
129
130static HRESULT WINAPI segment_state_GetRepeats(IDirectMusicSegmentState8 *iface, DWORD *repeats)
131{
133 TRACE("(%p, %p)\n", This, repeats);
134 *repeats = This->repeats;
135 return S_OK;
136}
137
138static HRESULT WINAPI segment_state_GetSegment(IDirectMusicSegmentState8 *iface, IDirectMusicSegment **segment)
139{
141
142 TRACE("(%p, %p)\n", This, segment);
143
144 if (!(*segment = This->segment)) return DMUS_E_NOT_FOUND;
145
147 return S_OK;
148}
149
150static HRESULT WINAPI segment_state_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_time)
151{
153
154 TRACE("(%p, %p)\n", This, start_time);
155
156 *start_time = This->start_time;
157 return S_OK;
158}
159
160static HRESULT WINAPI segment_state_GetSeek(IDirectMusicSegmentState8 *iface, MUSIC_TIME *seek_time)
161{
163 FIXME("(%p, %p): semi-stub\n", This, seek_time);
164 *seek_time = 0;
165 return S_OK;
166}
167
168static HRESULT WINAPI segment_state_GetStartPoint(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_point)
169{
171
172 TRACE("(%p, %p)\n", This, start_point);
173
174 *start_point = This->start_point;
175 return S_OK;
176}
177
178static HRESULT WINAPI segment_state_SetTrackConfig(IDirectMusicSegmentState8 *iface,
179 REFGUID rguidTrackClassID, DWORD dwGroupBits, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff)
180{
182 FIXME("(%p, %s, %ld, %ld, %ld, %ld): stub\n", This, debugstr_dmguid(rguidTrackClassID), dwGroupBits, dwIndex, dwFlagsOn, dwFlagsOff);
183 return S_OK;
184}
185
186static HRESULT WINAPI segment_state_GetObjectInPath(IDirectMusicSegmentState8 *iface, DWORD dwPChannel,
187 DWORD dwStage, DWORD dwBuffer, REFGUID guidObject, DWORD dwIndex, REFGUID iidInterface, void **ppObject)
188{
190 FIXME("(%p, %ld, %ld, %ld, %s, %ld, %s, %p): stub\n", This, dwPChannel, dwStage, dwBuffer, debugstr_dmguid(guidObject), dwIndex, debugstr_dmguid(iidInterface), ppObject);
191 return S_OK;
192}
193
194static const IDirectMusicSegmentState8Vtbl segment_state_vtbl =
195{
206};
207
208static inline struct segment_state *impl_from_IDirectMusicGraph(IDirectMusicGraph *iface)
209{
211}
212
213static HRESULT WINAPI segment_state_graph_QueryInterface(IDirectMusicGraph *iface, REFIID riid, void **ret_iface)
214{
216 return IDirectMusicSegmentState8_QueryInterface(&This->IDirectMusicSegmentState8_iface, riid, ret_iface);
217}
218
219static ULONG WINAPI segment_state_graph_AddRef(IDirectMusicGraph *iface)
220{
222 return IDirectMusicSegmentState8_AddRef(&This->IDirectMusicSegmentState8_iface);
223}
224
225static ULONG WINAPI segment_state_graph_Release(IDirectMusicGraph *iface)
226{
228 return IDirectMusicSegmentState8_Release(&This->IDirectMusicSegmentState8_iface);
229}
230
231static HRESULT WINAPI segment_state_graph_StampPMsg(IDirectMusicGraph *iface, DMUS_PMSG *msg)
232{
234 HRESULT hr;
235
236 TRACE("(%p, %p)\n", This, msg);
237
238 if (!msg) return E_POINTER;
239
240 hr = IDirectMusicGraph_StampPMsg(This->parent_graph, msg);
241 if (SUCCEEDED(hr))
242 {
243 switch (msg->dwType)
244 {
245 case DMUS_PMSGT_WAVE:
247 {
248 if (((DMUS_WAVE_PMSG *)msg)->rtDuration > This->actual_duration)
249 This->actual_duration = ((DMUS_WAVE_PMSG *)msg)->rtDuration;
250 }
251 break;
252 default: ;
253 }
254 }
255
256 return hr;
257}
258
259static HRESULT WINAPI segment_state_graph_InsertTool(IDirectMusicGraph *iface, IDirectMusicTool *tool,
260 DWORD *channels, DWORD channels_count, LONG index)
261{
263 TRACE("(%p, %p, %p, %lu, %ld)\n", This, tool, channels, channels_count, index);
264 return E_NOTIMPL;
265}
266
267static HRESULT WINAPI segment_state_graph_GetTool(IDirectMusicGraph *iface, DWORD index, IDirectMusicTool **tool)
268{
270 TRACE("(%p, %lu, %p)\n", This, index, tool);
271 return E_NOTIMPL;
272}
273
274static HRESULT WINAPI segment_state_graph_RemoveTool(IDirectMusicGraph *iface, IDirectMusicTool *tool)
275{
277 TRACE("(%p, %p)\n", This, tool);
278 return E_NOTIMPL;
279}
280
281static const IDirectMusicGraphVtbl segment_state_graph_vtbl =
282{
290};
291
292/* for ClassFactory */
294{
295 struct segment_state *obj;
296 HRESULT hr;
297
298 *ret_iface = NULL;
299 if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY;
300 obj->IDirectMusicSegmentState8_iface.lpVtbl = &segment_state_vtbl;
301 obj->IDirectMusicGraph_iface.lpVtbl = &segment_state_graph_vtbl;
302 obj->ref = 1;
303 obj->start_time = -1;
304 list_init(&obj->tracks);
305
306 TRACE("Created IDirectMusicSegmentState %p\n", obj);
307 hr = IDirectMusicSegmentState8_QueryInterface(&obj->IDirectMusicSegmentState8_iface, riid, ret_iface);
308 IDirectMusicSegmentState8_Release(&obj->IDirectMusicSegmentState8_iface);
309 return hr;
310}
311
313 IDirectMusicPerformance8 *performance, IDirectMusicSegmentState **ret_iface)
314{
315 IDirectMusicSegmentState *iface;
316 struct segment_state *This;
317 IDirectMusicGraph *graph;
318 IDirectMusicTrack *track;
319 HRESULT hr;
320 UINT i;
321
322 TRACE("(%p, %lu, %p)\n", segment, start_time, ret_iface);
323
324 if (FAILED(hr = create_dmsegmentstate(&IID_IDirectMusicSegmentState, (void **)&iface))) return hr;
325 This = impl_from_IDirectMusicSegmentState8((IDirectMusicSegmentState8 *)iface);
326
327 This->segment = segment;
329
330 hr = IDirectMusicPerformance8_QueryInterface(performance, &IID_IDirectMusicGraph, (void **)&graph);
331
332 if (SUCCEEDED(hr) &&
334 &This->auto_download, sizeof(This->auto_download))) && This->auto_download)
335 hr = IDirectMusicSegment_SetParam(segment, &GUID_DownloadToAudioPath, -1,
337
338 This->start_time = start_time;
342 if (SUCCEEDED(hr)) This->actual_repeats = This->repeats;
343
344 for (i = 0; SUCCEEDED(hr); i++)
345 {
346 DWORD track_id = ++next_track_id;
347 struct track_entry *entry;
348
350 {
351 if (hr == DMUS_E_NOT_FOUND) hr = S_OK;
352 break;
353 }
354
355 if (!(entry = malloc(sizeof(*entry))))
357 else if (SUCCEEDED(hr = IDirectMusicTrack_InitPlay(track, iface, (IDirectMusicPerformance *)performance,
358 &entry->state_data, track_id, 0)))
359 {
360 entry->track = track;
361 entry->track_id = track_id;
362 list_add_tail(&This->tracks, &entry->entry);
363 }
364
365 if (FAILED(hr))
366 {
367 WARN("Failed to initialize track %p, hr %#lx\n", track, hr);
369 free(entry);
370 }
371 }
372
373 if (SUCCEEDED(hr))
374 {
375 *ret_iface = iface;
376 This->parent_graph = graph;
377 }
378 else
379 {
382 }
383
384 return hr;
385}
386
387static HRESULT segment_state_play_until(struct segment_state *This, IDirectMusicPerformance8 *performance,
388 MUSIC_TIME end_time, DWORD track_flags)
389{
390 IDirectMusicSegmentState *iface = (IDirectMusicSegmentState *)&This->IDirectMusicSegmentState8_iface;
391 struct track_entry *entry;
392 HRESULT hr = S_OK;
393 MUSIC_TIME played;
394
395 played = min(end_time - This->start_time, This->end_point - This->start_point);
396
397 if (This->track_flags & DMUS_TRACKF_DIRTY)
398 This->actual_duration = 0;
399
401 {
402 if (FAILED(hr = IDirectMusicTrack_Play(entry->track, entry->state_data,
403 This->start_point + This->played, This->start_point + played,
404 This->start_time, track_flags, (IDirectMusicPerformance *)performance,
405 iface, entry->track_id)))
406 {
407 WARN("Failed to play track %p, hr %#lx\n", entry->track, hr);
408 break;
409 }
410 }
411
412 This->played = played;
413 This->track_flags &= ~(DMUS_TRACKF_START|DMUS_TRACKF_DIRTY);
414 if (This->start_point + This->played >= This->end_point) return S_FALSE;
415 return S_OK;
416}
417
418static HRESULT segment_state_play_chunk(struct segment_state *This, IDirectMusicPerformance8 *performance,
419 REFERENCE_TIME duration)
420{
421 IDirectMusicSegmentState *iface = (IDirectMusicSegmentState *)&This->IDirectMusicSegmentState8_iface;
422 MUSIC_TIME next_time;
424 HRESULT hr;
425
427 This->start_time + This->played, &time)))
428 return hr;
430 time + duration, &next_time)))
431 return hr;
432
433 while ((hr = segment_state_play_until(This, performance, next_time, This->track_flags)) == S_FALSE)
434 {
435 if (!This->actual_repeats)
436 {
437 MUSIC_TIME end_time = This->start_time + This->played;
438
439 if (FAILED(hr = performance_send_segment_end(performance, end_time, iface, FALSE)))
440 {
441 ERR("Failed to send segment end, hr %#lx\n", hr);
442 return hr;
443 }
444
445 return S_FALSE;
446 }
447
448 if (FAILED(hr = IDirectMusicSegment_GetLoopPoints(This->segment, &This->played,
449 &This->end_point)))
450 break;
451 if (!This->played && !This->end_point)
452 {
453 if (!This->actual_end_point && This->actual_duration)
454 {
455 IDirectMusicPerformance_ReferenceToMusicTime(performance, time + This->actual_duration, &This->actual_end_point);
456 This->actual_end_point -= This->start_time + This->played;
457 }
458 This->end_point = This->actual_end_point;
459 if (next_time < This->start_time + This->end_point)
460 next_time += This->end_point - This->start_point;
461 }
462 This->start_time += This->end_point - This->start_point;
463 This->actual_repeats--;
464 This->track_flags |= DMUS_TRACKF_LOOP | DMUS_TRACKF_SEEK;
465
466 if (next_time <= This->start_time || This->end_point <= This->start_point) break;
467 }
468
469 return S_OK;
470}
471
472HRESULT segment_state_play(IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
473{
474 struct segment_state *This = impl_from_IDirectMusicSegmentState8((IDirectMusicSegmentState8 *)iface);
475 HRESULT hr;
476
477 TRACE("%p %p\n", iface, performance);
478
479 if (FAILED(hr = performance_send_segment_start(performance, This->start_time, iface)))
480 {
481 ERR("Failed to send segment start, hr %#lx\n", hr);
482 return hr;
483 }
484
487 return hr;
488
489 if (hr == S_FALSE) return S_OK;
490 return performance_send_segment_tick(performance, This->start_time, iface);
491}
492
493HRESULT segment_state_tick(IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
494{
495 struct segment_state *This = impl_from_IDirectMusicSegmentState8((IDirectMusicSegmentState8 *)iface);
496
497 TRACE("%p %p\n", iface, performance);
498
499 return segment_state_play_chunk(This, performance, 10000000);
500}
501
502HRESULT segment_state_stop(IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
503{
504 struct segment_state *This = impl_from_IDirectMusicSegmentState8((IDirectMusicSegmentState8 *)iface);
505
506 TRACE("%p %p\n", iface, performance);
507
508 This->played = This->end_point - This->start_point;
509 return performance_send_segment_end(performance, This->start_time + This->played, iface, TRUE);
510}
511
512HRESULT segment_state_end_play(IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
513{
514 struct segment_state *This = impl_from_IDirectMusicSegmentState8((IDirectMusicSegmentState8 *)iface);
515 struct track_entry *entry, *next;
516 HRESULT hr;
517
519 {
520 list_remove(&entry->entry);
522 }
523
524 if (performance && This->auto_download && FAILED(hr = IDirectMusicSegment_SetParam(This->segment,
525 &GUID_UnloadFromAudioPath, -1, DMUS_SEG_ALLTRACKS, 0, performance)))
526 ERR("Failed to unload segment from performance, hr %#lx\n", hr);
527
528 return S_OK;
529}
530
531BOOL segment_state_has_segment(IDirectMusicSegmentState *iface, IDirectMusicSegment *segment)
532{
533 struct segment_state *This = impl_from_IDirectMusicSegmentState8((IDirectMusicSegmentState8 *)iface);
534 return !segment || This->segment == segment;
535}
536
537BOOL segment_state_has_track(IDirectMusicSegmentState *iface, DWORD track_id)
538{
539 struct segment_state *This = impl_from_IDirectMusicSegmentState8((IDirectMusicSegmentState8 *)iface);
540 struct track_entry *entry;
541
543 if (entry->track_id == track_id) return TRUE;
544
545 return FALSE;
546}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
unsigned int channels
Definition: audiorecord.c:89
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
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
#define ERR(fmt,...)
Definition: precomp.h:57
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
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define DMUS_E_NOT_FOUND
Definition: dmerror.h:109
HRESULT performance_send_segment_tick(IDirectMusicPerformance8 *iface, MUSIC_TIME music_time, IDirectMusicSegmentState *state)
Definition: performance.c:337
HRESULT performance_send_segment_start(IDirectMusicPerformance8 *iface, MUSIC_TIME music_time, IDirectMusicSegmentState *state)
Definition: performance.c:318
HRESULT performance_send_segment_end(IDirectMusicPerformance8 *iface, MUSIC_TIME music_time, IDirectMusicSegmentState *state, BOOL abort)
Definition: performance.c:355
const char * debugstr_dmguid(const GUID *id)
Definition: dmobject.c:36
#define IDirectMusicTrack_Release(p)
Definition: dmplugin.h:226
LONG MUSIC_TIME
Definition: dmplugin.h:95
#define IDirectMusicTrack_Play(p, a, b, c, d, e, f, g, h)
Definition: dmplugin.h:231
#define IDirectMusicTrack_InitPlay(p, a, b, c, d, e)
Definition: dmplugin.h:229
@ 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
#define IDirectMusicTrack_EndPlay(p, a)
Definition: dmplugin.h:230
#define IDirectMusicPerformance8_QueryInterface(p, a, b)
Definition: dmusici.h:1392
#define IDirectMusicPerformance8_ReferenceToMusicTime(p, a, b)
Definition: dmusici.h:1406
#define IDirectMusicSegment_GetLength(p, a)
Definition: dmusici.h:1010
#define IDirectMusicSegment_GetLoopPoints(p, a, b)
Definition: dmusici.h:1031
#define IDirectMusicSegmentState8_Release(p)
Definition: dmusici.h:1176
#define IDirectMusicSegmentState8_AddRef(p)
Definition: dmusici.h:1175
#define DMUS_SEG_ALLTRACKS
Definition: dmusici.h:317
#define IDirectMusicPerformance8_GetGlobalParam(p, a, b, c)
Definition: dmusici.h:1426
@ DMUS_PMSGF_MUSICTIME
Definition: dmusici.h:446
@ DMUS_PMSGF_REFTIME
Definition: dmusici.h:445
#define IDirectMusicSegment_GetRepeats(p, a)
Definition: dmusici.h:1012
#define IDirectMusicSegmentState8_QueryInterface(p, a, b)
Definition: dmusici.h:1174
#define IDirectMusicSegment_Release(p)
Definition: dmusici.h:1008
#define IDirectMusicPerformance8_MusicToReferenceTime(p, a, b)
Definition: dmusici.h:1405
#define IDirectMusicSegment_SetParam(p, a, b, c, d, e)
Definition: dmusici.h:1026
#define IDirectMusicSegment_AddRef(p)
Definition: dmusici.h:1007
#define IDirectMusicSegment_GetStartPoint(p, a)
Definition: dmusici.h:1029
#define IDirectMusicSegmentState_Release(p)
Definition: dmusici.h:1140
#define IDirectMusicSegment_GetTrack(p, a, b, c, d)
Definition: dmusici.h:1016
#define IDirectMusicGraph_Release(p)
Definition: dmusici.h:1472
#define IDirectMusicGraph_StampPMsg(p, a)
Definition: dmusici.h:1474
#define IDirectMusicPerformance_ReferenceToMusicTime(p, a, b)
Definition: dmusici.h:1291
@ DMUS_PMSGT_WAVE
Definition: dmusici.h:468
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint index
Definition: glext.h:6031
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
unsigned int UINT
Definition: sysinfo.c:13
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
#define GUID_NULL
Definition: ks.h:106
if(dx< 0)
Definition: linetemp.h:194
__u16 time
Definition: mkdosfs.c:8
#define min(a, b)
Definition: monoChain.cc:55
long LONG
Definition: pedump.c:60
#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
static HRESULT segment_state_play_until(struct segment_state *This, IDirectMusicPerformance8 *performance, MUSIC_TIME end_time, DWORD track_flags)
Definition: segmentstate.c:387
static const IDirectMusicGraphVtbl segment_state_graph_vtbl
Definition: segmentstate.c:281
HRESULT segment_state_create(IDirectMusicSegment *segment, MUSIC_TIME start_time, IDirectMusicPerformance8 *performance, IDirectMusicSegmentState **ret_iface)
Definition: segmentstate.c:312
static HRESULT WINAPI segment_state_graph_QueryInterface(IDirectMusicGraph *iface, REFIID riid, void **ret_iface)
Definition: segmentstate.c:213
static HRESULT WINAPI segment_state_graph_GetTool(IDirectMusicGraph *iface, DWORD index, IDirectMusicTool **tool)
Definition: segmentstate.c:267
static ULONG WINAPI segment_state_graph_Release(IDirectMusicGraph *iface)
Definition: segmentstate.c:225
static ULONG WINAPI segment_state_Release(IDirectMusicSegmentState8 *iface)
Definition: segmentstate.c:112
static HRESULT WINAPI segment_state_GetRepeats(IDirectMusicSegmentState8 *iface, DWORD *repeats)
Definition: segmentstate.c:130
static ULONG WINAPI segment_state_graph_AddRef(IDirectMusicGraph *iface)
Definition: segmentstate.c:219
HRESULT segment_state_stop(IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
Definition: segmentstate.c:502
static HRESULT WINAPI segment_state_graph_RemoveTool(IDirectMusicGraph *iface, IDirectMusicTool *tool)
Definition: segmentstate.c:274
BOOL segment_state_has_track(IDirectMusicSegmentState *iface, DWORD track_id)
Definition: segmentstate.c:537
static HRESULT WINAPI segment_state_SetTrackConfig(IDirectMusicSegmentState8 *iface, REFGUID rguidTrackClassID, DWORD dwGroupBits, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff)
Definition: segmentstate.c:178
static void track_entry_destroy(struct track_entry *entry)
Definition: segmentstate.c:34
static HRESULT WINAPI segment_state_graph_StampPMsg(IDirectMusicGraph *iface, DMUS_PMSG *msg)
Definition: segmentstate.c:231
static HRESULT segment_state_play_chunk(struct segment_state *This, IDirectMusicPerformance8 *performance, REFERENCE_TIME duration)
Definition: segmentstate.c:418
static HRESULT WINAPI segment_state_GetObjectInPath(IDirectMusicSegmentState8 *iface, DWORD dwPChannel, DWORD dwStage, DWORD dwBuffer, REFGUID guidObject, DWORD dwIndex, REFGUID iidInterface, void **ppObject)
Definition: segmentstate.c:186
static DWORD next_track_id
Definition: segmentstate.c:23
static HRESULT WINAPI segment_state_graph_InsertTool(IDirectMusicGraph *iface, IDirectMusicTool *tool, DWORD *channels, DWORD channels_count, LONG index)
Definition: segmentstate.c:259
static HRESULT WINAPI segment_state_QueryInterface(IDirectMusicSegmentState8 *iface, REFIID riid, void **ppobj)
Definition: segmentstate.c:73
static struct segment_state * impl_from_IDirectMusicSegmentState8(IDirectMusicSegmentState8 *iface)
Definition: segmentstate.c:68
static HRESULT WINAPI segment_state_GetStartPoint(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_point)
Definition: segmentstate.c:168
HRESULT segment_state_end_play(IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
Definition: segmentstate.c:512
BOOL segment_state_has_segment(IDirectMusicSegmentState *iface, IDirectMusicSegment *segment)
Definition: segmentstate.c:531
HRESULT create_dmsegmentstate(REFIID riid, void **ret_iface)
Definition: segmentstate.c:293
static struct segment_state * impl_from_IDirectMusicGraph(IDirectMusicGraph *iface)
Definition: segmentstate.c:208
static const IDirectMusicSegmentState8Vtbl segment_state_vtbl
Definition: segmentstate.c:194
static HRESULT WINAPI segment_state_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_time)
Definition: segmentstate.c:150
HRESULT segment_state_tick(IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
Definition: segmentstate.c:493
static HRESULT WINAPI segment_state_GetSegment(IDirectMusicSegmentState8 *iface, IDirectMusicSegment **segment)
Definition: segmentstate.c:138
static HRESULT WINAPI segment_state_GetSeek(IDirectMusicSegmentState8 *iface, MUSIC_TIME *seek_time)
Definition: segmentstate.c:160
static ULONG WINAPI segment_state_AddRef(IDirectMusicSegmentState8 *iface)
Definition: segmentstate.c:102
HRESULT segment_state_play(IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
Definition: segmentstate.c:472
#define TRACE(s)
Definition: solgame.cpp:4
Definition: scsiwmi.h:51
Definition: graph.c:32
Definition: send.c:48
MUSIC_TIME end_point
Definition: segmentstate.c:55
DWORD track_flags
Definition: segmentstate.c:63
MUSIC_TIME start_time
Definition: segmentstate.c:53
struct list tracks
Definition: segmentstate.c:65
MUSIC_TIME start_point
Definition: segmentstate.c:54
BOOL auto_download
Definition: segmentstate.c:61
IDirectMusicSegment * segment
Definition: segmentstate.c:52
REFERENCE_TIME actual_duration
Definition: segmentstate.c:58
MUSIC_TIME played
Definition: segmentstate.c:56
IDirectMusicGraph IDirectMusicGraph_iface
Definition: segmentstate.c:48
DWORD actual_repeats
Definition: segmentstate.c:62
IDirectMusicSegmentState8 IDirectMusicSegmentState8_iface
Definition: segmentstate.c:47
IDirectMusicGraph * parent_graph
Definition: segmentstate.c:51
MUSIC_TIME actual_end_point
Definition: segmentstate.c:59
Definition: segment.c:26
void * state_data
Definition: segmentstate.c:30
IDirectMusicTrack * track
Definition: segmentstate.c:29
DWORD track_id
Definition: segmentstate.c:31
struct list entry
Definition: segment.c:27
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_POINTER
Definition: winerror.h:3480