ReactOS 0.4.17-dev-934-g091855f
segmentstate.c File Reference
#include "dmime_private.h"
Include dependency graph for segmentstate.c:

Go to the source code of this file.

Classes

struct  track_entry
 
struct  segment_state
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (dmime)
 
static void track_entry_destroy (struct track_entry *entry)
 
static struct segment_state * impl_from_IDirectMusicSegmentState8 (IDirectMusicSegmentState8 *iface)
 
static HRESULT WINAPI segment_state_QueryInterface (IDirectMusicSegmentState8 *iface, REFIID riid, void **ppobj)
 
static ULONG WINAPI segment_state_AddRef (IDirectMusicSegmentState8 *iface)
 
static ULONG WINAPI segment_state_Release (IDirectMusicSegmentState8 *iface)
 
static HRESULT WINAPI segment_state_GetRepeats (IDirectMusicSegmentState8 *iface, DWORD *repeats)
 
static HRESULT WINAPI segment_state_GetSegment (IDirectMusicSegmentState8 *iface, IDirectMusicSegment **segment)
 
static HRESULT WINAPI segment_state_GetStartTime (IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_time)
 
static HRESULT WINAPI segment_state_GetSeek (IDirectMusicSegmentState8 *iface, MUSIC_TIME *seek_time)
 
static HRESULT WINAPI segment_state_GetStartPoint (IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_point)
 
static HRESULT WINAPI segment_state_SetTrackConfig (IDirectMusicSegmentState8 *iface, REFGUID rguidTrackClassID, DWORD dwGroupBits, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff)
 
static HRESULT WINAPI segment_state_GetObjectInPath (IDirectMusicSegmentState8 *iface, DWORD dwPChannel, DWORD dwStage, DWORD dwBuffer, REFGUID guidObject, DWORD dwIndex, REFGUID iidInterface, void **ppObject)
 
static struct segment_state * impl_from_IDirectMusicGraph (IDirectMusicGraph *iface)
 
static HRESULT WINAPI segment_state_graph_QueryInterface (IDirectMusicGraph *iface, REFIID riid, void **ret_iface)
 
static ULONG WINAPI segment_state_graph_AddRef (IDirectMusicGraph *iface)
 
static ULONG WINAPI segment_state_graph_Release (IDirectMusicGraph *iface)
 
static HRESULT WINAPI segment_state_graph_StampPMsg (IDirectMusicGraph *iface, DMUS_PMSG *msg)
 
static HRESULT WINAPI segment_state_graph_InsertTool (IDirectMusicGraph *iface, IDirectMusicTool *tool, DWORD *channels, DWORD channels_count, LONG index)
 
static HRESULT WINAPI segment_state_graph_GetTool (IDirectMusicGraph *iface, DWORD index, IDirectMusicTool **tool)
 
static HRESULT WINAPI segment_state_graph_RemoveTool (IDirectMusicGraph *iface, IDirectMusicTool *tool)
 
HRESULT create_dmsegmentstate (REFIID riid, void **ret_iface)
 
HRESULT segment_state_create (IDirectMusicSegment *segment, MUSIC_TIME start_time, IDirectMusicPerformance8 *performance, IDirectMusicSegmentState **ret_iface)
 
static HRESULT segment_state_play_until (struct segment_state *This, IDirectMusicPerformance8 *performance, MUSIC_TIME end_time, DWORD track_flags)
 
static HRESULT segment_state_play_chunk (struct segment_state *This, IDirectMusicPerformance8 *performance, REFERENCE_TIME duration)
 
