ReactOS 0.4.17-dev-934-g091855f
timesigtrack.c
Go to the documentation of this file.
1/* IDirectMusicTimeSigTrack Implementation
2 *
3 * Copyright (C) 2003-2004 Rok Mandeljc
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#include "dmime_private.h"
21
23
24/*****************************************************************************
25 * IDirectMusicTimeSigTrack implementation
26 */
28 IDirectMusicTrack IDirectMusicTrack_iface;
29 struct dmobject dmobj; /* IPersistStream only */
31
33 unsigned int count;
35
36/* IDirectMusicTimeSigTrack IDirectMusicTrack8 part: */
37static inline IDirectMusicTimeSigTrack *impl_from_IDirectMusicTrack(IDirectMusicTrack *iface)
38{
39 return CONTAINING_RECORD(iface, IDirectMusicTimeSigTrack, IDirectMusicTrack_iface);
40}
41
43{
44 return CONTAINING_RECORD(iface, IDirectMusicTimeSigTrack, dmobj.IPersistStream_iface);
45}
46
48 void **ret_iface)
49{
51
52 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
53
54 *ret_iface = NULL;
55
56 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectMusicTrack))
57 *ret_iface = iface;
59 *ret_iface = &This->dmobj.IPersistStream_iface;
60 else {
61 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface);
62 return E_NOINTERFACE;
63 }
64
65 IUnknown_AddRef((IUnknown*)*ret_iface);
66 return S_OK;
67}
68
69static ULONG WINAPI IDirectMusicTrackImpl_AddRef(IDirectMusicTrack *iface)
70{
73
74 TRACE("(%p) ref=%ld\n", This, ref);
75
76 return ref;
77}
78
79static ULONG WINAPI IDirectMusicTrackImpl_Release(IDirectMusicTrack *iface)
80{
83
84 TRACE("(%p) ref=%ld\n", This, ref);
85
86 if (!ref) {
87 free(This->items);
88 free(This);
89 }
90
91 return ref;
92}
93
94static HRESULT WINAPI IDirectMusicTrackImpl_Init(IDirectMusicTrack *iface,
95 IDirectMusicSegment *pSegment)
96{
98 FIXME("(%p, %p): stub\n", This, pSegment);
99 return S_OK;
100}
101
102static HRESULT WINAPI IDirectMusicTrackImpl_InitPlay(IDirectMusicTrack *iface,
103 IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance,
104 void **ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
105{
107 FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This, pSegmentState, pPerformance, ppStateData, dwVirtualTrack8ID, dwFlags);
108 return S_OK;
109}
110
111static HRESULT WINAPI IDirectMusicTrackImpl_EndPlay(IDirectMusicTrack *iface, void *pStateData)
112{
114 FIXME("(%p, %p): stub\n", This, pStateData);
115 return S_OK;
116}
117
118static HRESULT WINAPI IDirectMusicTrackImpl_Play(IDirectMusicTrack *iface, void *pStateData,
119 MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD dwFlags,
120 IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID)
121{
123 FIXME("(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): stub\n", This, pStateData, mtStart, mtEnd, mtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
124 return S_OK;
125}
126
129{
131
132 TRACE("(%p, %s, %ld, %p, %p)\n", This, debugstr_dmguid(type), time, next, param);
133
134 if (IsEqualGUID(type, &GUID_TimeSignature)) {
135 FIXME("GUID_TimeSignature not handled yet\n");
136 return DMUS_E_NOT_FOUND;
137 }
138
140}
141
143 MUSIC_TIME time, void *param)
144{
146
147 TRACE("(%p, %s, %ld, %p)\n", This, debugstr_dmguid(type), time, param);
148
149 if (IsEqualGUID(type, &GUID_DisableTimeSig)) {
150 FIXME("GUID_DisableTimeSig not handled yet\n");
151 return S_OK;
152 }
153 if (IsEqualGUID(type, &GUID_EnableTimeSig)) {
154 FIXME("GUID_EnableTimeSig not handled yet\n");
155 return S_OK;
156 }
157
159}
160
162 REFGUID rguidType)
163{
165
166 TRACE("(%p, %s)\n", This, debugstr_dmguid(rguidType));
167 if (IsEqualGUID (rguidType, &GUID_DisableTimeSig)
168 || IsEqualGUID (rguidType, &GUID_EnableTimeSig)
169 || IsEqualGUID (rguidType, &GUID_TimeSignature)) {
170 TRACE("param supported\n");
171 return S_OK;
172 }
173 TRACE("param unsupported\n");
175}
176
178 REFGUID rguidNotificationType)
179{
181 FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidNotificationType));
182 return S_OK;
183}
184
186 REFGUID rguidNotificationType)
187{
189 FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidNotificationType));
190 return S_OK;
191}
192
193static HRESULT WINAPI IDirectMusicTrackImpl_Clone(IDirectMusicTrack *iface, MUSIC_TIME mtStart,
194 MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
195{
197 FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack);
198 return S_OK;
199}
200
201static const IDirectMusicTrackVtbl dmtack_vtbl = {
215};
216
218 struct chunk_entry *timesig)
219{
220 HRESULT hr;
221 struct chunk_entry chunk = {.parent = timesig};
222 int i;
223
224 TRACE("Parsing segment form in %p: %s\n", stream, debugstr_chunk(timesig));
225
227 WARN("Failed to read data of %s\n", debugstr_chunk(&chunk));
228 return hr;
229 }
230
233
234 hr = stream_chunk_get_array(stream, &chunk, (void **)&This->items, &This->count,
236 if (FAILED(hr))
237 return hr;
238
239 for (i = 0; i < This->count; i++)
240 {
241 TRACE("Found DMUS_IO_TIMESIGNATURE_ITEM\n");
242 TRACE(" - lTime %ld\n", This->items[i].lTime);
243 TRACE(" - bBeatsPerMeasure %d\n", This->items[i].bBeatsPerMeasure);
244 TRACE(" - bBeat %d\n", This->items[i].bBeat);
245 TRACE(" - wGridsPerBeat %d\n", This->items[i].wGridsPerBeat);
246 }
247
248 return S_OK;
249}
250
252{
254 HRESULT hr;
255 struct chunk_entry chunk = {0};
256
257 TRACE("%p, %p\n", This, stream);
258
259 if (!stream)
260 return E_POINTER;
261
262 if ((hr = stream_get_chunk(stream, &chunk)) != S_OK)
263 return hr;
264
267 else
269
270 return hr;
271}
272
273static const IPersistStreamVtbl persiststream_vtbl = {
282};
283
284/* for ClassFactory */
286{
288 HRESULT hr;
289
290 *ppobj = NULL;
291 if (!(track = calloc(1, sizeof(*track)))) return E_OUTOFMEMORY;
292 track->IDirectMusicTrack_iface.lpVtbl = &dmtack_vtbl;
293 track->ref = 1;
294 dmobject_init(&track->dmobj, &CLSID_DirectMusicTimeSigTrack,
296 track->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl;
297
300
301 return hr;
302}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define DMUS_E_GET_UNSUPPORTED
Definition: dmerror.h:72
#define DMUS_E_UNSUPPORTED_STREAM
Definition: dmerror.h:100
#define DMUS_E_NOT_FOUND
Definition: dmerror.h:109
#define DMUS_E_TYPE_UNSUPPORTED
Definition: dmerror.h:112
#define DMUS_E_SET_UNSUPPORTED
Definition: dmerror.h:71
void dmobject_init(struct dmobject *dmobj, const GUID *class, IUnknown *outer_unk)
Definition: dmobject.c:749
HRESULT stream_next_chunk(IStream *stream, struct chunk_entry *chunk)
Definition: dmobject.c:360
ULONG WINAPI dmobj_IPersistStream_Release(IPersistStream *iface)
Definition: dmobject.c:702
HRESULT WINAPI unimpl_IPersistStream_GetSizeMax(IPersistStream *iface, ULARGE_INTEGER *size)
Definition: dmobject.c:742
const char * debugstr_chunk(const struct chunk_entry *chunk)
Definition: dmobject.c:279
HRESULT WINAPI dmobj_IPersistStream_GetClassID(IPersistStream *iface, CLSID *class)
Definition: dmobject.c:708
ULONG WINAPI dmobj_IPersistStream_AddRef(IPersistStream *iface)
Definition: dmobject.c:696
const char * debugstr_dmguid(const GUID *id)
Definition: dmobject.c:36
HRESULT stream_chunk_get_array(IStream *stream, const struct chunk_entry *chunk, void **array, unsigned int *count, DWORD elem_size)
Definition: dmobject.c:378
HRESULT WINAPI dmobj_IPersistStream_QueryInterface(IPersistStream *iface, REFIID riid, void **ret_iface)
Definition: dmobject.c:689
HRESULT stream_get_chunk(IStream *stream, struct chunk_entry *chunk)
Definition: dmobject.c:307
HRESULT WINAPI unimpl_IPersistStream_IsDirty(IPersistStream *iface)
Definition: dmobject.c:729
HRESULT WINAPI unimpl_IPersistStream_Save(IPersistStream *iface, IStream *stream, BOOL clear_dirty)
Definition: dmobject.c:735
#define IDirectMusicTrack_Release(p)
Definition: dmplugin.h:226
LONG MUSIC_TIME
Definition: dmplugin.h:95
#define IDirectMusicTrack_QueryInterface(p, a, b)
Definition: dmplugin.h:224
#define DMUS_FOURCC_TIMESIGTRACK_LIST
Definition: dmusicf.h:210
#define DMUS_FOURCC_TIMESIGNATURE_TRACK
Definition: dmusicf.h:209
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLfloat param
Definition: glext.h:5796
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
__u16 time
Definition: mkdosfs.c:8
#define FOURCC_LIST
Definition: mmsystem.h:565
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
long LONG
Definition: pedump.c:60
const GUID IID_IPersistStream
Definition: proxy.cpp:13
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
static unsigned __int64 next
Definition: rand_nt.c:6
#define calloc
Definition: rosglue.h:14
#define TRACE(s)
Definition: solgame.cpp:4
DMUS_IO_TIMESIGNATURE_ITEM * items
Definition: timesigtrack.c:32
IDirectMusicTrack IDirectMusicTrack_iface
Definition: timesigtrack.c:28
struct dmobject dmobj
Definition: timesigtrack.c:29
Definition: scsiwmi.h:51
Definition: dmobject.h:26
Definition: send.c:48
Definition: parse.h:23
static HRESULT WINAPI IDirectMusicTrackImpl_Play(IDirectMusicTrack *iface, void *pStateData, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD dwFlags, IDirectMusicPerformance *pPerf, IDirectMusicSegmentState *pSegSt, DWORD dwVirtualID)
Definition: timesigtrack.c:118
static IDirectMusicTimeSigTrack * impl_from_IPersistStream(IPersistStream *iface)
Definition: timesigtrack.c:42
HRESULT create_dmtimesigtrack(REFIID lpcGUID, void **ppobj)
Definition: timesigtrack.c:285
static HRESULT WINAPI IDirectMusicTrackImpl_EndPlay(IDirectMusicTrack *iface, void *pStateData)
Definition: timesigtrack.c:111
static HRESULT WINAPI IDirectMusicTrackImpl_SetParam(IDirectMusicTrack *iface, REFGUID type, MUSIC_TIME time, void *param)
Definition: timesigtrack.c:142
static ULONG WINAPI IDirectMusicTrackImpl_Release(IDirectMusicTrack *iface)
Definition: timesigtrack.c:79
static ULONG WINAPI IDirectMusicTrackImpl_AddRef(IDirectMusicTrack *iface)
Definition: timesigtrack.c:69
static HRESULT WINAPI IDirectMusicTrackImpl_QueryInterface(IDirectMusicTrack *iface, REFIID riid, void **ret_iface)
Definition: timesigtrack.c:47
static HRESULT parse_timetrack_list(IDirectMusicTimeSigTrack *This, IStream *stream, struct chunk_entry *timesig)
Definition: timesigtrack.c:217
static HRESULT WINAPI IDirectMusicTrackImpl_Init(IDirectMusicTrack *iface, IDirectMusicSegment *pSegment)
Definition: timesigtrack.c:94
static HRESULT WINAPI IDirectMusicTrackImpl_InitPlay(IDirectMusicTrack *iface, IDirectMusicSegmentState *pSegmentState, IDirectMusicPerformance *pPerformance, void **ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
Definition: timesigtrack.c:102
static HRESULT WINAPI IDirectMusicTrackImpl_IsParamSupported(IDirectMusicTrack *iface, REFGUID rguidType)
Definition: timesigtrack.c:161
static const IPersistStreamVtbl persiststream_vtbl
Definition: timesigtrack.c:273
static HRESULT WINAPI IDirectMusicTrackImpl_RemoveNotificationType(IDirectMusicTrack *iface, REFGUID rguidNotificationType)
Definition: timesigtrack.c:185
static HRESULT WINAPI IDirectMusicTrackImpl_AddNotificationType(IDirectMusicTrack *iface, REFGUID rguidNotificationType)
Definition: timesigtrack.c:177
static IDirectMusicTimeSigTrack * impl_from_IDirectMusicTrack(IDirectMusicTrack *iface)
Definition: timesigtrack.c:37
static HRESULT WINAPI IDirectMusicTrackImpl_Clone(IDirectMusicTrack *iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack **ppTrack)
Definition: timesigtrack.c:193
static HRESULT WINAPI time_IPersistStream_Load(IPersistStream *iface, IStream *stream)
Definition: timesigtrack.c:251
static HRESULT WINAPI IDirectMusicTrackImpl_GetParam(IDirectMusicTrack *iface, REFGUID type, MUSIC_TIME time, MUSIC_TIME *next, void *param)
Definition: timesigtrack.c:127
static const IDirectMusicTrackVtbl dmtack_vtbl
Definition: timesigtrack.c:201
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_POINTER
Definition: winerror.h:3480