ReactOS 0.4.17-dev-934-g091855f
bandtrack.c File Reference
#include "dmband_private.h"
#include "dmusic_band.h"
#include "dmobject.h"
Include dependency graph for bandtrack.c:

Go to the source code of this file.

Classes

struct  band_entry
 
struct  band_track
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (dmband)
 
static void band_entry_destroy (struct band_entry *entry)
 
static struct band_track * impl_from_IDirectMusicTrack8 (IDirectMusicTrack8 *iface)
 
static HRESULT WINAPI band_track_QueryInterface (IDirectMusicTrack8 *iface, REFIID riid, void **ret_iface)
 
static ULONG WINAPI band_track_AddRef (IDirectMusicTrack8 *iface)
 
static ULONG WINAPI band_track_Release (IDirectMusicTrack8 *iface)
 
static HRESULT WINAPI band_track_Init (IDirectMusicTrack8 *iface, IDirectMusicSegment *segment)
 
static HRESULT WINAPI band_track_InitPlay (IDirectMusicTrack8 *iface, IDirectMusicSegmentState *segment_state, IDirectMusicPerformance *performance, void **state_data, DWORD virtual_track8id, DWORD flags)
 
static HRESULT WINAPI band_track_EndPlay (IDirectMusicTrack8 *iface, void *state_data)
 
static HRESULT WINAPI band_track_Play (IDirectMusicTrack8 *iface, void *state_data, MUSIC_TIME start_time, MUSIC_TIME end_time, MUSIC_TIME time_offset, DWORD track_flags, IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD track_id)
 
static HRESULT WINAPI band_track_GetParam (IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, MUSIC_TIME *out_next, void *param)
 
static HRESULT WINAPI band_track_SetParam (IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, void *param)
 
static HRESULT WINAPI band_track_IsParamSupported (IDirectMusicTrack8 *iface, REFGUID rguidType)
 
static HRESULT WINAPI band_track_AddNotificationType (IDirectMusicTrack8 *iface, REFGUID notiftype)
 
static HRESULT WINAPI band_track_RemoveNotificationType (IDirectMusicTrack8 *iface, REFGUID notiftype)
 
static HRESULT WINAPI band_track_Clone (IDirectMusicTrack8 *iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
 
static HRESULT WINAPI band_track_PlayEx (IDirectMusicTrack8 *iface, void *state_data, REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD flags, IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD virtual_id)
 
static HRESULT WINAPI band_track_GetParamEx (IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *rtNext, void *param, void *state_data, DWORD flags)
 
static HRESULT WINAPI band_track_SetParamEx (IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, void *param, void *state_data, DWORD flags)
 
static HRESULT WINAPI band_track_Compose (IDirectMusicTrack8 *iface, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **track)
 
static HRESULT WINAPI band_track_Join (IDirectMusicTrack8 *iface, IDirectMusicTrack *pNewTrack, MUSIC_TIME mtJoin, IUnknown *pContext, DWORD dwTrackGroup, IDirectMusicTrack **ppResultTrack)
 
static HRESULT parse_lbnd_list (struct band_track *This, IStream *stream, struct chunk_entry *parent)
 
static HRESULT parse_lbdl_list (struct band_track *This, IStream *stream, struct chunk_entry *parent)
 
static HRESULT parse_dmbt_chunk (struct band_track *This, IStream *stream, struct chunk_entry *parent)
 
static struct band_track * impl_from_IPersistStream (IPersistStream *iface)
 
static HRESULT WINAPI band_track_persist_stream_Load (IPersistStream *iface, IStream *stream)
 
HRESULT create_dmbandtrack (REFIID lpcGUID, void **ppobj)
 

Variables

static const IDirectMusicTrack8Vtbl band_track_vtbl
 
static const IPersistStreamVtbl band_track_persist_stream_vtbl
 

Function Documentation

◆ band_entry_destroy()

static void band_entry_destroy ( struct band_entry *  entry)
static

Definition at line 32 of file bandtrack.c.

33{
35 free(entry);
36}
#define free
Definition: debug_ros.c:5
#define IDirectMusicTrack_Release(p)
Definition: dmplugin.h:226
uint32_t entry
Definition: isohybrid.c:63

Referenced by band_track_Release().

◆ band_track_AddNotificationType()

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

Definition at line 356 of file bandtrack.c.

357{
359
360 TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype));
361 return E_NOTIMPL;
362}
static struct band_track * impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface)
Definition: bandtrack.c:47
#define E_NOTIMPL
Definition: ddrawi.h:99
const char * debugstr_dmguid(const GUID *id)
Definition: dmobject.c:36
#define TRACE(s)
Definition: solgame.cpp:4

