ReactOS 0.4.17-dev-966-gf06eace
dmusic.c File Reference
#include <stdio.h>
#include "dmusic_private.h"
Include dependency graph for dmusic.c:

Go to the source code of this file.

Classes

struct  master_clock
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (dmusic)
 
static struct master_clock * impl_from_IReferenceClock (IReferenceClock *iface)
 
static HRESULT WINAPI master_IReferenceClock_QueryInterface (IReferenceClock *iface, REFIID riid, void **ret_iface)
 
static ULONG WINAPI master_IReferenceClock_AddRef (IReferenceClock *iface)
 
static ULONG WINAPI master_IReferenceClock_Release (IReferenceClock *iface)
 
static HRESULT WINAPI master_IReferenceClock_GetTime (IReferenceClock *iface, REFERENCE_TIME *time)
 
static HRESULT WINAPI master_IReferenceClock_AdviseTime (IReferenceClock *iface, REFERENCE_TIME base, REFERENCE_TIME offset, HEVENT event, DWORD_PTR *cookie)
 
static HRESULT WINAPI master_IReferenceClock_AdvisePeriodic (IReferenceClock *iface, REFERENCE_TIME start, REFERENCE_TIME period, HSEMAPHORE semaphore, DWORD_PTR *cookie)
 
static HRESULT WINAPI master_IReferenceClock_Unadvise (IReferenceClock *iface, DWORD_PTR cookie)
 
static HRESULT master_clock_create (IReferenceClock **clock)
 
static IDirectMusic8Impl * impl_from_IDirectMusic8 (IDirectMusic8 *iface)
 
static HRESULT WINAPI IDirectMusic8Impl_QueryInterface (LPDIRECTMUSIC8 iface, REFIID riid, LPVOID *ret_iface)
 
static ULONG WINAPI IDirectMusic8Impl_AddRef (LPDIRECTMUSIC8 iface)
 
static ULONG WINAPI IDirectMusic8Impl_Release (LPDIRECTMUSIC8 iface)
 
static HRESULT WINAPI IDirectMusic8Impl_EnumPort (LPDIRECTMUSIC8 iface, DWORD index, LPDMUS_PORTCAPS port_caps)
 
static HRESULT WINAPI IDirectMusic8Impl_CreateMusicBuffer (LPDIRECTMUSIC8 iface, LPDMUS_BUFFERDESC buffer_desc, LPDIRECTMUSICBUFFER *buffer, LPUNKNOWN unkouter)
 
static HRESULT WINAPI IDirectMusic8Impl_CreatePort (LPDIRECTMUSIC8 iface, REFCLSID rclsid_port, LPDMUS_PORTPARAMS port_params, LPDIRECTMUSICPORT *port, LPUNKNOWN unkouter)
 
void dmusic_remove_port (IDirectMusic8Impl *dmusic, IDirectMusicPort *port)
 
static HRESULT WINAPI IDirectMusic8Impl_EnumMasterClock (LPDIRECTMUSIC8 iface, DWORD index, LPDMUS_CLOCKINFO clock_info)
 
static HRESULT WINAPI IDirectMusic8Impl_GetMasterClock (LPDIRECTMUSIC8 iface, LPGUID guid_clock, IReferenceClock **reference_clock)
 
static HRESULT WINAPI IDirectMusic8Impl_SetMasterClock (LPDIRECTMUSIC8 iface, REFGUID rguidClock)
 
static HRESULT WINAPI IDirectMusic8Impl_Activate (LPDIRECTMUSIC8 iface, BOOL enable)
 
static HRESULT WINAPI IDirectMusic8Impl_GetDefaultPort (LPDIRECTMUSIC8 iface, LPGUID guid_port)
 
static HRESULT WINAPI IDirectMusic8Impl_SetDirectSound (IDirectMusic8 *iface, IDirectSound *dsound, HWND hwnd)
 
static HRESULT WINAPI IDirectMusic8Impl_SetExternalMasterClock (LPDIRECTMUSIC8 iface, IReferenceClock *clock)
 
static void create_system_ports_list (IDirectMusic8Impl *object)
 
HRESULT music_create (IUnknown **ret_iface)
 

Variables

static const IReferenceClockVtbl master_clock_vtbl
 
static const IDirectMusic8Vtbl DirectMusic8_Vtbl
 

Function Documentation

◆ create_system_ports_list()

static void create_system_ports_list ( IDirectMusic8Impl *  object)
static

Definition at line 485 of file dmusic.c.

