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

Go to the source code of this file.

Classes

struct  wave_item
 
struct  wave_part
 
struct  wave_track
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (dmime)
 
static struct wave_track * impl_from_IDirectMusicTrack8 (IDirectMusicTrack8 *iface)
 
static struct wave_track * impl_from_IPersistStream (IPersistStream *iface)
 
static HRESULT WINAPI wave_track_QueryInterface (IDirectMusicTrack8 *iface, REFIID riid, void **ret_iface)
 
static ULONG WINAPI wave_track_AddRef (IDirectMusicTrack8 *iface)
 
static ULONG WINAPI wave_track_Release (IDirectMusicTrack8 *iface)
 
static HRESULT WINAPI wave_track_Init (IDirectMusicTrack8 *iface, IDirectMusicSegment *pSegment)
 
static HRESULT WINAPI wave_track_InitPlay (IDirectMusicTrack8 *iface, IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance, void **ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
 
static HRESULT WINAPI wave_track_EndPlay (IDirectMusicTrack8 *iface, void *pStateData)
 
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)
 
static HRESULT WINAPI wave_track_GetParam (IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, MUSIC_TIME *next, void *param)
 
static HRESULT WINAPI wave_track_SetParam (IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, void *param)
 
static HRESULT WINAPI wave_track_IsParamSupported (IDirectMusicTrack8 *iface, REFGUID type)
 
static HRESULT WINAPI wave_track_AddNotificationType (IDirectMusicTrack8 *iface, REFGUID notiftype)
 
static HRESULT WINAPI wave_track_RemoveNotificationType (IDirectMusicTrack8 *iface, REFGUID notiftype)
 
static HRESULT WINAPI wave_track_Clone (IDirectMusicTrack8 *iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
 
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)
 
static HRESULT WINAPI wave_track_GetParamEx (IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *prtNext, void *pParam, void *pStateData, DWORD dwFlags)
 
static HRESULT WINAPI wave_track_SetParamEx (IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, void *pParam, void *pStateData, DWORD dwFlags)
 
static HRESULT WINAPI wave_track_Compose (IDirectMusicTrack8 *iface, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **track)
 
static HRESULT WINAPI wave_track_Join (IDirectMusicTrack8 *iface, IDirectMusicTrack *newtrack, MUSIC_TIME join, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **resulttrack)
 
static HRESULT parse_wave_item (struct wave_part *part, IStream *stream, struct chunk_entry *wavi)
 
static HRESULT parse_wave_part (struct wave_track *This, IStream *stream, struct chunk_entry *wavp)
 
static HRESULT WINAPI wave_IPersistStream_Load (IPersistStream *iface, IStream *stream)
 
HRESULT create_dmwavetrack (REFIID lpcGUID, void **ppobj)
 
HRESULT wave_track_create_from_chunk (IStream *stream, struct chunk_entry *parent, IDirectMusicTrack8 **ret_iface)
 

Variables

static const IDirectMusicTrack8Vtbl dmtrack8_vtbl
 
static const IPersistStreamVtbl persiststream_vtbl
 

Function Documentation

◆ create_dmwavetrack()

HRESULT create_dmwavetrack ( REFIID  lpcGUID,
void **  ppobj 
)

Definition at line 585 of file wavetrack.c.

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}
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
void dmobject_init(struct dmobject *dmobj, const GUID *class, IUnknown *outer_unk)
Definition: dmobject.c:749
#define IDirectMusicTrack8_Release(p)
Definition: dmplugin.h:275
#define IDirectMusicTrack8_QueryInterface(p, a, b)
Definition: dmplugin.h:273
#define calloc
Definition: rosglue.h:14
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
static const IPersistStreamVtbl persiststream_vtbl
Definition: wavetrack.c:573
static const IDirectMusicTrack8Vtbl dmtrack8_vtbl
Definition: wavetrack.c:407

Referenced by wave_track_create_from_chunk().

◆ impl_from_IDirectMusicTrack8()

◆ impl_from_IPersistStream()

static struct wave_track * impl_from_IPersistStream ( IPersistStream *  iface)
inlinestatic

Definition at line 52 of file wavetrack.c.

53{
54 return CONTAINING_RECORD(iface, struct wave_track, dmobj.IPersistStream_iface);
55}

Referenced by wave_IPersistStream_Load().

◆ parse_wave_item()

static HRESULT parse_wave_item ( struct wave_part *  part,
IStream *  stream,
struct chunk_entry *  wavi 
)
static

