*****************************************************************************/
typedef struct
{
- aout_instance_t *p_aout;
+ audio_output_t *p_aout;
vlc_thread_t thread;
vlc_cond_t wait;
struct aout_sys_t
{
- aout_instance_t *p_aout;
+ aout_packet_t packet;
+ audio_output_t *p_aout;
PaStream *p_stream;
PaDeviceIndex i_devices;
*****************************************************************************/
static int Open ( vlc_object_t * );
static void Close ( vlc_object_t * );
-static void Play ( aout_instance_t * );
+static void Play ( audio_output_t *, block_t * );
-static int PAOpenDevice( aout_instance_t * );
-static int PAOpenStream( aout_instance_t * );
+static int PAOpenDevice( audio_output_t * );
+static int PAOpenStream( audio_output_t * );
/*****************************************************************************
* Module descriptor
set_subcategory( SUBCAT_AUDIO_AOUT )
add_integer( "portaudio-audio-device", 0,
DEVICE_TEXT, DEVICE_LONGTEXT, false )
- add_deprecated_alias( "portaudio-device" ) /* deprecated since 0.9.3 */
set_capability( "audio output", 0 )
set_callbacks( Open, Close )
vlc_module_end ()
VLC_UNUSED( inputBuffer ); VLC_UNUSED( statusFlags );
struct aout_sys_t *p_sys = (struct aout_sys_t*) p_cookie;
- aout_instance_t *p_aout = p_sys->p_aout;
+ audio_output_t *p_aout = p_sys->p_aout;
aout_buffer_t *p_buffer;
mtime_t out_date;
out_date = mdate() + (mtime_t) ( 1000000 *
( paDate->outputBufferDacTime - paDate->currentTime ) );
- p_buffer = aout_OutputNextBuffer( p_aout, out_date, true );
+ p_buffer = aout_PacketNext( p_aout, out_date );
if ( p_buffer != NULL )
{
}
vlc_memcpy( outputBuffer, p_buffer->p_buffer,
framesPerBuffer * p_sys->i_sample_size );
- /* aout_BufferFree may be dangereous here, but then so is
- * aout_OutputNextBuffer (calls aout_BufferFree internally).
- * one solution would be to link the no longer useful buffers
- * in a second fifo (in aout_OutputNextBuffer too) and to
- * wait until we are in Play to do the actual free.
- */
aout_BufferFree( p_buffer );
}
else
*****************************************************************************/
static int Open( vlc_object_t * p_this )
{
- aout_instance_t *p_aout = (aout_instance_t *)p_this;
+ audio_output_t *p_aout = (audio_output_t *)p_this;
struct aout_sys_t * p_sys;
msg_Dbg( p_aout, "entering Open()");
return VLC_ENOMEM;
p_sys->p_aout = p_aout;
p_sys->p_stream = 0;
- p_aout->output.p_sys = p_sys;
- p_aout->output.pf_play = Play;
- p_aout->output.pf_pause = NULL;
+ p_aout->sys = p_sys;
+ p_aout->pf_play = aout_PacketPlay;
+ p_aout->pf_pause = aout_PacketPause;
+ p_aout->pf_flush = aout_PacketFlush;
/* Retrieve output device id from config */
p_sys->i_device_id = var_CreateGetInteger( p_aout, "portaudio-audio-device" );
*****************************************************************************/
static void Close ( vlc_object_t *p_this )
{
- aout_instance_t *p_aout = (aout_instance_t *)p_this;
- aout_sys_t *p_sys = p_aout->output.p_sys;
+ audio_output_t *p_aout = (audio_output_t *)p_this;
+ aout_sys_t *p_sys = p_aout->sys;
msg_Dbg( p_aout, "closing portaudio");
#endif
msg_Dbg( p_aout, "portaudio closed");
+ aout_PacketDestroy( p_aout );
free( p_sys );
}
-static int PAOpenDevice( aout_instance_t *p_aout )
+static int PAOpenDevice( audio_output_t *p_aout )
{
- aout_sys_t *p_sys = p_aout->output.p_sys;
+ aout_sys_t *p_sys = p_aout->sys;
const PaDeviceInfo *p_pdi;
PaError i_err;
vlc_value_t val, text;
}
/* Audio format is paFloat32 (always supported by portaudio v19) */
- p_aout->output.output.i_format = VLC_CODEC_FL32;
+ p_aout->format.i_format = VLC_CODEC_FL32;
return VLC_SUCCESS;
return VLC_EGENERIC;
}
-static int PAOpenStream( aout_instance_t *p_aout )
+static int PAOpenStream( audio_output_t *p_aout )
{
- aout_sys_t *p_sys = p_aout->output.p_sys;
+ aout_sys_t *p_sys = p_aout->sys;
const PaHostErrorInfo* paLastHostErrorInfo = Pa_GetLastHostErrorInfo();
PaStreamParameters paStreamParameters;
vlc_value_t val;
if( val.i_int == AOUT_VAR_5_1 )
{
- p_aout->output.output.i_physical_channels
+ p_aout->format.i_physical_channels
= AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
| AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT
| AOUT_CHAN_LFE;
}
else if( val.i_int == AOUT_VAR_3F2R )
{
- p_aout->output.output.i_physical_channels
+ p_aout->format.i_physical_channels
= AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
| AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
}
else if( val.i_int == AOUT_VAR_2F2R )
{
- p_aout->output.output.i_physical_channels
+ p_aout->format.i_physical_channels
= AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
| AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
}
else if( val.i_int == AOUT_VAR_MONO )
{
- p_aout->output.output.i_physical_channels = AOUT_CHAN_CENTER;
+ p_aout->format.i_physical_channels = AOUT_CHAN_CENTER;
}
else
{
- p_aout->output.output.i_physical_channels
+ p_aout->format.i_physical_channels
= AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
}
- i_channels = aout_FormatNbChannels( &p_aout->output.output );
+ i_channels = aout_FormatNbChannels( &p_aout->format );
msg_Dbg( p_aout, "nb_channels requested = %d", i_channels );
- i_channel_mask = p_aout->output.output.i_physical_channels;
+ i_channel_mask = p_aout->format.i_physical_channels;
/* Calculate the frame size in bytes */
p_sys->i_sample_size = 4 * i_channels;
- p_aout->output.i_nb_samples = FRAME_SIZE;
- aout_FormatPrepare( &p_aout->output.output );
+ aout_FormatPrepare( &p_aout->format );
+ aout_PacketInit( p_aout, &p_sys->packet, FRAME_SIZE );
aout_VolumeSoftInit( p_aout );
/* Check for channel reordering */
- p_aout->output.p_sys->i_channel_mask = i_channel_mask;
- p_aout->output.p_sys->i_bits_per_sample = 32; /* forced to paFloat32 */
- p_aout->output.p_sys->i_channels = i_channels;
+ p_aout->sys->i_channel_mask = i_channel_mask;
+ p_aout->sys->i_bits_per_sample = 32; /* forced to paFloat32 */
+ p_aout->sys->i_channels = i_channels;
- p_aout->output.p_sys->b_chan_reorder =
+ p_aout->sys->b_chan_reorder =
aout_CheckChannelReorder( NULL, pi_channels_out,
i_channel_mask, i_channels,
- p_aout->output.p_sys->pi_chan_table );
+ p_aout->sys->pi_chan_table );
- if( p_aout->output.p_sys->b_chan_reorder )
+ if( p_aout->sys->b_chan_reorder )
{
msg_Dbg( p_aout, "channel reordering needed" );
}
paStreamParameters.hostApiSpecificStreamInfo = NULL;
i_err = Pa_OpenStream( &p_sys->p_stream, NULL /* no input */,
- &paStreamParameters, (double)p_aout->output.output.i_rate,
+ &paStreamParameters, (double)p_aout->format.i_rate,
FRAME_SIZE, paClipOff, paCallback, p_sys );
if( i_err != paNoError )
{
paLastHostErrorInfo->errorText );
}
p_sys->p_stream = 0;
+ aout_PacketDestroy( p_aout );
return VLC_EGENERIC;
}
{
msg_Err( p_aout, "Pa_StartStream() failed" );
Pa_CloseStream( p_sys->p_stream );
+ aout_PacketDestroy( p_aout );
return VLC_EGENERIC;
}
return VLC_SUCCESS;
}
-/*****************************************************************************
- * Play: play sound
- *****************************************************************************/
-static void Play( aout_instance_t * p_aout )
-{
- VLC_UNUSED( p_aout );
-}
-
#ifdef PORTAUDIO_IS_SERIOUSLY_BROKEN
/*****************************************************************************
* PORTAUDIOThread: all interactions with libportaudio.a are handled
static void* PORTAUDIOThread( void *data )
{
pa_thread_t *pa_thread = (pa_thread_t*)data;
- aout_instance_t *p_aout;
+ audio_output_t *p_aout;
aout_sys_t *p_sys;
int i_err;
int canc = vlc_savecancel ();
pa_thread->b_signal = false;
p_aout = pa_thread->p_aout;
- p_sys = p_aout->output.p_sys;
+ p_sys = p_aout->sys;
if( PAOpenDevice( p_aout ) != VLC_SUCCESS )
{