diff options
author | Uoti Urpala <uau@mplayer2.org> | 2012-03-25 22:58:48 +0300 |
---|---|---|
committer | Uoti Urpala <uau@mplayer2.org> | 2012-03-26 03:55:31 +0300 |
commit | a0de4bc5000823c058aab6b02a7fdfb48275cb32 (patch) | |
tree | 799a49605b04f39e2bc79604f0d93727a43e167d /libao2 | |
parent | 4fed8ad19771f6c3cfdd01414ba11456007fd9b8 (diff) |
ao_pulse, core: make pulse thread wake up core for more data
For ao_pulse, the current latency is not a good indicator of how soon
the AO requires new data to avoid underflow. Add an internal pipe that
can be used to wake up the input loop from select(), and make the
pulseaudio main loop (which runs in a separate thread) use this
mechanism when pulse requests more data. The wakeup signal currently
contains no information about the reason for the wakup, but audio
buffers are always filled when the event loop wakes up.
Also, request a latency of 1 second from the Pulseaudio server. The
default is normally significantly higher. We don't need low latency,
while higher latency helps prevent underflows reduces need for
wakeups.
Diffstat (limited to 'libao2')
-rw-r--r-- | libao2/ao_pulse.c | 12 | ||||
-rw-r--r-- | libao2/audio_out.c | 5 | ||||
-rw-r--r-- | libao2/audio_out.h | 3 |
3 files changed, 15 insertions, 5 deletions
diff --git a/libao2/ao_pulse.c b/libao2/ao_pulse.c index 659a2bc907..ddaf35716c 100644 --- a/libao2/ao_pulse.c +++ b/libao2/ao_pulse.c @@ -30,6 +30,7 @@ #include "libaf/af_format.h" #include "mp_msg.h" #include "audio_out.h" +#include "input/input.h" #define PULSE_CLIENT_NAME "mplayer2" @@ -84,6 +85,7 @@ static void stream_request_cb(pa_stream *s, size_t length, void *userdata) { struct ao *ao = userdata; struct priv *priv = ao->priv; + mp_input_wakeup(ao->input_ctx); pa_threaded_mainloop_signal(priv->mainloop, 0); } @@ -263,8 +265,14 @@ static int init(struct ao *ao, char *params) pa_stream_set_write_callback(priv->stream, stream_request_cb, ao); pa_stream_set_latency_update_callback(priv->stream, stream_latency_update_cb, ao); - - if (pa_stream_connect_playback(priv->stream, sink, NULL, + pa_buffer_attr bufattr = { + .maxlength = -1, + .tlength = pa_usec_to_bytes(1000000, &ss), + .prebuf = -1, + .minreq = -1, + .fragsize = -1, + }; + if (pa_stream_connect_playback(priv->stream, sink, &bufattr, PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE, NULL, NULL) < 0) diff --git a/libao2/audio_out.c b/libao2/audio_out.c index a91a0d6d72..6130e2ed33 100644 --- a/libao2/audio_out.c +++ b/libao2/audio_out.c @@ -136,10 +136,11 @@ void list_audio_out(void) mp_msg(MSGT_GLOBAL, MSGL_INFO,"\n"); } -struct ao *ao_create(void) +struct ao *ao_create(struct MPOpts *opts, struct input_ctx *input) { struct ao *r = talloc(NULL, struct ao); - *r = (struct ao){.outburst = OUTBURST, .buffersize = -1}; + *r = (struct ao){.outburst = OUTBURST, .buffersize = -1, + .opts = opts, .input_ctx = input }; return r; } diff --git a/libao2/audio_out.h b/libao2/audio_out.h index cbd913656b..1c472565a0 100644 --- a/libao2/audio_out.h +++ b/libao2/audio_out.h @@ -81,6 +81,7 @@ struct ao { const struct ao_driver *driver; void *priv; struct MPOpts *opts; + struct input_ctx *input_ctx; }; extern char *ao_subdevice; @@ -109,7 +110,7 @@ typedef struct ao_control_vol { float right; } ao_control_vol_t; -struct ao *ao_create(void); +struct ao *ao_create(struct MPOpts *opts, struct input_ctx *input); void ao_init(struct ao *ao, char **ao_list); void ao_uninit(struct ao *ao, bool cut_audio); int ao_play(struct ao *ao, void *data, int len, int flags); |