summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorKevin Mitchell <kevmitch@gmail.com>2015-12-18 20:45:51 -0800
committerKevin Mitchell <kevmitch@gmail.com>2015-12-20 03:30:28 -0800
commitaa5f04c7a0b1f809f47a3aef48654a9b8788e8cb (patch)
tree800eafbec68f58ce9942e110b9e430a4c61d7fa0 /audio
parente15526153e9f0cfa30144e33c6a13b527205fbbf (diff)
downloadmpv-aa5f04c7a0b1f809f47a3aef48654a9b8788e8cb.tar.bz2
mpv-aa5f04c7a0b1f809f47a3aef48654a9b8788e8cb.tar.xz
ao_wasapi: split exclusive/shared specific ao controls
this avoids having to check if we're exclusive or shared for every control
Diffstat (limited to 'audio')
-rw-r--r--audio/out/ao_wasapi.c97
1 files changed, 60 insertions, 37 deletions
diff --git a/audio/out/ao_wasapi.c b/audio/out/ao_wasapi.c
index 2edbdf5ef0..5b4cb20335 100644
--- a/audio/out/ao_wasapi.c
+++ b/audio/out/ao_wasapi.c
@@ -290,55 +290,78 @@ static int control(struct ao *ao, enum aocontrol cmd, void *arg)
ao_control_vol_t *vol = arg;
BOOL mute;
- switch (cmd) {
- case AOCONTROL_GET_VOLUME:
- if (state->opt_exclusive)
+ if (state->opt_exclusive) {
+ // exclusive-specific
+ switch (cmd) {
+ case AOCONTROL_GET_VOLUME:
IAudioEndpointVolume_GetMasterVolumeLevelScalar(state->pEndpointVolumeProxy,
&state->audio_volume);
- else
+ /* check to see if user manually changed volume through mixer;
+ this information is used in exclusive mode for restoring the mixer volume on uninit */
+ if (state->audio_volume != state->previous_volume) {
+ MP_VERBOSE(state, "Mixer difference: %.2g now, expected %.2g\n",
+ state->audio_volume, state->previous_volume);
+ state->initial_volume = state->audio_volume;
+ }
+
+ vol->left = vol->right = 100.0f * state->audio_volume;
+ return CONTROL_OK;
+ case AOCONTROL_SET_VOLUME:
+ state->audio_volume = vol->left / 100.f;
+ IAudioEndpointVolume_SetMasterVolumeLevelScalar(state->pEndpointVolumeProxy,
+ state->audio_volume, NULL);
+ state->previous_volume = state->audio_volume;
+ 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;
+ case AOCONTROL_HAS_PER_APP_VOLUME:
+ return CONTROL_FALSE;
+ }
+ } else {
+ // shared-specific
+ switch (cmd) {
+ case AOCONTROL_GET_VOLUME:
ISimpleAudioVolume_GetMasterVolume(state->pAudioVolumeProxy,
&state->audio_volume);
- /* check to see if user manually changed volume through mixer;
- this information is used in exclusive mode for restoring the mixer volume on uninit */
- if (state->audio_volume != state->previous_volume) {
- MP_VERBOSE(state, "Mixer difference: %.2g now, expected %.2g\n",
- state->audio_volume, state->previous_volume);
- state->initial_volume = state->audio_volume;
- }
+ /* check to see if user manually changed volume through mixer;
+ this information is used in exclusive mode for restoring the mixer volume on uninit */
+ if (state->audio_volume != state->previous_volume) {
+ MP_VERBOSE(state, "Mixer difference: %.2g now, expected %.2g\n",
+ state->audio_volume, state->previous_volume);
+ state->initial_volume = state->audio_volume;
+ }
- vol->left = vol->right = 100.0f * state->audio_volume;
- return CONTROL_OK;
- case AOCONTROL_SET_VOLUME:
- state->audio_volume = vol->left / 100.f;
- if (state->opt_exclusive)
- IAudioEndpointVolume_SetMasterVolumeLevelScalar(state->pEndpointVolumeProxy,
- state->audio_volume, NULL);
- else
+ vol->left = vol->right = 100.0f * state->audio_volume;
+ return CONTROL_OK;
+ case AOCONTROL_SET_VOLUME:
+ state->audio_volume = vol->left / 100.f;
ISimpleAudioVolume_SetMasterVolume(state->pAudioVolumeProxy,
state->audio_volume, NULL);
- state->previous_volume = state->audio_volume;
- return CONTROL_OK;
- case AOCONTROL_GET_MUTE:
- if (state->opt_exclusive)
- IAudioEndpointVolume_GetMute(state->pEndpointVolumeProxy, &mute);
- else
+ state->previous_volume = state->audio_volume;
+ return CONTROL_OK;
+ case AOCONTROL_GET_MUTE:
ISimpleAudioVolume_GetMute(state->pAudioVolumeProxy, &mute);
- *(bool*)arg = mute;
-
- return CONTROL_OK;
- case AOCONTROL_SET_MUTE:
- mute = *(bool*)arg;
- if (state->opt_exclusive)
- IAudioEndpointVolume_SetMute(state->pEndpointVolumeProxy, mute, NULL);
- else
+ *(bool*)arg = mute;
+ return CONTROL_OK;
+ case AOCONTROL_SET_MUTE:
+ mute = *(bool*)arg;
ISimpleAudioVolume_SetMute(state->pAudioVolumeProxy, mute, NULL);
+ return CONTROL_OK;
+ case AOCONTROL_HAS_PER_APP_VOLUME:
+ return CONTROL_TRUE;
+ }
+ }
- return CONTROL_OK;
- case AOCONTROL_HAS_PER_APP_VOLUME:
- return state->share_mode == AUDCLNT_SHAREMODE_SHARED ?
- CONTROL_TRUE : CONTROL_FALSE;
+ // common to exclusive and shared
+ switch (cmd) {
case AOCONTROL_UPDATE_STREAM_TITLE: {
MP_VERBOSE(state, "Updating stream title to \"%s\"\n", (char*)arg);
wchar_t *title = mp_from_utf8(NULL, (char*)arg);