ReactOS 0.4.17-dev-934-g091855f
chordmap.c
Go to the documentation of this file.
1/* IDirectMusicChordMap 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 "dmcompos_private.h"
21#include "dmobject.h"
22
25
26/*****************************************************************************
27 * IDirectMusicChordMapImpl implementation
28 */
30 IDirectMusicChordMap IDirectMusicChordMap_iface;
34
35/* IDirectMusicChordMapImpl IDirectMusicChordMap part: */
36static inline IDirectMusicChordMapImpl *impl_from_IDirectMusicChordMap(IDirectMusicChordMap *iface)
37{
38 return CONTAINING_RECORD(iface, IDirectMusicChordMapImpl, IDirectMusicChordMap_iface);
39}
40
41static HRESULT WINAPI IDirectMusicChordMapImpl_QueryInterface(IDirectMusicChordMap *iface,
42 REFIID riid, void **ret_iface)
43{
45
46 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
47
48 *ret_iface = NULL;
49
50 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectMusicChordMap))
51 *ret_iface = iface;
52 else if (IsEqualIID(riid, &IID_IDirectMusicObject))
53 *ret_iface = &This->dmobj.IDirectMusicObject_iface;
55 *ret_iface = &This->dmobj.IPersistStream_iface;
56 else {
57 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface);
58 return E_NOINTERFACE;
59 }
60
61 IUnknown_AddRef((IUnknown*)*ret_iface);
62 return S_OK;
63}
64
65static ULONG WINAPI IDirectMusicChordMapImpl_AddRef(IDirectMusicChordMap *iface)
66{
69
70 TRACE("(%p) ref=%ld\n", This, ref);
71
72 return ref;
73}
74
75static ULONG WINAPI IDirectMusicChordMapImpl_Release(IDirectMusicChordMap *iface)
76{
79
80 TRACE("(%p) ref=%ld\n", This, ref);
81
82 if (!ref) free(This);
83
84 return ref;
85}
86
87static HRESULT WINAPI IDirectMusicChordMapImpl_GetScale(IDirectMusicChordMap *iface,
88 DWORD *pdwScale)
89{
91 FIXME("(%p, %p): stub\n", This, pdwScale);
92 return S_OK;
93}
94
95static const IDirectMusicChordMapVtbl dmchordmap_vtbl = {
100};
101
102/* IDirectMusicChordMapImpl IDirectMusicObject part: */
105{
106 struct chunk_entry riff = {0};
107 HRESULT hr;
108
109 TRACE("(%p, %p, %p)\n", iface, stream, desc);
110
111 if (!stream || !desc)
112 return E_POINTER;
113
114 if ((hr = stream_get_chunk(stream, &riff)) != S_OK)
115 return hr;
116 if (riff.id != FOURCC_RIFF || riff.type != DMUS_FOURCC_CHORDMAP_FORM) {
117 TRACE("loading failed: unexpected %s\n", debugstr_chunk(&riff));
120 }
121
123 if (FAILED(hr))
124 return hr;
125
126 desc->guidClass = CLSID_DirectMusicChordMap;
127 desc->dwValidData |= DMUS_OBJ_CLASS;
128
129 TRACE("returning descriptor:\n");
131
132 return S_OK;
133}
134
135static const IDirectMusicObjectVtbl dmobject_vtbl = {
142};
143
144/* IDirectMusicChordMapImpl IPersistStream part: */
146{
147 return CONTAINING_RECORD(iface, IDirectMusicChordMapImpl, dmobj.IPersistStream_iface);
148}
149
151{
153 FOURCC chunkID;
154 DWORD chunkSize, StreamSize, StreamCount, ListSize[3], ListCount[3];
155 LARGE_INTEGER liMove; /* used when skipping chunks */
156
157 FIXME("(%p, %p): Loading not implemented yet\n", This, pStm);
158 IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
159 IStream_Read (pStm, &chunkSize, sizeof(DWORD), NULL);
160 TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
161 switch (chunkID) {
162 case FOURCC_RIFF: {
163 IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
164 TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(chunkID));
165 StreamSize = chunkSize - sizeof(FOURCC);
166 StreamCount = 0;
167 switch (chunkID) {
169 TRACE_(dmfile)(": chordmap form\n");
170 do {
171 IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
172 IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
173 StreamCount += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
174 TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
175 switch (chunkID) {
177 TRACE_(dmfile)(": GUID chunk\n");
178 This->dmobj.desc.dwValidData |= DMUS_OBJ_OBJECT;
179 IStream_Read (pStm, &This->dmobj.desc.guidObject, chunkSize, NULL);
180 break;
181 }
183 TRACE_(dmfile)(": version chunk\n");
184 This->dmobj.desc.dwValidData |= DMUS_OBJ_VERSION;
185 IStream_Read (pStm, &This->dmobj.desc.vVersion, chunkSize, NULL);
186 break;
187 }
189 TRACE_(dmfile)(": category chunk\n");
190 This->dmobj.desc.dwValidData |= DMUS_OBJ_CATEGORY;
191 IStream_Read (pStm, This->dmobj.desc.wszCategory, chunkSize, NULL);
192 break;
193 }
194 case FOURCC_LIST: {
195 IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
196 TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunkID));
197 ListSize[0] = chunkSize - sizeof(FOURCC);
198 ListCount[0] = 0;
199 switch (chunkID) {
201 TRACE_(dmfile)(": UNFO list\n");
202 do {
203 IStream_Read (pStm, &chunkID, sizeof(FOURCC), NULL);
204 IStream_Read (pStm, &chunkSize, sizeof(FOURCC), NULL);
205 ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunkSize;
206 TRACE_(dmfile)(": %s chunk (size = %ld)", debugstr_fourcc (chunkID), chunkSize);
207 switch (chunkID) {
208 /* don't ask me why, but M$ puts INFO elements in UNFO list sometimes
209 (though strings seem to be valid unicode) */
210 case mmioFOURCC('I','N','A','M'):
212 TRACE_(dmfile)(": name chunk\n");
213 This->dmobj.desc.dwValidData |= DMUS_OBJ_NAME;
214 IStream_Read (pStm, This->dmobj.desc.wszName, chunkSize, NULL);
215 break;
216 }
217 case mmioFOURCC('I','A','R','T'):
219 TRACE_(dmfile)(": artist chunk (ignored)\n");
220 liMove.QuadPart = chunkSize;
221 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
222 break;
223 }
224 case mmioFOURCC('I','C','O','P'):
226 TRACE_(dmfile)(": copyright chunk (ignored)\n");
227 liMove.QuadPart = chunkSize;
228 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
229 break;
230 }
231 case mmioFOURCC('I','S','B','J'):
233 TRACE_(dmfile)(": subject chunk (ignored)\n");
234 liMove.QuadPart = chunkSize;
235 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
236 break;
237 }
238 case mmioFOURCC('I','C','M','T'):
240 TRACE_(dmfile)(": comment chunk (ignored)\n");
241 liMove.QuadPart = chunkSize;
242 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
243 break;
244 }
245 default: {
246 TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
247 liMove.QuadPart = chunkSize;
248 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
249 break;
250 }
251 }
252 TRACE_(dmfile)(": ListCount[0] = %ld < ListSize[0] = %ld\n", ListCount[0], ListSize[0]);
253 } while (ListCount[0] < ListSize[0]);
254 break;
255 }
256 default: {
257 TRACE_(dmfile)(": unknown (skipping)\n");
258 liMove.QuadPart = chunkSize - sizeof(FOURCC);
259 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
260 break;
261 }
262 }
263 break;
264 }
265 default: {
266 TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n");
267 liMove.QuadPart = chunkSize;
268 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL);
269 break;
270 }
271 }
272 TRACE_(dmfile)(": StreamCount[0] = %ld < StreamSize[0] = %ld\n", StreamCount, StreamSize);
273 } while (StreamCount < StreamSize);
274 break;
275 }
276 default: {
277 TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
278 liMove.QuadPart = StreamSize;
279 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
280 return E_FAIL;
281 }
282 }
283 TRACE_(dmfile)(": reading finished\n");
284 break;
285 }
286 default: {
287 TRACE_(dmfile)(": unexpected chunk; loading failed)\n");
288 liMove.QuadPart = chunkSize;
289 IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */
290 return E_FAIL;
291 }
292 }
293
294 return S_OK;
295}
296
297static const IPersistStreamVtbl persiststream_vtbl = {
306};
307
308/* for ClassFactory */
309HRESULT create_dmchordmap(REFIID lpcGUID, void **ppobj)
310{
312 HRESULT hr;
313
314 *ppobj = NULL;
315 if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY;
316 obj->IDirectMusicChordMap_iface.lpVtbl = &dmchordmap_vtbl;
317 obj->ref = 1;
318 dmobject_init(&obj->dmobj, &CLSID_DirectMusicChordMap,
319 (IUnknown *)&obj->IDirectMusicChordMap_iface);
320 obj->dmobj.IDirectMusicObject_iface.lpVtbl = &dmobject_vtbl;
321 obj->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl;
322
323 hr = IDirectMusicChordMap_QueryInterface(&obj->IDirectMusicChordMap_iface, lpcGUID, ppobj);
324 IDirectMusicChordMap_Release(&obj->IDirectMusicChordMap_iface);
325
326 return hr;
327}
#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
static ULONG WINAPI IDirectMusicChordMapImpl_AddRef(IDirectMusicChordMap *iface)
Definition: chordmap.c:65
static IDirectMusicChordMapImpl * impl_from_IDirectMusicChordMap(IDirectMusicChordMap *iface)
Definition: chordmap.c:36
static const IDirectMusicObjectVtbl dmobject_vtbl
Definition: chordmap.c:135
static ULONG WINAPI IDirectMusicChordMapImpl_Release(IDirectMusicChordMap *iface)
Definition: chordmap.c:75
static HRESULT WINAPI IDirectMusicChordMapImpl_QueryInterface(IDirectMusicChordMap *iface, REFIID riid, void **ret_iface)
Definition: chordmap.c:41
static const IPersistStreamVtbl persiststream_vtbl
Definition: chordmap.c:297
static const IDirectMusicChordMapVtbl dmchordmap_vtbl
Definition: chordmap.c:95
static HRESULT WINAPI chord_IDirectMusicObject_ParseDescriptor(IDirectMusicObject *iface, IStream *stream, DMUS_OBJECTDESC *desc)
Definition: chordmap.c:103
HRESULT create_dmchordmap(REFIID lpcGUID, void **ppobj)
Definition: chordmap.c:309
static HRESULT WINAPI IPersistStreamImpl_Load(IPersistStream *iface, IStream *pStm)
Definition: chordmap.c:150
static HRESULT WINAPI IDirectMusicChordMapImpl_GetScale(IDirectMusicChordMap *iface, DWORD *pdwScale)
Definition: chordmap.c:87
static IDirectMusicChordMapImpl * impl_from_IPersistStream(IPersistStream *iface)
Definition: chordmap.c:145
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRACE_(x)
Definition: compat.h:76
#define WINE_DECLARE_DEBUG_CHANNEL(x)
Definition: compat.h:45
DWORD FOURCC
Definition: dmdls.h:25
#define DMUS_E_CHUNKNOTFOUND
Definition: dmerror.h:66
HRESULT WINAPI dmobj_IDirectMusicObject_GetDescriptor(IDirectMusicObject *iface, DMUS_OBJECTDESC *desc)
Definition: dmobject.c:503
void dmobject_init(struct dmobject *dmobj, const GUID *class, IUnknown *outer_unk)
Definition: dmobject.c:749
ULONG WINAPI dmobj_IPersistStream_Release(IPersistStream *iface)
Definition: dmobject.c:702
ULONG WINAPI dmobj_IDirectMusicObject_Release(IDirectMusicObject *iface)
Definition: dmobject.c:497
HRESULT dmobj_parsedescriptor(IStream *stream, const struct chunk_entry *riff, DMUS_OBJECTDESC *desc, DWORD supported)
Definition: dmobject.c:591
HRESULT WINAPI dmobj_IDirectMusicObject_QueryInterface(IDirectMusicObject *iface, REFIID riid, void **ret_iface)
Definition: dmobject.c:484
HRESULT WINAPI unimpl_IPersistStream_GetSizeMax(IPersistStream *iface, ULARGE_INTEGER *size)
Definition: dmobject.c:742
HRESULT WINAPI dmobj_IDirectMusicObject_SetDescriptor(IDirectMusicObject *iface, DMUS_OBJECTDESC *desc)
Definition: dmobject.c:518
void dump_DMUS_OBJECTDESC(DMUS_OBJECTDESC *desc)
Definition: dmobject.c:222
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 WINAPI dmobj_IPersistStream_QueryInterface(IPersistStream *iface, REFIID riid, void **ret_iface)
Definition: dmobject.c:689
ULONG WINAPI dmobj_IDirectMusicObject_AddRef(IDirectMusicObject *iface)
Definition: dmobject.c:491
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
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 DMUS_FOURCC_GUID_CHUNK
Definition: dmusicf.h:42
#define DMUS_FOURCC_UNAM_CHUNK
Definition: dmusicf.h:45
#define DMUS_FOURCC_VERSION_CHUNK
Definition: dmusicf.h:51
#define DMUS_FOURCC_CHORDMAP_FORM
Definition: dmusicf.h:68
#define DMUS_FOURCC_UCOP_CHUNK
Definition: dmusicf.h:47
#define DMUS_FOURCC_UART_CHUNK
Definition: dmusicf.h:46
#define DMUS_FOURCC_UNFO_LIST
Definition: dmusicf.h:44
#define DMUS_FOURCC_UCMT_CHUNK
Definition: dmusicf.h:49
#define DMUS_FOURCC_USBJ_CHUNK
Definition: dmusicf.h:48
#define DMUS_FOURCC_CATEGORY_CHUNK
Definition: dmusicf.h:50
#define IDirectMusicChordMap_Release(p)
Definition: dmusici.h:1594
#define DMUS_OBJ_NAME
Definition: dmusici.h:267
#define IDirectMusicChordMap_QueryInterface(p, a, b)
Definition: dmusici.h:1592
#define DMUS_OBJ_CLASS
Definition: dmusici.h:266
#define DMUS_OBJ_VERSION
Definition: dmusici.h:272
#define DMUS_OBJ_CATEGORY
Definition: dmusici.h:268
#define DMUS_OBJ_OBJECT
Definition: dmusici.h:265
unsigned long DWORD
Definition: ntddk_ex.h:95
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define FOURCC(a, b, c, d)
Definition: memtrack.h:4
#define FOURCC_RIFF
Definition: mmsystem.h:564
#define FOURCC_LIST
Definition: mmsystem.h:565
#define mmioFOURCC(c0, c1, c2, c3)
Definition: mmsystem.h:38
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
long LONG
Definition: pedump.c:60
const GUID IID_IPersistStream
Definition: proxy.cpp:13
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define calloc
Definition: rosglue.h:14
static __inline const char * debugstr_fourcc(unsigned int cc)
Definition: debug.h:397
#define TRACE(s)
Definition: solgame.cpp:4
struct dmobject dmobj
Definition: chordmap.c:31
IDirectMusicChordMap IDirectMusicChordMap_iface
Definition: chordmap.c:30
Definition: dmobject.h:26
FOURCC id
Definition: dmobject.h:27
FOURCC type
Definition: dmobject.h:29
Definition: send.c:48
Definition: parse.h:23
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
LONGLONG QuadPart
Definition: typedefs.h:114
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_POINTER
Definition: winerror.h:3480