◆ band_track_AddRef()

static ULONG WINAPI band_track_AddRef ( IDirectMusicTrack8 *  iface)
static

Definition at line 75 of file bandtrack.c.

76{
79
80 TRACE("(%p) ref=%ld\n", This, ref);
81
82 return ref;
83}
#define InterlockedIncrement
Definition: armddk.h:53
long LONG
Definition: pedump.c:60
LONG ref
Definition: bandtrack.c:42
Definition: send.c:48

◆ band_track_Clone()

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

Definition at line 373 of file bandtrack.c.

375{
377 FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack);
378 return S_OK;
379}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define S_OK
Definition: intsafe.h:52

◆ band_track_Compose()

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

Definition at line 417 of file bandtrack.c.

419{
421
422 TRACE("(%p, %p, %ld, %p): method not implemented\n", This, context, trackgroup, track);
423 return E_NOTIMPL;
424}
Definition: http.c:7252

◆ band_track_EndPlay()

static HRESULT WINAPI band_track_EndPlay ( IDirectMusicTrack8 *  iface,
void *  state_data 
)
static

Definition at line 142 of file bandtrack.c.

143{
145 struct band_entry *entry;
146 HRESULT hr;
147
148 FIXME("(%p, %p): semi-stub\n", This, state_data);
149
150 if (This->header.bAutoDownload)
151 {
153 {
155 return hr;
156 }
157 }
158
159 return S_OK;
160}
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define IDirectMusicBand_Unload(p, a)
Definition: dmusici.h:819
#define FAILED(hr)
Definition: intsafe.h:51
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236
Definition: bandtrack.c:26

◆ band_track_GetParam()

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

Definition at line 201 of file bandtrack.c.

203{
205 struct band_entry *band, *next_band;
206 DMUS_BAND_PARAM *bandparam;
207
208 TRACE("(%p, %s, %ld, %p, %p)\n", This, debugstr_dmguid(type), time, out_next, param);
209
210 if (!type)
211 return E_POINTER;
212 if (!IsEqualGUID(type, &GUID_BandParam))
214 if (list_empty(&This->bands))
215 return DMUS_E_NOT_FOUND;
216
217 bandparam = param;
218 if (out_next) *out_next = 0;
219
220 LIST_FOR_EACH_ENTRY_SAFE(band, next_band, &This->bands, struct band_entry, entry)
221 {
222 /* we want to return the first band even when there's nothing with lBandTime <= time */
223 bandparam->pBand = band->band;
224 bandparam->mtTimePhysical = band->head.lBandTimePhysical;
225 if (band->entry.next == &This->bands) break;
226 if (out_next) *out_next = next_band->head.lBandTimeLogical;
227 if (next_band->head.lBandTimeLogical > time) break;
228 }
229
230 IDirectMusicBand_AddRef(bandparam->pBand);
231 return S_OK;
232}
static int list_empty(struct list_entry *head)
Definition: list.h:58
#define DMUS_E_GET_UNSUPPORTED
Definition: dmerror.h:72
#define DMUS_E_NOT_FOUND
Definition: dmerror.h:109
#define IDirectMusicBand_AddRef(p)
Definition: dmusici.h:814
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLfloat param
Definition: glext.h:5796
__u16 time
Definition: mkdosfs.c:8
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242
MUSIC_TIME mtTimePhysical
Definition: dmusici.h:783
struct IDirectMusicBand * pBand
Definition: dmusici.h:784
MUSIC_TIME lBandTimeLogical
Definition: dmusicf.h:665
IDirectMusicBand * band
Definition: bandtrack.c:29
DMUS_IO_BAND_ITEM_HEADER2 head
Definition: bandtrack.c:28
Definition: band.c:76
#define E_POINTER
Definition: winerror.h:3480

◆ band_track_GetParamEx()

static HRESULT WINAPI band_track_GetParamEx ( IDirectMusicTrack8 *  iface,
REFGUID  rguidType,
REFERENCE_TIME  rtTime,
REFERENCE_TIME *  rtNext,
void *  param,
void *  state_data,
DWORD  flags 
)
static

Definition at line 394 of file bandtrack.c.