486{
487 static const WCHAR emulated[] = L" [Emulated]";
488 port_info * port;
489 ULONG nb_ports;
490 ULONG nb_midi_out;
491 ULONG nb_midi_in;
492 MIDIOUTCAPSW caps_out;
493 MIDIINCAPSW caps_in;
494 IDirectMusicSynth8* synth;
495 HRESULT hr;
496 ULONG i;
497
498 TRACE("(%p)\n", object);
499
500 /* NOTE:
501 - it seems some native versions get the rest of devices through dmusic32.EnumLegacyDevices...*sigh*...which is undocumented
502 - should we enum wave devices ? Native does not seem to
503 */
504
505 nb_midi_out = midiOutGetNumDevs();
506 nb_midi_in = midiInGetNumDevs();
507 nb_ports = 1 /* midi mapper */ + nb_midi_out + nb_midi_in + 1 /* synth port */;
508
509 port = object->system_ports = malloc(nb_ports * sizeof(port_info));
510 if (!object->system_ports)
511 return;
512
513 /* Fill common port caps for all winmm ports */
514 for (i = 0; i < (nb_ports - 1 /* synth port*/); i++)
515 {
516 object->system_ports[i].caps.dwSize = sizeof(DMUS_PORTCAPS);
517 object->system_ports[i].caps.dwType = DMUS_PORT_WINMM_DRIVER;
518 object->system_ports[i].caps.dwMemorySize = 0;
519 object->system_ports[i].caps.dwMaxChannelGroups = 1;
520 object->system_ports[i].caps.dwMaxVoices = 0;
521 object->system_ports[i].caps.dwMaxAudioChannels = 0;
522 object->system_ports[i].caps.dwEffectFlags = DMUS_EFFECT_NONE;
523 /* Fake port GUID */
524 object->system_ports[i].caps.guidPort = IID_IUnknown;
525 object->system_ports[i].caps.guidPort.Data1 = i + 1;
526 }
527
528 /* Fill midi mapper port info */
529 port->device = MIDI_MAPPER;
530 port->create = midi_out_port_create;
531 midiOutGetDevCapsW(MIDI_MAPPER, &caps_out, sizeof(caps_out));
532 lstrcpyW(port->caps.wszDescription, caps_out.szPname);
533 lstrcatW(port->caps.wszDescription, emulated);
534 port->caps.dwFlags = DMUS_PC_SHAREABLE;
535 port->caps.dwClass = DMUS_PC_OUTPUTCLASS;
536 port++;
537
538 /* Fill midi out port info */
539 for (i = 0; i < nb_midi_out; i++)
540 {
541 port->device = i;
542 port->create = midi_out_port_create;
543 midiOutGetDevCapsW(i, &caps_out, sizeof(caps_out));
544 lstrcpyW(port->caps.wszDescription, caps_out.szPname);
545 lstrcatW(port->caps.wszDescription, emulated);
546 port->caps.dwFlags = DMUS_PC_SHAREABLE | DMUS_PC_EXTERNAL;
547 port->caps.dwClass = DMUS_PC_OUTPUTCLASS;
548 port++;
549 }
550
551 /* Fill midi in port info */
552 for (i = 0; i < nb_midi_in; i++)
553 {
554 port->device = i;
555 port->create = midi_in_port_create;
556 midiInGetDevCapsW(i, &caps_in, sizeof(caps_in));
557 lstrcpyW(port->caps.wszDescription, caps_in.szPname);
558 lstrcatW(port->caps.wszDescription, emulated);
559 port->caps.dwFlags = DMUS_PC_EXTERNAL;
560 port->caps.dwClass = DMUS_PC_INPUTCLASS;
561 port++;
562 }
563
564 /* Fill synth port info */
565 port->create = synth_port_create;
566 hr = CoCreateInstance(&CLSID_DirectMusicSynth, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicSynth8, (void**)&synth);
567 if (SUCCEEDED(hr))
568 {
569 port->caps.dwSize = sizeof(port->caps);
570 hr = IDirectMusicSynth8_GetPortCaps(synth, &port->caps);
572 }
573 if (FAILED(hr))
574 nb_ports--;
575
576 object->num_system_ports = nb_ports;
577}
const GUID IID_IUnknown
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
#define lstrcpyW
Definition: compat.h:749
USHORT port
Definition: uri.c:210
HRESULT synth_port_create(IDirectMusic8Impl *parent, DMUS_PORTPARAMS *port_params, DMUS_PORTCAPS *port_caps, IDirectMusicPort **port)
Definition: port.c:686
HRESULT midi_in_port_create(IDirectMusic8Impl *parent, DMUS_PORTPARAMS *port_params, DMUS_PORTCAPS *port_caps, IDirectMusicPort **port)
Definition: port.c:1072
HRESULT midi_out_port_create(IDirectMusic8Impl *parent, DMUS_PORTPARAMS *port_params, DMUS_PORTCAPS *port_caps, IDirectMusicPort **port)
Definition: port.c:1064
#define DMUS_EFFECT_NONE
Definition: dmusicc.h:173
#define DMUS_PC_INPUTCLASS
Definition: dmusicc.h:181
#define DMUS_PC_EXTERNAL
Definition: dmusicc.h:185
#define DMUS_PORT_WINMM_DRIVER
Definition: dmusicc.h:198
#define DMUS_PC_SHAREABLE
Definition: dmusicc.h:192
#define DMUS_PC_OUTPUTCLASS
Definition: dmusicc.h:182
struct _DMUS_PORTCAPS DMUS_PORTCAPS
Definition: dmusicc.h:269
#define IDirectMusicSynth8_Release(p)
Definition: dmusics.h:171
#define IDirectMusicSynth8_GetPortCaps(p, a)
Definition: dmusics.h:180
#define L(x)
Definition: resources.c:13
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
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
#define MIDI_MAPPER
Definition: mmsystem.h:253
short WCHAR
Definition: pedump.c:58
#define TRACE(s)
Definition: solgame.cpp:4
WCHAR szPname[MAXPNAMELEN]
Definition: mmsystem.h:1148
WCHAR szPname[MAXPNAMELEN]
Definition: mmsystem.h:1128
uint32_t ULONG
Definition: typedefs.h:59
UINT WINAPI midiInGetNumDevs(void)
Definition: winmm.c:1184
UINT WINAPI midiOutGetNumDevs(void)
Definition: winmm.c:806
UINT WINAPI midiOutGetDevCapsW(UINT_PTR uDeviceID, LPMIDIOUTCAPSW lpCaps, UINT uSize)
Definition: winmm.c:814
UINT WINAPI midiInGetDevCapsW(UINT_PTR uDeviceID, LPMIDIINCAPSW lpCaps, UINT uSize)
Definition: winmm.c:1192

