[vlc-commits] mmdevice: keep ISimpleAudioVolume interface
Rémi Denis-Courmont
git at videolan.org
Fri Dec 7 17:26:20 CET 2012
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri Dec 7 18:17:24 2012 +0200| [cf189e0ef9bd63bff6dfade92ac99c1b5d865537] | committer: Rémi Denis-Courmont
mmdevice: keep ISimpleAudioVolume interface
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cf189e0ef9bd63bff6dfade92ac99c1b5d865537
---
modules/audio_output/mmdevice.c | 57 +++++++++++++++++----------------------
1 file changed, 24 insertions(+), 33 deletions(-)
diff --git a/modules/audio_output/mmdevice.c b/modules/audio_output/mmdevice.c
index 8368a67..b4142a8 100644
--- a/modules/audio_output/mmdevice.c
+++ b/modules/audio_output/mmdevice.c
@@ -80,6 +80,7 @@ struct aout_sys_t
IMMDevice *dev; /**< Selected output device, NULL if none */
IAudioSessionManager *manager; /**< Session for the output device */
struct IAudioSessionEvents session_events;
+ ISimpleAudioVolume *volume; /**< Volume setter */
LONG refs;
HANDLE device_changed; /**< Event to reset thread */
@@ -165,59 +166,36 @@ static void Flush(audio_output_t *aout, bool wait)
}
-static ISimpleAudioVolume *GetSimpleVolume(audio_output_t *aout)
-{
- aout_sys_t *sys = aout->sys;
- ISimpleAudioVolume *volume;
- HRESULT hr;
-
- if (sys->manager == NULL)
- return NULL;
-
- if (TryEnterMTA(aout))
- return NULL;
- hr = IAudioSessionManager_GetSimpleAudioVolume(sys->manager,
- &GUID_VLC_AUD_OUT,
- FALSE, &volume);
- if (FAILED(hr))
- {
- LeaveMTA();
- msg_Err(aout, "cannot get simple volume (error 0x%lx)", hr);
- assert(volume == NULL);
- }
- return volume;
-}
-
-static void PutSimpleVolume(ISimpleAudioVolume *volume)
-{
- ISimpleAudioVolume_Release(volume);
- LeaveMTA();
-}
-
static int VolumeSet(audio_output_t *aout, float vol)
{
- ISimpleAudioVolume *volume = GetSimpleVolume(aout);
+ ISimpleAudioVolume *volume = aout->sys->volume;
if (volume == NULL)
return -1;
+ if (TryEnterMTA(aout))
+ return -1;
+
HRESULT hr = ISimpleAudioVolume_SetMasterVolume(volume, vol, NULL);
if (FAILED(hr))
msg_Err(aout, "cannot set volume (error 0x%lx)", hr);
- PutSimpleVolume(volume);
+ LeaveMTA();
return FAILED(hr) ? -1 : 0;
}
static int MuteSet(audio_output_t *aout, bool mute)
{
- ISimpleAudioVolume *volume = GetSimpleVolume(aout);
+ ISimpleAudioVolume *volume = aout->sys->volume;
if (volume == NULL)
return -1;
+ if (TryEnterMTA(aout))
+ return -1;
+
HRESULT hr = ISimpleAudioVolume_SetMute(volume, mute ? TRUE : FALSE, NULL);
if (FAILED(hr))
msg_Err(aout, "cannot set volume (error 0x%lx)", hr);
- PutSimpleVolume(volume);
+ LeaveMTA();
return FAILED(hr) ? -1 : 0;
}
@@ -498,6 +476,12 @@ static void MMSession(audio_output_t *aout, aout_sys_t *sys)
/* Register session control */
if (sys->manager != NULL)
{
+ hr = IAudioSessionManager_GetSimpleAudioVolume(sys->manager,
+ &GUID_VLC_AUD_OUT,
+ FALSE, &sys->volume);
+ if (FAILED(hr))
+ msg_Err(aout, "cannot get simple volume (error 0x%lx)", hr);
+
hr = IAudioSessionManager_GetAudioSessionControl(sys->manager,
&GUID_VLC_AUD_OUT, 0,
&control);
@@ -505,7 +489,10 @@ static void MMSession(audio_output_t *aout, aout_sys_t *sys)
msg_Err(aout, "cannot get session control (error 0x%lx)", hr);
}
else
+ {
+ sys->volume = NULL;
control = NULL;
+ }
if (control != NULL)
{
@@ -518,6 +505,7 @@ static void MMSession(audio_output_t *aout, aout_sys_t *sys)
}
SetEvent(sys->device_ready);
+ /* Wait until device change or exit */
WaitForSingleObject(sys->device_changed, INFINITE);
/* Deregister session control */
@@ -527,6 +515,9 @@ static void MMSession(audio_output_t *aout, aout_sys_t *sys)
&sys->session_events);
IAudioSessionControl_Release(control);
}
+
+ if (sys->volume != NULL)
+ ISimpleAudioVolume_Release(sys->volume);
}
/** MMDevice audio output thread.
More information about the vlc-commits
mailing list