21#define NONAMELESSUNION
32#include "mmdeviceapi.h"
35#include "audioclient.h"
36#include "endpointvolume.h"
37#include "audiopolicy.h"
45 {
'S',
'o',
'f',
't',
'w',
'a',
'r',
'e',
'\\',
46 'M',
'i',
'c',
'r',
'o',
's',
'o',
'f',
't',
'\\',
47 'W',
'i',
'n',
'd',
'o',
'w',
's',
'\\',
48 'C',
'u',
'r',
'r',
'e',
'n',
't',
'V',
'e',
'r',
's',
'i',
'o',
'n',
'\\',
49 'M',
'M',
'D',
'e',
'v',
'i',
'c',
'e',
's',
'\\',
50 'A',
'u',
'd',
'i',
'o',0};
52 {
'R',
'e',
'n',
'd',
'e',
'r',0 };
54 {
'C',
'a',
'p',
't',
'u',
'r',
'e',0 };
56 {
'D',
'e',
'v',
'i',
'c',
'e',
'S',
't',
'a',
't',
'e',0 };
58 {
'P',
'r',
'o',
'p',
'e',
'r',
't',
'i',
'e',
's',0 };
60static const WCHAR reg_out_nameW[] = {
'D',
'e',
'f',
'a',
'u',
'l',
't',
'O',
'u',
't',
'p',
'u',
't',0};
61static const WCHAR reg_vout_nameW[] = {
'D',
'e',
'f',
'a',
'u',
'l',
't',
'V',
'o',
'i',
'c',
'e',
'O',
'u',
't',
'p',
'u',
't',0};
62static const WCHAR reg_in_nameW[] = {
'D',
'e',
'f',
'a',
'u',
'l',
't',
'I',
'n',
'p',
'u',
't',0};
63static const WCHAR reg_vin_nameW[] = {
'D',
'e',
'f',
'a',
'u',
'l',
't',
'V',
'o',
'i',
'c',
'e',
'I',
'n',
'p',
'u',
't',0};
132 '{',
'%',
'0',
'8',
'X',
'-',
'%',
'0',
'4',
'X',
'-',
133 '%',
'0',
'4',
'X',
'-',
'%',
'0',
'2',
'X',
'%',
'0',
'2',
'X',
'-',
134 '%',
'0',
'2',
'X',
'%',
'0',
'2',
'X',
'%',
'0',
'2',
'X',
'%',
'0',
'2',
'X',
135 '%',
'0',
'2',
'X',
'%',
'0',
'2',
'X',
'}',
',',
'%',
'd',0 };
171 id->Data4[0],
id->Data4[1],
id->Data4[2],
id->Data4[3],
172 id->Data4[4],
id->Data4[5],
id->Data4[6],
id->Data4[7],
key->pid );
203 pv->u.blob.cbSize =
size;
205 if (!pv->u.blob.pBlobData)
212 ERR(
"Unknown/unhandled type: %u\n",
type);
232 id->Data4[0],
id->Data4[1],
id->Data4[2],
id->Data4[3],
233 id->Data4[4],
id->Data4[5],
id->Data4[6],
id->Data4[7],
key->pid );
244 TRACE(
"Blob %p %u\n", pv->u.blob.pBlobData, pv->u.blob.cbSize);
255 FIXME(
"Unhandled type %u\n", pv->vt);
269 if (!
drvs.pGetPropValue)
272 hr =
drvs.pGetPropValue(
id, prop, &pv);
294 static const PROPERTYKEY deviceinterface_key = {
295 {0x233164c8, 0x1b2c, 0x4c7d, {0xbc, 0x68, 0xb6, 0x71, 0x68, 0x7a, 0x25, 0x67}}, 1
298 static const PROPERTYKEY devicepath_key = {
299 {0xb3f8fa53, 0x0004, 0x438e, {0x90, 0x03, 0x51, 0xa4, 0x6e, 0x13, 0x9b, 0xfc}}, 2
321 cur->crst.DebugInfo->Spare[0] = (
DWORD_PTR)(__FILE__
": MMDevice.crst");
328 }
else if(
cur->ref > 0)
329 WARN(
"Modifying an MMDevice with postitive reference count!\n");
359 pv.u.pwszVal = guidstr;
376 PropVariantInit(&
pv2);
419 WARN(
"Couldn't create key: %u\n",
ret);
452 DEVICE_STATE_NOTPRESENT,
FALSE);
473 IAudioClient_Release(
client);
477 IAudioClient_Release(
client);
481 pv.u.blob.pBlobData = (
BYTE*)
fmt;
483 &PKEY_AudioEngine_DeviceFormat, &pv);
485 &PKEY_AudioEngine_OEMFormat, &pv);
498 if(!
drvs.pGetEndpointIDs)
501 hr =
drvs.pGetEndpointIDs(flow, &
ids, &guids, &
num, &def);
531 This->crst.DebugInfo->Spare[0] = 0;
554 *
ppv = &
This->IMMEndpoint_iface;
609 ERR(
"Not supported for recording?\n");
621 IPersistPropertyBag_Release(ppb);
627 FIXME(
"Wine doesn't support IPersistPropertyBag on DSoundRender yet, ignoring..\n");
634 FIXME(
"IID_IDeviceTopology unsupported\n");
684 static const WCHAR formatW[] = {
'{',
'0',
'.',
'0',
'.',
'%',
'u',
'.',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'}',
'.',
685 '{',
'%',
'0',
'8',
'X',
'-',
'%',
'0',
'4',
'X',
'-',
686 '%',
'0',
'4',
'X',
'-',
'%',
'0',
'2',
'X',
'%',
'0',
'2',
'X',
'-',
687 '%',
'0',
'2',
'X',
'%',
'0',
'2',
'X',
'%',
'0',
'2',
'X',
'%',
'0',
'2',
'X',
688 '%',
'0',
'2',
'X',
'%',
'0',
'2',
'X',
'}',0 };
697 id->Data4[0],
id->Data4[1],
id->Data4[2],
id->Data4[3],
698 id->Data4[4],
id->Data4[5],
id->Data4[6],
id->Data4[7] );
734 return IMMDevice_QueryInterface(&
This->IMMDevice_iface,
riid,
ppv);
741 return IMMDevice_AddRef(&
This->IMMDevice_iface);
748 return IMMDevice_Release(&
This->IMMDevice_iface);
781 *
ppv = &
This->IMMDeviceCollection_iface;
799 *
ppv = &
This->IMMDeviceCollection_iface;
862 *
dev = &
cur->IMMDevice_iface;
863 IMMDevice_AddRef(*
dev);
867 WARN(
"Could not obtain item %u\n",
n);
899 return IMMDeviceEnumerator_QueryInterface(&
This->IMMDeviceEnumerator_iface,
riid,
ppv);
922 *
ppv = &
This->IMMDeviceEnumerator_iface;
958 if (
mask & ~DEVICE_STATEMASK_ALL)
977 WARN(
"Unknown flow (%u) or role (%u)\n", flow, role);
991 const WCHAR *reg_x_name, *reg_vx_name;
1006 hr = IMMDeviceEnumerator_GetDevice(iface, def_id,
device);
1009 state == DEVICE_STATE_ACTIVE){
1020 hr = IMMDeviceEnumerator_GetDevice(iface, def_id,
device);
1023 state == DEVICE_STATE_ACTIVE){
1042 IMMDevice_AddRef(*
device);
1052 static const WCHAR wine_info_deviceW[] = {
'W',
'i',
'n',
'e',
' ',
1053 'i',
'n',
'f',
'o',
' ',
'd',
'e',
'v',
'i',
'c',
'e',0};
1073 WARN(
"GetId failed: %08x\n",
hr);
1080 IMMDevice_AddRef(
dev);
1103 0, 0, { (
DWORD_PTR)(__FILE__
": g_notif_lock") }
1112 IMMNotificationClient_OnDefaultDeviceChanged(wrapper->
client, flow,
1127 size =
sizeof(new_val);
1130 if(old_val[0] != 0){
1133 hr = IMMDevice_GetId(def_dev, &
id);
1135 ERR(
"GetId failed: %08x\n",
hr);
1157 if(new_val[0] != 0){
1160 memcpy(old_val, new_val,
sizeof(new_val));
1166 hr = IMMDevice_GetId(def_dev, &
id);
1168 ERR(
"GetId failed: %08x\n",
hr);
1185 WCHAR out_name[64], vout_name[64], in_name[64], vin_name[64];
1198 size =
sizeof(out_name);
1203 size =
sizeof(vout_name);
1208 size =
sizeof(in_name);
1213 size =
sizeof(vin_name);
1328 *
ppv = &
This->IPropertyStore_iface;
1352 *
ppv = &
This->IPropertyStore_iface;
1387 TRACE(
"(%p)->(%p)\n", iface, nprops);
1401 TRACE(
"Returning %i\n",
i);
1414 TRACE(
"(%p)->(%u,%p)\n", iface, prop,
key);
1425 WARN(
"GetAt %u failed\n", prop);
1477 TRACE(
"(%p)\n", iface);
1505 ERR(
"Should not be called\n");
1512 ERR(
"Should not be called\n");
1518 ERR(
"Should not be called\n");
1524 static const WCHAR dsguid[] = {
'D',
'S',
'G',
'u',
'i',
'd', 0 };
1541 ERR(
"Should not be called\n");
1545static const IPropertyBagVtbl
PB_Vtbl =
#define InterlockedIncrement
#define InterlockedDecrement
HRESULT AudioEndpointVolume_Create(MMDevice *parent, IAudioEndpointVolumeEx **ppv)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void user(int argc, const char *argv[])
static void list_remove(struct list_entry *entry)
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
#define RegCloseKey(hKey)
const GUID IID_IBaseFilter
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
LONG WINAPI RegNotifyChangeKeyValue(HKEY hKey, BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL fAsynchronous)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
#define ERROR_NO_MORE_ITEMS
#define HeapFree(x, y, z)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
static MMDevice * MMDevice_def_play
static HRESULT WINAPI PB_Write(IPropertyBag *iface, LPCOLESTR name, VARIANT *var)
static HRESULT load_devices_from_reg(void)
static HRESULT MMDevCol_Create(IMMDeviceCollection **ppv, EDataFlow flow, DWORD state)
static void MMDevice_Destroy(MMDevice *This)
static const IMMEndpointVtbl MMEndpointVtbl
static const IPropertyStoreVtbl info_device_ps_Vtbl
static HRESULT WINAPI MMEndpoint_GetDataFlow(IMMEndpoint *iface, EDataFlow *flow)
static const IMMDeviceVtbl info_device_Vtbl
static ULONG WINAPI MMDevEnum_AddRef(IMMDeviceEnumerator *iface)
static const WCHAR reg_vout_nameW[]
static MMDevice * impl_from_IMMDevice(IMMDevice *iface)
static HRESULT WINAPI MMDevPropStore_GetCount(IPropertyStore *iface, DWORD *nprops)
static HRESULT WINAPI MMDevPropStore_GetAt(IPropertyStore *iface, DWORD prop, PROPERTYKEY *key)
static const IPropertyBagVtbl PB_Vtbl
static ULONG WINAPI MMEndpoint_Release(IMMEndpoint *iface)
static HRESULT WINAPI MMDevCol_QueryInterface(IMMDeviceCollection *iface, REFIID riid, void **ppv)
static HRESULT WINAPI MMDevPropStore_SetValue(IPropertyStore *iface, REFPROPERTYKEY key, REFPROPVARIANT pv)
static HRESULT WINAPI info_device_OpenPropertyStore(IMMDevice *iface, DWORD access, IPropertyStore **ppv)
static const WCHAR propkey_formatW[]
static MMDevColImpl * impl_from_IMMDeviceCollection(IMMDeviceCollection *iface)
static ULONG WINAPI MMEndpoint_AddRef(IMMEndpoint *iface)
static const WCHAR reg_vin_nameW[]
static const WCHAR software_mmdevapi[]
static IPropertyStore info_device_ps
static CRITICAL_SECTION_DEBUG g_notif_lock_debug
static MMDevice * impl_from_IMMEndpoint(IMMEndpoint *iface)
static IPropertyBagImpl * impl_from_IPropertyBag(IPropertyBag *iface)
static HRESULT MMDevice_GetPropValue(const GUID *devguid, DWORD flow, REFPROPERTYKEY key, PROPVARIANT *pv)
static MMDevPropStore * impl_from_IPropertyStore(IPropertyStore *iface)
static HRESULT WINAPI MMDevEnum_QueryInterface(IMMDeviceEnumerator *iface, REFIID riid, void **ppv)
static DWORD WINAPI notif_thread_proc(void *user)
static const WCHAR reg_out_nameW[]
void MMDevEnum_Free(void)
static HRESULT WINAPI MMDevCol_GetCount(IMMDeviceCollection *iface, UINT *numdevs)
static ULONG WINAPI info_device_ps_Release(IPropertyStore *iface)
static ULONG WINAPI PB_AddRef(IPropertyBag *iface)
static DWORD MMDevice_count
static void MMDevCol_Destroy(MMDevColImpl *This)
static MMDevice * MMDevice_def_rec
static HRESULT MMDevPropStore_Create(MMDevice *This, DWORD access, IPropertyStore **ppv)
static HRESULT WINAPI MMDevice_GetState(IMMDevice *iface, DWORD *state)
static ULONG WINAPI MMDevCol_Release(IMMDeviceCollection *iface)
static HRESULT WINAPI MMDevice_OpenPropertyStore(IMMDevice *iface, DWORD access, IPropertyStore **ppv)
static const IMMDeviceCollectionVtbl MMDevColVtbl
static HRESULT WINAPI MMDevEnum_UnregisterEndpointNotificationCallback(IMMDeviceEnumerator *iface, IMMNotificationClient *client)
static ULONG WINAPI MMDevPropStore_Release(IPropertyStore *iface)
static HRESULT WINAPI MMEndpoint_QueryInterface(IMMEndpoint *iface, REFIID riid, void **ppv)
static HRESULT WINAPI MMDevPropStore_GetValue(IPropertyStore *iface, REFPROPERTYKEY key, PROPVARIANT *pv)
static const WCHAR slashW[]
static HRESULT WINAPI MMDevEnum_EnumAudioEndpoints(IMMDeviceEnumerator *iface, EDataFlow flow, DWORD mask, IMMDeviceCollection **devices)
static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD clsctx, PROPVARIANT *params, void **ppv)
static ULONG WINAPI info_device_AddRef(IMMDevice *iface)
static const WCHAR reg_capture[]
static HRESULT WINAPI PB_Read(IPropertyBag *iface, LPCOLESTR name, VARIANT *var, IErrorLog *log)
static BOOL notify_if_changed(EDataFlow flow, ERole role, HKEY key, const WCHAR *val_name, WCHAR *old_val, IMMDevice *def_dev)
static HRESULT MMDevPropStore_OpenPropKey(const GUID *guid, DWORD flow, HKEY *propkey)
static ULONG WINAPI MMDevCol_AddRef(IMMDeviceCollection *iface)
static void notify_clients(EDataFlow flow, ERole role, const WCHAR *id)
static HANDLE g_notif_thread
static const WCHAR reg_devicestate[]
static HRESULT WINAPI MMDevice_GetId(IMMDevice *iface, WCHAR **itemid)
static HRESULT WINAPI MMDevPropStore_Commit(IPropertyStore *iface)
static HRESULT WINAPI info_device_ps_GetValue(IPropertyStore *iface, REFPROPERTYKEY key, PROPVARIANT *pv)
static const IPropertyStoreVtbl MMDevPropVtbl
static ULONG WINAPI info_device_Release(IMMDevice *iface)
static MMDevEnumImpl * MMDevEnumerator
static MMDevice ** MMDevice_head
static HRESULT set_format(MMDevice *dev)
static HRESULT WINAPI MMDevEnum_GetDevice(IMMDeviceEnumerator *iface, const WCHAR *name, IMMDevice **device)
static HRESULT load_driver_devices(EDataFlow flow)
static const IMMDeviceEnumeratorVtbl MMDevEnumVtbl
static const IMMDeviceVtbl MMDeviceVtbl
static HRESULT WINAPI MMDevEnum_GetDefaultAudioEndpoint(IMMDeviceEnumerator *iface, EDataFlow flow, ERole role, IMMDevice **device)
static ULONG WINAPI MMDevEnum_Release(IMMDeviceEnumerator *iface)
static ULONG WINAPI MMDevice_Release(IMMDevice *iface)
static HRESULT WINAPI MMDevCol_Item(IMMDeviceCollection *iface, UINT n, IMMDevice **dev)
static void MMDevPropStore_Destroy(MMDevPropStore *This)
static HRESULT WINAPI PB_QueryInterface(IPropertyBag *iface, REFIID riid, void **ppv)
static HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERTYKEY key, REFPROPVARIANT pv)
static CRITICAL_SECTION g_notif_lock
static const WCHAR reg_in_nameW[]
static IMMDevice info_device
static ULONG WINAPI PB_Release(IPropertyBag *iface)
static HRESULT WINAPI MMDevEnum_RegisterEndpointNotificationCallback(IMMDeviceEnumerator *iface, IMMNotificationClient *client)
static const WCHAR reg_properties[]
static HRESULT WINAPI MMDevice_QueryInterface(IMMDevice *iface, REFIID riid, void **ppv)
static HRESULT WINAPI MMDevPropStore_QueryInterface(IPropertyStore *iface, REFIID riid, void **ppv)
static ULONG WINAPI MMDevPropStore_AddRef(IPropertyStore *iface)
static const WCHAR reg_render[]
static ULONG WINAPI MMDevice_AddRef(IMMDevice *iface)
HRESULT MMDevEnum_Create(REFIID riid, void **ppv)
static MMDevice * MMDevice_Create(WCHAR *name, GUID *id, EDataFlow flow, DWORD state, BOOL setdefault)
static ULONG WINAPI info_device_ps_AddRef(IPropertyStore *iface)
static struct list g_notif_clients
static MMDevEnumImpl * impl_from_IMMDeviceEnumerator(IMMDeviceEnumerator *iface)
struct MMDevPropStoreImpl MMDevPropStore
static HRESULT set_driver_prop_value(GUID *id, const EDataFlow flow, const PROPERTYKEY *prop)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
HRESULT WINAPI PropVariantClear(PROPVARIANT *pvar)
#define RRF_RT_REG_BINARY
static struct all_devices * devices
#define IDirectSoundCapture_Release(p)
#define IDirectSoundCapture_Initialize(p, a)
#define IDirectSound_Initialize(p, a)
#define IDirectSound_Release(p)
GLuint GLuint GLsizei GLenum type
GLenum const GLfloat * params
GLuint GLint GLboolean GLint GLenum access
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
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 GLint GLint j
VOID WINAPI CoTaskMemFree(LPVOID ptr)
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
#define memcpy(s1, s2, n)
enum _EDataFlow EDataFlow
BSTR WINAPI SysAllocString(LPCOLESTR str)
#define IsEqualPropertyKey(a, b)
PROPERTYKEY * REFPROPERTYKEY
const GUID IID_IPersistPropertyBag
#define IsEqualGUID(rguid1, rguid2)
#define IsEqualIID(riid1, riid2)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
IPropertyBag IPropertyBag_iface
IMMDeviceCollection IMMDeviceCollection_iface
IMMDeviceEnumerator IMMDeviceEnumerator_iface
IPropertyStore IPropertyStore_iface
IMMDevice IMMDevice_iface
IMMNotificationClient * client
LIST_ENTRY ProcessLocksList
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
#define CONTAINING_RECORD(address, type, field)
DWORD WINAPI GetLastError(void)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define STG_E_ACCESSDENIED
#define HKEY_LOCAL_MACHINE
#define HKEY_CURRENT_USER
#define REG_NOTIFY_CHANGE_LAST_SET
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)