[vlc-commits] mmdevice: simplify volume & mute handling
Rémi Denis-Courmont
git at videolan.org
Tue Dec 4 21:15:58 CET 2012
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Dec 4 22:09:52 2012 +0200| [4f42f23600802c7d84c1a1e0a4a330f5cd8bc239] | committer: Rémi Denis-Courmont
mmdevice: simplify volume & mute handling
Apparently, there is no need for COM to do that.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4f42f23600802c7d84c1a1e0a4a330f5cd8bc239
---
modules/audio_output/mmdevice.c | 75 ++++++++++++++++++---------------------
1 file changed, 34 insertions(+), 41 deletions(-)
diff --git a/modules/audio_output/mmdevice.c b/modules/audio_output/mmdevice.c
index 90735ff..967988a 100644
--- a/modules/audio_output/mmdevice.c
+++ b/modules/audio_output/mmdevice.c
@@ -87,8 +87,6 @@ struct aout_sys_t
bool killed; /**< Flag to terminate the thread */
bool running; /**< Whether the thread is running */
- int8_t mute; /**< Requested mute state or negative value */
- float volume; /**< Requested volume or negative value */
};
static int vlc_FromHR(audio_output_t *aout, HRESULT hr)
@@ -138,24 +136,50 @@ static void Flush(audio_output_t *aout, bool wait)
static int VolumeSet(audio_output_t *aout, float vol)
{
aout_sys_t *sys = aout->sys;
+ ISimpleAudioVolume *volume;
+ HRESULT hr;
- EnterCriticalSection(&sys->lock);
- sys->volume = vol;
- LeaveCriticalSection(&sys->lock);
+ hr = IAudioSessionManager_GetSimpleAudioVolume(sys->manager,
+ &GUID_VLC_AUD_OUT,
+ FALSE, &volume);
+ if (FAILED(hr))
+ {
+ msg_Err(aout, "cannot get simple volume (error 0x%lx)", hr);
+ return -1;
+ }
- WakeConditionVariable(&sys->request_wait);
+ hr = ISimpleAudioVolume_SetMasterVolume(volume, vol, NULL);
+ ISimpleAudioVolume_Release(volume);
+ if (FAILED(hr))
+ {
+ msg_Err(aout, "cannot set volume (error 0x%lx)", hr);
+ return -1;
+ }
return 0;
}
static int MuteSet(audio_output_t *aout, bool mute)
{
aout_sys_t *sys = aout->sys;
+ ISimpleAudioVolume *volume;
+ HRESULT hr;
- EnterCriticalSection(&sys->lock);
- sys->mute = mute;
- LeaveCriticalSection(&sys->lock);
+ hr = IAudioSessionManager_GetSimpleAudioVolume(sys->manager,
+ &GUID_VLC_AUD_OUT,
+ FALSE, &volume);
+ if (FAILED(hr))
+ {
+ msg_Err(aout, "cannot get simple volume (error 0x%lx)", hr);
+ return -1;
+ }
- WakeConditionVariable(&sys->request_wait);
+ hr = ISimpleAudioVolume_SetMute(volume, mute ? TRUE : FALSE, NULL);
+ ISimpleAudioVolume_Release(volume);
+ if (FAILED(hr))
+ {
+ msg_Err(aout, "cannot set mute (error 0x%lx)", hr);
+ return -1;
+ }
return 0;
}
@@ -411,7 +435,6 @@ static void MMThread(void *data)
audio_output_t *aout = data;
aout_sys_t *sys = aout->sys;
IAudioSessionControl *control;
- ISimpleAudioVolume *volume;
HRESULT hr;
Enter();
@@ -432,42 +455,14 @@ static void MMThread(void *data)
&sys->session_events);
}
- hr = IAudioSessionManager_GetSimpleAudioVolume(sys->manager,
- &GUID_VLC_AUD_OUT, FALSE,
- &volume);
- if (FAILED(hr))
- msg_Err(aout, "cannot get simple volume (error 0x%lx)", hr);
-
EnterCriticalSection(&sys->lock);
sys->running = true;
WakeConditionVariable(&sys->reply_wait);
while (!sys->killed)
- {
- /* Update volume */
- if (sys->volume >= 0.f)
- {
- hr = ISimpleAudioVolume_SetMasterVolume(volume, sys->volume, NULL);
- if (FAILED(hr))
- msg_Err(aout, "cannot set volume (error 0x%lx)", hr);
- sys->volume = -1.f;
- }
-
- /* Update mute state */
- if (sys->mute >= 0)
- {
- hr = ISimpleAudioVolume_SetMute(volume, sys->mute, NULL);
- if (FAILED(hr))
- msg_Err(aout, "cannot set mute (error 0x%lx)", hr);
- sys->mute = -1;
- }
-
SleepConditionVariableCS(&sys->request_wait, &sys->lock, INFINITE);
- }
LeaveCriticalSection(&sys->lock);
- if (volume != NULL)
- ISimpleAudioVolume_Release(volume);
if (control != NULL)
{
IAudioSessionControl_UnregisterAudioSessionNotification(control,
@@ -532,8 +527,6 @@ static int Open(vlc_object_t *obj)
InitializeConditionVariable(&sys->reply_wait);
sys->killed = false;
sys->running = false;
- sys->volume = -1.f;
- sys->mute = -1;
hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL,
&IID_IMMDeviceEnumerator, &pv);
More information about the vlc-commits
mailing list