397{
399
400 FIXME("(%p, %s, 0x%s, %p, %p, %p, %lx): stub\n", This, debugstr_dmguid(rguidType),
401 wine_dbgstr_longlong(rtTime), rtNext, param, state_data, flags);
402
403 return S_OK;
404}
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
GLbitfield flags
Definition: glext.h:7161

◆ band_track_Init()

static HRESULT WINAPI band_track_Init ( IDirectMusicTrack8 *  iface,
IDirectMusicSegment *  segment 
)
static

Definition at line 108 of file bandtrack.c.

109{
111
112 FIXME("(%p, %p): stub\n", This, segment);
113
114 if (!segment) return E_POINTER;
115 return S_OK;
116}

◆ band_track_InitPlay()

static HRESULT WINAPI band_track_InitPlay ( IDirectMusicTrack8 *  iface,
IDirectMusicSegmentState *  segment_state,
IDirectMusicPerformance *  performance,
void **  state_data,
DWORD  virtual_track8id,
DWORD  flags 
)
static

Definition at line 118 of file bandtrack.c.

121{
123 struct band_entry *entry;
124 HRESULT hr;
125
126 FIXME("(%p, %p, %p, %p, %ld, %lx): semi-stub\n", This, segment_state, performance, state_data, virtual_track8id, flags);
127
128 if (!performance) return E_POINTER;
129
130 if (This->header.bAutoDownload)
131 {
133 {
135 return hr;
136 }
137 }
138
139 return S_OK;
140}
#define IDirectMusicBand_Download(p, a)
Definition: dmusici.h:818

◆ band_track_IsParamSupported()

static HRESULT WINAPI band_track_IsParamSupported ( IDirectMusicTrack8 *  iface,
REFGUID  rguidType 
)
static

Definition at line 328 of file bandtrack.c.

329{
331
332 TRACE("(%p, %s)\n", This, debugstr_dmguid(rguidType));
333
334 if (!rguidType)
335 return E_POINTER;
336
337 if (IsEqualGUID (rguidType, &GUID_BandParam)
338 || IsEqualGUID (rguidType, &GUID_Clear_All_Bands)
339 || IsEqualGUID (rguidType, &GUID_ConnectToDLSCollection)
340 || IsEqualGUID (rguidType, &GUID_Disable_Auto_Download)
341 || IsEqualGUID (rguidType, &GUID_Download)
342 || IsEqualGUID (rguidType, &GUID_DownloadToAudioPath)
343 || IsEqualGUID (rguidType, &GUID_Enable_Auto_Download)
344 || IsEqualGUID (rguidType, &GUID_IDirectMusicBand)
345 || IsEqualGUID (rguidType, &GUID_StandardMIDIFile)
346 || IsEqualGUID (rguidType, &GUID_Unload)
347 || IsEqualGUID (rguidType, &GUID_UnloadFromAudioPath)) {
348 TRACE("param supported\n");
349 return S_OK;
350 }
351
352 TRACE("param unsupported\n");
354}
#define DMUS_E_TYPE_UNSUPPORTED
Definition: dmerror.h:112

◆ band_track_Join()

static HRESULT WINAPI band_track_Join ( IDirectMusicTrack8 *  iface,
IDirectMusicTrack *  pNewTrack,
MUSIC_TIME  mtJoin,
IUnknown *  pContext,
DWORD  dwTrackGroup,
IDirectMusicTrack **  ppResultTrack 
)
static

Definition at line 426 of file bandtrack.c.

429{
431 FIXME("(%p, %p, %ld, %p, %ld, %p): stub\n", This, pNewTrack, mtJoin, pContext, dwTrackGroup, ppResultTrack);
432 return S_OK;
433}

◆ band_track_persist_stream_Load()

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

Definition at line 591 of file bandtrack.c.

