ReactOS 0.4.17-dev-923-g4c9a150
wave.c
Go to the documentation of this file.
1/*
2 * Copyright 2023 Rémi Bernon for CodeWeavers
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include "dmusic_private.h"
20#include "soundfont.h"
21
23
24struct sample
25{
28};
29
30#ifdef __REACTOS__
31C_ASSERT(sizeof(struct sample) == offsetof(struct sample, loops));
32#else
33C_ASSERT(sizeof(struct sample) == offsetof(struct sample, loops[0]));
34#endif
35
36struct wave
37{
41
42 struct sample *sample;
46};
47
48static inline struct wave *impl_from_IUnknown(IUnknown *iface)
49{
50 return CONTAINING_RECORD(iface, struct wave, IUnknown_iface);
51}
52
53static HRESULT WINAPI wave_QueryInterface(IUnknown *iface, REFIID riid, void **ret_iface)
54{
55 struct wave *This = impl_from_IUnknown(iface);
56
57 TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
58
60 {
61 *ret_iface = &This->IUnknown_iface;
62 IUnknown_AddRef(&This->IUnknown_iface);
63 return S_OK;
64 }
65
66 if (IsEqualIID(riid, &IID_IDirectMusicObject))
67 {
68 *ret_iface = &This->dmobj.IDirectMusicObject_iface;
69 IDirectMusicObject_AddRef(&This->dmobj.IDirectMusicObject_iface);
70 return S_OK;
71 }
72
74 {
75 *ret_iface = &This->dmobj.IPersistStream_iface;
76 IDirectMusicObject_AddRef(&This->dmobj.IPersistStream_iface);
77 return S_OK;
78 }
79
80 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface);
81 *ret_iface = NULL;
82 return E_NOINTERFACE;
83}
84
86{
87 struct wave *This = impl_from_IUnknown(iface);
89 TRACE("(%p) ref=%ld\n", This, ref);
90 return ref;
91}
92
94{
95 struct wave *This = impl_from_IUnknown(iface);
97
98 TRACE("(%p) ref=%ld\n", This, ref);
99
100 if (!ref)
101 {
102 free(This->format);
103 if (This->data) IStream_Release(This->data);
104 free(This->sample);
105 free(This);
106 }
107
108 return ref;
109}
110
111static const IUnknownVtbl unknown_vtbl =
112{
116};
117
119{
120 struct sample *sample;
121 WSMPL wsmpl;
122 HRESULT hr;
123 UINT size;
124
125 if (chunk->size < sizeof(wsmpl)) return E_INVALIDARG;
126 if (FAILED(hr = stream_read(stream, &wsmpl, sizeof(wsmpl)))) return hr;
127 if (chunk->size != wsmpl.cbSize + sizeof(WLOOP) * wsmpl.cSampleLoops) return E_INVALIDARG;
128 if (wsmpl.cbSize != sizeof(wsmpl)) return E_INVALIDARG;
129 if (wsmpl.cSampleLoops > 1) FIXME("Not implemented: found more than one wave loop\n");
130
131 size = offsetof(struct sample, loops[wsmpl.cSampleLoops]);
132 if (!(sample = malloc(size))) return E_OUTOFMEMORY;
133 sample->head = wsmpl;
134
135 size = sizeof(WLOOP) * wsmpl.cSampleLoops;
137 else This->sample = sample;
138
139 return hr;
140}
141
143{
144 struct chunk_entry chunk = {.parent = parent};
145 HRESULT hr;
146
147 while ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
148 {
149 switch (MAKE_IDTYPE(chunk.id, chunk.type))
150 {
151 case mmioFOURCC('f','m','t',' '):
152 if (!(This->format = malloc(chunk.size))) return E_OUTOFMEMORY;
154 break;
155
156 case mmioFOURCC('d','a','t','a'):
157 if (This->data) IStream_Release(This->data);
158 hr = IStream_Clone(stream, &This->data);
159 if (SUCCEEDED(hr)) This->data_size = chunk.size;
160 break;
161
162 case FOURCC_WSMP:
164 break;
165
166 case mmioFOURCC('w','a','v','u'):
167 case mmioFOURCC('s','m','p','l'):
169 break;
170
171 default:
172 FIXME("Ignoring chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
173 break;
174 }
175
176 if (FAILED(hr)) break;
177 }
178
179 if (This->format && This->data) return S_OK;
180 return hr;
181}
182
183static inline struct wave *impl_from_IDirectMusicObject(IDirectMusicObject *iface)
184{
185 return CONTAINING_RECORD(iface, struct wave, dmobj.IDirectMusicObject_iface);
186}
187
188static HRESULT WINAPI wave_object_ParseDescriptor(IDirectMusicObject *iface,
190{
191 struct chunk_entry chunk = {0};
192 HRESULT hr;
193
194 TRACE("(%p, %p, %p)\n", iface, stream, desc);
195
196 if (!stream || !desc) return E_POINTER;
197
198 if ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
199 {
200 switch (MAKE_IDTYPE(chunk.id, chunk.type))
201 {
202 case MAKE_IDTYPE(FOURCC_RIFF, mmioFOURCC('W','A','V','E')):
205 break;
206
207 default:
208 WARN("Invalid wave chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
210 break;
211 }
212 }
213
214 if (FAILED(hr)) return hr;
215
216 TRACE("returning descriptor:\n");
218 return S_OK;
219}
220
221static const IDirectMusicObjectVtbl wave_object_vtbl =
222{
229};
230
231static inline struct wave *impl_from_IPersistStream(IPersistStream *iface)
232{
233 return CONTAINING_RECORD(iface, struct wave, dmobj.IPersistStream_iface);
234}
235
237{
238 struct wave *This = impl_from_IPersistStream(iface);
239 struct chunk_entry chunk = {0};
240 HRESULT hr;
241
242 TRACE("(%p, %p)\n", This, stream);
243
244 if (!stream) return E_POINTER;
245
246 if ((hr = stream_next_chunk(stream, &chunk)) == S_OK)
247 {
248 switch (MAKE_IDTYPE(chunk.id, chunk.type))
249 {
250 case MAKE_IDTYPE(FOURCC_RIFF, mmioFOURCC('W','A','V','E')):
252 break;
253
254 default:
255 WARN("Invalid wave chunk %s %s\n", debugstr_fourcc(chunk.id), debugstr_fourcc(chunk.type));
257 break;
258 }
259 }
260
262 return hr;
263}
264
265static const IPersistStreamVtbl wave_persist_stream_vtbl =
266{
275};
276
277HRESULT wave_create(IDirectMusicObject **ret_iface)
278{
279 struct wave *obj;
280
281 if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY;
282 obj->IUnknown_iface.lpVtbl = &unknown_vtbl;
283 obj->ref = 1;
284 dmobject_init(&obj->dmobj, &CLSID_DirectSoundWave, &obj->IUnknown_iface);
285 obj->dmobj.IDirectMusicObject_iface.lpVtbl = &wave_object_vtbl;
286 obj->dmobj.IPersistStream_iface.lpVtbl = &wave_persist_stream_vtbl;
287
288 *ret_iface = &obj->dmobj.IDirectMusicObject_iface;
289 return S_OK;
290}
291
292HRESULT wave_create_from_chunk(IStream *stream, struct chunk_entry *parent, IDirectMusicObject **ret_iface)
293{
294 struct wave *This;
295 IDirectMusicObject *iface;
296 HRESULT hr;
297
298 TRACE("(%p, %p, %p)\n", stream, parent, ret_iface);
299
300 if (FAILED(hr = wave_create(&iface))) return hr;
302
304 {
307 }
308
309 if (TRACE_ON(dmusic))
310 {
311 UINT i;
312
313 TRACE("*** Created DirectMusicWave %p\n", This);
314 TRACE(" - format: %p\n", This->format);
315 if (This->format)
316 {
317 TRACE(" - wFormatTag: %u\n", This->format->wFormatTag);
318 TRACE(" - nChannels: %u\n", This->format->nChannels);
319 TRACE(" - nSamplesPerSec: %lu\n", This->format->nSamplesPerSec);
320 TRACE(" - nAvgBytesPerSec: %lu\n", This->format->nAvgBytesPerSec);
321 TRACE(" - nBlockAlign: %u\n", This->format->nBlockAlign);
322 TRACE(" - wBitsPerSample: %u\n", This->format->wBitsPerSample);
323 TRACE(" - cbSize: %u\n", This->format->cbSize);
324 }
325 if (This->sample)
326 {
327 TRACE(" - sample: {size: %lu, unity_note: %u, fine_tune: %d, attenuation: %ld, options: %#lx, loops: %lu}\n",
328 This->sample->head.cbSize, This->sample->head.usUnityNote,
329 This->sample->head.sFineTune, This->sample->head.lAttenuation,
330 This->sample->head.fulOptions, This->sample->head.cSampleLoops);
331 for (i = 0; i < This->sample->head.cSampleLoops; i++)
332 TRACE(" - loops[%u]: {size: %lu, type: %lu, start: %lu, length: %lu}\n", i,
333 This->sample->loops[i].cbSize, This->sample->loops[i].ulType,
334 This->sample->loops[i].ulStart, This->sample->loops[i].ulLength);
335 }
336 }
337
338 *ret_iface = iface;
339 return S_OK;
340}
341
342HRESULT wave_create_from_soundfont(struct soundfont *soundfont, UINT index, IDirectMusicObject **ret_iface)
343{
345 struct sample *sample = NULL;
348 DWORD data_size, offset;
349 struct wave *This;
351 IDirectMusicObject *iface;
352 const LARGE_INTEGER zero = { .QuadPart = 0 };
353
354 TRACE("(%p, %u, %p)\n", soundfont, index, ret_iface);
355
356 if (sf_sample->sample_link) FIXME("Stereo sample not supported\n");
357
358 if (!(format = calloc(1, sizeof(*format)))) goto failed;
359 format->wFormatTag = WAVE_FORMAT_PCM;
360 format->nChannels = 1;
361 format->wBitsPerSample = 16;
362 format->nSamplesPerSec = sf_sample->sample_rate;
363 format->nBlockAlign = format->wBitsPerSample * format->nChannels / 8;
364 format->nAvgBytesPerSec = format->nBlockAlign * format->nSamplesPerSec;
365
366 if (!(sample = calloc(1, offsetof(struct sample, loops[1])))) goto failed;
367 sample->head.cbSize = sizeof(sample->head);
371
373 if (FAILED(hr = CreateStreamOnHGlobal(NULL, TRUE, &stream))) goto failed;
374 offset = sf_sample->start * format->nBlockAlign / format->nChannels;
375 if (FAILED(hr = IStream_Write(stream, soundfont->sdta + offset, data_size, &data_size))) goto failed;
376 if (FAILED(hr = IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL))) goto failed;
377
378 if (FAILED(hr = wave_create(&iface))) goto failed;
379
381 This->format = format;
382 This->sample = sample;
383 This->data_size = data_size;
384 This->data = stream;
385
386 if (TRACE_ON(dmusic))
387 {
388 UINT i;
389
390 TRACE("*** Created DirectMusicWave %p\n", This);
391 TRACE(" - format: %p\n", This->format);
392 if (This->format)
393 {
394 TRACE(" - wFormatTag: %u\n", This->format->wFormatTag);
395 TRACE(" - nChannels: %u\n", This->format->nChannels);
396 TRACE(" - nSamplesPerSec: %lu\n", This->format->nSamplesPerSec);
397 TRACE(" - nAvgBytesPerSec: %lu\n", This->format->nAvgBytesPerSec);
398 TRACE(" - nBlockAlign: %u\n", This->format->nBlockAlign);
399 TRACE(" - wBitsPerSample: %u\n", This->format->wBitsPerSample);
400 TRACE(" - cbSize: %u\n", This->format->cbSize);
401 }
402
403 TRACE(" - sample: {size: %lu, unity_note: %u, fine_tune: %d, attenuation: %ld, options: %#lx, loops: %lu}\n",
404 This->sample->head.cbSize, This->sample->head.usUnityNote,
405 This->sample->head.sFineTune, This->sample->head.lAttenuation,
406 This->sample->head.fulOptions, This->sample->head.cSampleLoops);
407 for (i = 0; i < This->sample->head.cSampleLoops; i++)
408 TRACE(" - loops[%u]: {size: %lu, type: %lu, start: %lu, length: %lu}\n", i,
409 This->sample->loops[i].cbSize, This->sample->loops[i].ulType,
410 This->sample->loops[i].ulStart, This->sample->loops[i].ulLength);
411 }
412
413 *ret_iface = iface;
414 return S_OK;
415
416failed:
417 if (stream) IStream_Release(stream);
418 free(sample);
419 free(format);
420 return hr;
421}
422
424{
426 HRESULT hr;
427
428 if (SUCCEEDED(hr = IStream_Clone(This->data, &stream)))
429 {
430 hr = IStream_Read(stream, data, This->data_size, data_size);
431 IStream_Release(stream);
432 }
433
434 return hr;
435}
436
437HRESULT wave_download_to_port(IDirectMusicObject *iface, IDirectMusicPortDownload *port, DWORD *id)
438{
439 struct download_buffer
440 {
442 ULONG offsets[2];
445 } *buffer;
446
447 struct wave *This = impl_from_IDirectMusicObject(iface);
448 DWORD size = offsetof(struct download_buffer, data.byData[This->data_size]);
449 IDirectMusicDownload *download;
450 HRESULT hr;
451
453
456 {
457 buffer->info.dwDLType = DMUS_DOWNLOADINFO_WAVE;
458 buffer->info.dwNumOffsetTableEntries = 2;
459 buffer->info.cbSize = size;
460
461 buffer->offsets[0] = offsetof(struct download_buffer, wave);
462 buffer->offsets[1] = offsetof(struct download_buffer, data);
463
464 buffer->wave.WaveformatEx = *This->format;
465 buffer->wave.ulWaveDataIdx = 1;
466 buffer->wave.ulCopyrightIdx = 0;
467 buffer->wave.ulFirstExtCkIdx = 0;
468
469 if (FAILED(hr = wave_read_data(This, buffer->data.byData, &buffer->data.cbSize)))
470 WARN("Failed to read wave data from stream, hr %#lx\n", hr);
472 WARN("Failed to download wave to port, hr %#lx\n", hr);
473 else
474 *id = buffer->info.dwDLId;
475 }
476
478 return hr;
479}
480
481HRESULT wave_download_to_dsound(IDirectMusicObject *iface, IDirectSound *dsound, IDirectSoundBuffer **ret_iface)
482{
483 struct wave *This = impl_from_IDirectMusicObject(iface);
485 {
486 .dwSize = sizeof(desc),
487 .dwBufferBytes = This->data_size,
488 .lpwfxFormat = This->format,
489 };
490 IDirectSoundBuffer *buffer;
491 HRESULT hr;
492 void *data;
493 DWORD size;
494
495 TRACE("%p, %p, %p\n", This, dsound, ret_iface);
496
498 {
499 WARN("Failed to create direct sound buffer, hr %#lx\n", hr);
500 return hr;
501 }
502
503 if (SUCCEEDED(hr = IDirectSoundBuffer_Lock(buffer, 0, This->data_size, &data, &size, NULL, 0, 0)))
504 {
506 WARN("Failed to read wave data from stream, hr %#lx\n", hr);
508 }
509
510 if (FAILED(hr))
511 {
512 WARN("Failed to download wave to dsound, hr %#lx\n", hr);
514 return hr;
515 }
516
517 *ret_iface = buffer;
518 return S_OK;
519}
520
521HRESULT wave_get_duration(IDirectMusicObject *iface, REFERENCE_TIME *duration)
522{
523 struct wave *This = impl_from_IDirectMusicObject(iface);
524 *duration = (REFERENCE_TIME)This->data_size * 10000000 / This->format->nAvgBytesPerSec;
525 return S_OK;
526}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define WAVE_FORMAT_PCM
Definition: constants.h:425
#define index(s, c)
Definition: various.h:29
#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 E_INVALIDARG
Definition: ddrawi.h:101
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
static const IPersistStreamVtbl wave_persist_stream_vtbl
Definition: wave.c:265
static HRESULT WINAPI wave_object_ParseDescriptor(IDirectMusicObject *iface, IStream *stream, DMUS_OBJECTDESC *desc)
Definition: wave.c:188
static const IDirectMusicObjectVtbl wave_object_vtbl
Definition: wave.c:221
static HRESULT parse_wsmp_chunk(struct wave *This, IStream *stream, struct chunk_entry *chunk)
Definition: wave.c:118
static HRESULT wave_read_data(struct wave *This, void *data, DWORD *data_size)
Definition: wave.c:423
static HRESULT parse_wave_chunk(struct wave *This, IStream *stream, struct chunk_entry *parent)
Definition: wave.c:142
static HRESULT WINAPI wave_QueryInterface(IUnknown *iface, REFIID riid, void **ret_iface)
Definition: wave.c:53
HRESULT wave_create_from_chunk(IStream *stream, struct chunk_entry *parent, IDirectMusicObject **ret_iface)
Definition: wave.c:292
HRESULT wave_get_duration(IDirectMusicObject *iface, REFERENCE_TIME *duration)
Definition: wave.c:521
HRESULT wave_create(IDirectMusicObject **ret_iface)
Definition: wave.c:277
HRESULT wave_download_to_port(IDirectMusicObject *iface, IDirectMusicPortDownload *port, DWORD *id)
Definition: wave.c:437
static struct wave * impl_from_IPersistStream(IPersistStream *iface)
Definition: wave.c:231
HRESULT wave_create_from_soundfont(struct soundfont *soundfont, UINT index, IDirectMusicObject **ret_iface)
Definition: wave.c:342
static const IUnknownVtbl unknown_vtbl
Definition: wave.c:111
HRESULT wave_download_to_dsound(IDirectMusicObject *iface, IDirectSound *dsound, IDirectSoundBuffer **ret_iface)
Definition: wave.c:481
static HRESULT WINAPI wave_persist_stream_Load(IPersistStream *iface, IStream *stream)
Definition: wave.c:236
static struct wave * impl_from_IUnknown(IUnknown *iface)
Definition: wave.c:48
static struct wave * impl_from_IDirectMusicObject(IDirectMusicObject *iface)
Definition: wave.c:183
static ULONG WINAPI wave_Release(IUnknown *iface)
Definition: wave.c:93
static ULONG WINAPI wave_AddRef(IUnknown *iface)
Definition: wave.c:85
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL delete_on_release, IStream **stream)
#define TRACE_ON(x)
Definition: compat.h:75
USHORT port
Definition: uri.c:210
#define FOURCC_WSMP
Definition: dls1.h:49
struct _rloop WLOOP
#define DMUS_DOWNLOADINFO_WAVE
Definition: dmdls.h:7
#define DMUS_E_UNSUPPORTED_STREAM
Definition: dmerror.h:100
#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
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
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
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 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_OBJ_NAME_INFO
Definition: dmobject.h:97
#define MAKE_IDTYPE(id, type)
Definition: dmobject.h:33
#define IDirectMusicDownload_Release(p)
Definition: dmusicc.h:604
#define IDirectMusicPortDownload_GetDLId(p, a, b)
Definition: dmusicc.h:638
#define IDirectMusicPortDownload_Download(p, a)
Definition: dmusicc.h:640
#define IDirectMusicDownload_GetBuffer(p, a, b)
Definition: dmusicc.h:606
#define IDirectMusicPortDownload_AllocateBuffer(p, a, b)
Definition: dmusicc.h:637
#define DMUS_FOURCC_INFO_LIST
Definition: dmusicf.h:43
#define IDirectMusicObject_Release(p)
Definition: dmusici.h:844
#define IDirectMusicObject_AddRef(p)
Definition: dmusici.h:843
#define DMUS_OBJ_VERSION
Definition: dmusici.h:272
#define DMUS_OBJ_OBJECT
Definition: dmusici.h:265
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
r parent
Definition: btrfs.c:3010
#define IDirectSoundBuffer_Unlock(p, a, b, c, d)
Definition: dsound.h:592
#define IDirectSoundBuffer_Lock(p, a, b, c, d, e, f, g)
Definition: dsound.h:584
#define IDirectSound_CreateSoundBuffer(p, a, b, c)
Definition: dsound.h:455
#define IDirectSoundBuffer_Release(p)
Definition: dsound.h:574
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLuint index
Definition: glext.h:6031
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define C_ASSERT(e)
Definition: intsafe.h:73
if(dx< 0)
Definition: linetemp.h:194
#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
static int stream_read
Definition: htmldoc.c:205
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
#define offsetof(TYPE, MEMBER)
static __inline const char * debugstr_fourcc(unsigned int cc)
Definition: debug.h:397
int zero
Definition: sehframes.cpp:29
#define TRACE(s)
Definition: solgame.cpp:4
Definition: dls1.h:132
ULONG ulLength
Definition: dls1.h:136
ULONG ulStart
Definition: dls1.h:135
Definition: dls1.h:140
ULONG cSampleLoops
Definition: dls1.h:146
ULONG cbSize
Definition: dls1.h:141
Definition: dmobject.h:26
uint16_t size
Definition: btrfs_drv.h:563
ULONG offsets[]
Definition: instrument.c:740
DMUS_DOWNLOADINFO info
Definition: instrument.c:739
Definition: send.c:48
Definition: wave.c:25
WSMPL head
Definition: wave.c:26
WLOOP loops[]
Definition: wave.c:27
DWORD end_loop
Definition: soundfont.h:294
WORD sample_link
Definition: soundfont.h:298
DWORD end
Definition: soundfont.h:292
DWORD start_loop
Definition: soundfont.h:293
DWORD sample_rate
Definition: soundfont.h:295
DWORD start
Definition: soundfont.h:291
BYTE * sdta
Definition: soundfont.h:322
struct sf_sample * shdr
Definition: soundfont.h:321
Definition: parse.h:23
Definition: wave.c:37
IUnknown IUnknown_iface
Definition: wave.c:38
IStream * data
Definition: wave.c:45
struct sample * sample
Definition: wave.c:42
UINT data_size
Definition: wave.c:44
WAVEFORMATEX * format
Definition: wave.c:43
struct dmobject dmobj
Definition: wave.c:39
LONG ref
Definition: wave.c:40
#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