ReactOS 0.4.17-dev-934-g091855f
dmusic_wave.h File Reference
#include <stdarg.h>
#include <stddef.h>
#include "windef.h"
#include "winbase.h"
#include "objbase.h"
#include "dmusici.h"
Include dependency graph for dmusic_wave.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define COBJMACROS
 

Functions

HRESULT wave_create (IDirectMusicObject **ret_iface)
 
HRESULT wave_create_from_soundfont (struct soundfont *soundfont, UINT index, IDirectMusicObject **out)
 
HRESULT wave_create_from_chunk (IStream *stream, struct chunk_entry *parent, IDirectMusicObject **out)
 
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)
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 22 of file dmusic_wave.h.

Function Documentation

◆ 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}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
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 S_OK
Definition: intsafe.h:52
#define calloc
Definition: rosglue.h:14
Definition: wave.c:37

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 **  out 
)

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}
HRESULT hr
Definition: delayimp.cpp:582
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
r parent
Definition: btrfs.c:3010
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
#define FAILED(hr)
Definition: intsafe.h:51
#define TRACE(s)
Definition: solgame.cpp:4
Definition: parse.h:23

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 **  out 
)

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 FIXME(fmt,...)
Definition: precomp.h:53
#define free
Definition: debug_ros.c:5
#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
#define offsetof(TYPE, MEMBER)
int zero
Definition: sehframes.cpp:29
ULONG ulLength
Definition: dls1.h:136
ULONG ulStart
Definition: dls1.h:135
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
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
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
#define SUCCEEDED(hr)
Definition: intsafe.h:50
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().