diff options
Diffstat (limited to 'audio/out/ao_pulse.c')
-rw-r--r-- | audio/out/ao_pulse.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/audio/out/ao_pulse.c b/audio/out/ao_pulse.c index a4da2a179b..f1800f279c 100644 --- a/audio/out/ao_pulse.c +++ b/audio/out/ao_pulse.c @@ -286,6 +286,8 @@ static int init(struct ao *ao) ss.channels = ao->channels.num; ss.rate = ao->samplerate; + ao->format = af_fmt_from_planar(ao->format); + const struct format_map *fmt_map = format_maps; while (fmt_map->mp_format != ao->format) { if (fmt_map->mp_format == AF_FORMAT_UNKNOWN) { @@ -375,14 +377,14 @@ static void cork(struct ao *ao, bool pause) } // Play the specified data to the pulseaudio server -static int play(struct ao *ao, void *data, int len, int flags) +static int play(struct ao *ao, void **data, int samples, int flags) { struct priv *priv = ao->priv; pa_threaded_mainloop_lock(priv->mainloop); - if (pa_stream_write(priv->stream, data, len, NULL, 0, + if (pa_stream_write(priv->stream, data[0], samples * ao->sstride, NULL, 0, PA_SEEK_RELATIVE) < 0) { GENERIC_ERR_MSG("pa_stream_write() failed"); - len = -1; + samples = -1; } if (flags & AOPLAY_FINAL_CHUNK) { // Force start in case the stream was too short for prebuf @@ -390,7 +392,7 @@ static int play(struct ao *ao, void *data, int len, int flags) pa_operation_unref(op); } pa_threaded_mainloop_unlock(priv->mainloop); - return len; + return samples; } // Reset the audio stream, i.e. flush the playback buffer on the server side @@ -425,14 +427,14 @@ static void resume(struct ao *ao) cork(ao, false); } -// Return number of bytes that may be written to the server without blocking +// Return number of samples that may be written to the server without blocking static int get_space(struct ao *ao) { struct priv *priv = ao->priv; pa_threaded_mainloop_lock(priv->mainloop); size_t space = pa_stream_writable_size(priv->stream); pa_threaded_mainloop_unlock(priv->mainloop); - return space; + return space / ao->sstride; } // Return the current latency in seconds |