21 #define NONAMELESSUNION 28 #include "wine/list.h" 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 };
60 static const WCHAR reg_out_nameW[] = {
'D',
'e',
'f',
'a',
'u',
'l',
't',
'O',
'u',
't',
'p',
'u',
't',0};
61 static const WCHAR reg_vout_nameW[] = {
'D',
'e',
'f',
'a',
'u',
'l',
't',
'V',
'o',
'i',
'c',
'e',
'O',
'u',
't',
'p',
'u',
't',0};
62 static const WCHAR reg_in_nameW[] = {
'D',
'e',
'f',
'a',
'u',
'l',
't',
'I',
'n',
'p',
'u',
't',0};
63 static 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");
1545 static const IPropertyBagVtbl
PB_Vtbl =
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
static const WCHAR software_mmdevapi[]
static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD clsctx, PROPVARIANT *params, void **ppv)
static HRESULT WINAPI info_device_OpenPropertyStore(IMMDevice *iface, DWORD access, IPropertyStore **ppv)
const GUID IID_IBaseFilter
void MMDevEnum_Free(void)
static const WCHAR reg_render[]
static HRESULT WINAPI info_device_ps_GetValue(IPropertyStore *iface, REFPROPERTYKEY key, PROPVARIANT *pv)
#define IsEqualPropertyKey(a, b)
static ULONG WINAPI MMDevCol_AddRef(IMMDeviceCollection *iface)
static HRESULT WINAPI MMDevEnum_GetDefaultAudioEndpoint(IMMDeviceEnumerator *iface, EDataFlow flow, ERole role, IMMDevice **device)
struct IPropertyBagImpl IPropertyBagImpl
HRESULT MMDevEnum_Create(REFIID riid, void **ppv)
VOID WINAPI CoTaskMemFree(LPVOID ptr)
static HRESULT WINAPI MMDevPropStore_GetCount(IPropertyStore *iface, DWORD *nprops)
static CRITICAL_SECTION g_notif_lock
#define IDirectSound_Initialize(p, a)
static ULONG WINAPI MMDevPropStore_AddRef(IPropertyStore *iface)
static HRESULT WINAPI MMDevPropStore_QueryInterface(IPropertyStore *iface, REFIID riid, void **ppv)
#define ERROR_NO_MORE_ITEMS
#define IDirectSoundCapture_Release(p)
HRESULT WINAPI PropVariantClear(PROPVARIANT *pvar)
char * wine_dbgstr_w(const wchar_t *wstr)
static HRESULT set_driver_prop_value(GUID *id, const EDataFlow flow, const PROPERTYKEY *prop)
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
static HRESULT WINAPI MMDevEnum_RegisterEndpointNotificationCallback(IMMDeviceEnumerator *iface, IMMNotificationClient *client)
#define HKEY_CURRENT_USER
static const IPropertyStoreVtbl MMDevPropVtbl
IMMDevice IMMDevice_iface
static IPropertyBagImpl * impl_from_IPropertyBag(IPropertyBag *iface)
struct MMDevColImpl MMDevColImpl
static HRESULT WINAPI MMDevice_GetState(IMMDevice *iface, DWORD *state)
static void MMDevice_Destroy(MMDevice *This)
static HRESULT MMDevCol_Create(IMMDeviceCollection **ppv, EDataFlow flow, DWORD state)
static ULONG WINAPI MMDevice_Release(IMMDevice *iface)
DWORD WINAPI GetLastError(VOID)
struct tWAVEFORMATEX WAVEFORMATEX
static CRITICAL_SECTION_DEBUG g_notif_lock_debug
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
static void MMDevPropStore_Destroy(MMDevPropStore *This)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
static ULONG WINAPI info_device_Release(IMMDevice *iface)
static ULONG WINAPI MMDevCol_Release(IMMDeviceCollection *iface)
static void MMDevCol_Destroy(MMDevColImpl *This)
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)
static const IPropertyBagVtbl PB_Vtbl
struct MMDevPropStoreImpl MMDevPropStore
static ULONG WINAPI info_device_AddRef(IMMDevice *iface)
static HRESULT WINAPI MMEndpoint_GetDataFlow(IMMEndpoint *iface, EDataFlow *flow)
static ULONG WINAPI info_device_ps_Release(IPropertyStore *iface)
__WINE_SERVER_LIST_INLINE void list_add_tail(struct list *list, struct list *elem)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
static HRESULT WINAPI PB_Write(IPropertyBag *iface, LPCOLESTR name, VARIANT *var)
static ULONG WINAPI MMEndpoint_Release(IMMEndpoint *iface)
LONG WINAPI RegCloseKey(HKEY hKey)
static DWORD WINAPI notif_thread_proc(void *user)
static const WCHAR reg_out_nameW[]
static HRESULT MMDevPropStore_Create(MMDevice *This, DWORD access, IPropertyStore **ppv)
GLenum const GLfloat * params
static const IMMDeviceCollectionVtbl MMDevColVtbl
#define STG_E_ACCESSDENIED
static ULONG WINAPI PB_AddRef(IPropertyBag *iface)
static HRESULT load_devices_from_reg(void)
const GUID IID_IPersistPropertyBag
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
static IPropertyStore info_device_ps
enum _EDataFlow EDataFlow
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)
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)
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
#define REG_NOTIFY_CHANGE_LAST_SET
BSTR WINAPI SysAllocString(LPCOLESTR str)
static MMDevice * MMDevice_def_play
static HRESULT set_format(MMDevice *dev)
static MMDevice * impl_from_IMMDevice(IMMDevice *iface)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
static const WCHAR reg_properties[]
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
static MMDevice ** MMDevice_head
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
__WINE_SERVER_LIST_INLINE void list_remove(struct list *elem)
static MMDevice * MMDevice_def_rec
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
static HRESULT WINAPI MMDevPropStore_SetValue(IPropertyStore *iface, REFPROPERTYKEY key, REFPROPVARIANT pv)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
static HRESULT WINAPI MMDevPropStore_GetValue(IPropertyStore *iface, REFPROPERTYKEY key, PROPVARIANT *pv)
static void notify_clients(EDataFlow flow, ERole role, const WCHAR *id)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
static ULONG WINAPI MMDevEnum_Release(IMMDeviceEnumerator *iface)
static HRESULT WINAPI MMDevEnum_GetDevice(IMMDeviceEnumerator *iface, const WCHAR *name, IMMDevice **device)
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
#define IDirectSoundCapture_Initialize(p, a)
static HANDLE g_notif_thread
static HRESULT WINAPI MMDevEnum_EnumAudioEndpoints(IMMDeviceEnumerator *iface, EDataFlow flow, DWORD mask, IMMDeviceCollection **devices)
static HRESULT WINAPI PB_Read(IPropertyBag *iface, LPCOLESTR name, VARIANT *var, IErrorLog *log)
static HRESULT WINAPI MMDevice_QueryInterface(IMMDevice *iface, REFIID riid, void **ppv)
static MMDevice * impl_from_IMMEndpoint(IMMEndpoint *iface)
static HRESULT WINAPI MMDevPropStore_Commit(IPropertyStore *iface)
static const WCHAR reg_in_nameW[]
static const WCHAR reg_capture[]
static HRESULT WINAPI MMEndpoint_QueryInterface(IMMEndpoint *iface, REFIID riid, void **ppv)
static const IPropertyStoreVtbl info_device_ps_Vtbl
static HRESULT WINAPI MMDevCol_GetCount(IMMDeviceCollection *iface, UINT *numdevs)
#define InterlockedDecrement
static MMDevice * MMDevice_Create(WCHAR *name, GUID *id, EDataFlow flow, DWORD state, BOOL setdefault)
static HRESULT WINAPI MMDevice_GetId(IMMDevice *iface, WCHAR **itemid)
static const WCHAR propkey_formatW[]
#define memcpy(s1, s2, n)
static HRESULT MMDevice_GetPropValue(const GUID *devguid, DWORD flow, REFPROPERTYKEY key, PROPVARIANT *pv)
static HRESULT WINAPI MMDevCol_Item(IMMDeviceCollection *iface, UINT n, IMMDevice **dev)
static const IMMDeviceVtbl info_device_Vtbl
LIST_ENTRY ProcessLocksList
static const IMMDeviceEnumeratorVtbl MMDevEnumVtbl
static HRESULT WINAPI MMDevEnum_UnregisterEndpointNotificationCallback(IMMDeviceEnumerator *iface, IMMNotificationClient *client)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
static ULONG WINAPI MMDevPropStore_Release(IPropertyStore *iface)
PSSTDAPI typedef PROPERTYKEY * REFPROPERTYKEY
IMMDeviceEnumerator IMMDeviceEnumerator_iface
IMMNotificationClient * client
LONG WINAPI RegNotifyChangeKeyValue(HKEY hKey, BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL fAsynchronous)
IMMDeviceCollection IMMDeviceCollection_iface
HRESULT AudioEndpointVolume_Create(MMDevice *parent, IAudioEndpointVolumeEx **ppv)
#define InterlockedIncrement
#define IDirectSound_Release(p)
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
GLuint GLint GLboolean GLint GLenum access
IPropertyBag IPropertyBag_iface
static HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERTYKEY key, REFPROPVARIANT pv)
static const WCHAR reg_vout_nameW[]
static HRESULT WINAPI MMDevEnum_QueryInterface(IMMDeviceEnumerator *iface, REFIID riid, void **ppv)
static HRESULT WINAPI MMDevPropStore_GetAt(IPropertyStore *iface, DWORD prop, PROPERTYKEY *key)
static const WCHAR reg_devicestate[]
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
IPropertyStore IPropertyStore_iface
static const IMMDeviceVtbl MMDeviceVtbl
static ULONG WINAPI MMEndpoint_AddRef(IMMEndpoint *iface)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
static HRESULT WINAPI PB_QueryInterface(IPropertyBag *iface, REFIID riid, void **ppv)
static HRESULT WINAPI MMDevice_OpenPropertyStore(IMMDevice *iface, DWORD access, IPropertyStore **ppv)
static const WCHAR reg_vin_nameW[]
static HRESULT MMDevPropStore_OpenPropKey(const GUID *guid, DWORD flow, HKEY *propkey)
static BOOL notify_if_changed(EDataFlow flow, ERole role, HKEY key, const WCHAR *val_name, WCHAR *old_val, IMMDevice *def_dev)
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)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
static ULONG WINAPI MMDevEnum_AddRef(IMMDeviceEnumerator *iface)
GLuint GLuint GLsizei GLenum type
struct MMDevEnumImpl MMDevEnumImpl
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
static HRESULT load_driver_devices(EDataFlow flow)
static ULONG WINAPI PB_Release(IPropertyBag *iface)
static MMDevEnumImpl * MMDevEnumerator
static DWORD MMDevice_count
static ULONG WINAPI MMDevice_AddRef(IMMDevice *iface)
static MMDevColImpl * impl_from_IMMDeviceCollection(IMMDeviceCollection *iface)
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
void user(int argc, const char *argv[])
static const IMMEndpointVtbl MMEndpointVtbl
#define HeapFree(x, y, z)
static MMDevPropStore * impl_from_IPropertyStore(IPropertyStore *iface)
static MMDevEnumImpl * impl_from_IMMDeviceEnumerator(IMMDeviceEnumerator *iface)
#define IsEqualIID(riid1, riid2)
static struct list g_notif_clients
static HRESULT WINAPI MMDevCol_QueryInterface(IMMDeviceCollection *iface, REFIID riid, void **ppv)
static IMMDevice info_device
static ULONG WINAPI info_device_ps_AddRef(IPropertyStore *iface)
#define HKEY_LOCAL_MACHINE
#define RRF_RT_REG_BINARY
GLuint const GLchar * name
static const WCHAR slashW[]