Definition at line 428 of file wavetrack.c.

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}
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
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
#define DMUS_E_UNSUPPORTED_STREAM
Definition: dmerror.h:100
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
const char * debugstr_chunk(const struct chunk_entry *chunk)
Definition: dmobject.c:279
HRESULT dmobj_parsereference(IStream *stream, const struct chunk_entry *list, IDirectMusicObject **dmobj)
Definition: dmobject.c:654
#define DMUS_FOURCC_WAVE_LIST
Definition: dmusicf.h:218
#define DMUS_FOURCC_REF_LIST
Definition: dmusicf.h:102
#define DMUS_FOURCC_WAVEITEM_CHUNK
Definition: dmusicf.h:219
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define error(str)
Definition: mkdosfs.c:1605
#define FOURCC_LIST
Definition: mmsystem.h:565
#define TRACE(s)
Definition: solgame.cpp:4
Definition: dmobject.h:26
Definition: parse.h:23
struct list items
Definition: wavetrack.c:34
Definition: wave.c:37

Referenced by parse_wave_part().

◆ parse_wave_part()

static HRESULT parse_wave_part ( struct wave_track *  This,
IStream *  stream,
struct chunk_entry *  wavp 
)
static

Definition at line 487 of file wavetrack.c.

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}
#define DMUS_FOURCC_WAVEITEM_LIST
Definition: dmusicf.h:217
#define DMUS_FOURCC_WAVEPART_CHUNK
Definition: dmusicf.h:216
struct list entry
Definition: wavetrack.c:32
DMUS_IO_WAVE_PART_HEADER header
Definition: wavetrack.c:33
static HRESULT parse_wave_item(struct wave_part *part, IStream *stream, struct chunk_entry *wavi)
Definition: wavetrack.c:428

Referenced by wave_IPersistStream_Load().

◆ wave_IPersistStream_Load()

static HRESULT WINAPI wave_IPersistStream_Load ( IPersistStream *  iface,
IStream *  stream 
)
static

Definition at line 533 of file wavetrack.c.

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}
HRESULT stream_get_chunk(IStream *stream, struct chunk_entry *chunk)
Definition: dmobject.c:307
#define DMUS_FOURCC_WAVETRACK_LIST
Definition: dmusicf.h:213
#define DMUS_FOURCC_WAVETRACK_CHUNK
Definition: dmusicf.h:214
#define DMUS_FOURCC_WAVEPART_LIST
Definition: dmusicf.h:215
#define SUCCEEDED(hr)
Definition: intsafe.h:50
FOURCC id
Definition: dmobject.h:27
FOURCC type
Definition: dmobject.h:29
static HRESULT parse_wave_part(struct wave_track *This, IStream *stream, struct chunk_entry *wavp)
Definition: wavetrack.c:487
static struct wave_track * impl_from_IPersistStream(IPersistStream *iface)
Definition: wavetrack.c:52
#define E_POINTER
Definition: winerror.h:3480

◆ wave_track_AddNotificationType()

static HRESULT WINAPI wave_track_AddNotificationType ( IDirectMusicTrack8 *  iface,
REFGUID  notiftype 
)
static

Definition at line 334 of file wavetrack.c.

335{
337
338 TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype));
339 return E_NOTIMPL;
340}
#define E_NOTIMPL
Definition: ddrawi.h:99
const char * debugstr_dmguid(const GUID *id)
Definition: dmobject.c:36
static struct wave_track * impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface)
Definition: wavetrack.c:47

◆ wave_track_AddRef()

static ULONG WINAPI wave_track_AddRef ( IDirectMusicTrack8 *  iface)
static

Definition at line 80 of file wavetrack.c.

81{
84
85 TRACE("(%p) ref=%ld\n", This, ref);
86
87 return ref;
88}
#define InterlockedIncrement
Definition: armddk.h:53
long LONG
Definition: pedump.c:60
Definition: send.c:48

◆ wave_track_Clone()

static HRESULT WINAPI wave_track_Clone ( IDirectMusicTrack8 *  iface,
MUSIC_TIME  mtStart,
MUSIC_TIME  mtEnd,
IDirectMusicTrack **  ppTrack 
)
static

Definition at line 351 of file wavetrack.c.

353{
355 FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack);
356 return S_OK;
357}
#define FIXME(fmt,...)
Definition: precomp.h:53

◆ wave_track_Compose()

static HRESULT WINAPI wave_track_Compose ( IDirectMusicTrack8 *  iface,
IUnknown *  context,
DWORD  trackgroup,
IDirectMusicTrack **  track 
)
static

Definition at line 389 of file wavetrack.c.