HRESULT segment_state_play (IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
 
HRESULT segment_state_tick (IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
 
HRESULT segment_state_stop (IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
 
HRESULT segment_state_end_play (IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
 
BOOL segment_state_has_segment (IDirectMusicSegmentState *iface, IDirectMusicSegment *segment)
 
BOOL segment_state_has_track (IDirectMusicSegmentState *iface, DWORD track_id)
 

Variables

static DWORD next_track_id
 
static const IDirectMusicSegmentState8Vtbl segment_state_vtbl
 
static const IDirectMusicGraphVtbl segment_state_graph_vtbl
 

Function Documentation

◆ create_dmsegmentstate()

HRESULT create_dmsegmentstate ( REFIID  riid,
void **  ret_iface 
)

Definition at line 293 of file segmentstate.c.

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}
static void list_init(struct list_entry *head)
Definition: list.h:51
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define IDirectMusicSegmentState8_Release(p)
Definition: dmusici.h:1176
#define IDirectMusicSegmentState8_QueryInterface(p, a, b)
Definition: dmusici.h:1174
REFIID riid
Definition: atlbase.h:39
#define calloc
Definition: rosglue.h:14
static const IDirectMusicGraphVtbl segment_state_graph_vtbl
Definition: segmentstate.c:281
static const IDirectMusicSegmentState8Vtbl segment_state_vtbl
Definition: segmentstate.c:194
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by segment_InitPlay(), and segment_state_create().

◆ impl_from_IDirectMusicGraph()

static struct segment_state * impl_from_IDirectMusicGraph ( IDirectMusicGraph *  iface)
inlinestatic

◆ impl_from_IDirectMusicSegmentState8()

◆ segment_state_AddRef()

static ULONG WINAPI segment_state_AddRef ( IDirectMusicSegmentState8 *  iface)
static

Definition at line 102 of file segmentstate.c.

103{
106
107 TRACE("(%p): %ld\n", This, ref);
108
109 return ref;
110}
#define InterlockedIncrement
Definition: armddk.h:53
static struct segment_state * impl_from_IDirectMusicSegmentState8(IDirectMusicSegmentState8 *iface)
Definition: segmentstate.c:68
Definition: send.c:48
uint32_t ULONG
Definition: typedefs.h:59

◆ segment_state_create()

HRESULT segment_state_create ( IDirectMusicSegment *  segment,
MUSIC_TIME  start_time,
IDirectMusicPerformance8 *  performance,
IDirectMusicSegmentState **  ret_iface 
)

Definition at line 312 of file segmentstate.c.

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}
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
#define WARN(fmt,...)
Definition: precomp.h:61
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define DMUS_E_NOT_FOUND
Definition: dmerror.h:109
#define IDirectMusicTrack_Release(p)
Definition: dmplugin.h:226
#define IDirectMusicTrack_InitPlay(p, a, b, c, d, e)
Definition: dmplugin.h:229
#define IDirectMusicPerformance8_QueryInterface(p, a, b)
Definition: dmusici.h:1392
#define IDirectMusicSegment_GetLength(p, a)
Definition: dmusici.h:1010
#define DMUS_SEG_ALLTRACKS
Definition: dmusici.h:317
#define IDirectMusicPerformance8_GetGlobalParam(p, a, b, c)
Definition: dmusici.h:1426
#define IDirectMusicSegment_GetRepeats(p, a)
Definition: dmusici.h:1012
#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
unsigned long DWORD
Definition: ntddk_ex.h:95
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
#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
static DWORD next_track_id
Definition: segmentstate.c:23
HRESULT create_dmsegmentstate(REFIID riid, void **ret_iface)
Definition: segmentstate.c:293
Definition: graph.c:32
MUSIC_TIME start_time
Definition: segmentstate.c:53
IDirectMusicSegment * segment
Definition: segmentstate.c:52
Definition: segment.c:26
IDirectMusicTrack * track
Definition: segmentstate.c:29
DWORD track_id
Definition: segmentstate.c:31

Referenced by performance_PlaySegmentEx().

◆ segment_state_end_play()

HRESULT segment_state_end_play ( IDirectMusicSegmentState *  iface,
IDirectMusicPerformance8 *  performance 
)

Definition at line 512 of file segmentstate.c.

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}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
#define ERR(fmt,...)
Definition: precomp.h:57
static unsigned __int64 next
Definition: rand_nt.c:6
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242
static void track_entry_destroy(struct track_entry *entry)
Definition: segmentstate.c:34

Referenced by performance_CloseDown(), performance_tool_ProcessPMsg(), and segment_state_Release().

◆ segment_state_GetObjectInPath()

static HRESULT WINAPI segment_state_GetObjectInPath ( IDirectMusicSegmentState8 *  iface,
DWORD  dwPChannel,
DWORD  dwStage,
DWORD  dwBuffer,
REFGUID  guidObject,
DWORD  dwIndex,
REFGUID  iidInterface,
void **  ppObject 
)
static

Definition at line 186 of file segmentstate.c.

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}
#define FIXME(fmt,...)
Definition: precomp.h:53
const char * debugstr_dmguid(const GUID *id)
Definition: dmobject.c:36

