From 821e8fb9d04c593a041fae10876db9ffb1fe2ce2 Mon Sep 17 00:00:00 2001 From: Kevin Mitchell Date: Fri, 18 Dec 2015 21:45:04 -0800 Subject: ao_wasapi: actually use hw volume support information for exclusive mode Do not try and set/get master volume in exclusive if there is no hardware support. This would just uselessly change the master slider, but have no effect on the actual volume. Furthermore if getting hardware volume support information fails, then assume it has none. --- audio/out/ao_wasapi.c | 46 ++++++++++++++++++++++++++++----------------- audio/out/ao_wasapi_utils.c | 1 + 2 files changed, 30 insertions(+), 17 deletions(-) (limited to 'audio') diff --git a/audio/out/ao_wasapi.c b/audio/out/ao_wasapi.c index 2fc3c0a9a7..f819f1fcbd 100644 --- a/audio/out/ao_wasapi.c +++ b/audio/out/ao_wasapi.c @@ -294,26 +294,38 @@ static int control(struct ao *ao, enum aocontrol cmd, void *arg) // exclusive-specific switch (cmd) { case AOCONTROL_GET_VOLUME: - IAudioEndpointVolume_GetMasterVolumeLevelScalar(state->pEndpointVolumeProxy, - &volume); - *(ao_control_vol_t *)arg = (ao_control_vol_t){ - .left = 100.0f * volume, - .right = 100.0f * volume, - }; - return CONTROL_OK; case AOCONTROL_SET_VOLUME: - volume = ((ao_control_vol_t *)arg)->left / 100.f; - IAudioEndpointVolume_SetMasterVolumeLevelScalar(state->pEndpointVolumeProxy, - volume, NULL); - return CONTROL_OK; + if (!(state->vol_hw_support & ENDPOINT_HARDWARE_SUPPORT_VOLUME)) + return CONTROL_FALSE; + switch (cmd) { + case AOCONTROL_GET_VOLUME: + IAudioEndpointVolume_GetMasterVolumeLevelScalar(state->pEndpointVolumeProxy, + &volume); + *(ao_control_vol_t *)arg = (ao_control_vol_t){ + .left = 100.0f * volume, + .right = 100.0f * volume, + }; + return CONTROL_OK; + case AOCONTROL_SET_VOLUME: + volume = ((ao_control_vol_t *)arg)->left / 100.f; + IAudioEndpointVolume_SetMasterVolumeLevelScalar(state->pEndpointVolumeProxy, + volume, NULL); + return CONTROL_OK; + } case AOCONTROL_GET_MUTE: - IAudioEndpointVolume_GetMute(state->pEndpointVolumeProxy, &mute); - *(bool *)arg = mute; - return CONTROL_OK; case AOCONTROL_SET_MUTE: - mute = *(bool *)arg; - IAudioEndpointVolume_SetMute(state->pEndpointVolumeProxy, mute, NULL); - return CONTROL_OK; + if (!(state->vol_hw_support & ENDPOINT_HARDWARE_SUPPORT_MUTE)) + return CONTROL_FALSE; + switch (cmd) { + case AOCONTROL_GET_MUTE: + IAudioEndpointVolume_GetMute(state->pEndpointVolumeProxy, &mute); + *(bool *)arg = mute; + return CONTROL_OK; + case AOCONTROL_SET_MUTE: + mute = *(bool *)arg; + IAudioEndpointVolume_SetMute(state->pEndpointVolumeProxy, mute, NULL); + return CONTROL_OK; + } case AOCONTROL_HAS_PER_APP_VOLUME: return CONTROL_FALSE; } diff --git a/audio/out/ao_wasapi_utils.c b/audio/out/ao_wasapi_utils.c index 20729b2348..0dc78cfe35 100755 --- a/audio/out/ao_wasapi_utils.c +++ b/audio/out/ao_wasapi_utils.c @@ -1096,6 +1096,7 @@ retry: ; if (hr != S_OK) { MP_WARN(ao, "Error querying hardware volume control: %s\n", mp_HRESULT_to_str(hr)); + state->vol_hw_support = 0; } MP_DBG(ao, "Probing formats\n"); -- cgit v1.2.3