ReactOS 0.4.17-dev-934-g091855f
wave.c File Reference
#include "dmusic_private.h"
#include "soundfont.h"
Include dependency graph for wave.c:

Go to the source code of this file.

Classes

struct  sample
 
struct  wave
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (dmusic)
 
 C_ASSERT (sizeof(struct sample)==offsetof(struct sample, loops[0]))
 
static struct wave * impl_from_IUnknown (IUnknown *iface)
 
static HRESULT WINAPI wave_QueryInterface (IUnknown *iface, REFIID riid, void **ret_iface)
 
static ULONG WINAPI wave_AddRef (IUnknown *iface)
 
static ULONG WINAPI wave_Release (IUnknown *iface)
 
static HRESULT parse_wsmp_chunk (struct wave *This, IStream *stream, struct chunk_entry *chunk)
 
static HRESULT parse_wave_chunk (struct wave *This, IStream *stream, struct chunk_entry *parent)
 
static struct wave * impl_from_IDirectMusicObject (IDirectMusicObject *iface)
 
static HRESULT WINAPI wave_object_ParseDescriptor (IDirectMusicObject *iface, IStream *stream, DMUS_OBJECTDESC *desc)
 
static struct wave * impl_from_IPersistStream (IPersistStream *iface)
 
static HRESULT WINAPI wave_persist_stream_Load (IPersistStream *iface, IStream *stream)
 
HRESULT wave_create (IDirectMusicObject **ret_iface)
 
HRESULT wave_create_from_chunk (IStream *stream, struct chunk_entry *parent, IDirectMusicObject **ret_iface)
 
HRESULT wave_create_from_soundfont (struct soundfont *soundfont, UINT index, IDirectMusicObject **ret_iface)
 
static HRESULT wave_read_data (struct wave *This, void *data, DWORD *data_size)
 
HRESULT wave_download_to_port (IDirectMusicObject *iface, IDirectMusicPortDownload *port, DWORD *id)
 
HRESULT wave_download_to_dsound (IDirectMusicObject *iface, IDirectSound *dsound, IDirectSoundBuffer **ret_iface)
 
HRESULT wave_get_duration (IDirectMusicObject *iface, REFERENCE_TIME *duration)
 

Variables

static const IUnknownVtbl unknown_vtbl
 
static const IDirectMusicObjectVtbl wave_object_vtbl
 
static const IPersistStreamVtbl wave_persist_stream_vtbl
 

Function Documentation

◆ C_ASSERT()

C_ASSERT ( sizeof(struct sample)  = =offsetof(struct sample, loops[0]))

◆ impl_from_IDirectMusicObject()

static struct wave * impl_from_IDirectMusicObject ( IDirectMusicObject *  iface)
inlinestatic

Definition at line 183 of file wave.c.

184{
185 return CONTAINING_RECORD(iface, struct wave, dmobj.IDirectMusicObject_iface);
186}
Definition: wave.c:37
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by wave_create_from_chunk(), wave_create_from_soundfont(), wave_download_to_dsound(), wave_download_to_port(), and wave_get_duration().

◆ impl_from_IPersistStream()

static struct wave * impl_from_IPersistStream ( IPersistStream *  iface)
inlinestatic

Definition at line 231 of file wave.c.

232{
233 return CONTAINING_RECORD(iface, struct wave, dmobj.IPersistStream_iface);
234}

Referenced by wave_persist_stream_Load().

◆ impl_from_IUnknown()

static struct wave * impl_from_IUnknown ( IUnknown *  iface)
inlinestatic

Definition at line 48 of file wave.c.

49{
50 return CONTAINING_RECORD(iface, struct wave, IUnknown_iface);
51}

Referenced by wave_AddRef(), wave_QueryInterface(), and wave_Release().

◆ parse_wave_chunk()

static HRESULT parse_wave_chunk ( struct wave *  This,
IStream *  stream,
struct chunk_entry *  parent 
)
static

Definition at line 142 of file wave.c.

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',' '):
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}
#define FIXME(fmt,...)
Definition: precomp.h:53
return
Definition: dirsup.c:529
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
static HRESULT parse_wsmp_chunk(struct wave *This, IStream *stream, struct chunk_entry *chunk)
Definition: wave.c:118
#define FOURCC_WSMP
Definition: dls1.h:49
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
#define MAKE_IDTYPE(id, type)
Definition: dmobject.h:33
#define DMUS_FOURCC_INFO_LIST
Definition: dmusicf.h:43
r parent
Definition: btrfs.c:3010
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
if(dx< 0)
Definition: linetemp.h:194
#define FOURCC_LIST
Definition: mmsystem.h:565
#define mmioFOURCC(c0, c1, c2, c3)
Definition: mmsystem.h:38
static __inline const char * debugstr_fourcc(unsigned int cc)
Definition: debug.h:397
Definition: dmobject.h:26
uint16_t size
Definition: btrfs_drv.h:563
Definition: parse.h:23