592{
594 struct chunk_entry chunk = {0};
595 HRESULT hr;
596
597 TRACE("(%p, %p)\n", This, stream);
598
599 if ((hr = stream_get_chunk(stream, &chunk)) == S_OK)
600 {
601 switch (MAKE_IDTYPE(chunk.id, chunk.type))
602 {
605 break;
606
607 default:
608 WARN("Invalid band track chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
610 break;
611 }
612 }
613
615 if (FAILED(hr)) return hr;
616
617 if (TRACE_ON(dmband))
618 {
619 struct band_entry *entry;
620 int i = 0;
621
622 TRACE("Loaded DirectMusicBandTrack %p\n", This);
623 dump_DMUS_OBJECTDESC(&This->dmobj.desc);
624
625 TRACE(" - header:\n");
626 TRACE(" - bAutoDownload: %u\n", This->header.bAutoDownload);
627
628 TRACE(" - bands:\n");
630 {
631 TRACE(" - band[%u]: %p\n", i++, entry->band);
632 TRACE(" - lBandTimeLogical: %ld\n", entry->head.lBandTimeLogical);
633 TRACE(" - lBandTimePhysical: %ld\n", entry->head.lBandTimePhysical);
634 }
635 }
636
637 return S_OK;
638}
static struct band_track * impl_from_IPersistStream(IPersistStream *iface)
Definition: bandtrack.c:586
static HRESULT parse_dmbt_chunk(struct band_track *This, IStream *stream, struct chunk_entry *parent)
Definition: bandtrack.c:547
#define WARN(fmt,...)
Definition: precomp.h:61
#define TRACE_ON(x)
Definition: compat.h:75
#define DMUS_E_UNSUPPORTED_STREAM
Definition: dmerror.h:100
void dump_DMUS_OBJECTDESC(DMUS_OBJECTDESC *desc)
Definition: dmobject.c:222
HRESULT stream_skip_chunk(IStream *stream, const struct chunk_entry *chunk)
Definition: dmobject.c:351
HRESULT stream_get_chunk(IStream *stream, struct chunk_entry *chunk)
Definition: dmobject.c:307
#define MAKE_IDTYPE(id, type)
Definition: dmobject.h:33
#define DMUS_FOURCC_BANDTRACK_FORM
Definition: dmusicf.h:145
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 FOURCC_RIFF
Definition: mmsystem.h:564
static __inline const char * debugstr_fourcc(unsigned int cc)
Definition: debug.h:397
Definition: dmobject.h:26
Definition: parse.h:23

◆ band_track_Play()

static HRESULT WINAPI band_track_Play ( IDirectMusicTrack8 *  iface,
void *  state_data,
MUSIC_TIME  start_time,
MUSIC_TIME  end_time,
MUSIC_TIME  time_offset,
DWORD  track_flags,
IDirectMusicPerformance *  performance,
IDirectMusicSegmentState *  segment_state,
DWORD  track_id 
)
static

Definition at line 162 of file bandtrack.c.

165{
167 IDirectMusicGraph *graph;
168 struct band_entry *entry;
169 HRESULT hr;
170
171 TRACE("(%p, %p, %ld, %ld, %ld, %#lx, %p, %p, %ld)\n", This, state_data, start_time, end_time,
172 time_offset, track_flags, performance, segment_state, track_id);
173
174 if (!performance) return DMUS_S_END;
175
176 if (track_flags) FIXME("track_flags %#lx not implemented\n", track_flags);
177 if (segment_state) FIXME("segment_state %p not implemented\n", segment_state);
178
180 &IID_IDirectMusicGraph, (void **)&graph)))
181 return hr;
182
184 {
185 MUSIC_TIME music_time = entry->head.lBandTimeLogical;
186 if (music_time == -1 && !(track_flags & DMUS_TRACKF_START)) continue;
187 else if (music_time != -1)
188 {
189 if (music_time < start_time || music_time >= end_time) continue;
190 music_time += time_offset;
191 }
192
193 if (FAILED(hr = band_send_messages(entry->band, performance, graph, music_time, track_id)))
194 break;
195 }
196
198 return hr;
199}
HRESULT band_send_messages(IDirectMusicBand *iface, IDirectMusicPerformance *performance, IDirectMusicGraph *graph, MUSIC_TIME time, DWORD track_id)
Definition: band.c:489
#define DMUS_S_END
Definition: dmerror.h:44
LONG MUSIC_TIME
Definition: dmplugin.h:95
@ DMUS_TRACKF_START
Definition: dmplugin.h:113
#define IDirectMusicPerformance_QueryInterface(p, a, b)
Definition: dmusici.h:1277
#define IDirectMusicGraph_Release(p)
Definition: dmusici.h:1472
Definition: graph.c:32

◆ band_track_PlayEx()

static HRESULT WINAPI band_track_PlayEx ( IDirectMusicTrack8 *  iface,
void *  state_data,
REFERENCE_TIME  rtStart,
REFERENCE_TIME  rtEnd,
REFERENCE_TIME  rtOffset,
DWORD  flags,
IDirectMusicPerformance *  performance,
IDirectMusicSegmentState *  segment_state,
DWORD  virtual_id 
)
static

