winstore: handle volume/mute in the winstore audio output
authorSteve Lhomme <robUx4@videolabs.io>
Mon, 16 May 2016 11:21:31 +0000 (13:21 +0200)
committerJean-Baptiste Kempf <jb@videolan.org>
Tue, 17 May 2016 08:48:03 +0000 (10:48 +0200)
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
modules/audio_output/winstore.c

index 4734f39..a292841 100644 (file)
@@ -57,6 +57,70 @@ struct aout_sys_t
     IAudioClient *client;
 };
 
+
+static int VolumeSet(audio_output_t *aout, float vol)
+{
+    aout_sys_t *sys = aout->sys;
+    HRESULT hr;
+    ISimpleAudioVolume *pc_AudioVolume = NULL;
+    float gain = 1.f;
+
+    vol = vol * vol * vol; /* ISimpleAudioVolume is tapered linearly. */
+
+    if (vol > 1.f)
+    {
+        gain = vol;
+        vol = 1.f;
+    }
+
+    aout_GainRequest(aout, gain);
+
+    hr = IAudioClient_GetService(sys->client, &IID_ISimpleAudioVolume, &pc_AudioVolume);
+    if (FAILED(hr))
+    {
+        msg_Err(aout, "cannot get volume service (error 0x%lx)", hr);
+        goto done;
+    }
+
+    hr = ISimpleAudioVolume_SetMasterVolume(pc_AudioVolume, vol, NULL);
+    if (FAILED(hr))
+    {
+        msg_Err(aout, "cannot set volume (error 0x%lx)", hr);
+        goto done;
+    }
+
+done:
+    ISimpleAudioVolume_Release(pc_AudioVolume);
+
+    return SUCCEEDED(hr) ? 0 : -1;
+}
+
+static int MuteSet(audio_output_t *aout, bool mute)
+{
+    aout_sys_t *sys = aout->sys;
+    HRESULT hr;
+    ISimpleAudioVolume *pc_AudioVolume = NULL;
+
+    hr = IAudioClient_GetService(sys->client, &IID_ISimpleAudioVolume, &pc_AudioVolume);
+    if (FAILED(hr))
+    {
+        msg_Err(aout, "cannot get volume service (error 0x%lx)", hr);
+        goto done;
+    }
+
+    hr = ISimpleAudioVolume_SetMute(pc_AudioVolume, mute, NULL);
+    if (FAILED(hr))
+    {
+        msg_Err(aout, "cannot set mute (error 0x%lx)", hr);
+        goto done;
+    }
+
+done:
+    ISimpleAudioVolume_Release(pc_AudioVolume);
+
+    return SUCCEEDED(hr) ? 0 : -1;
+}
+
 static int TimeGet(audio_output_t *aout, mtime_t *restrict delay)
 {
     aout_sys_t *sys = aout->sys;
@@ -193,6 +257,8 @@ static int Open(vlc_object_t *obj)
     aout->start = Start;
     aout->stop = Stop;
     aout->time_get = TimeGet;
+    aout->volume_set = VolumeSet;
+    aout->mute_set = MuteSet;
     aout->play = Play;
     aout->pause = Pause;
     aout->flush = Flush;