2015-10-21 16:29:00 -07:00
|
|
|
#include "OVR_CAPI_Audio.h"
|
|
|
|
|
|
2015-10-21 16:29:00 -07:00
|
|
|
#include <Windows.h>
|
2015-10-21 16:29:00 -07:00
|
|
|
#include <Mmddk.h>
|
2015-10-21 16:29:00 -07:00
|
|
|
#include <Mmdeviceapi.h>
|
2016-09-25 22:21:13 +02:00
|
|
|
#include <DSound.h>
|
2015-10-21 16:29:00 -07:00
|
|
|
|
2016-09-24 13:22:26 +02:00
|
|
|
#include "Assert.h"
|
2015-10-21 16:29:00 -07:00
|
|
|
|
2015-10-21 16:29:00 -07:00
|
|
|
OVR_PUBLIC_FUNCTION(ovrResult) ovr_GetAudioDeviceOutWaveId(UINT* deviceOutId)
|
|
|
|
|
{
|
2016-08-20 02:10:39 +02:00
|
|
|
REV_TRACE(ovr_GetAudioDeviceOutWaveId);
|
|
|
|
|
|
2016-04-27 15:44:47 +00:00
|
|
|
if (!deviceOutId)
|
|
|
|
|
return ovrError_InvalidParameter;
|
|
|
|
|
|
2017-08-22 22:07:17 +02:00
|
|
|
// Query and cache the result
|
|
|
|
|
static UINT cachedId = 0;
|
|
|
|
|
if (!cachedId)
|
|
|
|
|
{
|
2016-09-24 13:29:39 +02:00
|
|
|
#pragma warning( disable : 4312 )
|
2017-08-22 22:07:17 +02:00
|
|
|
if (waveOutMessage((HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&cachedId, NULL) != 0)
|
|
|
|
|
return ovrError_AudioDeviceNotFound;
|
2016-09-24 13:29:39 +02:00
|
|
|
#pragma warning( default : 4312 )
|
2017-08-22 22:07:17 +02:00
|
|
|
}
|
2016-04-27 15:44:47 +00:00
|
|
|
|
2017-08-22 22:07:17 +02:00
|
|
|
*deviceOutId = cachedId;
|
2015-10-21 16:29:00 -07:00
|
|
|
return ovrSuccess;
|
|
|
|
|
}
|
2015-10-21 16:29:00 -07:00
|
|
|
|
2015-10-21 16:29:00 -07:00
|
|
|
OVR_PUBLIC_FUNCTION(ovrResult) ovr_GetAudioDeviceInWaveId(UINT* deviceInId)
|
|
|
|
|
{
|
2016-08-20 02:10:39 +02:00
|
|
|
REV_TRACE(ovr_GetAudioDeviceInWaveId);
|
|
|
|
|
|
2016-04-27 15:44:47 +00:00
|
|
|
if (!deviceInId)
|
|
|
|
|
return ovrError_InvalidParameter;
|
|
|
|
|
|
2017-08-22 22:07:17 +02:00
|
|
|
// Query and cache the result
|
|
|
|
|
static UINT cachedId = 0;
|
|
|
|
|
if (!cachedId)
|
|
|
|
|
{
|
2016-09-24 13:29:39 +02:00
|
|
|
#pragma warning( disable : 4312 )
|
2017-08-22 22:07:17 +02:00
|
|
|
if (waveInMessage((HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&cachedId, NULL) != 0)
|
|
|
|
|
return ovrError_AudioDeviceNotFound;
|
2016-09-24 13:29:39 +02:00
|
|
|
#pragma warning( default : 4312 )
|
2017-08-22 22:07:17 +02:00
|
|
|
}
|
2016-04-27 15:44:47 +00:00
|
|
|
|
2017-08-22 22:07:17 +02:00
|
|
|
*deviceInId = cachedId;
|
2015-10-21 16:29:00 -07:00
|
|
|
return ovrSuccess;
|
|
|
|
|
}
|
2015-10-21 16:29:00 -07:00
|
|
|
|
2015-10-21 16:29:00 -07:00
|
|
|
OVR_PUBLIC_FUNCTION(ovrResult) ovr_GetAudioDeviceOutGuidStr(WCHAR deviceOutStrBuffer[OVR_AUDIO_MAX_DEVICE_STR_SIZE])
|
|
|
|
|
{
|
2016-08-20 02:10:39 +02:00
|
|
|
REV_TRACE(ovr_GetAudioDeviceOutGuidStr);
|
|
|
|
|
|
2016-05-27 13:59:42 +00:00
|
|
|
if (!deviceOutStrBuffer)
|
|
|
|
|
return ovrError_InvalidParameter;
|
|
|
|
|
|
2017-08-22 22:07:17 +02:00
|
|
|
// Query and cache the result
|
|
|
|
|
static WCHAR cachedBuffer[OVR_AUDIO_MAX_DEVICE_STR_SIZE] = {};
|
|
|
|
|
if (wcslen(cachedBuffer) == 0)
|
|
|
|
|
{
|
|
|
|
|
HRESULT com = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
|
|
|
|
|
|
|
|
|
IMMDeviceEnumerator* pEnumerator;
|
|
|
|
|
const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
|
|
|
|
|
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
|
|
|
|
|
HRESULT hr = CoCreateInstance(
|
|
|
|
|
CLSID_MMDeviceEnumerator, NULL,
|
|
|
|
|
CLSCTX_ALL, IID_IMMDeviceEnumerator,
|
|
|
|
|
(void**)&pEnumerator);
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
return ovrError_AudioComError;
|
|
|
|
|
|
|
|
|
|
IMMDevice* pDevice;
|
|
|
|
|
hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
return ovrError_AudioDeviceNotFound;
|
|
|
|
|
|
|
|
|
|
LPWSTR pGuid;
|
|
|
|
|
hr = pDevice->GetId(&pGuid);
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
return ovrError_AudioComError;
|
|
|
|
|
|
|
|
|
|
wcsncpy(cachedBuffer, pGuid, OVR_AUDIO_MAX_DEVICE_STR_SIZE);
|
|
|
|
|
|
|
|
|
|
// Cleanup
|
|
|
|
|
pDevice->Release();
|
|
|
|
|
pEnumerator->Release();
|
|
|
|
|
if (SUCCEEDED(com))
|
|
|
|
|
CoUninitialize();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wcsncpy(deviceOutStrBuffer, cachedBuffer, OVR_AUDIO_MAX_DEVICE_STR_SIZE);
|
2015-10-21 16:29:00 -07:00
|
|
|
return ovrSuccess;
|
|
|
|
|
}
|
2015-10-21 16:29:00 -07:00
|
|
|
|
2015-10-21 16:29:00 -07:00
|
|
|
OVR_PUBLIC_FUNCTION(ovrResult) ovr_GetAudioDeviceOutGuid(GUID* deviceOutGuid)
|
|
|
|
|
{
|
2016-08-20 02:10:39 +02:00
|
|
|
REV_TRACE(ovr_GetAudioDeviceOutGuid);
|
|
|
|
|
|
2016-05-27 13:59:42 +00:00
|
|
|
if (!deviceOutGuid)
|
|
|
|
|
return ovrError_InvalidParameter;
|
|
|
|
|
|
2017-08-22 22:07:17 +02:00
|
|
|
// Query and cache the result
|
|
|
|
|
static GUID cachedGuid = GUID_NULL;
|
|
|
|
|
if (cachedGuid == GUID_NULL)
|
|
|
|
|
{
|
|
|
|
|
HRESULT hr = GetDeviceID(&DSDEVID_DefaultPlayback, &cachedGuid);
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
return ovrError_AudioDeviceNotFound;
|
|
|
|
|
}
|
2016-04-27 15:44:47 +00:00
|
|
|
|
2017-08-22 22:07:17 +02:00
|
|
|
*deviceOutGuid = cachedGuid;
|
2015-10-21 16:29:00 -07:00
|
|
|
return ovrSuccess;
|
|
|
|
|
}
|
2015-10-21 16:29:00 -07:00
|
|
|
|
2015-10-21 16:29:00 -07:00
|
|
|
OVR_PUBLIC_FUNCTION(ovrResult) ovr_GetAudioDeviceInGuidStr(WCHAR deviceInStrBuffer[OVR_AUDIO_MAX_DEVICE_STR_SIZE])
|
|
|
|
|
{
|
2016-08-20 02:10:39 +02:00
|
|
|
REV_TRACE(ovr_GetAudioDeviceInGuidStr);
|
|
|
|
|
|
2016-05-27 13:59:42 +00:00
|
|
|
if (!deviceInStrBuffer)
|
|
|
|
|
return ovrError_InvalidParameter;
|
|
|
|
|
|
2017-08-22 22:07:17 +02:00
|
|
|
// Query and cache the result
|
|
|
|
|
static WCHAR cachedBuffer[OVR_AUDIO_MAX_DEVICE_STR_SIZE] = {};
|
2017-08-31 19:59:56 +02:00
|
|
|
if (wcslen(cachedBuffer) == 0)
|
2017-08-22 22:07:17 +02:00
|
|
|
{
|
|
|
|
|
HRESULT com = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
|
|
|
|
|
|
|
|
|
IMMDeviceEnumerator* pEnumerator;
|
|
|
|
|
const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
|
|
|
|
|
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
|
|
|
|
|
HRESULT hr = CoCreateInstance(
|
|
|
|
|
CLSID_MMDeviceEnumerator, NULL,
|
|
|
|
|
CLSCTX_ALL, IID_IMMDeviceEnumerator,
|
|
|
|
|
(void**)&pEnumerator);
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
return ovrError_AudioComError;
|
|
|
|
|
|
|
|
|
|
IMMDevice* pDevice;
|
|
|
|
|
hr = pEnumerator->GetDefaultAudioEndpoint(eCapture, eConsole, &pDevice);
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
return ovrError_AudioDeviceNotFound;
|
|
|
|
|
|
|
|
|
|
LPWSTR pGuid;
|
|
|
|
|
hr = pDevice->GetId(&pGuid);
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
return ovrError_AudioComError;
|
|
|
|
|
|
|
|
|
|
wcsncpy(cachedBuffer, pGuid, OVR_AUDIO_MAX_DEVICE_STR_SIZE);
|
|
|
|
|
|
|
|
|
|
// Cleanup
|
|
|
|
|
pDevice->Release();
|
|
|
|
|
pEnumerator->Release();
|
|
|
|
|
if (SUCCEEDED(com))
|
|
|
|
|
CoUninitialize();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wcsncpy(deviceInStrBuffer, cachedBuffer, OVR_AUDIO_MAX_DEVICE_STR_SIZE);
|
2015-10-21 16:29:00 -07:00
|
|
|
return ovrSuccess;
|
|
|
|
|
}
|
2015-10-21 16:29:00 -07:00
|
|
|
|
2015-10-21 16:29:00 -07:00
|
|
|
OVR_PUBLIC_FUNCTION(ovrResult) ovr_GetAudioDeviceInGuid(GUID* deviceInGuid)
|
|
|
|
|
{
|
2016-08-20 02:10:39 +02:00
|
|
|
REV_TRACE(ovr_GetAudioDeviceInGuid);
|
|
|
|
|
|
2016-05-27 13:59:42 +00:00
|
|
|
if (!deviceInGuid)
|
|
|
|
|
return ovrError_InvalidParameter;
|
|
|
|
|
|
2017-08-22 22:07:17 +02:00
|
|
|
// Query and cache the result
|
|
|
|
|
static GUID cachedGuid = GUID_NULL;
|
|
|
|
|
if (cachedGuid == GUID_NULL)
|
|
|
|
|
{
|
|
|
|
|
HRESULT hr = GetDeviceID(&DSDEVID_DefaultCapture, &cachedGuid);
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
return ovrError_AudioDeviceNotFound;
|
|
|
|
|
}
|
2016-04-27 15:44:47 +00:00
|
|
|
|
2017-08-22 22:07:17 +02:00
|
|
|
*deviceInGuid = cachedGuid;
|
2015-10-21 16:29:00 -07:00
|
|
|
return ovrSuccess;
|
|
|
|
|
}
|