◆ segment_state_GetRepeats()

static HRESULT WINAPI segment_state_GetRepeats ( IDirectMusicSegmentState8 *  iface,
DWORD *  repeats 
)
static

Definition at line 130 of file segmentstate.c.

131{
133 TRACE("(%p, %p)\n", This, repeats);
134 *repeats = This->repeats;
135 return S_OK;
136}

◆ segment_state_GetSeek()

static HRESULT WINAPI segment_state_GetSeek ( IDirectMusicSegmentState8 *  iface,
MUSIC_TIME *  seek_time 
)
static

Definition at line 160 of file segmentstate.c.

161{
163 FIXME("(%p, %p): semi-stub\n", This, seek_time);
164 *seek_time = 0;
165 return S_OK;
166}

◆ segment_state_GetSegment()

static HRESULT WINAPI segment_state_GetSegment ( IDirectMusicSegmentState8 *  iface,
IDirectMusicSegment **  segment 
)
static

Definition at line 138 of file segmentstate.c.

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}

◆ segment_state_GetStartPoint()

static HRESULT WINAPI segment_state_GetStartPoint ( IDirectMusicSegmentState8 *  iface,
MUSIC_TIME *  start_point 
)
static

Definition at line 168 of file segmentstate.c.

169{
171
172 TRACE("(%p, %p)\n", This, start_point);
173
174 *start_point = This->start_point;
175 return S_OK;
176}
MUSIC_TIME start_point
Definition: segmentstate.c:54

◆ segment_state_GetStartTime()

static HRESULT WINAPI segment_state_GetStartTime ( IDirectMusicSegmentState8 *  iface,
MUSIC_TIME *  start_time 
)
static

Definition at line 150 of file segmentstate.c.

151{
153
154 TRACE("(%p, %p)\n", This, start_time);
155
156 *start_time = This->start_time;
157 return S_OK;
158}

◆ segment_state_graph_AddRef()

static ULONG WINAPI segment_state_graph_AddRef ( IDirectMusicGraph *  iface)
static

Definition at line 219 of file segmentstate.c.

220{
222 return IDirectMusicSegmentState8_AddRef(&This->IDirectMusicSegmentState8_iface);
223}
#define IDirectMusicSegmentState8_AddRef(p)
Definition: dmusici.h:1175
static struct segment_state * impl_from_IDirectMusicGraph(IDirectMusicGraph *iface)
Definition: segmentstate.c:208

◆ segment_state_graph_GetTool()

static HRESULT WINAPI segment_state_graph_GetTool ( IDirectMusicGraph *  iface,
DWORD  index,
IDirectMusicTool **  tool 
)
static

Definition at line 267 of file segmentstate.c.

268{
270 TRACE("(%p, %lu, %p)\n", This, index, tool);
271 return E_NOTIMPL;
272}
#define E_NOTIMPL
Definition: ddrawi.h:99
GLuint index
Definition: glext.h:6031

◆ segment_state_graph_InsertTool()

static HRESULT WINAPI segment_state_graph_InsertTool ( IDirectMusicGraph *  iface,
IDirectMusicTool *  tool,
DWORD *  channels,
DWORD  channels_count,
LONG  index 
)
static

Definition at line 259 of file segmentstate.c.

261{
263 TRACE("(%p, %p, %p, %lu, %ld)\n", This, tool, channels, channels_count, index);
264 return E_NOTIMPL;
265}
unsigned int channels
Definition: audiorecord.c:89

◆ segment_state_graph_QueryInterface()

static HRESULT WINAPI segment_state_graph_QueryInterface ( IDirectMusicGraph *  iface,
REFIID  riid,
void **  ret_iface 
)
static

Definition at line 213 of file segmentstate.c.

214{
216 return IDirectMusicSegmentState8_QueryInterface(&This->IDirectMusicSegmentState8_iface, riid, ret_iface);
217}

◆ segment_state_graph_Release()

static ULONG WINAPI segment_state_graph_Release ( IDirectMusicGraph *  iface)
static

Definition at line 225 of file segmentstate.c.

226{
228 return IDirectMusicSegmentState8_Release(&This->IDirectMusicSegmentState8_iface);
229}