Referenced by music_create().

◆ dmusic_remove_port()

void dmusic_remove_port ( IDirectMusic8Impl *  dmusic,
IDirectMusicPort *  port 
)

Definition at line 291 of file dmusic.c.

292{
293 BOOL found = FALSE;
294 int i;
295
296 TRACE("Removing port %p.\n", port);
297
298 for (i = 0; i < dmusic->num_ports; i++)
299 {
300 if (dmusic->ports[i] == port) {
301 found = TRUE;
302 break;
303 }
304 }
305
306 if (!found)
307 {
308 ERR("Port %p not found in ports array.\n", port);
309 return;
310 }
311
312 if (!--dmusic->num_ports) {
313 free(dmusic->ports);
314 dmusic->ports = NULL;
315 return;
316 }
317
318 memmove(&dmusic->ports[i], &dmusic->ports[i + 1],
319 (dmusic->num_ports - i) * sizeof(*dmusic->ports));
320 dmusic->ports = realloc(dmusic->ports, sizeof(*dmusic->ports) * dmusic->num_ports);
321}
#define ERR(fmt,...)
Definition: precomp.h:57
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
IDirectMusicPort ** ports

Referenced by synth_port_Release().

◆ IDirectMusic8Impl_Activate()

static HRESULT WINAPI IDirectMusic8Impl_Activate ( LPDIRECTMUSIC8  iface,
BOOL  enable 
)
static

Definition at line 378 of file dmusic.c.

379{
381 int i;
382 HRESULT hr;
383
384 TRACE("(%p)->(%u)\n", This, enable);
385
386 for (i = 0; i < This->num_ports; i++)
387 {
389 if (FAILED(hr))
390 return hr;
391 }
392
393 return S_OK;
394}
static IDirectMusic8Impl * impl_from_IDirectMusic8(IDirectMusic8 *iface)
Definition: dmusic.c:148
#define IDirectMusicPort_Activate(p, a)
Definition: dmusicc.h:694
GLboolean enable
Definition: glext.h:11120
#define S_OK
Definition: intsafe.h:52

◆ IDirectMusic8Impl_AddRef()

static ULONG WINAPI IDirectMusic8Impl_AddRef ( LPDIRECTMUSIC8  iface)
static

Definition at line 177 of file dmusic.c.

178{
181
182 TRACE("(%p): new ref = %lu\n", This, ref);
183
184 return ref;
185}
#define InterlockedIncrement
Definition: armddk.h:53
Definition: send.c:48

◆ IDirectMusic8Impl_CreateMusicBuffer()

static HRESULT WINAPI IDirectMusic8Impl_CreateMusicBuffer ( LPDIRECTMUSIC8  iface,
LPDMUS_BUFFERDESC  buffer_desc,
LPDIRECTMUSICBUFFER *  buffer,
LPUNKNOWN  unkouter 
)
static

Definition at line 224 of file dmusic.c.