Definition at line 381 of file bandtrack.c.

385{
387
388 FIXME("(%p, %p, 0x%s, 0x%s, 0x%s, %lx, %p, %p, %ld): stub\n", This, state_data, wine_dbgstr_longlong(rtStart),
390
391 return S_OK;
392}

◆ band_track_QueryInterface()

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

Definition at line 52 of file bandtrack.c.

54{
56
57 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
58
59 *ret_iface = NULL;
60
61 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectMusicTrack) ||
62 IsEqualIID(riid, &IID_IDirectMusicTrack8))
63 *ret_iface = iface;
65 *ret_iface = &This->dmobj.IPersistStream_iface;
66 else {
67 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface);
68 return E_NOINTERFACE;
69 }
70
71 IUnknown_AddRef((IUnknown*)*ret_iface);
72 return S_OK;
73}
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

◆ band_track_Release()

static ULONG WINAPI band_track_Release ( IDirectMusicTrack8 *  iface)
static

Definition at line 85 of file bandtrack.c.

86{
89
90 TRACE("(%p) ref=%ld\n", This, ref);
91
92 if (!ref)
93 {
94 struct band_entry *entry, *next;
95
97 {
98 list_remove(&entry->entry);
100 }
101
102 free(This);
103 }
104
105 return ref;
106}
#define InterlockedDecrement
Definition: armddk.h:52
static void band_entry_destroy(struct band_entry *entry)
Definition: bandtrack.c:32
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static unsigned __int64 next
Definition: rand_nt.c:6

◆ band_track_RemoveNotificationType()

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

Definition at line 364 of file bandtrack.c.

366{
368
369 TRACE("(%p, %s): method not implemented\n", This, debugstr_dmguid(notiftype));
370 return E_NOTIMPL;
371}

◆ band_track_SetParam()

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

Definition at line 234 of file bandtrack.c.

236{
238
239 TRACE("(%p, %s, %ld, %p)\n", This, debugstr_dmguid(type), time, param);
240
241 if (!type)
242 return E_POINTER;
245
246 if (IsEqualGUID(type, &GUID_BandParam))
247 {
248 struct band_entry *new_entry = NULL, *entry, *next_entry;
249 DMUS_BAND_PARAM *band_param = param;
250 if (!band_param || !band_param->pBand)
251 return E_POINTER;
252 if (!(new_entry = calloc(1, sizeof(*new_entry))))
253 return E_OUTOFMEMORY;
254 new_entry->band = band_param->pBand;
255 new_entry->head.lBandTimeLogical = time;
256 new_entry->head.lBandTimePhysical = band_param->mtTimePhysical;
257 IDirectMusicBand_AddRef(new_entry->band);
258 if (list_empty(&This->bands))
259 list_add_tail(&This->bands, &new_entry->entry);
260 else
261 {
262 LIST_FOR_EACH_ENTRY_SAFE(entry, next_entry, &This->bands, struct band_entry, entry)
263 if (entry->entry.next == &This->bands || next_entry->head.lBandTimeLogical > time)
264 {
265 list_add_after(&entry->entry, &new_entry->entry);
266 break;
267 }
268 }
269 }
270 else if (IsEqualGUID(type, &GUID_Clear_All_Bands))
271 FIXME("GUID_Clear_All_Bands not handled yet\n");
272 else if (IsEqualGUID(type, &GUID_ConnectToDLSCollection))
273 {
274 struct band_entry *entry;
275
278 }
279 else if (IsEqualGUID(type, &GUID_Disable_Auto_Download))
280 This->header.bAutoDownload = FALSE;
281 else if (IsEqualGUID(type, &GUID_Download))
282 FIXME("GUID_Download not handled yet\n");
283 else if (IsEqualGUID(type, &GUID_DownloadToAudioPath))
284 {
285 IDirectMusicPerformance *performance;
286 IDirectMusicAudioPath *audio_path;
287 IUnknown *object = param;
288 struct band_entry *entry;
289 HRESULT hr;
290
291 if (FAILED(hr = IDirectMusicAudioPath_QueryInterface(object, &IID_IDirectMusicPerformance8, (void **)&performance))
292 && SUCCEEDED(hr = IDirectMusicAudioPath_QueryInterface(object, &IID_IDirectMusicAudioPath, (void **)&audio_path)))
293 {
295 &GUID_All_Objects, 0, &IID_IDirectMusicPerformance8, (void **)&performance);
297 }
298
299 if (FAILED(hr))
300 {
301 WARN("Failed to get IDirectMusicPerformance from param %p\n", param);
302 return hr;
303 }
304
307
309 }
310 else if (IsEqualGUID(type, &GUID_Enable_Auto_Download))
311 This->header.bAutoDownload = TRUE;
312 else if (IsEqualGUID(type, &GUID_IDirectMusicBand))
313 FIXME("GUID_IDirectMusicBand not handled yet\n");
314 else if (IsEqualGUID(type, &GUID_StandardMIDIFile))
315 FIXME("GUID_StandardMIDIFile not handled yet\n");
316 else if (IsEqualGUID(type, &GUID_UnloadFromAudioPath))
317 {
318 struct band_entry *entry;
319 HRESULT hr;
320
322 if (FAILED(hr = IDirectMusicBand_Unload(entry->band, NULL))) break;
323 }
324
325 return S_OK;
326}
HRESULT band_connect_to_collection(IDirectMusicBand *iface, IDirectMusicCollection *collection)
Definition: band.c:477
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define IDirectMusicTrack8_IsParamSupported(p, a)
Definition: dmplugin.h:283
#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
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define calloc
Definition: rosglue.h:14
__WINE_SERVER_LIST_INLINE void list_add_after(struct list *elem, struct list *to_add)
Definition: list.h:80
MUSIC_TIME lBandTimePhysical
Definition: dmusicf.h:666
struct list entry
Definition: bandtrack.c:27

