#include <vlc_plugin.h>
#include <errno.h> /* ENOMEM */
-#include <vlc_interface.h>
+#include <vlc_dialog.h>
#include <vlc_aout.h>
/*****************************************************************************
* Local prototypes
*****************************************************************************/
-static int Open ( vlc_object_t * );
-static void Close ( vlc_object_t * );
-static void Play ( aout_instance_t * );
-static int ALSAThread ( aout_instance_t * );
-static void ALSAFill ( aout_instance_t * );
+static int Open ( vlc_object_t * );
+static void Close ( vlc_object_t * );
+static void Play ( aout_instance_t * );
+static void* ALSAThread ( vlc_object_t * );
+static void ALSAFill ( aout_instance_t * );
static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name,
vlc_value_t newval, vlc_value_t oldval, void *p_unused );
*****************************************************************************/
static const char *const ppsz_devices[] = { "default" };
static const char *const ppsz_devices_text[] = { N_("Default") };
-vlc_module_begin();
- set_shortname( "ALSA" );
- set_description( N_("ALSA audio output") );
- set_category( CAT_AUDIO );
- set_subcategory( SUBCAT_AUDIO_AOUT );
- add_string( "alsadev", DEFAULT_ALSA_DEVICE, aout_FindAndRestart,
- N_("ALSA Device Name"), NULL, false );
- change_string_list( ppsz_devices, ppsz_devices_text, FindDevicesCallback );
- change_action_add( FindDevicesCallback, N_("Refresh list") );
-
- set_capability( "audio output", 150 );
- set_callbacks( Open, Close );
-vlc_module_end();
+vlc_module_begin ()
+ set_shortname( "ALSA" )
+ set_description( N_("ALSA audio output") )
+ set_category( CAT_AUDIO )
+ set_subcategory( SUBCAT_AUDIO_AOUT )
+ add_string( "alsa-audio-device", DEFAULT_ALSA_DEVICE, aout_FindAndRestart,
+ N_("ALSA Device Name"), NULL, false )
+ add_deprecated_alias( "alsadev" ) /* deprecated since 0.9.3 */
+ change_string_list( ppsz_devices, ppsz_devices_text, FindDevicesCallback )
+ change_action_add( FindDevicesCallback, N_("Refresh list") )
+
+ set_capability( "audio output", 150 )
+ set_callbacks( Open, Close )
+vlc_module_end ()
/*****************************************************************************
* Probe: probe the audio device for available formats and channels
{
case 1:
val.i_int = AOUT_VAR_MONO;
- text.psz_string = N_("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 = N_("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 = N_("2 Front 2 Rear");
+ text.psz_string = _("2 Front 2 Rear");
var_Change( p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text );
break;
if ( !snd_pcm_hw_params_test_channels( p_sys->p_snd_pcm, p_hw, 2 ))
{
val.i_int = AOUT_VAR_STEREO;
- text.psz_string = N_("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 );
SND_PCM_NONBLOCK ) ) )
{
val.i_int = AOUT_VAR_SPDIF;
- text.psz_string = N_("A/52 over S/PDIF");
+ text.psz_string = (char*)N_("A/52 over S/PDIF");
var_Change( p_aout, "audio-device",
VLC_VAR_ADDCHOICE, &val, &text );
if( config_GetInt( p_aout, "spdif" ) )
/* Add final settings to the variable */
var_AddCallback( p_aout, "audio-device", aout_ChannelsRestart, NULL );
- val.b_bool = true;
- var_Set( p_aout, "intf-change", val );
+ var_SetBool( p_aout, "intf-change", true );
}
/*****************************************************************************
return VLC_ENOMEM;
p_sys->b_playing = false;
p_sys->start_date = 0;
- vlc_cond_init( p_aout, &p_sys->wait );
+ vlc_cond_init( &p_sys->wait );
vlc_mutex_init( &p_sys->lock );
/* Get device name */
- if( (psz_device = config_GetPsz( p_aout, "alsadev" )) == NULL )
+ if( (psz_device = config_GetPsz( p_aout, "alsa-audio-device" )) == NULL )
{
msg_Err( p_aout, "no audio device given (maybe \"default\" ?)" );
- intf_UserFatal( p_aout, false, _("No Audio Device"),
+ dialog_Fatal( p_aout, _("No Audio Device"),
_("No audio device name was given. You might want to " \
"enter \"default\".") );
free( p_sys );
and float32) */
if( vlc_CPU() & CPU_CAPABILITY_FPU )
{
- i_vlc_pcm_format = VLC_FOURCC('f','l','3','2');
+ i_vlc_pcm_format = VLC_CODEC_FL32;
i_snd_pcm_format = SND_PCM_FORMAT_FLOAT;
}
else
{
- i_vlc_pcm_format = AOUT_FMT_S16_NE;
+ i_vlc_pcm_format = VLC_CODEC_S16N;
i_snd_pcm_format = SND_PCM_FORMAT_S16;
}
{
msg_Err( p_aout, "cannot open ALSA device `%s' (%s)",
psz_iec_device, snd_strerror( i_snd_rc ) );
- intf_UserFatal( p_aout, false, _("Audio output failed"),
+ dialog_Fatal( p_aout, _("Audio output failed"),
_("VLC could not open the ALSA device \"%s\" (%s)."),
psz_iec_device, snd_strerror( i_snd_rc ) );
free( p_sys );
i_snd_pcm_format = SND_PCM_FORMAT_S16;
i_channels = 2;
- i_vlc_pcm_format = VLC_FOURCC('s','p','d','i');
+ i_vlc_pcm_format = VLC_CODEC_SPDIFL;
p_aout->output.i_nb_samples = i_period_size = ALSA_SPDIF_PERIOD_SIZE;
p_aout->output.output.i_bytes_per_frame = AOUT_SPDIF_SIZE;
p_aout->output.output.i_frame_length = A52_FRAME_NB;
{
msg_Err( p_aout, "audio device: %s is already in use",
psz_device );
- intf_UserFatal( p_aout, false, _("Audio output failed"),
+ dialog_Fatal( p_aout, _("Audio output failed"),
_("The audio device \"%s\" is already in use."),
psz_device );
}
{
msg_Err( p_aout, "cannot open ALSA device `%s' (%s)",
psz_device, snd_strerror( i_snd_rc ) );
- intf_UserFatal( p_aout, false, _("Audio output failed"),
+ dialog_Fatal( p_aout, _("Audio output failed"),
_("VLC could not open the ALSA device \"%s\" (%s)."),
psz_device, snd_strerror( i_snd_rc ) );
free( p_sys );
goto error;
}
}
- if( i_vlc_pcm_format != VLC_FOURCC('s','p','d','i') )
+ if( i_vlc_pcm_format != VLC_CODEC_SPDIFL )
switch( i_snd_pcm_format )
{
case SND_PCM_FORMAT_FLOAT:
- i_vlc_pcm_format = VLC_FOURCC('f','l','3','2');
+ i_vlc_pcm_format = VLC_CODEC_FL32;
break;
case SND_PCM_FORMAT_S16:
- i_vlc_pcm_format = AOUT_FMT_S16_NE;
+ i_vlc_pcm_format = VLC_CODEC_S16N;
break;
}
p_aout->output.output.i_format = i_vlc_pcm_format;
{
b_retry = true;
i_snd_pcm_format = SND_PCM_FORMAT_S16;
- p_aout->output.output.i_format = AOUT_FMT_S16_NE;
+ p_aout->output.output.i_format = VLC_CODEC_S16N;
msg_Warn( p_aout, "unable to commit hardware configuration "
"with fl32 samples. Retrying with s16l (%s)", snd_strerror( i_snd_rc ) );
}
/* Create ALSA thread and wait for its readiness. */
if( vlc_thread_create( p_aout, "aout", ALSAThread,
- VLC_THREAD_PRIORITY_OUTPUT, false ) )
+ VLC_THREAD_PRIORITY_OUTPUT ) )
{
msg_Err( p_aout, "cannot create ALSA thread (%m)" );
goto error;
struct aout_sys_t * p_sys = p_aout->output.p_sys;
int i_snd_rc;
+ /* Make sure that the thread will stop once it is waken up */
+ vlc_object_kill( p_aout );
+
/* make sure the audio output thread is waken up */
vlc_mutex_lock( &p_aout->output.p_sys->lock );
vlc_cond_signal( &p_aout->output.p_sys->wait );
vlc_mutex_unlock( &p_aout->output.p_sys->lock );
- vlc_object_kill( p_aout );
+ /* */
vlc_thread_join( p_aout );
p_aout->b_die = false;
/*****************************************************************************
* ALSAThread: asynchronous thread used to DMA the data to the device
*****************************************************************************/
-static int ALSAThread( aout_instance_t * p_aout )
+static void* ALSAThread( vlc_object_t* p_this )
{
+ aout_instance_t * p_aout = (aout_instance_t*)p_this;
struct aout_sys_t * p_sys = p_aout->output.p_sys;
+ int canc = vlc_savecancel ();
p_sys->p_status = (snd_pcm_status_t *)malloc(snd_pcm_status_sizeof());
/* Wait for the exact time to start playing (avoids resampling) */
vlc_mutex_lock( &p_sys->lock );
- while( !p_sys->start_date && !p_aout->b_die )
+ while( !p_sys->start_date && vlc_object_alive (p_aout) )
vlc_cond_wait( &p_sys->wait, &p_sys->lock );
vlc_mutex_unlock( &p_sys->lock );
- if( p_aout->b_die )
+ if( !vlc_object_alive (p_aout) )
goto cleanup;
mwait( p_sys->start_date - AOUT_PTS_TOLERANCE / 4 );
- while ( !p_aout->b_die )
+ while ( vlc_object_alive (p_aout) )
{
ALSAFill( p_aout );
}
cleanup:
snd_pcm_drop( p_sys->p_snd_pcm );
free( p_aout->output.p_sys->p_status );
- return 0;
+ vlc_restorecancel (canc);
+ return NULL;
}
/*****************************************************************************
}
p_buffer = aout_OutputNextBuffer( p_aout, next_date,
- (p_aout->output.output.i_format == VLC_FOURCC('s','p','d','i')) );
+ (p_aout->output.output.i_format == VLC_CODEC_SPDIFL) );
/* Audio output buffer shortage -> stop the fill process and wait */
if( p_buffer == NULL )
* (stream is suspended and waiting for an application recovery) */
msg_Dbg( p_aout, "entering in suspend mode, trying to resume..." );
- while( !p_aout->b_die && !p_aout->p_libvlc->b_die &&
+ while( vlc_object_alive (p_aout) && vlc_object_alive (p_aout->p_libvlc) &&
( i_snd_rc = snd_pcm_resume( p_sys->p_snd_pcm ) ) == -EAGAIN )
{
msleep( 1000000 );
{
module_config_t *p_item;
int i;
+ (void)newval;
+ (void)oldval;
+ (void)p_unused;
p_item = config_FindConfig( p_this, psz_name );
if( !p_item ) return VLC_SUCCESS;
p_item->b_dirty = true;
return VLC_SUCCESS;
-
}
continue;
}
- asprintf( &psz_device, "hw:%d,%d", i_card, i_pcm_device );
- asprintf( &psz_descr, "%s: %s (%s)", psz_card_name,
- snd_pcm_info_get_name(p_pcm_info), psz_device );
+ if( asprintf( &psz_device, "hw:%d,%d", i_card, i_pcm_device ) == -1 )
+ break;
+ if( asprintf( &psz_descr, "%s: %s (%s)", psz_card_name,
+ snd_pcm_info_get_name(p_pcm_info), psz_device ) == -1 )
+ {
+ free( psz_device );
+ break;
+ }
p_item->ppsz_list =
- (const char **)realloc( p_item->ppsz_list,
+ (char **)realloc( p_item->ppsz_list,
(p_item->i_list + 2) * sizeof(char *) );
p_item->ppsz_list_text =
- (const char **)realloc( p_item->ppsz_list_text,
+ (char **)realloc( p_item->ppsz_list_text,
(p_item->i_list + 2) * sizeof(char *) );
p_item->ppsz_list[ p_item->i_list ] = psz_device;
p_item->ppsz_list_text[ p_item->i_list ] = psz_descr;