225{
227
228 TRACE("(%p)->(%p, %p, %p)\n", This, buffer_desc, buffer, unkouter);
229
230 if (unkouter)
232
233 if (!buffer_desc || !buffer)
234 return E_POINTER;
235
237}
HRESULT DMUSIC_CreateDirectMusicBufferImpl(LPDMUS_BUFFERDESC desc, LPVOID *ret_iface)
Definition: buffer.c:293
GLuint buffer
Definition: glext.h:5915
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771
#define E_POINTER
Definition: winerror.h:3480

◆ IDirectMusic8Impl_CreatePort()

static HRESULT WINAPI IDirectMusic8Impl_CreatePort ( LPDIRECTMUSIC8  iface,
REFCLSID  rclsid_port,
LPDMUS_PORTPARAMS  port_params,
LPDIRECTMUSICPORT *  port,
LPUNKNOWN  unkouter 
)
static

Definition at line 239 of file dmusic.c.

240{
242 int i;
243 DMUS_PORTCAPS port_caps;
244 IDirectMusicPort* new_port = NULL;
245 HRESULT hr;
246 GUID default_port;
247 const GUID *request_port = rclsid_port;
248
249 TRACE("(%p)->(%s, %p, %p, %p)\n", This, debugstr_dmguid(rclsid_port), port_params, port, unkouter);
250
251 if (!rclsid_port || !port)
252 return E_POINTER;
253 if (!port_params)
254 return E_INVALIDARG;
255 if (unkouter)
257 if (!This->dsound)
259
260 if (TRACE_ON(dmusic))
261 dump_DMUS_PORTPARAMS(port_params);
262
263 ZeroMemory(&port_caps, sizeof(DMUS_PORTCAPS));
264 port_caps.dwSize = sizeof(DMUS_PORTCAPS);
265
266 if (IsEqualGUID(request_port, &GUID_NULL)) {
267 hr = IDirectMusic8_GetDefaultPort(iface, &default_port);
268 if(FAILED(hr))
269 return hr;
270 request_port = &default_port;
271 }
272
273 for (i = 0; S_FALSE != IDirectMusic8Impl_EnumPort(iface, i, &port_caps); i++) {
274 if (IsEqualCLSID(request_port, &port_caps.guidPort)) {
275 hr = This->system_ports[i].create(This, port_params, &port_caps, &new_port);
276 if (FAILED(hr)) {
277 *port = NULL;
278 return hr;
279 }
280 This->num_ports++;
281 This->ports = realloc(This->ports, sizeof(*This->ports) * This->num_ports);
282 This->ports[This->num_ports - 1] = new_port;
283 *port = new_port;
284 return S_OK;
285 }
286 }
287
288 return E_NOINTERFACE;
289}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define TRACE_ON(x)
Definition: compat.h:75
#define DMUS_E_DSOUND_NOT_SET
Definition: dmerror.h:93
const char * debugstr_dmguid(const GUID *id)
Definition: dmobject.c:36
static HRESULT WINAPI IDirectMusic8Impl_EnumPort(LPDIRECTMUSIC8 iface, DWORD index, LPDMUS_PORTCAPS port_caps)
Definition: dmusic.c:207
void dump_DMUS_PORTPARAMS(LPDMUS_PORTPARAMS params)
Definition: dmusic_main.c:203
#define IDirectMusic8_GetDefaultPort(p, a)
Definition: dmusicc.h:451
#define GUID_NULL
Definition: ks.h:106
#define ZeroMemory
Definition: minwinbase.h:31
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualCLSID(rclsid1, rclsid2)
Definition: guiddef.h:96
GUID guidPort
Definition: dmusicc.h:292
DWORD dwSize
Definition: dmusicc.h:290
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ IDirectMusic8Impl_EnumMasterClock()

static HRESULT WINAPI IDirectMusic8Impl_EnumMasterClock ( LPDIRECTMUSIC8  iface,
DWORD  index,
LPDMUS_CLOCKINFO  clock_info 
)
static

Definition at line 323 of file dmusic.c.

324{
325 TRACE("(%p, %ld, %p)\n", iface, index, clock_info);
326
327 if (!clock_info)
328 return E_POINTER;
329
330 if (index > 1)
331 return S_FALSE;
332
333 if (!index)
334 {
335 static const GUID guid_system_clock = { 0x58d58419, 0x71b4, 0x11d1, { 0xa7, 0x4c, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12 } };
336
337 clock_info->ctType = 0;
338 clock_info->guidClock = guid_system_clock;
339 lstrcpyW(clock_info->wszDescription, L"System Clock");
340 }
341 else
342 {
343 static const GUID guid_dsound_clock = { 0x58d58420, 0x71b4, 0x11d1, { 0xa7, 0x4c, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12 } };
344
345 clock_info->ctType = 0;
346 clock_info->guidClock = guid_dsound_clock;
347 lstrcpyW(clock_info->wszDescription, L"DirectSound Clock");
348 }
349
350 return S_OK;
351}
GLuint index
Definition: glext.h:6031
WCHAR wszDescription[DMUS_MAX_DESCRIPTION]
Definition: dmusicc.h:367
DMUS_CLOCKTYPE ctType
Definition: dmusicc.h:365

