1 /* 2 * Copyright 2009 Maarten Lankhorst 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 17 */ 18 19 #ifndef _MMDEVAPI_H_ 20 #define _MMDEVAPI_H_ 21 22 #include <wine/config.h> 23 #include <wine/port.h> 24 25 #include <stdarg.h> 26 27 #define WIN32_NO_STATUS 28 #define _INC_WINDOWS 29 #define COM_NO_WINDOWS_H 30 31 #define COBJMACROS 32 #define NONAMELESSUNION 33 34 #include <windef.h> 35 #include <winbase.h> 36 #include <wingdi.h> 37 #include <winreg.h> 38 #include <objbase.h> 39 #include <audiopolicy.h> 40 #include <endpointvolume.h> 41 #include <mmdeviceapi.h> 42 43 #include <wine/debug.h> 44 #include <wine/unicode.h> 45 46 WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi); 47 48 extern HRESULT MMDevEnum_Create(REFIID riid, void **ppv) DECLSPEC_HIDDEN; 49 extern void MMDevEnum_Free(void) DECLSPEC_HIDDEN; 50 51 52 /* Changes to this enum must be synced in drivers. */ 53 enum _DriverPriority { 54 Priority_Unavailable = 0, /* driver won't work */ 55 Priority_Low, /* driver may work, but unlikely */ 56 Priority_Neutral, /* driver makes no judgment */ 57 Priority_Preferred /* driver thinks it's correct */ 58 }; 59 60 typedef struct _DriverFuncs { 61 HMODULE module; 62 WCHAR module_name[64]; 63 int priority; 64 65 /* Returns a "priority" value for the driver. Highest priority wins. 66 * If multiple drivers think they are valid, they will return a 67 * priority value reflecting the likelihood that they are actually 68 * valid. See enum _DriverPriority. */ 69 int (WINAPI *pGetPriority)(void); 70 71 /* ids gets an array of human-friendly endpoint names 72 * keys gets an array of driver-specific stuff that is used 73 * in GetAudioEndpoint to identify the endpoint 74 * it is the caller's responsibility to free both arrays, and 75 * all of the elements in both arrays with HeapFree() */ 76 HRESULT (WINAPI *pGetEndpointIDs)(EDataFlow flow, WCHAR ***ids, 77 GUID **guids, UINT *num, UINT *default_index); 78 HRESULT (WINAPI *pGetAudioEndpoint)(void *key, IMMDevice *dev, 79 IAudioClient **out); 80 HRESULT (WINAPI *pGetAudioSessionManager)(IMMDevice *device, 81 IAudioSessionManager2 **out); 82 HRESULT (WINAPI *pGetPropValue)(GUID *guid, 83 const PROPERTYKEY *prop, PROPVARIANT *out); 84 } DriverFuncs; 85 86 extern DriverFuncs drvs DECLSPEC_HIDDEN; 87 88 typedef struct MMDevice { 89 IMMDevice IMMDevice_iface; 90 IMMEndpoint IMMEndpoint_iface; 91 LONG ref; 92 93 CRITICAL_SECTION crst; 94 95 EDataFlow flow; 96 DWORD state; 97 GUID devguid; 98 WCHAR *drv_id; 99 } MMDevice; 100 101 extern HRESULT AudioClient_Create(MMDevice *parent, IAudioClient **ppv) DECLSPEC_HIDDEN; 102 extern HRESULT AudioEndpointVolume_Create(MMDevice *parent, IAudioEndpointVolumeEx **ppv) DECLSPEC_HIDDEN; 103 104 extern const WCHAR drv_keyW[] DECLSPEC_HIDDEN; 105 106 #endif /* _MMDEVAPI_H_ */ 107