- struct aout_sys_t * p_sys = p_aout->output.p_sys;
- vlc_value_t val, text;
- int i_ret;
-
- var_Create ( p_aout, "audio-device", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE );
- text.psz_string = _("Audio Device");
- var_Change( p_aout, "audio-device", VLC_VAR_SETTEXT, &text, NULL );
-
- /* We'll open the audio device in non blocking mode so we can just exit
- * when it is already in use, but for the real stuff we'll still use
- * the blocking mode */
-
- /* Now test linear PCM capabilities */
- i_ret = snd_pcm_open( &p_sys->p_snd_pcm, psz_device,
- SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK );
- if( i_ret == 0 )
- {
- int i_channels;
- snd_pcm_hw_params_t * p_hw;
- snd_pcm_hw_params_alloca (&p_hw);
-
- if ( snd_pcm_hw_params_any( p_sys->p_snd_pcm, p_hw ) < 0 )
- {
- msg_Warn( p_aout, "unable to retrieve initial hardware parameters"
- ", disabling linear PCM audio" );
- snd_pcm_close( p_sys->p_snd_pcm );
- var_Destroy( p_aout, "audio-device" );
- return VLC_EGENERIC;
- }
-
- if ( snd_pcm_hw_params_set_format( p_sys->p_snd_pcm, p_hw,
- *pi_snd_pcm_format ) < 0 )
- {
- int i_snd_rc = -1;
-
- if( *pi_snd_pcm_format != SND_PCM_FORMAT_S16 )
- {
- *pi_snd_pcm_format = SND_PCM_FORMAT_S16;
- i_snd_rc = snd_pcm_hw_params_set_format( p_sys->p_snd_pcm,
- p_hw, *pi_snd_pcm_format );
- }
- if ( i_snd_rc < 0 )
- {
- msg_Warn( p_aout, "unable to set stream sample size and "
- "word order, disabling linear PCM audio" );
- snd_pcm_close( p_sys->p_snd_pcm );
- var_Destroy( p_aout, "audio-device" );
- return VLC_EGENERIC;
- }
- }
-
- i_channels = aout_FormatNbChannels( &p_aout->output.output );
-
- while ( i_channels > 0 )
- {
- if ( !snd_pcm_hw_params_test_channels( p_sys->p_snd_pcm, p_hw,
- i_channels ) )
- {
- switch ( i_channels )
- {
- case 1:
- val.i_int = AOUT_VAR_MONO;
- text.psz_string = _("Mono");
- var_Change( p_aout, "audio-device",
- VLC_VAR_ADDCHOICE, &val, &text );
- break;
- case 2:
- val.i_int = AOUT_VAR_STEREO;
- text.psz_string = _("Stereo");
- var_Change( p_aout, "audio-device",
- VLC_VAR_ADDCHOICE, &val, &text );
- var_Set( p_aout, "audio-device", val );
- break;
- case 4:
- val.i_int = AOUT_VAR_2F2R;
- text.psz_string = _("2 Front 2 Rear");
- var_Change( p_aout, "audio-device",
- VLC_VAR_ADDCHOICE, &val, &text );
- break;
- case 6:
- val.i_int = AOUT_VAR_5_1;
- text.psz_string = (char *)"5.1";
- var_Change( p_aout, "audio-device",
- VLC_VAR_ADDCHOICE, &val, &text );
- break;
- }
- }
-
- --i_channels;
- }
-
- /* Special case for mono on stereo only boards */
- i_channels = aout_FormatNbChannels( &p_aout->output.output );
- var_Change( p_aout, "audio-device", VLC_VAR_CHOICESCOUNT, &val, NULL );
- if( val.i_int <= 0 && i_channels == 1 )
- {
- if ( !snd_pcm_hw_params_test_channels( p_sys->p_snd_pcm, p_hw, 2 ))
- {
- val.i_int = AOUT_VAR_STEREO;
- text.psz_string = (char*)N_("Stereo");
- var_Change( p_aout, "audio-device",
- VLC_VAR_ADDCHOICE, &val, &text );
- var_Set( p_aout, "audio-device", val );
- }
- }