#include <vlc_cpu.h>
#include <pulse/pulseaudio.h>
+#ifdef HAVE_X11_XLIB_H
+# include <X11/Xlib.h>
+#endif
#include <assert.h>
* Module descriptor
*****************************************************************************/
vlc_module_begin ()
- set_shortname( "Pulse Audio" )
+ set_shortname( "PulseAudio" )
set_description( N_("Pulseaudio audio output") )
set_capability( "audio output", 160 )
set_category( CAT_AUDIO )
add_shortcut( "pulseaudio" )
add_shortcut( "pa" )
set_callbacks( Open, Close )
- linked_with_a_crap_library_which_uses_atexit()
vlc_module_end ()
/*****************************************************************************
struct pa_buffer_attr a;
struct pa_channel_map map;
+#ifdef HAVE_X11_XLIB_H
+ if( !XInitThreads() )
+ return VLC_EGENERIC;
+#endif
/* Allocate structures */
p_aout->output.p_sys = p_sys = calloc( 1, sizeof( aout_sys_t ) );
if( p_sys == NULL )
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;
}
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;
}
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))){
+/* I didn't find any explanation why we need to do pa_stream_drain on close
+ * as we don't really care if we lose 20ms buffer in this point anyway?
+ * And disabling this speeds up closing pulseaudio quite a lot (atleast for me).
+ */
+#if 0
+ pa_operation *o = pa_stream_drain(p_sys->stream, success_cb, p_aout);
+ if(o){
while (pa_operation_get_state(o) != PA_OPERATION_DONE) {
CHECK_DEAD_GOTO(fail);
pa_threaded_mainloop_wait(p_sys->mainloop);
pa_operation_unref(o);
}
-
+#endif
pa_threaded_mainloop_unlock(p_sys->mainloop);
}
uninit(p_aout);
}
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;
}
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;
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;