◆ IDirectMusic8Impl_EnumPort()

static HRESULT WINAPI IDirectMusic8Impl_EnumPort ( LPDIRECTMUSIC8  iface,
DWORD  index,
LPDMUS_PORTCAPS  port_caps 
)
static

Definition at line 207 of file dmusic.c.

208{
210
211 TRACE("(%p, %ld, %p)\n", This, index, port_caps);
212
213 if (!port_caps)
214 return E_POINTER;
215
216 if (index >= This->num_system_ports)
217 return S_FALSE;
218
219 *port_caps = This->system_ports[index].caps;
220
221 return S_OK;
222}
#define index(s, c)
Definition: various.h:29

Referenced by IDirectMusic8Impl_CreatePort().

◆ IDirectMusic8Impl_GetDefaultPort()

static HRESULT WINAPI IDirectMusic8Impl_GetDefaultPort ( LPDIRECTMUSIC8  iface,
LPGUID  guid_port 
)
static

Definition at line 396 of file dmusic.c.

397{
399 HKEY hkGUID;
400 DWORD returnTypeGUID, sizeOfReturnBuffer = 50;
401 char returnBuffer[51];
402 GUID defaultPortGUID;
403 WCHAR buff[51];
404
405 TRACE("(%p)->(%p)\n", This, guid_port);
406
407 if ((RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\DirectMusic\\Defaults" , 0, KEY_READ, &hkGUID) != ERROR_SUCCESS) ||
408 (RegQueryValueExA(hkGUID, "DefaultOutputPort", NULL, &returnTypeGUID, (LPBYTE)returnBuffer, &sizeOfReturnBuffer) != ERROR_SUCCESS))
409 {
410 WARN(": registry entry missing\n" );
411 *guid_port = CLSID_DirectMusicSynth;
412 return S_OK;
413 }
414 /* FIXME: Check return types to ensure we're interpreting data right */
415 MultiByteToWideChar(CP_ACP, 0, returnBuffer, -1, buff, ARRAY_SIZE(buff));
416 CLSIDFromString(buff, &defaultPortGUID);
417 *guid_port = defaultPortGUID;
418
419 return S_OK;
420}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3298
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
Definition: reg.c:4009
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
Definition: combase.c:1470
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
unsigned long DWORD
Definition: ntddk_ex.h:95
#define KEY_READ
Definition: nt_native.h:1026
static const char *static const char const char DWORD void DWORD *static const char const char DWORD void DWORD *static const char DWORD DWORD void * buff
Definition: shcore.c:41
unsigned char * LPBYTE
Definition: typedefs.h:53
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12

◆ IDirectMusic8Impl_GetMasterClock()

static HRESULT WINAPI IDirectMusic8Impl_GetMasterClock ( LPDIRECTMUSIC8  iface,
LPGUID  guid_clock,
IReferenceClock **  reference_clock 
)
static

Definition at line 353 of file dmusic.c.

354{
356
357 TRACE("(%p)->(%p, %p)\n", This, guid_clock, reference_clock);
358
359 if (guid_clock)
360 *guid_clock = GUID_NULL;
361 if (reference_clock) {
362 *reference_clock = This->master_clock;
363 IReferenceClock_AddRef(*reference_clock);
364 }
365
366 return S_OK;
367}

◆ IDirectMusic8Impl_QueryInterface()

static HRESULT WINAPI IDirectMusic8Impl_QueryInterface ( LPDIRECTMUSIC8  iface,
REFIID  riid,
LPVOID *  ret_iface 
)
static

Definition at line 154 of file dmusic.c.

155{
157
158 TRACE("(%p)->(%s, %p)\n", iface, debugstr_dmguid(riid), ret_iface);
159
160 if (IsEqualIID (riid, &IID_IUnknown) ||
161 IsEqualIID (riid, &IID_IDirectMusic) ||
162 IsEqualIID (riid, &IID_IDirectMusic2) ||
163 IsEqualIID (riid, &IID_IDirectMusic8))
164 {
166 *ret_iface = iface;
167 return S_OK;
168 }
169
170 *ret_iface = NULL;
171
172 WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface);
173
174 return E_NOINTERFACE;
175}
#define IDirectMusic8_AddRef(p)
Definition: dmusicc.h:441
REFIID riid
Definition: atlbase.h:39
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95

◆ IDirectMusic8Impl_Release()

