summaryrefslogtreecommitdiffstats
path: root/audio/out/ao_wasapi_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/out/ao_wasapi_utils.c')
-rw-r--r--audio/out/ao_wasapi_utils.c52
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",