summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Mitchell <kevmitch@gmail.com>2015-12-18 21:45:04 -0800
committerKevin Mitchell <kevmitch@gmail.com>2015-12-20 03:30:28 -0800
commit821e8fb9d04c593a041fae10876db9ffb1fe2ce2 (patch)
tree41790f7626de7cd3f7a0d84715292d0221fd3904
parent4b81398b4e1d66fece109aaa1d5a7422462ceee5 (diff)
downloadmpv-821e8fb9d04c593a041fae10876db9ffb1fe2ce2.tar.bz2
mpv-821e8fb9d04c593a041fae10876db9ffb1fe2ce2.tar.xz
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.c46
-rwxr-xr-xaudio/out/ao_wasapi_utils.c1
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");