static ULONG WINAPI IDirectMusic8Impl_Release ( LPDIRECTMUSIC8  iface)
static

Definition at line 187 of file dmusic.c.

188{
191
192 TRACE("(%p): new ref = %lu\n", This, ref);
193
194 if (!ref) {
195 IReferenceClock_Release(This->master_clock);
196 if (This->dsound)
197 IDirectSound_Release(This->dsound);
198 free(This->system_ports);
199 free(This->ports);
200 free(This);
201 }
202
203 return ref;
204}
#define InterlockedDecrement
Definition: armddk.h:52
#define IDirectSound_Release(p)
Definition: dsound.h:453

◆ IDirectMusic8Impl_SetDirectSound()

static HRESULT WINAPI IDirectMusic8Impl_SetDirectSound ( IDirectMusic8 *  iface,
IDirectSound *  dsound,
HWND  hwnd 
)
static

Definition at line 422 of file dmusic.c.

424{
426 HRESULT hr;
427 int i;
428
429 TRACE("(%p)->(%p, %p)\n", This, dsound, hwnd);
430
431 for (i = 0; i < This->num_ports; i++)
432 {
434 if (FAILED(hr))
435 return hr;
436 }
437
438 if (This->dsound)
439 IDirectSound_Release(This->dsound);
440
441 if (!dsound) {
442 hr = DirectSoundCreate8(NULL, (IDirectSound8 **)&This->dsound, NULL);
443 if (FAILED(hr))
444 return hr;
447 if (FAILED(hr)) {
448 IDirectSound_Release(This->dsound);
449 This->dsound = NULL;
450 }
451 return hr;
452 }
453
454 IDirectSound_AddRef(dsound);
455 This->dsound = dsound;
456
457 return S_OK;
458}
HRESULT WINAPI DirectSoundCreate8(LPCGUID lpcGUID, LPDIRECTSOUND8 *ppDS, IUnknown *pUnkOuter)
Definition: directsound.c:504
#define IDirectMusicPort_SetDirectSound(p, a, b)
Definition: dmusicc.h:697
#define IDirectSound_AddRef(p)
Definition: dsound.h:452
#define DSSCL_PRIORITY
Definition: dsound.h:248
#define IDirectSound_SetCooperativeLevel(p, a, b)
Definition: dsound.h:458
HWND WINAPI GetForegroundWindow(void)
Definition: ntwrapper.h:392
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023

◆ IDirectMusic8Impl_SetExternalMasterClock()

static HRESULT WINAPI IDirectMusic8Impl_SetExternalMasterClock ( LPDIRECTMUSIC8  iface,
IReferenceClock *  clock 
)
static

Definition at line 460 of file dmusic.c.

461{
463
464 FIXME("(%p)->(%p): stub\n", This, clock);
465
466 return S_OK;
467}
#define FIXME(fmt,...)
Definition: precomp.h:53
_ACRTIMP clock_t __cdecl clock(void)
Definition: time.c:698

◆ IDirectMusic8Impl_SetMasterClock()

static HRESULT WINAPI IDirectMusic8Impl_SetMasterClock ( LPDIRECTMUSIC8  iface,
REFGUID  rguidClock 
)
static

Definition at line 369 of file dmusic.c.

370{
372
373 FIXME("(%p)->(%s): stub\n", This, debugstr_dmguid(rguidClock));
374
375 return S_OK;
376}

◆ impl_from_IDirectMusic8()

◆ impl_from_IReferenceClock()

static struct master_clock * impl_from_IReferenceClock ( IReferenceClock *  iface)
inlinestatic

Definition at line 35 of file dmusic.c.

36{
37 return CONTAINING_RECORD(iface, struct master_clock, IReferenceClock_iface);
38}

Referenced by master_IReferenceClock_AddRef(), master_IReferenceClock_GetTime(), and master_IReferenceClock_Release().

◆ master_clock_create()

static HRESULT master_clock_create ( IReferenceClock **  clock)
static

Definition at line 128 of file dmusic.c.

129{
130 struct master_clock *obj;
132
133 TRACE("(%p)\n", clock);
134
135 if (!(obj = calloc(1, sizeof(*obj))))
136 return E_OUTOFMEMORY;
137
138 obj->IReferenceClock_iface.lpVtbl = &master_clock_vtbl;
139 obj->ref = 1;
141 obj->freq = 10000000.0 / freq.QuadPart;
142
143 *clock = &obj->IReferenceClock_iface;
144
145 return S_OK;
146}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
BOOL WINAPI QueryPerformanceFrequency(OUT PLARGE_INTEGER lpFrequency)
Definition: perfcnt.c:45
static const IReferenceClockVtbl master_clock_vtbl
Definition: dmusic.c:118
#define calloc
Definition: rosglue.h:14
double freq
Definition: dmusic.c:31