Referenced by wave_create_from_chunk(), and wave_persist_stream_Load().

◆ parse_wsmp_chunk()

static HRESULT parse_wsmp_chunk ( struct wave *  This,
IStream *  stream,
struct chunk_entry *  chunk 
)
static

Definition at line 118 of file wave.c.

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}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define free
Definition: debug_ros.c:5
struct _rloop WLOOP
unsigned int UINT
Definition: sysinfo.c:13
static int stream_read
Definition: htmldoc.c:205
#define offsetof(TYPE, MEMBER)
Definition: dls1.h:132
Definition: dls1.h:140
ULONG cSampleLoops
Definition: dls1.h:146
ULONG cbSize
Definition: dls1.h:141
Definition: wave.c:25
WSMPL head
Definition: wave.c:26
WLOOP loops[]
Definition: wave.c:27

Referenced by parse_wave_chunk().

◆ wave_AddRef()

static ULONG WINAPI wave_AddRef ( IUnknown *  iface)
static

Definition at line 85 of file wave.c.

86{
87 struct wave *This = impl_from_IUnknown(iface);
89 TRACE("(%p) ref=%ld\n", This, ref);
90 return ref;
91}
#define InterlockedIncrement
Definition: armddk.h:53
static struct wave * impl_from_IUnknown(IUnknown *iface)
Definition: wave.c:48
long LONG
Definition: pedump.c:60
#define TRACE(s)
Definition: solgame.cpp:4
Definition: send.c:48
LONG ref
Definition: wave.c:40

◆ wave_create()

HRESULT wave_create ( IDirectMusicObject **  ret_iface)

Definition at line 277 of file wave.c.

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}
static const IPersistStreamVtbl wave_persist_stream_vtbl
Definition: wave.c:265
static const IDirectMusicObjectVtbl wave_object_vtbl
Definition: wave.c:221
static const IUnknownVtbl unknown_vtbl
Definition: wave.c:111
void dmobject_init(struct dmobject *dmobj, const GUID *class, IUnknown *outer_unk)
Definition: dmobject.c:749
#define calloc
Definition: rosglue.h:14

Referenced by wave_create_from_chunk(), wave_create_from_soundfont(), and WaveCF_CreateInstance().

◆ wave_create_from_chunk()

HRESULT wave_create_from_chunk ( IStream *  stream,
struct chunk_entry *  parent,
IDirectMusicObject **  ret_iface 
)

Definition at line 292 of file wave.c.

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}
static HRESULT parse_wave_chunk(struct wave *This, IStream *stream, struct chunk_entry *parent)
Definition: wave.c:142
HRESULT wave_create(IDirectMusicObject **ret_iface)
Definition: wave.c:277
static struct wave * impl_from_IDirectMusicObject(IDirectMusicObject *iface)
Definition: wave.c:183
#define TRACE_ON(x)
Definition: compat.h:75
#define DMUS_E_UNSUPPORTED_STREAM
Definition: dmerror.h:100
#define IDirectMusicObject_Release(p)
Definition: dmusici.h:844
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

Referenced by parse_wvpl_list(), and wave_track_create_from_chunk().

◆ wave_create_from_soundfont()

HRESULT wave_create_from_soundfont ( struct soundfont *  soundfont,
UINT  index,
IDirectMusicObject **  ret_iface 
)

Definition at line 342 of file wave.c.

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}
#define WAVE_FORMAT_PCM
Definition: constants.h:425
#define index(s, c)
Definition: various.h:29
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL delete_on_release, IStream **stream)
unsigned long DWORD
Definition: ntddk_ex.h:95
GLintptr offset
Definition: glext.h:5920
GLuint index
Definition: glext.h:6031
int zero
Definition: sehframes.cpp:29
ULONG ulLength
Definition: dls1.h:136
ULONG ulStart
Definition: dls1.h:135
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
struct sample * sample
Definition: wave.c:42
UINT data_size
Definition: wave.c:44
WAVEFORMATEX * format
Definition: wave.c:43

Referenced by parse_sfbk_chunk().

◆ wave_download_to_dsound()

HRESULT wave_download_to_dsound ( IDirectMusicObject *  iface,
IDirectSound *  dsound,
IDirectSoundBuffer **  ret_iface 
)

Definition at line 481 of file wave.c.

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}
#define WARN(fmt,...)
Definition: precomp.h:61
static HRESULT wave_read_data(struct wave *This, void *data, DWORD *data_size)
Definition: wave.c:423
#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
GLuint buffer
Definition: glext.h:5915
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683

Referenced by wave_track_SetParam().

◆ wave_download_to_port()

HRESULT wave_download_to_port ( IDirectMusicObject *  iface,
IDirectMusicPortDownload *  port,
DWORD *  id 
)

