X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Foss.c;h=04d06d0f5f794377e9fb1b8e11b6b941f9c0bee1;hb=1f8010321a609bcadaa56a17f0805f6e90f46764;hp=61999f0dc7693274d4b421d9f779ca6a83eb5879;hpb=fa4bde0b26a6c7a2a617362ea0b17144686e39fe;p=vlc diff --git a/modules/access/oss.c b/modules/access/oss.c index 61999f0dc7..04d06d0f5f 100644 --- a/modules/access/oss.c +++ b/modules/access/oss.c @@ -1,7 +1,7 @@ /***************************************************************************** * oss.c : OSS input module for vlc ***************************************************************************** - * Copyright (C) 2002-2009 the VideoLAN team + * Copyright (C) 2002-2009 VLC authors and VideoLAN * $Id$ * * Authors: Benjamin Pracht @@ -9,19 +9,19 @@ * Antoine Cellerier * Dennis Lou * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -36,16 +36,20 @@ #include #include #include -#include -#include +#include -#include +#include #include #include #include #include -#include +#ifdef HAVE_SYS_SOUNDCARD_H +# include +#endif +#ifdef HAVE_SOUNDCARD_H +# include +#endif #include @@ -64,11 +68,6 @@ static void DemuxClose( vlc_object_t * ); #define SAMPLERATE_LONGTEXT N_( \ "Samplerate of the captured audio stream, in Hz (eg: 11025, 22050, 44100, 48000)" ) -#define CACHING_TEXT N_("Caching value in ms") -#define CACHING_LONGTEXT N_( \ - "Caching value for OSS captures. This " \ - "value should be set in milliseconds." ) - #define OSS_DEFAULT "/dev/dsp" #define CFG_PREFIX "oss-" @@ -83,12 +82,10 @@ vlc_module_begin () set_capability( "access_demux", 10 ) set_callbacks( DemuxOpen, DemuxClose ) - add_bool( CFG_PREFIX "stereo", true, NULL, STEREO_TEXT, STEREO_LONGTEXT, + add_bool( CFG_PREFIX "stereo", true, STEREO_TEXT, STEREO_LONGTEXT, true ) - add_integer( CFG_PREFIX "samplerate", 48000, NULL, SAMPLERATE_TEXT, + add_integer( CFG_PREFIX "samplerate", 48000, SAMPLERATE_TEXT, SAMPLERATE_LONGTEXT, true ) - add_integer( CFG_PREFIX "caching", DEFAULT_PTS_DELAY / 1000, NULL, - CACHING_TEXT, CACHING_LONGTEXT, true ) vlc_module_end () /***************************************************************************** @@ -118,7 +115,6 @@ struct demux_sys_t int i_fd; /* Audio */ - int i_cache; unsigned int i_sample_rate; bool b_stereo; size_t i_max_frame_size; @@ -167,16 +163,15 @@ static int DemuxOpen( vlc_object_t *p_this ) p_demux->p_sys = p_sys = calloc( 1, sizeof( demux_sys_t ) ); if( p_sys == NULL ) return VLC_ENOMEM; - p_sys->i_sample_rate = var_CreateGetInteger( p_demux, CFG_PREFIX "samplerate" ); - p_sys->b_stereo = var_CreateGetBool( p_demux, CFG_PREFIX "stereo" ); - p_sys->i_cache = var_CreateGetInteger( p_demux, CFG_PREFIX "caching" ); + p_sys->i_sample_rate = var_InheritInteger( p_demux, CFG_PREFIX "samplerate" ); + p_sys->b_stereo = var_InheritBool( p_demux, CFG_PREFIX "stereo" ); p_sys->i_fd = -1; p_sys->p_es = NULL; p_sys->p_block = NULL; p_sys->i_next_demux_date = -1; - if( p_demux->psz_path && *p_demux->psz_path ) - p_sys->psz_device = p_demux->psz_path; + if( p_demux->psz_location && *p_demux->psz_location ) + p_sys->psz_device = p_demux->psz_location; else p_sys->psz_device = OSS_DEFAULT; @@ -217,7 +212,6 @@ static int DemuxControl( demux_t *p_demux, int i_query, va_list args ) /* Special for access_demux */ case DEMUX_CAN_PAUSE: case DEMUX_CAN_SEEK: - case DEMUX_SET_PAUSE_STATE: case DEMUX_CAN_CONTROL_PACE: pb = (bool*)va_arg( args, bool * ); *pb = false; @@ -225,7 +219,8 @@ static int DemuxControl( demux_t *p_demux, int i_query, va_list args ) case DEMUX_GET_PTS_DELAY: pi64 = (int64_t*)va_arg( args, int64_t * ); - *pi64 = (int64_t)p_sys->i_cache * 1000; + *pi64 = INT64_C(1000) + * var_InheritInteger( p_demux, "live-caching" ); return VLC_SUCCESS; case DEMUX_GET_TIME: @@ -268,8 +263,10 @@ static int Demux( demux_t *p_demux ) } /* Wait for data */ - if( poll( &fd, 1, 500 ) ) /* Timeout after 0.5 seconds since I don't know if pf_demux can be blocking. */ + if( poll( &fd, 1, 10 ) ) /* Timeout after 0.01 seconds. Bigger delays are an issue when used with/as an input-slave since all the inputs run in the same thread. */ { + if( errno == EINTR ) + continue; if( fd.revents & (POLLIN|POLLPRI) ) { p_block = GrabAudio( p_demux ); @@ -297,12 +294,12 @@ static block_t* GrabAudio( demux_t *p_demux ) block_t *p_block; if( p_sys->p_block ) p_block = p_sys->p_block; - else p_block = block_New( p_demux, p_sys->i_max_frame_size ); + else p_block = block_Alloc( p_sys->i_max_frame_size ); if( !p_block ) { msg_Warn( p_demux, "cannot get block" ); - return 0; + return NULL; } p_sys->p_block = p_block; @@ -310,10 +307,10 @@ static block_t* GrabAudio( demux_t *p_demux ) i_read = read( p_sys->i_fd, p_block->p_buffer, p_sys->i_max_frame_size ); - if( i_read <= 0 ) return 0; + if( i_read <= 0 ) return NULL; p_block->i_buffer = i_read; - p_sys->p_block = 0; + p_sys->p_block = NULL; /* Correct the date because of kernel buffering */ i_correct = i_read; @@ -338,7 +335,7 @@ static int OpenAudioDevOss( demux_t *p_demux ) int i_fd; int i_format; - i_fd = open( p_demux->p_sys->psz_device, O_RDONLY | O_NONBLOCK ); + i_fd = vlc_open( p_demux->p_sys->psz_device, O_RDONLY | O_NONBLOCK ); if( i_fd < 0 ) { @@ -392,7 +389,7 @@ static int OpenAudioDev( demux_t *p_demux ) p_sys->i_sample_rate ); es_format_t fmt; - es_format_Init( &fmt, AUDIO_ES, VLC_FOURCC('a','r','a','w') ); + es_format_Init( &fmt, AUDIO_ES, VLC_CODEC_S16L ); fmt.audio.i_channels = p_sys->b_stereo ? 2 : 1; fmt.audio.i_rate = p_sys->i_sample_rate; @@ -414,7 +411,7 @@ static int OpenAudioDev( demux_t *p_demux ) static bool ProbeAudioDevOss( demux_t *p_demux, const char *psz_device ) { int i_caps; - int i_fd = open( psz_device, O_RDONLY | O_NONBLOCK ); + int i_fd = vlc_open( psz_device, O_RDONLY | O_NONBLOCK ); if( i_fd < 0 ) {