Referenced by music_create().

◆ master_IReferenceClock_AddRef()

static ULONG WINAPI master_IReferenceClock_AddRef ( IReferenceClock *  iface)
static

Definition at line 58 of file dmusic.c.

59{
62
63 TRACE("(%p) ref = %lu\n", iface, ref);
64
65 return ref;
66}
static struct master_clock * impl_from_IReferenceClock(IReferenceClock *iface)
Definition: dmusic.c:35
LONG ref
Definition: dmusic.c:30

◆ master_IReferenceClock_AdvisePeriodic()

static HRESULT WINAPI master_IReferenceClock_AdvisePeriodic ( IReferenceClock *  iface,
REFERENCE_TIME  start,
REFERENCE_TIME  period,
HSEMAPHORE  semaphore,
DWORD_PTR *  cookie 
)
static

Definition at line 105 of file dmusic.c.

107{
108 FIXME("(%p, %I64d, %I64d, %#Ix, %p): stub\n", iface, start, period, semaphore, cookie);
109 return E_NOTIMPL;
110}
#define E_NOTIMPL
Definition: ddrawi.h:99
GLuint start
Definition: gl.h:1545
static HANDLE semaphore
Definition: loader.c:2947
Definition: cookie.c:34

◆ master_IReferenceClock_AdviseTime()

static HRESULT WINAPI master_IReferenceClock_AdviseTime ( IReferenceClock *  iface,
REFERENCE_TIME  base,
REFERENCE_TIME  offset,
HEVENT  event,
DWORD_PTR *  cookie 
)
static

Definition at line 98 of file dmusic.c.

100{
101 FIXME("(%p, %I64d, %I64d, %#Ix, %p): stub\n", iface, base, offset, event, cookie);
102 return E_NOTIMPL;
103}
GLintptr offset
Definition: glext.h:5920
Definition: filter.c:185

◆ master_IReferenceClock_GetTime()

static HRESULT WINAPI master_IReferenceClock_GetTime ( IReferenceClock *  iface,
REFERENCE_TIME *  time 
)
static

Definition at line 81 of file dmusic.c.

83{
86 HRESULT hr;
87
88 TRACE("(%p, %p)\n", iface, time);
89
91 *time = counter.QuadPart * This->freq;
92 hr = (*time == This->last_time) ? S_FALSE : S_OK;
93 This->last_time = *time;
94
95 return hr;
96}
BOOL WINAPI QueryPerformanceCounter(OUT PLARGE_INTEGER lpPerformanceCount)
Definition: perfcnt.c:23
__u16 time
Definition: mkdosfs.c:8

◆ master_IReferenceClock_QueryInterface()

static HRESULT WINAPI master_IReferenceClock_QueryInterface ( IReferenceClock *  iface,
REFIID  riid,
void **  ret_iface 
)
static

Definition at line 40 of file dmusic.c.

42{
43 TRACE("(%p, %s, %p)\n", iface, debugstr_dmguid(riid), ret_iface);
44
45 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IReferenceClock))
46 *ret_iface = iface;
47 else {
48 WARN("no interface for %s\n", debugstr_dmguid(riid));
49 *ret_iface = NULL;
50 return E_NOINTERFACE;
51 }
52
53 IReferenceClock_AddRef(iface);
54
55 return S_OK;
56}

◆ master_IReferenceClock_Release()

static ULONG WINAPI master_IReferenceClock_Release ( IReferenceClock *  iface)
static

Definition at line 68 of file dmusic.c.

69{
72
73 TRACE("(%p) ref = %lu\n", iface, ref);
74
75 if (!ref)
76 free(This);
77
78 return ref;
79}

◆ master_IReferenceClock_Unadvise()

static HRESULT WINAPI master_IReferenceClock_Unadvise ( IReferenceClock *  iface,
DWORD_PTR  cookie 
)
static

Definition at line 112 of file dmusic.c.

113{
114 FIXME("(%p, %#Ix): stub\n", iface, cookie);
115 return E_NOTIMPL;
116}

◆ music_create()

HRESULT music_create ( IUnknown **  ret_iface)

Definition at line 579 of file dmusic.c.

