X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_output%2Foss.c;h=a05fcf16b6768bf79aad50a3eaf3494ec09685bd;hb=12ade3e3bc975d5426ba4af155b7372c31093b31;hp=0f1377ea7b4c6a28428a74ba9024a0a633d98e8f;hpb=a48fa0327705ef15ba4356f48f375eee0fb3dca9;p=vlc diff --git a/modules/audio_output/oss.c b/modules/audio_output/oss.c index 0f1377ea7b..a05fcf16b6 100644 --- a/modules/audio_output/oss.c +++ b/modules/audio_output/oss.c @@ -31,17 +31,13 @@ # include "config.h" #endif -#include /* ENOMEM */ #include /* open(), O_WRONLY */ #include /* ioctl() */ #include /* write(), close() */ #include #include - -#ifdef HAVE_ALLOCA_H -# include -#endif +#include #include @@ -51,8 +47,6 @@ # include #elif defined( HAVE_SYS_SOUNDCARD_H ) # include -#elif defined( HAVE_MACHINE_SOUNDCARD_H ) -# include #endif /* Patches for ignorant OSS versions */ @@ -106,20 +100,21 @@ static mtime_t BufferDuration( aout_instance_t * p_aout ); "are completely filled (the sound gets heavily hashed). If you have one " \ "of these drivers, then you need to enable this option." ) -vlc_module_begin(); - set_shortname( "OSS" ); - set_description( N_("UNIX OSS audio output") ); +vlc_module_begin () + set_shortname( "OSS" ) + set_description( N_("UNIX OSS audio output") ) - set_category( CAT_AUDIO ); - set_subcategory( SUBCAT_AUDIO_AOUT ); - add_file( "dspdev", "/dev/dsp", aout_FindAndRestart, - N_("OSS DSP device"), NULL, false ); - add_bool( "oss-buggy", 0, NULL, BUGGY_TEXT, BUGGY_LONGTEXT, true ); + set_category( CAT_AUDIO ) + set_subcategory( SUBCAT_AUDIO_AOUT ) + add_file( "oss-audio-device", "/dev/dsp", aout_FindAndRestart, + N_("OSS DSP device"), NULL, false ) + add_deprecated_alias( "dspdev" ) /* deprecated since 0.9.3 */ + add_bool( "oss-buggy", false, NULL, BUGGY_TEXT, BUGGY_LONGTEXT, true ) - set_capability( "audio output", 100 ); - add_shortcut( "oss" ); - set_callbacks( Open, Close ); -vlc_module_end(); + set_capability( "audio output", 100 ) + add_shortcut( "oss" ) + set_callbacks( Open, Close ) +vlc_module_end () /***************************************************************************** * Probe: probe the audio device for available formats and channels @@ -169,7 +164,7 @@ static void Probe( aout_instance_t * p_aout ) | AOUT_CHAN_LFE)) ) { val.i_int = AOUT_VAR_5_1; - text.psz_string = "5.1"; + text.psz_string = (char*) "5.1"; var_Change( p_aout, "audio-device", VLC_VAR_ADDCHOICE, &val, &text ); } @@ -180,7 +175,7 @@ static void Probe( aout_instance_t * p_aout ) | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT)) ) { 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 ); } @@ -204,7 +199,7 @@ static void Probe( aout_instance_t * p_aout ) && i_nb_channels == 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 ); } @@ -224,7 +219,7 @@ static void Probe( aout_instance_t * p_aout ) && i_nb_channels == 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 ); if ( p_aout->output.output.i_physical_channels == AOUT_CHAN_CENTER ) { @@ -248,13 +243,13 @@ static void Probe( aout_instance_t * p_aout ) && i_format == AFMT_AC3 ) { val.i_int = AOUT_VAR_SPDIF; - text.psz_string = N_("A/52 over S/PDIF"); + text.psz_string = _("A/52 over S/PDIF"); var_Change( p_aout, "audio-device", VLC_VAR_ADDCHOICE, &val, &text ); - if( config_GetInt( p_aout, "spdif" ) ) + if( var_InheritBool( p_aout, "spdif" ) ) var_Set( p_aout, "audio-device", val ); } - else if( config_GetInt( p_aout, "spdif" ) ) + else if( var_InheritBool( p_aout, "spdif" ) ) { msg_Warn( p_aout, "S/PDIF not supported by card" ); } @@ -283,7 +278,7 @@ static int Open( vlc_object_t *p_this ) return VLC_ENOMEM; /* Get device name */ - if( (psz_device = config_GetPsz( p_aout, "dspdev" )) == NULL ) + if( (psz_device = var_InheritString( p_aout, "oss-audio-device" )) == NULL ) { msg_Err( p_aout, "no audio device specified (maybe /dev/dsp?)" ); free( p_sys ); @@ -295,7 +290,7 @@ static int Open( vlc_object_t *p_this ) * wait forever until the device is available. Since this breaks the * OSS spec, we immediately put it back to blocking mode if the * operation was successful. */ - p_sys->i_fd = open( psz_device, O_WRONLY | O_NDELAY ); + p_sys->i_fd = vlc_open( psz_device, O_WRONLY | O_NDELAY ); if( p_sys->i_fd < 0 ) { msg_Err( p_aout, "cannot open audio device (%s)", psz_device ); @@ -320,17 +315,18 @@ static int Open( vlc_object_t *p_this ) if ( var_Get( p_aout, "audio-device", &val ) < 0 ) { /* Probe() has failed. */ + close( p_sys->i_fd ); free( p_sys ); return VLC_EGENERIC; } if ( val.i_int == AOUT_VAR_SPDIF ) { - p_aout->output.output.i_format = VLC_FOURCC('s','p','d','i'); + p_aout->output.output.i_format = VLC_CODEC_SPDIFL; } else if ( val.i_int == AOUT_VAR_5_1 ) { - p_aout->output.output.i_format = AOUT_FMT_S16_NE; + p_aout->output.output.i_format = VLC_CODEC_S16N; p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT @@ -338,32 +334,33 @@ static int Open( vlc_object_t *p_this ) } else if ( val.i_int == AOUT_VAR_2F2R ) { - p_aout->output.output.i_format = AOUT_FMT_S16_NE; + p_aout->output.output.i_format = VLC_CODEC_S16N; p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT; } else if ( val.i_int == AOUT_VAR_STEREO ) { - p_aout->output.output.i_format = AOUT_FMT_S16_NE; + p_aout->output.output.i_format = VLC_CODEC_S16N; p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT; } else if ( val.i_int == AOUT_VAR_MONO ) { - p_aout->output.output.i_format = AOUT_FMT_S16_NE; + p_aout->output.output.i_format = VLC_CODEC_S16N; p_aout->output.output.i_physical_channels = AOUT_CHAN_CENTER; } else { /* This should not happen ! */ - msg_Err( p_aout, "internal: can't find audio-device (%i)", val.i_int ); + msg_Err( p_aout, "internal: can't find audio-device (%"PRId64")", + val.i_int ); + close( p_sys->i_fd ); free( p_sys ); return VLC_EGENERIC; } - val.b_bool = true; - var_Set( p_aout, "intf-change", val ); + var_SetBool( p_aout, "intf-change", true ); /* Reset the DSP device */ if( ioctl( p_sys->i_fd, SNDCTL_DSP_RESET, NULL ) < 0 ) @@ -388,7 +385,7 @@ static int Open( vlc_object_t *p_this ) return VLC_EGENERIC; } - p_aout->output.output.i_format = VLC_FOURCC('s','p','d','i'); + p_aout->output.output.i_format = VLC_CODEC_SPDIFL; p_aout->output.i_nb_samples = A52_FRAME_NB; p_aout->output.output.i_bytes_per_frame = AOUT_SPDIF_SIZE; p_aout->output.output.i_frame_length = A52_FRAME_NB; @@ -415,22 +412,22 @@ static int Open( vlc_object_t *p_this ) switch ( i_format ) { case AFMT_U8: - p_aout->output.output.i_format = VLC_FOURCC('u','8',' ',' '); + p_aout->output.output.i_format = VLC_CODEC_U8; break; case AFMT_S8: - p_aout->output.output.i_format = VLC_FOURCC('s','8',' ',' '); + p_aout->output.output.i_format = VLC_CODEC_S8; break; case AFMT_U16_LE: - p_aout->output.output.i_format = VLC_FOURCC('u','1','6','l'); + p_aout->output.output.i_format = VLC_CODEC_U16L; break; case AFMT_S16_LE: - p_aout->output.output.i_format = VLC_FOURCC('s','1','6','l'); + p_aout->output.output.i_format = VLC_CODEC_S16L; break; case AFMT_U16_BE: - p_aout->output.output.i_format = VLC_FOURCC('u','1','6','b'); + p_aout->output.output.i_format = VLC_CODEC_U16B; break; case AFMT_S16_BE: - p_aout->output.output.i_format = VLC_FOURCC('s','1','6','b'); + p_aout->output.output.i_format = VLC_CODEC_S16B; break; default: msg_Err( p_aout, "OSS fell back to an unknown format (%d)", @@ -513,16 +510,16 @@ static int Open( vlc_object_t *p_this ) } p_aout->output.p_sys->b_workaround_buggy_driver = - config_GetInt( p_aout, "oss-buggy" ); + var_InheritBool( p_aout, "oss-buggy" ); /* Create OSS thread and wait for its readiness. */ if( vlc_thread_create( p_aout, "aout", OSSThread, - VLC_THREAD_PRIORITY_OUTPUT, false ) ) + VLC_THREAD_PRIORITY_OUTPUT ) ) { msg_Err( p_aout, "cannot create OSS thread (%m)" ); close( p_sys->i_fd ); free( p_sys ); - return VLC_ETHREAD; + return VLC_ENOMEM; } return VLC_SUCCESS; @@ -590,6 +587,7 @@ static void* OSSThread( 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; mtime_t next_date = 0; + int canc = vlc_savecancel (); while ( vlc_object_alive (p_aout) ) { @@ -597,7 +595,7 @@ static void* OSSThread( vlc_object_t *p_this ) int i_tmp, i_size; uint8_t * p_bytes; - if ( p_aout->output.output.i_format != VLC_FOURCC('s','p','d','i') ) + if ( p_aout->output.output.i_format != VLC_CODEC_SPDIFL ) { mtime_t buffered = BufferDuration( p_aout ); @@ -651,7 +649,7 @@ static void* OSSThread( vlc_object_t *p_this ) while( vlc_object_alive (p_aout) && ! ( p_buffer = aout_OutputNextBuffer( p_aout, next_date, true ) ) ) { - msleep( 1000 ); + msleep( VLC_HARD_MIN_SLEEP ); next_date = mdate(); } } @@ -659,10 +657,10 @@ static void* OSSThread( vlc_object_t *p_this ) if ( p_buffer != NULL ) { p_bytes = p_buffer->p_buffer; - i_size = p_buffer->i_nb_bytes; + i_size = p_buffer->i_buffer; /* This is theoretical ... we'll see next iteration whether * we're drifting */ - next_date += p_buffer->end_date - p_buffer->start_date; + next_date += p_buffer->i_length; } else { @@ -690,5 +688,6 @@ static void* OSSThread( vlc_object_t *p_this ) } } + vlc_restorecancel (canc); return NULL; }