◆ segment_state_graph_RemoveTool()

static HRESULT WINAPI segment_state_graph_RemoveTool ( IDirectMusicGraph *  iface,
IDirectMusicTool *  tool 
)
static

Definition at line 274 of file segmentstate.c.

275{
277 TRACE("(%p, %p)\n", This, tool);
278 return E_NOTIMPL;
279}

◆ segment_state_graph_StampPMsg()

static HRESULT WINAPI segment_state_graph_StampPMsg ( IDirectMusicGraph *  iface,
DMUS_PMSG *  msg 
)
static

Definition at line 231 of file segmentstate.c.

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}
#define msg(x)
Definition: auth_time.c:54
@ DMUS_PMSGF_MUSICTIME
Definition: dmusici.h:446
@ DMUS_PMSGF_REFTIME
Definition: dmusici.h:445
#define IDirectMusicGraph_StampPMsg(p, a)
Definition: dmusici.h:1474
@ DMUS_PMSGT_WAVE
Definition: dmusici.h:468
#define E_POINTER
Definition: winerror.h:3480

◆ segment_state_has_segment()

BOOL segment_state_has_segment ( IDirectMusicSegmentState *  iface,
IDirectMusicSegment *  segment 
)

Definition at line 531 of file segmentstate.c.

532{
533 struct segment_state *This = impl_from_IDirectMusicSegmentState8((IDirectMusicSegmentState8 *)iface);
534 return !segment || This->segment == segment;
535}

Referenced by enum_segment_states().

◆ segment_state_has_track()

BOOL segment_state_has_track ( IDirectMusicSegmentState *  iface,
DWORD  track_id 
)

Definition at line 537 of file segmentstate.c.

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 TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236

Referenced by message_needs_flushing().

◆ segment_state_play()

HRESULT segment_state_play ( IDirectMusicSegmentState *  iface,
IDirectMusicPerformance8 *  performance 
)

Definition at line 472 of file segmentstate.c.

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}
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
@ DMUS_TRACKF_SEEK
Definition: dmplugin.h:111
@ DMUS_TRACKF_START
Definition: dmplugin.h:113
@ DMUS_TRACKF_DIRTY
Definition: dmplugin.h:115
static HRESULT segment_state_play_chunk(struct segment_state *This, IDirectMusicPerformance8 *performance, REFERENCE_TIME duration)
Definition: segmentstate.c:418
#define S_FALSE
Definition: winerror.h:3451

Referenced by performance_PlaySegmentEx().

◆ segment_state_play_chunk()

static HRESULT segment_state_play_chunk ( struct segment_state *  This,
IDirectMusicPerformance8 *  performance,
REFERENCE_TIME  duration 
)
static

Definition at line 418 of file segmentstate.c.

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}
HRESULT performance_send_segment_end(IDirectMusicPerformance8 *iface, MUSIC_TIME music_time, IDirectMusicSegmentState *state, BOOL abort)
Definition: performance.c:355
LONG MUSIC_TIME
Definition: dmplugin.h:95
@ DMUS_TRACKF_LOOP
Definition: dmplugin.h:112
#define IDirectMusicPerformance8_ReferenceToMusicTime(p, a, b)
Definition: dmusici.h:1406
#define IDirectMusicSegment_GetLoopPoints(p, a, b)
Definition: dmusici.h:1031
#define IDirectMusicPerformance8_MusicToReferenceTime(p, a, b)
Definition: dmusici.h:1405
#define IDirectMusicPerformance_ReferenceToMusicTime(p, a, b)
Definition: dmusici.h:1291
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
if(dx< 0)
Definition: linetemp.h:194
__u16 time
Definition: mkdosfs.c:8
static HRESULT segment_state_play_until(struct segment_state *This, IDirectMusicPerformance8 *performance, MUSIC_TIME end_time, DWORD track_flags)
Definition: segmentstate.c:387

Referenced by segment_state_play(), and segment_state_tick().

◆ segment_state_play_until()

static HRESULT segment_state_play_until ( struct segment_state *  This,
IDirectMusicPerformance8 *  performance,
MUSIC_TIME  end_time,
DWORD  track_flags 
)
static

Definition at line 387 of file segmentstate.c.

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}
#define IDirectMusicTrack_Play(p, a, b, c, d, e, f, g, h)
Definition: dmplugin.h:231
#define min(a, b)
Definition: monoChain.cc:55