Definition at line 437 of file wave.c.

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}
USHORT port
Definition: uri.c:210
#define DMUS_DOWNLOADINFO_WAVE
Definition: dmdls.h:7
#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
ULONG offsets[]
Definition: instrument.c:740
DMUS_DOWNLOADINFO info
Definition: instrument.c:739
uint32_t ULONG
Definition: typedefs.h:59

Referenced by instrument_download_to_port().

◆ wave_get_duration()

HRESULT wave_get_duration ( IDirectMusicObject *  iface,
REFERENCE_TIME *  duration 
)

Definition at line 521 of file wave.c.

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}
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9

Referenced by wave_track_create_from_chunk().

◆ wave_object_ParseDescriptor()

static HRESULT WINAPI wave_object_ParseDescriptor ( IDirectMusicObject *  iface,
IStream *  stream,
DMUS_OBJECTDESC *  desc 
)
static

Definition at line 188 of file wave.c.

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}
#define DMUS_E_CHUNKNOTFOUND
Definition: dmerror.h:66
HRESULT dmobj_parsedescriptor(IStream *stream, const struct chunk_entry *riff, DMUS_OBJECTDESC *desc, DWORD supported)
Definition: dmobject.c:591
void dump_DMUS_OBJECTDESC(DMUS_OBJECTDESC *desc)
Definition: dmobject.c:222
#define DMUS_OBJ_NAME_INFO
Definition: dmobject.h:97
#define DMUS_OBJ_VERSION
Definition: dmusici.h:272
#define DMUS_OBJ_OBJECT
Definition: dmusici.h:265
#define FOURCC_RIFF
Definition: mmsystem.h:564
#define E_POINTER
Definition: winerror.h:3480

◆ wave_persist_stream_Load()

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

Definition at line 236 of file wave.c.

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}
static struct wave * impl_from_IPersistStream(IPersistStream *iface)
Definition: wave.c:231
HRESULT stream_skip_chunk(IStream *stream, const struct chunk_entry *chunk)
Definition: dmobject.c:351

◆ wave_QueryInterface()

static HRESULT WINAPI wave_QueryInterface ( IUnknown *  iface,
REFIID  riid,
void **  ret_iface 
)
static

Definition at line 53 of file wave.c.

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}
const GUID IID_IUnknown
const char * debugstr_dmguid(const GUID *id)
Definition: dmobject.c:36
#define IDirectMusicObject_AddRef(p)
Definition: dmusici.h:843
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_read_data()

static HRESULT wave_read_data ( struct wave *  This,
void *  data,
DWORD *  data_size 
)
static

Definition at line 423 of file wave.c.

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}

Referenced by wave_download_to_dsound(), and wave_download_to_port().

◆ wave_Release()

static ULONG WINAPI wave_Release ( IUnknown *  iface)
static

Definition at line 93 of file wave.c.

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}
#define InterlockedDecrement
Definition: armddk.h:52

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( dmusic  )

Variable Documentation

◆ unknown_vtbl

const IUnknownVtbl unknown_vtbl
static
Initial value:
=
{
}
static HRESULT WINAPI wave_QueryInterface(IUnknown *iface, REFIID riid, void **ret_iface)
Definition: wave.c:53
static ULONG WINAPI wave_Release(IUnknown *iface)
Definition: wave.c:93
static ULONG WINAPI wave_AddRef(IUnknown *iface)
Definition: wave.c:85

Definition at line 111 of file wave.c.

Referenced by wave_create().

◆ wave_object_vtbl

const IDirectMusicObjectVtbl wave_object_vtbl
static
Initial value:
=
{
}
static HRESULT WINAPI wave_object_ParseDescriptor(IDirectMusicObject *iface, IStream *stream, DMUS_OBJECTDESC *desc)
Definition: wave.c:188
HRESULT WINAPI dmobj_IDirectMusicObject_GetDescriptor(IDirectMusicObject *iface, DMUS_OBJECTDESC *desc)
Definition: dmobject.c:503
ULONG WINAPI dmobj_IDirectMusicObject_Release(IDirectMusicObject *iface)
Definition: dmobject.c:497
HRESULT WINAPI dmobj_IDirectMusicObject_QueryInterface(IDirectMusicObject *iface, REFIID riid, void **ret_iface)
Definition: dmobject.c:484
HRESULT WINAPI dmobj_IDirectMusicObject_SetDescriptor(IDirectMusicObject *iface, DMUS_OBJECTDESC *desc)
Definition: dmobject.c:518
ULONG WINAPI dmobj_IDirectMusicObject_AddRef(IDirectMusicObject *iface)
Definition: dmobject.c:491

Definition at line 221 of file wave.c.

Referenced by wave_create().

◆ wave_persist_stream_vtbl

const IPersistStreamVtbl wave_persist_stream_vtbl
static
Initial value:
=
{
}
static HRESULT WINAPI wave_persist_stream_Load(IPersistStream *iface, IStream *stream)
Definition: wave.c:236
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 265 of file wave.c.

Referenced by wave_create().