add_shortcut( "pulseaudio" )
add_shortcut( "pa" )
set_callbacks( Open, Close )
+ linked_with_a_crap_library_which_uses_atexit()
vlc_module_end ()
/*****************************************************************************
struct pa_channel_map map;
/* Allocate structures */
- p_aout->output.p_sys = p_sys = malloc( sizeof( aout_sys_t ) );
+ p_aout->output.p_sys = p_sys = calloc( 1, sizeof( aout_sys_t ) );
if( p_sys == NULL )
return VLC_ENOMEM;
- memset( p_sys, 0, sizeof( aout_sys_t ) );
PULSE_DEBUG( "Pulse start initialization");
ss.rate = p_aout->output.output.i_rate;
ss.format = PA_SAMPLE_FLOAT32NE;
- p_aout->output.output.i_format = VLC_FOURCC('f','l','3','2');
+ p_aout->output.output.i_format = VLC_CODEC_FL32;
if (!pa_sample_spec_valid(&ss)) {
msg_Err(p_aout,"Invalid sample spec");
goto fail;
}
- a.maxlength = pa_bytes_per_second(&ss)/4/pa_frame_size(&ss);
- a.tlength = a.maxlength*9/10;
- a.prebuf = a.tlength/2;
- a.minreq = a.tlength/10;
-
- a.maxlength *= pa_frame_size(&ss);
- a.tlength *= pa_frame_size(&ss);
- a.prebuf *= pa_frame_size(&ss);
- a.minreq *= pa_frame_size(&ss);
+ /* Reduce overall latency to 200mS to reduce audible clicks
+ * Also pulse minreq and internal buffers are now 20mS which reduces resampling
+ */
+ a.tlength = pa_bytes_per_second(&ss)/5;
+ a.maxlength = a.tlength * 2;
+ a.prebuf = a.tlength / 2;
+ a.minreq = a.tlength / 10;
+ /* Buffer size is 20mS */
p_sys->buffer_size = a.minreq;
/* Initialise the speaker map setup above */
pa_stream_set_write_callback(p_sys->stream, stream_request_cb, p_aout);
pa_stream_set_latency_update_callback(p_sys->stream, stream_latency_update_cb, p_aout);
- if (pa_stream_connect_playback(p_sys->stream, NULL, &a, PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE, NULL, NULL) < 0) {
+ if (pa_stream_connect_playback(p_sys->stream, NULL, &a, PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE|PA_STREAM_ADJUST_LATENCY, NULL, NULL) < 0) {
msg_Err(p_aout, "Failed to connect stream: %s", pa_strerror(pa_context_errno(p_sys->context)));
goto unlock_and_fail;
}
latency = 0;
}
+
PULSE_DEBUG( "Pulse stream request latency=%"PRId64"", latency);
next_date = mdate() + latency;
-
if(p_sys->start_date < next_date + AOUT_PTS_TOLERANCE ){
- /*
- vlc_mutex_lock( &p_aout->output_fifo_lock );
- p_buffer = aout_FifoPop( p_aout, &p_aout->output.fifo );
- vlc_mutex_unlock( &p_aout->output_fifo_lock );
- */
p_buffer = aout_OutputNextBuffer( p_aout, next_date, 0);
}
}