391{
393
394 TRACE("(%p, %p, %ld, %p): method not implemented\n", This, context, trackgroup, track);
395 return E_NOTIMPL;
396}
Definition: http.c:7252

◆ wave_track_create_from_chunk()

HRESULT wave_track_create_from_chunk ( IStream *  stream,
struct chunk_entry *  parent,
IDirectMusicTrack8 **  ret_iface 
)

Definition at line 605 of file wavetrack.c.

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}
HRESULT wave_get_duration(IDirectMusicObject *iface, REFERENCE_TIME *duration)
Definition: wave.c:521
HRESULT wave_create_from_chunk(IStream *stream, struct chunk_entry *parent, IDirectMusicObject **out)
Definition: wave.c:292
r parent
Definition: btrfs.c:3010
HRESULT create_dmwavetrack(REFIID lpcGUID, void **ppobj)
Definition: wavetrack.c:585

Referenced by segment_persist_stream_Load().

◆ wave_track_EndPlay()

static HRESULT WINAPI wave_track_EndPlay ( IDirectMusicTrack8 *  iface,
void *  pStateData 
)
static

Definition at line 139 of file wavetrack.c.

140{
142 FIXME("(%p, %p): stub\n", This, pStateData);
143 return S_OK;
144}

◆ wave_track_GetParam()

static HRESULT WINAPI wave_track_GetParam ( IDirectMusicTrack8 *  iface,
REFGUID  type,
MUSIC_TIME  time,
MUSIC_TIME *  next,
void *  param 
)
static

Definition at line 215 of file wavetrack.c.

217{
219
220 TRACE("(%p, %s, %ld, %p, %p): not supported\n", This, debugstr_dmguid(type), time, next, param);
222}
#define DMUS_E_GET_UNSUPPORTED
Definition: dmerror.h:72
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLfloat param
Definition: glext.h:5796
__u16 time
Definition: mkdosfs.c:8
static unsigned __int64 next
Definition: rand_nt.c:6

◆ wave_track_GetParamEx()

static HRESULT WINAPI wave_track_GetParamEx ( IDirectMusicTrack8 *  iface,
REFGUID  rguidType,
REFERENCE_TIME  rtTime,
REFERENCE_TIME *  prtNext,
void *  pParam,
void *  pStateData,
DWORD  dwFlags 
)
static

Definition at line 370 of file wavetrack.c.

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}
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141

◆ wave_track_Init()

static HRESULT WINAPI wave_track_Init ( IDirectMusicTrack8 *  iface,
IDirectMusicSegment *  pSegment 
)
static

Definition at line 122 of file wavetrack.c.

123{
125 FIXME("(%p, %p): stub\n", This, pSegment);
126 return S_OK;
127}

◆ wave_track_InitPlay()

static HRESULT WINAPI wave_track_InitPlay ( IDirectMusicTrack8 *  iface,
IDirectMusicSegmentState *  pSegmentState,
IDirectMusicPerformance *  pPerformance,
void **  ppStateData,
DWORD  dwVirtualTrack8ID,
DWORD  dwFlags 
)
static

Definition at line 129 of file wavetrack.c.

132{
134 FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This, pSegmentState, pPerformance, ppStateData,
135 dwVirtualTrack8ID, dwFlags);
136 return S_OK;
137}

◆ wave_track_IsParamSupported()

static HRESULT WINAPI wave_track_IsParamSupported ( IDirectMusicTrack8 *  iface,
REFGUID  type 
)
static

Definition at line 311 of file wavetrack.c.

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}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define DMUS_E_TYPE_UNSUPPORTED
Definition: dmerror.h:112
BOOLEAN valid
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
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147

◆ wave_track_Join()

static HRESULT WINAPI wave_track_Join ( IDirectMusicTrack8 *  iface,
IDirectMusicTrack *  newtrack,
MUSIC_TIME  join,
IUnknown *  context,
DWORD  trackgroup,
IDirectMusicTrack **  resulttrack 
)
static

Definition at line 398 of file wavetrack.c.

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}
LOCAL int join(int *aux, int a, int b)
Definition: match.c:560

◆ wave_track_Play()

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 
)
static

