diff options
Diffstat (limited to 'audio/out/ao_wasapi_utils.c')
-rw-r--r-- | audio/out/ao_wasapi_utils.c | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/audio/out/ao_wasapi_utils.c b/audio/out/ao_wasapi_utils.c index 2614872b91..f7ea7cfbb4 100644 --- a/audio/out/ao_wasapi_utils.c +++ b/audio/out/ao_wasapi_utils.c @@ -20,9 +20,17 @@ #include <math.h> #include <windows.h> -#include <mmsystem.h> +// Workaround for redefinition of some guids in mingw. ks.h has to be included +// before other ks*.h headers, but mingw fails then. +#ifdef __MINGW32__ #include <mmreg.h> #include <ksguid.h> +#else +#include <ks.h> +#include <ksguid.h> +#include <mmreg.h> +#endif +#include <mmsystem.h> #include <ksmedia.h> #include <avrt.h> #include <propsys.h> @@ -34,6 +42,40 @@ #include "osdep/strnlen.h" #include "ao_wasapi.h" +#ifdef _MSC_VER +// Define some GUIDs that are defined only in C++ interfaces. +DEFINE_GUID(KSDATAFORMAT_SPECIFIER_NONE, + 0xf6417d6, 0xc318, 0x11d0, 0xa4, 0x3f, + 0, 0xa0, 0xc9, 0x22, 0x31, 0x96); +DEFINE_GUID(CLSID_MMDeviceEnumerator, + 0xbcde0395, 0xe52f, 0x467c, 0x8e, 0x3d, + 0xc4, 0x57, 0x92, 0x91, 0x69, 0x2e); +DEFINE_GUID(IID_IAudioClient, + 0x1cb9ad4c, 0xdbfa, 0x4c32, 0xb1, 0x78, 0xc2, + 0xf5, 0x68, 0xa7, 0x03, 0xb2); +DEFINE_GUID(IID_IAudioClock, + 0xcd63314f, 0x3fba, 0x4a1b, 0x81, 0x2c, 0xef, 0x96, + 0x35, 0x87, 0x28, 0xe7); +DEFINE_GUID(IID_IAudioEndpointVolume, + 0x5cdf2c82, 0x841e, 0x4546, 0x97, 0x22, + 0x0c, 0xf7, 0x40, 0x78, 0x22, 0x9a); +DEFINE_GUID(IID_IAudioRenderClient, + 0xf294acfc, 0x3146, 0x4483, 0xa7, 0xbf, + 0xad, 0xdc, 0xa7, 0xc2, 0x60, 0xe2); +DEFINE_GUID(IID_IAudioSessionControl, + 0xf4b1a599, 0x7266, 0x4319, 0xa8, 0xca, + 0xe7, 0x0a, 0xcb, 0x11, 0xe8, 0xcd); +DEFINE_GUID(IID_IMMDeviceEnumerator, + 0xa95664d2, 0x9614, 0x4f35, 0xa7, 0x46, + 0xde, 0x8d, 0xb6, 0x36, 0x17, 0xe6); +DEFINE_GUID(IID_IMMNotificationClient, + 0x7991eec9, 0x7e89, 0x4d85, 0x83, 0x90, + 0x6c, 0x70, 0x3c, 0xec, 0x60, 0xc0); +DEFINE_GUID(IID_ISimpleAudioVolume, + 0x87ce5498, 0x68d6, 0x44e5, 0x92, 0x15, + 0x6d, 0xa4, 0x7e, 0xf8, 0x83, 0xd8); +#endif + #ifndef KSDATAFORMAT_SUBTYPE_IEC61937_DTS DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEC61937_DTS, WAVE_FORMAT_DTS, 0x0000, 0x0010, 0x80, 0x00, @@ -611,7 +653,7 @@ static void init_volume_control(struct wasapi_state *state) MP_DBG(state, "Activating pEndpointVolume interface\n"); hr = IMMDeviceActivator_Activate(state->pDevice, &IID_IAudioEndpointVolume, - CLSCTX_ALL, NULL, + CLSCTX_INPROC_SERVER, NULL, (void **)&state->pEndpointVolume); EXIT_ON_ERROR(hr); @@ -803,7 +845,7 @@ static struct enumerator *create_enumerator(struct mp_log *log) struct enumerator *e = talloc_zero(NULL, struct enumerator); e->log = log; HRESULT hr = CoCreateInstance( - &CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, &IID_IMMDeviceEnumerator, + &CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void **)&e->pEnumerator); EXIT_ON_ERROR(hr); @@ -871,7 +913,7 @@ static bool load_device(struct mp_log *l, IMMDevice **ppDevice, LPWSTR deviceID) { IMMDeviceEnumerator *pEnumerator = NULL; - HRESULT hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, + HRESULT hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void **)&pEnumerator); EXIT_ON_ERROR(hr); @@ -985,7 +1027,7 @@ retry: MP_DBG(ao, "Activating pAudioClient interface\n"); hr = IMMDeviceActivator_Activate(state->pDevice, &IID_IAudioClient, - CLSCTX_ALL, NULL, + CLSCTX_INPROC_SERVER, NULL, (void **)&state->pAudioClient); if (FAILED(hr)) { MP_FATAL(ao, "Error activating device: %s\n", |