X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=plugins%2Fsdl%2Faout_sdl.c;h=4db795f30388be9a6e3470e3eab53fb6335e7889;hb=9e3ab283c258cba17e4ca6730d84f9d00d49b068;hp=ac3d98cd6d63bbd9d61953c85571805461c676ab;hpb=d04b152ba136aa60f9005423eb34d9106b4581e0;p=vlc diff --git a/plugins/sdl/aout_sdl.c b/plugins/sdl/aout_sdl.c index ac3d98cd6d..4db795f303 100644 --- a/plugins/sdl/aout_sdl.c +++ b/plugins/sdl/aout_sdl.c @@ -1,7 +1,8 @@ /***************************************************************************** * aout_sdl.c : audio sdl functions library ***************************************************************************** - * Copyright (C) 1999, 2000 VideoLAN + * Copyright (C) 1999-2001 VideoLAN + * $Id: aout_sdl.c,v 1.29 2002/06/01 12:32:00 sam Exp $ * * Authors: Michel Kaempf * Samuel Hocevar @@ -25,30 +26,16 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include "defs.h" - #include /* ENOMEM */ #include /* open(), O_WRONLY */ -#include /* ioctl() */ #include /* strerror() */ #include /* write(), close() */ -#include /* "intf_msg.h" */ #include /* calloc(), malloc(), free() */ -#include /* SDL base include */ - -#include "config.h" -#include "common.h" /* boolean_t, byte_t */ -#include "threads.h" -#include "mtime.h" -#include "tests.h" - -#include "audio_output.h" /* aout_thread_t */ +#include +#include -#include "intf_msg.h" /* intf_DbgMsg(), intf_ErrMsg() */ -#include "main.h" - -#include "modules.h" +#include SDL_INCLUDE_FILE /***************************************************************************** * aout_sys_t: dsp audio output method descriptor @@ -60,22 +47,20 @@ /* the overflow limit is used to prevent the fifo from growing too big */ #define OVERFLOWLIMIT 100000 -typedef struct aout_sys_s +struct aout_sys_s { byte_t * audio_buf; int i_audio_end; - boolean_t b_active; - -} aout_sys_t; + vlc_bool_t b_active; +}; /***************************************************************************** * Local prototypes. *****************************************************************************/ -static int aout_Probe ( probedata_t *p_data ); static int aout_Open ( aout_thread_t *p_aout ); static int aout_SetFormat ( aout_thread_t *p_aout ); -static long aout_GetBufInfo ( aout_thread_t *p_aout, long l_buffer_info ); +static int aout_GetBufInfo ( aout_thread_t *p_aout, int i_buffer_info ); static void aout_Play ( aout_thread_t *p_aout, byte_t *buffer, int i_size ); static void aout_Close ( aout_thread_t *p_aout ); @@ -86,9 +71,8 @@ static void aout_SDLCallback ( void *userdata, Uint8 *stream, int len ); * Functions exported as capabilities. They are declared as static so that * we don't pollute the namespace too much. *****************************************************************************/ -void aout_getfunctions( function_list_t * p_function_list ) +void _M( aout_getfunctions )( function_list_t * p_function_list ) { - p_function_list->pf_probe = aout_Probe; p_function_list->functions.aout.pf_open = aout_Open; p_function_list->functions.aout.pf_setformat = aout_SetFormat; p_function_list->functions.aout.pf_getbufinfo = aout_GetBufInfo; @@ -96,49 +80,6 @@ void aout_getfunctions( function_list_t * p_function_list ) p_function_list->functions.aout.pf_close = aout_Close; } -/***************************************************************************** - * aout_Probe: probe the audio device and return a score - ***************************************************************************** - * This function tries to initialize SDL audio and returns a score to the - * plugin manager so that it can select the best plugin. - *****************************************************************************/ -static int aout_Probe( probedata_t *p_data ) -{ - SDL_AudioSpec desired, obtained; - - /* Start AudioSDL */ - if( SDL_Init(SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE) != 0 ) - { - intf_DbgMsg( "aout: SDL_Init failed (%s)", SDL_GetError() ); - return( 0 ); - } - - desired.freq = 11025; /* frequency */ - desired.format = AUDIO_U8; /* unsigned 8 bits */ - desired.channels = 2; /* mono */ - desired.callback = aout_SDLCallback; /* no callback function yet */ - desired.userdata = NULL; /* null parm for callback */ - desired.samples = 4096; - - /* If we were unable to open the device, there is no way we can use - * the plugin. Return a score of 0. */ - if( SDL_OpenAudio( &desired, &obtained ) < 0 ) - { - intf_DbgMsg( "aout: SDL_OpenAudio failed (%s)", SDL_GetError() ); - return( 0 ); - } - - /* Otherwise, there are good chances we can use this plugin, return 100. */ - SDL_CloseAudio(); - - if( TestMethod( AOUT_METHOD_VAR, "sdl" ) ) - { - return( 999 ); - } - - return( 50 ); -} - /***************************************************************************** * aout_Open: open the audio device ***************************************************************************** @@ -148,14 +89,36 @@ static int aout_Probe( probedata_t *p_data ) static int aout_Open( aout_thread_t *p_aout ) { SDL_AudioSpec desired; - int i_channels = p_aout->b_stereo ? 2 : 1; - /* Allocate structure */ + if( SDL_WasInit( SDL_INIT_AUDIO ) != 0 ) + { + return( 1 ); + } + + /* Allocate structure */ p_aout->p_sys = malloc( sizeof( aout_sys_t ) ); if( p_aout->p_sys == NULL ) { - intf_ErrMsg( "aout error: %s", strerror(ENOMEM) ); + msg_Err( p_aout, "out of memory" ); + return( 1 ); + } + + /* Initialize library */ + if( SDL_Init( SDL_INIT_AUDIO +#ifndef WIN32 + /* Win32 SDL implementation doesn't support SDL_INIT_EVENTTHREAD yet*/ + | SDL_INIT_EVENTTHREAD +#endif +#ifdef DEBUG + /* In debug mode you may want vlc to dump a core instead of staying + * stuck */ + | SDL_INIT_NOPARACHUTE +#endif + ) < 0 ) + { + msg_Err( p_aout, "cannot initialize SDL (%s)", SDL_GetError() ); + free( p_aout->p_sys ); return( 1 ); } @@ -163,19 +126,16 @@ static int aout_Open( aout_thread_t *p_aout ) p_aout->p_sys->audio_buf = malloc( OVERFLOWLIMIT ); /* Initialize some variables */ - p_aout->psz_device = 0; - p_aout->i_format = AOUT_FORMAT_DEFAULT; - p_aout->i_channels = 1 + main_GetIntVariable( AOUT_STEREO_VAR, - AOUT_STEREO_DEFAULT ); - p_aout->l_rate = main_GetIntVariable( AOUT_RATE_VAR, - AOUT_RATE_DEFAULT ); - - desired.freq = p_aout->l_rate; /* TODO: write conversion beetween AOUT_FORMAT_DEFAULT * AND AUDIO* from SDL. */ + desired.freq = p_aout->i_rate; +#ifdef WORDS_BIGENDIAN + desired.format = AUDIO_S16MSB; /* stereo 16 bits */ +#else desired.format = AUDIO_S16LSB; /* stereo 16 bits */ - desired.channels = i_channels; +#endif + desired.channels = p_aout->i_channels; desired.callback = aout_SDLCallback; desired.userdata = p_aout->p_sys; desired.samples = 1024; @@ -187,7 +147,9 @@ static int aout_Open( aout_thread_t *p_aout ) */ if( SDL_OpenAudio( &desired, NULL ) < 0 ) { - intf_ErrMsg( "aout error: SDL_OpenAudio failed (%s)", SDL_GetError() ); + msg_Err( p_aout, "SDL_OpenAudio failed (%s)", SDL_GetError() ); + SDL_QuitSubSystem( SDL_INIT_AUDIO ); + free( p_aout->p_sys ); return( -1 ); } @@ -209,12 +171,15 @@ static int aout_SetFormat( aout_thread_t *p_aout ) { /* TODO: finish and clean this */ SDL_AudioSpec desired; - int i_stereo = p_aout->b_stereo ? 2 : 1; /*i_format = p_aout->i_format;*/ - desired.freq = p_aout->l_rate; /* Set the output rate */ + desired.freq = p_aout->i_rate; /* Set the output rate */ +#ifdef WORDS_BIGENDIAN + desired.format = AUDIO_S16MSB; /* stereo 16 bits */ +#else desired.format = AUDIO_S16LSB; /* stereo 16 bits */ - desired.channels = i_stereo; +#endif + desired.channels = p_aout->i_channels; desired.callback = aout_SDLCallback; desired.userdata = p_aout->p_sys; desired.samples = 2048; @@ -239,16 +204,16 @@ static int aout_SetFormat( aout_thread_t *p_aout ) * aout_GetBufInfo: buffer status query ***************************************************************************** * returns the number of bytes in the audio buffer compared to the size of - * l_buffer_limit... + * i_buffer_limit... *****************************************************************************/ -static long aout_GetBufInfo( aout_thread_t *p_aout, long l_buffer_limit ) +static int aout_GetBufInfo( aout_thread_t *p_aout, int i_buffer_limit ) { - if(l_buffer_limit > p_aout->p_sys->i_audio_end) + if(i_buffer_limit > p_aout->p_sys->i_audio_end) { /* returning 0 here juste gives awful sound in the speakers :/ */ - return( l_buffer_limit ); + return( i_buffer_limit ); } - return( p_aout->p_sys->i_audio_end - l_buffer_limit); + return( p_aout->p_sys->i_audio_end - i_buffer_limit); } /***************************************************************************** @@ -289,6 +254,8 @@ static void aout_Close( aout_thread_t *p_aout ) SDL_CloseAudio(); + SDL_QuitSubSystem( SDL_INIT_AUDIO ); + free( p_aout->p_sys ); /* Close the Output. */ } @@ -297,11 +264,11 @@ static void aout_Close( aout_thread_t *p_aout ) *****************************************************************************/ static void aout_SDLCallback( void *userdata, byte_t *stream, int len ) { - struct aout_sys_s * p_sys = userdata; + aout_sys_t * p_sys = userdata; if( p_sys->i_audio_end > OVERFLOWLIMIT ) { - intf_ErrMsg( "aout error: aout_SDLCallback overflowed" ); +//X msg_Err( p_aout, "aout_SDLCallback overflowed" ); free( p_sys->audio_buf ); p_sys->audio_buf = NULL;