[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