X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_output%2Fpulse.c;h=4a239640a6ce841c201f26baaf706ef38878b4f4;hb=77dd16bace3e70599cab1a36fe94565bca717227;hp=bacd55ca2343ebe32be8f12aef1e09732acc31d3;hpb=52c18c4dec68158eedd655e0502820b7d7b6128f;p=vlc diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c index bacd55ca23..4a239640a6 100644 --- a/modules/audio_output/pulse.c +++ b/modules/audio_output/pulse.c @@ -31,8 +31,13 @@ #include #include +#include #include +#ifdef X_DISPLAY_MISSING +# error Xlib required due to PulseAudio bug 799! +#endif +#include #include @@ -58,8 +63,6 @@ struct aout_sys_t mtime_t start_date; }; -#define PULSE_CLIENT_NAME N_("VLC media player") - #if 0 #define PULSE_DEBUG( ...) \ msg_Dbg( p_aout, __VA_ARGS__ ) @@ -95,15 +98,13 @@ static void uninit(aout_instance_t *p_aout); * Module descriptor *****************************************************************************/ vlc_module_begin () - set_shortname( "Pulse Audio" ) + set_shortname( "PulseAudio" ) set_description( N_("Pulseaudio audio output") ) - set_capability( "audio output", 40 ) + set_capability( "audio output", 160 ) set_category( CAT_AUDIO ) set_subcategory( SUBCAT_AUDIO_AOUT ) - add_shortcut( "pulseaudio" ) - add_shortcut( "pa" ) + add_shortcut( "pulseaudio", "pa" ) set_callbacks( Open, Close ) - linked_with_a_crap_library_which_uses_atexit() vlc_module_end () /***************************************************************************** @@ -117,6 +118,10 @@ static int Open ( vlc_object_t *p_this ) const struct pa_buffer_attr *buffer_attr; struct pa_buffer_attr a; struct pa_channel_map map; + char * p_client_name; + + if( !vlc_xlib_init( p_this ) ) + return VLC_EGENERIC; /* Allocate structures */ p_aout->output.p_sys = p_sys = calloc( 1, sizeof( aout_sys_t ) ); @@ -165,11 +170,19 @@ static int Open ( vlc_object_t *p_this ) } /* Add a quick command line info message */ - msg_Info(p_aout, "No. of Audio Channels: %d", ss.channels); + msg_Dbg(p_aout, "%d audio channels", ss.channels); ss.rate = p_aout->output.output.i_rate; - ss.format = PA_SAMPLE_FLOAT32NE; - p_aout->output.output.i_format = VLC_CODEC_FL32; + if (HAVE_FPU) + { + ss.format = PA_SAMPLE_FLOAT32NE; + p_aout->output.output.i_format = VLC_CODEC_FL32; + } + else + { + ss.format = PA_SAMPLE_S16NE; + p_aout->output.output.i_format = VLC_CODEC_S16N; + } if (!pa_sample_spec_valid(&ss)) { msg_Err(p_aout,"Invalid sample spec"); @@ -181,7 +194,7 @@ static int Open ( vlc_object_t *p_this ) */ a.tlength = pa_bytes_per_second(&ss)/5; a.maxlength = a.tlength * 2; - a.prebuf = a.tlength; + a.prebuf = a.tlength / 2; a.minreq = a.tlength / 10; /* Buffer size is 20mS */ @@ -195,7 +208,15 @@ static int Open ( vlc_object_t *p_this ) goto fail; } - if (!(p_sys->context = pa_context_new(pa_threaded_mainloop_get_api(p_sys->mainloop), _( PULSE_CLIENT_NAME )))) { + if ((p_client_name = var_InheritString(p_aout, "user-agent")) == NULL) { + msg_Err(p_aout, "No user-agent string available."); + goto fail; + } + + p_sys->context = pa_context_new(pa_threaded_mainloop_get_api(p_sys->mainloop), p_client_name); + free(p_client_name); + if(!p_sys->context) + { msg_Err(p_aout, "Failed to allocate context"); goto fail; } @@ -224,7 +245,7 @@ static int Open ( vlc_object_t *p_this ) pa_threaded_mainloop_wait(p_sys->mainloop); if (pa_context_get_state(p_sys->context) != PA_CONTEXT_READY) { - msg_Err(p_aout, "Failed to connect to server: %s", pa_strerror(pa_context_errno(p_sys->context))); + msg_Dbg(p_aout, "Failed to connect to server: %s", pa_strerror(pa_context_errno(p_sys->context))); goto unlock_and_fail; } @@ -288,7 +309,7 @@ unlock_and_fail: if (p_sys->mainloop) pa_threaded_mainloop_unlock(p_sys->mainloop); fail: - msg_Err(p_aout, "Pulse initialization failed"); + msg_Dbg(p_aout, "Pulse initialization failed"); uninit(p_aout); return VLC_EGENERIC; } @@ -300,21 +321,15 @@ static void Play( aout_instance_t * p_aout ) { struct aout_sys_t * p_sys = (struct aout_sys_t *) p_aout->output.p_sys; - pa_operation *o; - if(!p_sys->started){ msg_Dbg(p_aout, "Pulse stream started"); + pa_threaded_mainloop_lock(p_sys->mainloop); p_sys->start_date = aout_FifoFirstDate( p_aout, &p_aout->output.fifo ); p_sys->started = 1; - pa_threaded_mainloop_lock(p_sys->mainloop); - if((o = pa_stream_flush(p_sys->stream, success_cb, p_aout))){ - pa_operation_unref(o); - } - pa_threaded_mainloop_unlock(p_sys->mainloop); - pa_threaded_mainloop_signal(p_sys->mainloop, 0); + pa_threaded_mainloop_unlock(p_sys->mainloop); } } @@ -329,20 +344,20 @@ static void Close ( vlc_object_t *p_this ) msg_Dbg(p_aout, "Pulse Close"); if(p_sys->stream){ - pa_operation *o; pa_threaded_mainloop_lock(p_sys->mainloop); pa_stream_set_write_callback(p_sys->stream, NULL, NULL); - if((o = pa_stream_drain(p_sys->stream, success_cb, p_aout))){ - while (pa_operation_get_state(o) != PA_OPERATION_DONE) { - CHECK_DEAD_GOTO(fail); - pa_threaded_mainloop_wait(p_sys->mainloop); - } + pa_operation *o; - fail: + o = pa_stream_flush(p_sys->stream, success_cb, p_aout); + while( pa_operation_get_state(o) == PA_OPERATION_RUNNING ) + pa_threaded_mainloop_wait(p_sys->mainloop); + pa_operation_unref(o); - pa_operation_unref(o); - } + o = pa_stream_drain(p_sys->stream, success_cb, p_aout); + while( pa_operation_get_state(o) == PA_OPERATION_RUNNING ) + pa_threaded_mainloop_wait(p_sys->mainloop); + pa_operation_unref(o); pa_threaded_mainloop_unlock(p_sys->mainloop); } @@ -424,6 +439,7 @@ static void stream_state_cb(pa_stream *s, void * userdata) { } static void stream_request_cb(pa_stream *s, size_t length, void *userdata) { + VLC_UNUSED( s ); aout_instance_t *p_aout = (aout_instance_t *)userdata; struct aout_sys_t * p_sys = (struct aout_sys_t *) p_aout->output.p_sys; mtime_t next_date; @@ -458,9 +474,9 @@ static void stream_request_cb(pa_stream *s, size_t length, void *userdata) { if ( p_buffer != NULL ) { - PULSE_DEBUG( "Pulse stream request write buffer %d", p_buffer->i_nb_bytes); - pa_stream_write(p_sys->stream, p_buffer->p_buffer, p_buffer->i_nb_bytes, NULL, 0, PA_SEEK_RELATIVE); - length -= p_buffer->i_nb_bytes; + PULSE_DEBUG( "Pulse stream request write buffer %d", p_buffer->i_buffer); + pa_stream_write(p_sys->stream, p_buffer->p_buffer, p_buffer->i_buffer, NULL, 0, PA_SEEK_RELATIVE); + length -= p_buffer->i_buffer; aout_BufferFree( p_buffer ); } else @@ -477,6 +493,7 @@ static void stream_request_cb(pa_stream *s, size_t length, void *userdata) { } static void stream_latency_update_cb(pa_stream *s, void *userdata) { + VLC_UNUSED( s ); aout_instance_t *p_aout = (aout_instance_t *)userdata; struct aout_sys_t * p_sys = (struct aout_sys_t *) p_aout->output.p_sys; @@ -489,6 +506,7 @@ static void stream_latency_update_cb(pa_stream *s, void *userdata) { static void success_cb(pa_stream *s, int sucess, void *userdata) { + VLC_UNUSED( s ); aout_instance_t *p_aout = (aout_instance_t *)userdata; struct aout_sys_t * p_sys = (struct aout_sys_t *) p_aout->output.p_sys;