◆ band_track_SetParamEx()

static HRESULT WINAPI band_track_SetParamEx ( IDirectMusicTrack8 *  iface,
REFGUID  rguidType,
REFERENCE_TIME  rtTime,
void *  param,
void *  state_data,
DWORD  flags 
)
static

Definition at line 406 of file bandtrack.c.

408{
410
411 FIXME("(%p, %s, 0x%s, %p, %p, %lx): stub\n", This, debugstr_dmguid(rguidType),
412 wine_dbgstr_longlong(rtTime), param, state_data, flags);
413
414 return S_OK;
415}

◆ create_dmbandtrack()

HRESULT create_dmbandtrack ( REFIID  lpcGUID,
void **  ppobj 
)

Definition at line 653 of file bandtrack.c.

654{
655 struct band_track *track;
656 HRESULT hr;
657
658 *ppobj = NULL;
659 if (!(track = calloc(1, sizeof(*track)))) return E_OUTOFMEMORY;
661 track->ref = 1;
662 dmobject_init(&track->dmobj, &CLSID_DirectMusicBandTrack, (IUnknown *)&track->IDirectMusicTrack8_iface);
663 track->dmobj.IPersistStream_iface.lpVtbl = &band_track_persist_stream_vtbl;
664 list_init(&track->bands);
665
668
669 return hr;
670}
static const IDirectMusicTrack8Vtbl band_track_vtbl
Definition: bandtrack.c:435
static const IPersistStreamVtbl band_track_persist_stream_vtbl
Definition: bandtrack.c:640
static void list_init(struct list_entry *head)
Definition: list.h:51
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
struct dmobject dmobj
Definition: bandtrack.c:41
IDirectMusicTrack8 IDirectMusicTrack8_iface
Definition: bandtrack.c:40
struct list bands
Definition: bandtrack.c:44

◆ impl_from_IDirectMusicTrack8()

◆ impl_from_IPersistStream()

static struct band_track * impl_from_IPersistStream ( IPersistStream *  iface)
inlinestatic

Definition at line 586 of file bandtrack.c.

587{
588 return CONTAINING_RECORD(iface, struct band_track, dmobj.IPersistStream_iface);
589}

Referenced by band_track_persist_stream_Load().

◆ parse_dmbt_chunk()

static HRESULT parse_dmbt_chunk ( struct band_track *  This,
IStream *  stream,
struct chunk_entry *  parent 
)
static

Definition at line 547 of file bandtrack.c.