Definition at line 146 of file wavetrack.c.

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}
#define msg(x)
Definition: auth_time.c:54
@ 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 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 IDirectMusicPerformance_SendPMsg(p, a)
Definition: dmusici.h:1289
#define IDirectMusicGraph_Release(p)
Definition: dmusici.h:1472
#define IDirectMusicPerformance_FreePMsg(p, a)
Definition: dmusici.h:1295
#define IDirectMusicGraph_StampPMsg(p, a)
Definition: dmusici.h:1474
#define IDirectMusicPerformance_AllocPMsg(p, a, b)
Definition: dmusici.h:1294
@ DMUS_PMSGT_WAVE
Definition: dmusici.h:468
#define IDirectSoundBuffer_AddRef(p)
Definition: dsound.h:573
unsigned long DWORD
Definition: ntddk_ex.h:95
uint32_t entry
Definition: isohybrid.c:63
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236
Definition: graph.c:32

◆ wave_track_PlayEx()

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 
)
static

Definition at line 359 of file wavetrack.c.

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}

◆ wave_track_QueryInterface()

static HRESULT WINAPI wave_track_QueryInterface ( IDirectMusicTrack8 *  iface,
REFIID  riid,
void **  ret_iface 
)
static

Definition at line 57 of file wavetrack.c.

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}
const GUID IID_IUnknown
REFIID riid
Definition: atlbase.h:39
const GUID IID_IPersistStream
Definition: proxy.cpp:13
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ wave_track_Release()

static ULONG WINAPI wave_track_Release ( IDirectMusicTrack8 *  iface)
static

Definition at line 90 of file wavetrack.c.

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}
#define InterlockedDecrement
Definition: armddk.h:52
static void list_remove(struct list_entry *entry)
Definition: list.h:90
#define IDirectMusicObject_Release(p)
Definition: dmusici.h:844
#define IDirectSoundBuffer_Release(p)
Definition: dsound.h:574
static const struct metadata_item item2[]
Definition: metadata.c:3608
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242

◆ wave_track_RemoveNotificationType()

static HRESULT WINAPI wave_track_RemoveNotificationType ( IDirectMusicTrack8 *  iface,
REFGUID  notiftype 
)
static

Definition at line 342 of file wavetrack.c.

344{
346
347 TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype));
348 return E_NOTIMPL;
349}

◆ wave_track_SetParam()

static HRESULT WINAPI wave_track_SetParam ( IDirectMusicTrack8 *  iface,
REFGUID  type,
MUSIC_TIME  time,
void *  param 
)
static

Definition at line 224 of file wavetrack.c.

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}
HRESULT performance_get_dsound(IDirectMusicPerformance8 *iface, IDirectSound **dsound)
Definition: performance.c:2316
HRESULT wave_download_to_dsound(IDirectMusicObject *iface, IDirectSound *dsound, IDirectSoundBuffer **ret_iface)
Definition: wave.c:481
#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 IDirectMusicPerformance_Release(p)
Definition: dmusici.h:1279
#define IDirectMusicAudioPath_Release(p)
Definition: dmusici.h:1211
#define DMUS_PATH_PERFORMANCE
Definition: dmusici.h:285
#define DMUS_PCHANNEL_ALL
Definition: dmusici.h:299

◆ wave_track_SetParamEx()

static HRESULT WINAPI wave_track_SetParamEx ( IDirectMusicTrack8 *  iface,
REFGUID  rguidType,
REFERENCE_TIME  rtTime,
void *  pParam,
void *  pStateData,
DWORD  dwFlags 
)
static

Definition at line 380 of file wavetrack.c.

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}

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( dmime  )

Variable Documentation

◆ dmtrack8_vtbl

const IDirectMusicTrack8Vtbl dmtrack8_vtbl
static
Initial value:
= {
}
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 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 HRESULT WINAPI wave_track_IsParamSupported(IDirectMusicTrack8 *iface, REFGUID type)
Definition: wavetrack.c:311
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_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 WINAPI wave_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, MUSIC_TIME *next, void *param)
Definition: wavetrack.c:215

Definition at line 407 of file wavetrack.c.

Referenced by create_dmwavetrack().

◆ persiststream_vtbl

const IPersistStreamVtbl persiststream_vtbl
static
Initial value:
= {
}
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
HRESULT WINAPI dmobj_IPersistStream_GetClassID(IPersistStream *iface, CLSID *class)
Definition: dmobject.c:708
ULONG WINAPI dmobj_IPersistStream_AddRef(IPersistStream *iface)
Definition: dmobject.c:696
HRESULT WINAPI dmobj_IPersistStream_QueryInterface(IPersistStream *iface, REFIID riid, void **ret_iface)
Definition: dmobject.c:689
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 WINAPI wave_IPersistStream_Load(IPersistStream *iface, IStream *stream)
Definition: wavetrack.c:533

Definition at line 573 of file wavetrack.c.

Referenced by create_dmwavetrack().