diff options
author | Kevin Mitchell <kevmitch@gmail.com> | 2015-12-18 21:45:04 -0800 |
---|---|---|
committer | Kevin Mitchell <kevmitch@gmail.com> | 2015-12-20 03:30:28 -0800 |
commit | 821e8fb9d04c593a041fae10876db9ffb1fe2ce2 (patch) | |
tree | 41790f7626de7cd3f7a0d84715292d0221fd3904 | |
parent | 4b81398b4e1d66fece109aaa1d5a7422462ceee5 (diff) |
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.
-rw-r--r-- | audio/out/ao_wasapi.c | 46 | ||||
-rwxr-xr-x | audio/out/ao_wasapi_utils.c | 1 |
2 files changed, 30 insertions, 17 deletions
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"); |