580{
581 IDirectMusic8Impl *dmusic;
582 HRESULT ret;
583
584 TRACE("(%p)\n", ret_iface);
585
586 *ret_iface = NULL;
587 if (!(dmusic = calloc(1, sizeof(*dmusic)))) return E_OUTOFMEMORY;
588 dmusic->IDirectMusic8_iface.lpVtbl = &DirectMusic8_Vtbl;
589 dmusic->ref = 1;
591 if (FAILED(ret)) {
592 free(dmusic);
593 return ret;
594 }
595
597
598 TRACE("Created DirectMusic %p\n", dmusic);
599 *ret_iface = (IUnknown *)&dmusic->IDirectMusic8_iface;
600 return S_OK;
601}
static const IDirectMusic8Vtbl DirectMusic8_Vtbl
Definition: dmusic.c:469
static HRESULT master_clock_create(IReferenceClock **clock)
Definition: dmusic.c:128
static void create_system_ports_list(IDirectMusic8Impl *object)
Definition: dmusic.c:485
return ret
Definition: mutex.c:147
IReferenceClock * master_clock
IDirectMusic8 IDirectMusic8_iface

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( dmusic  )

Variable Documentation

◆ DirectMusic8_Vtbl

const IDirectMusic8Vtbl DirectMusic8_Vtbl
static
Initial value:
= {
}
static HRESULT WINAPI IDirectMusic8Impl_CreateMusicBuffer(LPDIRECTMUSIC8 iface, LPDMUS_BUFFERDESC buffer_desc, LPDIRECTMUSICBUFFER *buffer, LPUNKNOWN unkouter)
Definition: dmusic.c:224
static HRESULT WINAPI IDirectMusic8Impl_EnumMasterClock(LPDIRECTMUSIC8 iface, DWORD index, LPDMUS_CLOCKINFO clock_info)
Definition: dmusic.c:323
static HRESULT WINAPI IDirectMusic8Impl_GetMasterClock(LPDIRECTMUSIC8 iface, LPGUID guid_clock, IReferenceClock **reference_clock)
Definition: dmusic.c:353
static HRESULT WINAPI IDirectMusic8Impl_GetDefaultPort(LPDIRECTMUSIC8 iface, LPGUID guid_port)
Definition: dmusic.c:396
static ULONG WINAPI IDirectMusic8Impl_AddRef(LPDIRECTMUSIC8 iface)
Definition: dmusic.c:177
static HRESULT WINAPI IDirectMusic8Impl_SetDirectSound(IDirectMusic8 *iface, IDirectSound *dsound, HWND hwnd)
Definition: dmusic.c:422
static HRESULT WINAPI IDirectMusic8Impl_QueryInterface(LPDIRECTMUSIC8 iface, REFIID riid, LPVOID *ret_iface)
Definition: dmusic.c:154
static HRESULT WINAPI IDirectMusic8Impl_SetMasterClock(LPDIRECTMUSIC8 iface, REFGUID rguidClock)
Definition: dmusic.c:369
static HRESULT WINAPI IDirectMusic8Impl_Activate(LPDIRECTMUSIC8 iface, BOOL enable)
Definition: dmusic.c:378
static HRESULT WINAPI IDirectMusic8Impl_SetExternalMasterClock(LPDIRECTMUSIC8 iface, IReferenceClock *clock)
Definition: dmusic.c:460
static HRESULT WINAPI IDirectMusic8Impl_CreatePort(LPDIRECTMUSIC8 iface, REFCLSID rclsid_port, LPDMUS_PORTPARAMS port_params, LPDIRECTMUSICPORT *port, LPUNKNOWN unkouter)
Definition: dmusic.c:239
static ULONG WINAPI IDirectMusic8Impl_Release(LPDIRECTMUSIC8 iface)
Definition: dmusic.c:187

Definition at line 469 of file dmusic.c.

Referenced by music_create().

◆ master_clock_vtbl

const IReferenceClockVtbl master_clock_vtbl
static
Initial value:
= {
}
static HRESULT WINAPI master_IReferenceClock_AdviseTime(IReferenceClock *iface, REFERENCE_TIME base, REFERENCE_TIME offset, HEVENT event, DWORD_PTR *cookie)
Definition: dmusic.c:98
static HRESULT WINAPI master_IReferenceClock_GetTime(IReferenceClock *iface, REFERENCE_TIME *time)
Definition: dmusic.c:81
static HRESULT WINAPI master_IReferenceClock_AdvisePeriodic(IReferenceClock *iface, REFERENCE_TIME start, REFERENCE_TIME period, HSEMAPHORE semaphore, DWORD_PTR *cookie)
Definition: dmusic.c:105
static ULONG WINAPI master_IReferenceClock_Release(IReferenceClock *iface)
Definition: dmusic.c:68
static HRESULT WINAPI master_IReferenceClock_QueryInterface(IReferenceClock *iface, REFIID riid, void **ret_iface)
Definition: dmusic.c:40
static ULONG WINAPI master_IReferenceClock_AddRef(IReferenceClock *iface)
Definition: dmusic.c:58
static HRESULT WINAPI master_IReferenceClock_Unadvise(IReferenceClock *iface, DWORD_PTR cookie)
Definition: dmusic.c:112

Definition at line 118 of file dmusic.c.

Referenced by master_clock_create().