Referenced by segment_state_play_chunk().

◆ segment_state_QueryInterface()

static HRESULT WINAPI segment_state_QueryInterface ( IDirectMusicSegmentState8 *  iface,
REFIID  riid,
void **  ppobj 
)
static

Definition at line 73 of file segmentstate.c.

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}
const GUID IID_IUnknown
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ segment_state_Release()

static ULONG WINAPI segment_state_Release ( IDirectMusicSegmentState8 *  iface)
static

Definition at line 112 of file segmentstate.c.

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}
#define InterlockedDecrement
Definition: armddk.h:52
#define IDirectMusicSegment_Release(p)
Definition: dmusici.h:1008
HRESULT segment_state_end_play(IDirectMusicSegmentState *iface, IDirectMusicPerformance8 *performance)
Definition: segmentstate.c:512

◆ segment_state_SetTrackConfig()

static HRESULT WINAPI segment_state_SetTrackConfig ( IDirectMusicSegmentState8 *  iface,
REFGUID  rguidTrackClassID,
DWORD  dwGroupBits,
DWORD  dwIndex,
DWORD  dwFlagsOn,
DWORD  dwFlagsOff 
)
static

Definition at line 178 of file segmentstate.c.

180{
182 FIXME("(%p, %s, %ld, %ld, %ld, %ld): stub\n", This, debugstr_dmguid(rguidTrackClassID), dwGroupBits, dwIndex, dwFlagsOn, dwFlagsOff);
183 return S_OK;
184}

◆ segment_state_stop()

HRESULT segment_state_stop ( IDirectMusicSegmentState *  iface,
IDirectMusicPerformance8 *  performance 
)

Definition at line 502 of file segmentstate.c.

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}

Referenced by performance_Stop().

◆ segment_state_tick()

HRESULT segment_state_tick ( IDirectMusicSegmentState *  iface,
IDirectMusicPerformance8 *  performance 
)

Definition at line 493 of file segmentstate.c.

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}

Referenced by performance_tool_ProcessPMsg().

◆ track_entry_destroy()

static void track_entry_destroy ( struct track_entry *  entry)
static

Definition at line 34 of file segmentstate.c.

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}
#define IDirectMusicTrack_EndPlay(p, a)
Definition: dmplugin.h:230

Referenced by segment_state_end_play().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( dmime  )

Variable Documentation

◆ next_track_id

DWORD next_track_id
static

Definition at line 23 of file segmentstate.c.

Referenced by segment_state_create().

◆ segment_state_graph_vtbl

const IDirectMusicGraphVtbl segment_state_graph_vtbl
static
Initial value:
=
{
}
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_graph_AddRef(IDirectMusicGraph *iface)
Definition: segmentstate.c:219
static HRESULT WINAPI segment_state_graph_RemoveTool(IDirectMusicGraph *iface, IDirectMusicTool *tool)
Definition: segmentstate.c:274
static HRESULT WINAPI segment_state_graph_StampPMsg(IDirectMusicGraph *iface, DMUS_PMSG *msg)
Definition: segmentstate.c:231
static HRESULT WINAPI segment_state_graph_InsertTool(IDirectMusicGraph *iface, IDirectMusicTool *tool, DWORD *channels, DWORD channels_count, LONG index)
Definition: segmentstate.c:259

Definition at line 281 of file segmentstate.c.

Referenced by create_dmsegmentstate().

◆ segment_state_vtbl

const IDirectMusicSegmentState8Vtbl segment_state_vtbl
static
Initial value:
=
{
}
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 HRESULT WINAPI segment_state_SetTrackConfig(IDirectMusicSegmentState8 *iface, REFGUID rguidTrackClassID, DWORD dwGroupBits, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff)
Definition: segmentstate.c:178
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 HRESULT WINAPI segment_state_QueryInterface(IDirectMusicSegmentState8 *iface, REFIID riid, void **ppobj)
Definition: segmentstate.c:73
static HRESULT WINAPI segment_state_GetStartPoint(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_point)
Definition: segmentstate.c:168
static HRESULT WINAPI segment_state_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_time)
Definition: segmentstate.c:150
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

Definition at line 194 of file segmentstate.c.

Referenced by create_dmsegmentstate().