[vlc-commits] waveout: use software amplification

Rémi Denis-Courmont git at videolan.org
Sat Dec 8 19:14:10 CET 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Dec  8 20:13:12 2012 +0200| [26af6a0331422f535d0d6fafbbc142fcd8823707] | committer: Rémi Denis-Courmont

waveout: use software amplification

This should make volume work.
Patch welcome to make hardware volume work instead where available.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=26af6a0331422f535d0d6fafbbc142fcd8823707
---

 modules/audio_output/waveout.c |   62 ++++++++++++++++++++++------------------
 1 file changed, 34 insertions(+), 28 deletions(-)

diff --git a/modules/audio_output/waveout.c b/modules/audio_output/waveout.c
index de54f96..424ffd1 100644
--- a/modules/audio_output/waveout.c
+++ b/modules/audio_output/waveout.c
@@ -67,9 +67,6 @@ static int PlayWaveOut   ( audio_output_t *, HWAVEOUT, WAVEHDR *,
 static void CALLBACK WaveOutCallback ( HWAVEOUT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR );
 static void* WaveOutThread( void * );
 
-static int VolumeSet( audio_output_t *, float );
-static int MuteSet( audio_output_t *, bool );
-
 static int WaveOutClearDoneBuffers(aout_sys_t *p_sys);
 
 static int ReloadWaveoutDevices( vlc_object_t *, const char *,
@@ -110,14 +107,8 @@ struct aout_sys_t
 
     uint8_t *p_silence_buffer;              /* buffer we use to play silence */
 
-    union {
-        float volume;
-        float soft_gain;
-    };
-    union {
-        bool mute;
-        bool soft_mute;
-    };
+    float soft_gain;
+    bool soft_mute;
 
     uint8_t chans_to_reorder;              /* do we need channel reordering */
     uint8_t chan_table[AOUT_CHAN_MAX];
@@ -240,8 +231,6 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
     }
     else
     {
-        WAVEOUTCAPS wocaps;
-
         switch( val.i_int )
         {
         case AOUT_VAR_5_1:
@@ -277,8 +266,9 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
         p_aout->sys->i_buffer_size = FRAME_SIZE * fmt->i_bytes_per_frame;
 
         aout_PacketInit( p_aout, &p_aout->sys->packet, FRAME_SIZE, fmt );
-
+#if 0
         /* Check for hardware volume support */
+        WAVEOUTCAPS wocaps;
         if( waveOutGetDevCaps( (UINT_PTR)p_aout->sys->h_waveout,
                                &wocaps, sizeof(wocaps) ) == MMSYSERR_NOERROR
          && (wocaps.dwSupport & WAVECAPS_VOLUME) )
@@ -289,7 +279,8 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
             p_aout->sys->mute = false;
         }
         else
-            aout_SoftVolumeInit( p_aout );
+#endif
+            aout_SoftVolumeStart( p_aout );
     }
 
     waveOutReset( p_aout->sys->h_waveout );
@@ -962,22 +953,30 @@ static void* WaveOutThread( void *data )
     return NULL;
 }
 
+#if 0
 static int VolumeSet( audio_output_t *aout, float volume )
 {
     aout_sys_t *sys = aout->sys;
     const HWAVEOUT hwo = sys->h_waveout;
-    const float full = 0xffff.fp0;
 
-    volume *= full;
-    if( volume >= full )
-        return -1;
+    unsigned vol = lroundf(volume * 0xffff.fp0);
+    if (vol > 0xffff)
+    {
+        volume = 1.f;
+        vol = 0xffff;
+    }
 
+    if (!sys->soft_mute)
+    {
+        MMRESULT r = waveOutSetVolume(hwo, vol | (vol << 16));
+        if (r != MMSYSERR_NOERROR)
+        {
+            msg_Err(aout, "cannot set mute: multimedia error %u", r);
+            return -1;
+        }
+    }
     sys->volume = volume;
-    if( sys->mute )
-        return 0;
-
-    uint16_t vol = lroundf(volume);
-    waveOutSetVolume( hwo, vol | (vol << 16) );
+    aout_VolumeReport(aout, volume);
     return 0;
 }
 
@@ -985,12 +984,19 @@ static int MuteSet( audio_output_t * p_aout, bool mute )
 {
     aout_sys_t *sys = p_aout->sys;
     const HWAVEOUT hwo = sys->h_waveout;
-    uint16_t vol = mute ? 0 : lroundf(sys->volume);
 
-    sys->mute = mute;
-    waveOutSetVolume( hwo, vol | (vol << 16) );
+    uint16_t vol = mute ? 0 : lroundf(sys->volume * 0xffff.fp0);
+    MMRESULT r = waveOutSetVolume(hwo, vol | (vol << 16));
+    if (r != MMSYSERR_NOERROR)
+    {
+        msg_Err(p_aout, "cannot set mute: multimedia error %u", r);
+        return -1;
+    }
+    sys->soft_mute = mute;
+    aout_MuteReport(p_aout, mute);
     return 0;
 }
+#endif
 
 /*
   reload the configuration drop down list, of the Audio Devices
@@ -1074,7 +1080,7 @@ static int Open(vlc_object_t *obj)
     aout->sys = sys;
     aout->start = Start;
     aout->stop = Stop;
-    /* FIXME: volume handlers */
+    aout_SoftVolumeInit(aout);
     return VLC_SUCCESS;
 }
 



More information about the vlc-commits mailing list