/*****************************************************************************
* 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 <maxx@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
/*****************************************************************************
* Preamble
*****************************************************************************/
-#include "defs.h"
-
#include <errno.h> /* ENOMEM */
#include <fcntl.h> /* open(), O_WRONLY */
-#include <sys/ioctl.h> /* ioctl() */
#include <string.h> /* strerror() */
#include <unistd.h> /* write(), close() */
-#include <stdio.h> /* "intf_msg.h" */
#include <stdlib.h> /* calloc(), malloc(), free() */
-#include <SDL/SDL.h> /* 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 <vlc/vlc.h>
+#include <vlc/aout.h>
-#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
/* 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 );
* 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;
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
*****************************************************************************
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 );
}
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;
*/
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 );
}
{
/* 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;
* 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);
}
/*****************************************************************************
SDL_CloseAudio();
+ SDL_QuitSubSystem( SDL_INIT_AUDIO );
+
free( p_aout->p_sys ); /* Close the Output. */
}
*****************************************************************************/
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;