548{
549 struct chunk_entry chunk = {.parent = parent};
550 HRESULT hr;
551
552 if (FAILED(hr = dmobj_parsedescriptor(stream, parent, &This->dmobj.desc,
555 return hr;
556
557 while ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
558 {
559 switch (MAKE_IDTYPE(chunk.id, chunk.type))
560 {
564 /* already parsed by dmobj_parsedescriptor */
565 break;
566
568 hr = stream_chunk_get_data(stream, &chunk, &This->header, sizeof(This->header));
569 break;
570
573 break;
574
575 default:
576 FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
577 break;
578 }
579
580 if (FAILED(hr)) break;
581 }
582
583 return hr;
584}
static HRESULT parse_lbdl_list(struct band_track *This, IStream *stream, struct chunk_entry *parent)
Definition: bandtrack.c:523
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
HRESULT dmobj_parsedescriptor(IStream *stream, const struct chunk_entry *riff, DMUS_OBJECTDESC *desc, DWORD supported)
Definition: dmobject.c:591
static HRESULT stream_reset_chunk_data(IStream *stream, const struct chunk_entry *chunk)
Definition: dmobject.h:50
#define DMUS_OBJ_NAME_INAM
Definition: dmobject.h:96
#define DMUS_FOURCC_GUID_CHUNK
Definition: dmusicf.h:42
#define DMUS_FOURCC_BANDTRACK_CHUNK
Definition: dmusicf.h:146
#define DMUS_FOURCC_VERSION_CHUNK
Definition: dmusicf.h:51
#define DMUS_FOURCC_BANDS_LIST
Definition: dmusicf.h:147
#define DMUS_FOURCC_UNFO_LIST
Definition: dmusicf.h:44
#define DMUS_OBJ_NAME
Definition: dmusici.h:267
#define DMUS_OBJ_VERSION
Definition: dmusici.h:272
#define DMUS_OBJ_OBJECT
Definition: dmusici.h:265
r parent
Definition: btrfs.c:3010
#define FOURCC_LIST
Definition: mmsystem.h:565

Referenced by band_track_persist_stream_Load().

◆ parse_lbdl_list()

static HRESULT parse_lbdl_list ( struct band_track *  This,
IStream *  stream,
struct chunk_entry *  parent 
)
static

Definition at line 523 of file bandtrack.c.

524{
525 struct chunk_entry chunk = {.parent = parent};
526 HRESULT hr;
527
528 while ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
529 {
530 switch (MAKE_IDTYPE(chunk.id, chunk.type))
531 {
534 break;
535
536 default:
537 FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
538 break;
539 }
540
541 if (FAILED(hr)) break;
542 }
543
544 return S_OK;
545}
static HRESULT parse_lbnd_list(struct band_track *This, IStream *stream, struct chunk_entry *parent)
Definition: bandtrack.c:457
#define DMUS_FOURCC_BAND_LIST
Definition: dmusicf.h:148

Referenced by parse_dmbt_chunk().

◆ parse_lbnd_list()

static HRESULT parse_lbnd_list ( struct band_track *  This,
IStream *  stream,
struct chunk_entry *  parent 
)
static

Definition at line 457 of file bandtrack.c.

458{
459 struct chunk_entry chunk = {.parent = parent};
461 struct band_entry *entry;
462 IDirectMusicBand *band;
463 HRESULT hr;
464
465 while ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
466 {
467 switch (MAKE_IDTYPE(chunk.id, chunk.type))
468 {
470 {
472
474 {
475 header2.lBandTimeLogical = header.lBandTime;
476 header2.lBandTimePhysical = header.lBandTime;
477 }
478
479 break;
480 }
481
483 hr = stream_chunk_get_data(stream, &chunk, &header2, sizeof(header2));
484 break;
485
487 {
488 IPersistStream *persist;
489
490 if (FAILED(hr = CoCreateInstance(&CLSID_DirectMusicBand, NULL, CLSCTX_INPROC_SERVER,
491 &IID_IDirectMusicBand, (void **)&band)))
492 break;
493
495 {
497 hr = IPersistStream_Load(persist, stream);
498 IPersistStream_Release(persist);
499 }
500
501 break;
502 }
503
504 default:
505 FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
506 break;
507 }
508
509 if (FAILED(hr)) break;
510 }
511
512 if (FAILED(hr)) return hr;
513
514 if (!(entry = calloc(1, sizeof(*entry)))) return E_OUTOFMEMORY;
515 entry->head = header2;
516 entry->band = band;
518 list_add_tail(&This->bands, &entry->entry);
519
520 return S_OK;
521}
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
static HRESULT stream_reset_chunk_start(IStream *stream, const struct chunk_entry *chunk)
Definition: dmobject.h:61
#define DMUS_FOURCC_BAND_FORM
Definition: dmusicf.h:63
#define DMUS_FOURCC_BANDITEM_CHUNK2
Definition: dmusicf.h:150
#define DMUS_FOURCC_BANDITEM_CHUNK
Definition: dmusicf.h:149
#define IDirectMusicBand_QueryInterface(p, a, b)
Definition: dmusici.h:813

Referenced by parse_lbdl_list().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( dmband  )

Variable Documentation

◆ band_track_persist_stream_vtbl

const IPersistStreamVtbl band_track_persist_stream_vtbl
static
Initial value:
=
{
}
static HRESULT WINAPI band_track_persist_stream_Load(IPersistStream *iface, IStream *stream)
Definition: bandtrack.c:591
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

Definition at line 640 of file bandtrack.c.

Referenced by create_dmbandtrack().

◆ band_track_vtbl

const IDirectMusicTrack8Vtbl band_track_vtbl
static
Initial value:
=
{
}
static HRESULT WINAPI band_track_AddNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype)
Definition: bandtrack.c:356
static HRESULT WINAPI band_track_SetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, void *param, void *state_data, DWORD flags)
Definition: bandtrack.c:406
static HRESULT WINAPI band_track_IsParamSupported(IDirectMusicTrack8 *iface, REFGUID rguidType)
Definition: bandtrack.c:328
static HRESULT WINAPI band_track_QueryInterface(IDirectMusicTrack8 *iface, REFIID riid, void **ret_iface)
Definition: bandtrack.c:52
static HRESULT WINAPI band_track_Init(IDirectMusicTrack8 *iface, IDirectMusicSegment *segment)
Definition: bandtrack.c:108
static HRESULT WINAPI band_track_EndPlay(IDirectMusicTrack8 *iface, void *state_data)
Definition: bandtrack.c:142
static HRESULT WINAPI band_track_Join(IDirectMusicTrack8 *iface, IDirectMusicTrack *pNewTrack, MUSIC_TIME mtJoin, IUnknown *pContext, DWORD dwTrackGroup, IDirectMusicTrack **ppResultTrack)
Definition: bandtrack.c:426
static ULONG WINAPI band_track_AddRef(IDirectMusicTrack8 *iface)
Definition: bandtrack.c:75
static HRESULT WINAPI band_track_InitPlay(IDirectMusicTrack8 *iface, IDirectMusicSegmentState *segment_state, IDirectMusicPerformance *performance, void **state_data, DWORD virtual_track8id, DWORD flags)
Definition: bandtrack.c:118
static ULONG WINAPI band_track_Release(IDirectMusicTrack8 *iface)
Definition: bandtrack.c:85
static HRESULT WINAPI band_track_GetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, MUSIC_TIME *out_next, void *param)
Definition: bandtrack.c:201
static HRESULT WINAPI band_track_SetParam(IDirectMusicTrack8 *iface, REFGUID type, MUSIC_TIME time, void *param)
Definition: bandtrack.c:234
static HRESULT WINAPI band_track_PlayEx(IDirectMusicTrack8 *iface, void *state_data, REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD flags, IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD virtual_id)
Definition: bandtrack.c:381
static HRESULT WINAPI band_track_RemoveNotificationType(IDirectMusicTrack8 *iface, REFGUID notiftype)
Definition: bandtrack.c:364
static HRESULT WINAPI band_track_Play(IDirectMusicTrack8 *iface, void *state_data, MUSIC_TIME start_time, MUSIC_TIME end_time, MUSIC_TIME time_offset, DWORD track_flags, IDirectMusicPerformance *performance, IDirectMusicSegmentState *segment_state, DWORD track_id)
Definition: bandtrack.c:162
static HRESULT WINAPI band_track_Compose(IDirectMusicTrack8 *iface, IUnknown *context, DWORD trackgroup, IDirectMusicTrack **track)
Definition: bandtrack.c:417
static HRESULT WINAPI band_track_GetParamEx(IDirectMusicTrack8 *iface, REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME *rtNext, void *param, void *state_data, DWORD flags)
Definition: bandtrack.c:394
static HRESULT WINAPI band_track_Clone(IDirectMusicTrack8 *iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
Definition: bandtrack.c:373

Definition at line 435 of file bandtrack.c.

Referenced by create_dmbandtrack().