Commit 084618ed authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

ALSA: disable resampling (plug, plughw)

VLC resamples all the time anyway. We don't need two resamplers.
parent 4a350206
...@@ -119,6 +119,10 @@ vlc_module_begin () ...@@ -119,6 +119,10 @@ vlc_module_begin ()
set_callbacks( Open, Close ) set_callbacks( Open, Close )
vlc_module_end () vlc_module_end ()
/* VLC will insert a resampling filter in any case, so it is best to turn off
* ALSA (plug) resampling. */
static const int mode = SND_PCM_NO_AUTO_RESAMPLE;
/***************************************************************************** /*****************************************************************************
* Probe: probe the audio device for available formats and channels * Probe: probe the audio device for available formats and channels
*****************************************************************************/ *****************************************************************************/
...@@ -127,8 +131,8 @@ static void Probe (aout_instance_t *p_aout, ...@@ -127,8 +131,8 @@ static void Probe (aout_instance_t *p_aout,
int *pi_snd_pcm_format) int *pi_snd_pcm_format)
{ {
struct aout_sys_t * p_sys = p_aout->output.p_sys; struct aout_sys_t * p_sys = p_aout->output.p_sys;
vlc_value_t val, text; vlc_value_t value, text;
int i_ret; int val;
var_Create ( p_aout, "audio-device", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE ); var_Create ( p_aout, "audio-device", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE );
text.psz_string = _("Audio Device"); text.psz_string = _("Audio Device");
...@@ -139,9 +143,9 @@ static void Probe (aout_instance_t *p_aout, ...@@ -139,9 +143,9 @@ static void Probe (aout_instance_t *p_aout,
* the blocking mode */ * the blocking mode */
/* Now test linear PCM capabilities */ /* Now test linear PCM capabilities */
i_ret = snd_pcm_open( &p_sys->p_snd_pcm, psz_device, val = snd_pcm_open (&p_sys->p_snd_pcm, psz_device,
SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK ); SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK | mode);
if( i_ret == 0 ) if (val == 0)
{ {
int i_channels; int i_channels;
snd_pcm_hw_params_t * p_hw; snd_pcm_hw_params_t * p_hw;
...@@ -185,29 +189,29 @@ static void Probe (aout_instance_t *p_aout, ...@@ -185,29 +189,29 @@ static void Probe (aout_instance_t *p_aout,
switch ( i_channels ) switch ( i_channels )
{ {
case 1: case 1:
val.i_int = AOUT_VAR_MONO; value.i_int = AOUT_VAR_MONO;
text.psz_string = _("Mono"); text.psz_string = _("Mono");
var_Change( p_aout, "audio-device", var_Change (p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text ); VLC_VAR_ADDCHOICE, &value, &text);
break; break;
case 2: case 2:
val.i_int = AOUT_VAR_STEREO; value.i_int = AOUT_VAR_STEREO;
text.psz_string = _("Stereo"); text.psz_string = _("Stereo");
var_Change( p_aout, "audio-device", var_Change (p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text ); VLC_VAR_ADDCHOICE, &value, &text);
var_Set( p_aout, "audio-device", val ); var_Set (p_aout, "audio-device", value);
break; break;
case 4: case 4:
val.i_int = AOUT_VAR_2F2R; value.i_int = AOUT_VAR_2F2R;
text.psz_string = _("2 Front 2 Rear"); text.psz_string = _("2 Front 2 Rear");
var_Change( p_aout, "audio-device", var_Change (p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text ); VLC_VAR_ADDCHOICE, &value, &text);
break; break;
case 6: case 6:
val.i_int = AOUT_VAR_5_1; value.i_int = AOUT_VAR_5_1;
text.psz_string = (char *)"5.1"; text.psz_string = (char *)"5.1";
var_Change( p_aout, "audio-device", var_Change (p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text ); VLC_VAR_ADDCHOICE, &value, &text);
break; break;
} }
} }
...@@ -217,49 +221,47 @@ static void Probe (aout_instance_t *p_aout, ...@@ -217,49 +221,47 @@ static void Probe (aout_instance_t *p_aout,
/* Special case for mono on stereo only boards */ /* Special case for mono on stereo only boards */
i_channels = aout_FormatNbChannels( &p_aout->output.output ); i_channels = aout_FormatNbChannels( &p_aout->output.output );
var_Change( p_aout, "audio-device", VLC_VAR_CHOICESCOUNT, &val, NULL ); var_Change (p_aout, "audio-device", VLC_VAR_CHOICESCOUNT, &value, NULL);
if( val.i_int <= 0 && i_channels == 1 ) if (value.i_int <= 0 && i_channels == 1)
{ {
if ( !snd_pcm_hw_params_test_channels( p_sys->p_snd_pcm, p_hw, 2 )) if ( !snd_pcm_hw_params_test_channels( p_sys->p_snd_pcm, p_hw, 2 ))
{ {
val.i_int = AOUT_VAR_STEREO; value.i_int = AOUT_VAR_STEREO;
text.psz_string = (char*)N_("Stereo"); text.psz_string = (char*)N_("Stereo");
var_Change( p_aout, "audio-device", var_Change (p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text ); VLC_VAR_ADDCHOICE, &value, &text);
var_Set( p_aout, "audio-device", val ); var_Set (p_aout, "audio-device", value);
} }
} }
/* Close the previously opened device */ /* Close the previously opened device */
snd_pcm_close( p_sys->p_snd_pcm ); snd_pcm_close( p_sys->p_snd_pcm );
} }
else if ( i_ret == -EBUSY ) else
{ if (val == -EBUSY)
msg_Warn( p_aout, "audio device: %s is already in use", psz_device ); msg_Warn( p_aout, "audio device: %s is already in use", psz_device );
}
/* Test for S/PDIF device if needed */ /* Test for S/PDIF device if needed */
if ( psz_iec_device ) if ( psz_iec_device )
{ {
/* Opening the device should be enough */ /* Opening the device should be enough */
i_ret = snd_pcm_open( &p_sys->p_snd_pcm, psz_iec_device, val = snd_pcm_open (&p_sys->p_snd_pcm, psz_iec_device,
SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK ); SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK | mode);
if( i_ret == 0 ) if (val == 0)
{ {
val.i_int = AOUT_VAR_SPDIF; value.i_int = AOUT_VAR_SPDIF;
text.psz_string = (char*)N_("A/52 over S/PDIF"); text.psz_string = (char*)N_("A/52 over S/PDIF");
var_Change( p_aout, "audio-device", var_Change (p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text ); VLC_VAR_ADDCHOICE, &value, &text);
if( var_InheritBool( p_aout, "spdif" ) ) if( var_InheritBool( p_aout, "spdif" ) )
var_Set( p_aout, "audio-device", val ); var_Set (p_aout, "audio-device", value);
snd_pcm_close( p_sys->p_snd_pcm ); snd_pcm_close( p_sys->p_snd_pcm );
} }
else if ( i_ret == -EBUSY ) else
{ if (val == -EBUSY)
msg_Warn( p_aout, "audio device: %s is already in use", msg_Warn( p_aout, "audio device: %s is already in use",
psz_iec_device ); psz_iec_device );
}
} }
/* Add final settings to the variable */ /* Add final settings to the variable */
...@@ -386,7 +388,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -386,7 +388,7 @@ static int Open( vlc_object_t *p_this )
/* Open the device */ /* Open the device */
msg_Dbg( p_aout, "opening ALSA device `%s'", psz_device ); msg_Dbg( p_aout, "opening ALSA device `%s'", psz_device );
int val = snd_pcm_open (&p_sys->p_snd_pcm, psz_device, int val = snd_pcm_open (&p_sys->p_snd_pcm, psz_device,
SND_PCM_STREAM_PLAYBACK, 0); SND_PCM_STREAM_PLAYBACK, mode);
#if (SND_LIB_VERSION <= 0x010015) #if (SND_LIB_VERSION <= 0x010015)
# warning Please update alsa-lib to version > 1.0.21a. # warning Please update alsa-lib to version > 1.0.21a.
var_Create (p_aout->p_libvlc, "alsa-working", VLC_VAR_BOOL); var_Create (p_aout->p_libvlc, "alsa-working", VLC_VAR_BOOL);
...@@ -523,16 +525,19 @@ retry: ...@@ -523,16 +525,19 @@ retry:
} }
/* Set rate. */ /* Set rate. */
unsigned i_old_rate = p_aout->output.output.i_rate; unsigned old_rate = p_aout->output.output.i_rate;
val = snd_pcm_hw_params_set_rate_near( p_sys->p_snd_pcm, p_hw, val = snd_pcm_hw_params_set_rate_near (p_sys->p_snd_pcm, p_hw,
&p_aout->output.output.i_rate, &p_aout->output.output.i_rate,
NULL ); NULL);
if( val < 0 || p_aout->output.output.i_rate != i_old_rate ) if (val < 0)
{ {
msg_Warn( p_aout, "The rate %d Hz is not supported by your " \ msg_Err (p_aout, "unable to set sampling rate (%s)",
"hardware. Using %d Hz instead.\n", i_old_rate, \ snd_strerror (val));
p_aout->output.output.i_rate ); goto error;
} }
if (p_aout->output.output.i_rate != old_rate)
msg_Warn (p_aout, "resampling from %d Hz to %d Hz\n", old_rate,
p_aout->output.output.i_rate);
/* Set period size. */ /* Set period size. */
val = snd_pcm_hw_params_set_period_size_near( p_sys->p_snd_pcm, p_hw, val = snd_pcm_hw_params_set_period_size_near( p_sys->p_snd_pcm, p_hw,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment