diff --git a/audio/jack.c b/audio/jack.c index aa5d166fa9..87e911bc0f 100644 --- a/audio/jack.c +++ b/audio/jack.c @@ -41,6 +41,7 @@ typedef struct jack pthread_cond_t cond; pthread_mutex_t cond_lock; + size_t buffer_size; } jack_t; static int process_cb(jack_nframes_t nframes, void *data) @@ -163,6 +164,8 @@ static void *ja_init(const char *device, unsigned rate, unsigned latency) } bufsize = find_buffersize(jd, latency); + jd->buffer_size = bufsize; + SSNES_LOG("JACK: Internal buffer size: %d frames.\n", (int)(bufsize / sizeof(jack_default_audio_sample_t))); for (int i = 0; i < 2; i++) { @@ -304,6 +307,18 @@ static bool ja_use_float(void *data) return true; } +static size_t ja_write_avail(void *data) +{ + jack_t *jd = (jack_t*)data; + return jack_ringbuffer_write_space(jd->buffer[0]); +} + +static size_t ja_buffer_size(void *data) +{ + jack_t *jd = (jack_t*)data; + return jd->buffer_size; +} + const audio_driver_t audio_jack = { ja_init, ja_write, @@ -312,6 +327,8 @@ const audio_driver_t audio_jack = { ja_set_nonblock_state, ja_free, ja_use_float, - "jack" + "jack", + ja_write_avail, + ja_buffer_size, }; diff --git a/audio/pulse.c b/audio/pulse.c index 7124a2e0b9..a368fe998e 100644 --- a/audio/pulse.c +++ b/audio/pulse.c @@ -30,6 +30,7 @@ typedef struct pa_context *context; pa_stream *stream; bool nonblock; + size_t buffer_size; } pa_t; static void pulse_free(void *data) @@ -153,6 +154,8 @@ static void *pulse_init(const char *device, unsigned rate, unsigned latency) buffer_attr.minreq = -1; buffer_attr.fragsize = -1; + pa->buffer_size = buffer_attr.tlength; + if (pa_stream_connect_playback(pa->stream, NULL, &buffer_attr, PA_STREAM_ADJUST_LATENCY, NULL, NULL) < 0) goto error; @@ -177,8 +180,9 @@ static ssize_t pulse_write(void *data, const void *buf, size_t size) pa_t *pa = (pa_t*)data; pa_threaded_mainloop_lock(pa->mainloop); - unsigned length = pa_stream_writable_size(pa->stream); + size_t length = pa_stream_writable_size(pa->stream); pa_threaded_mainloop_unlock(pa->mainloop); + while (length < size) { pa_threaded_mainloop_wait(pa->mainloop); @@ -222,6 +226,21 @@ static bool pulse_use_float(void *data) return true; } +static size_t pulse_write_avail(void *data) +{ + pa_t *pa = (pa_t*)data; + pa_threaded_mainloop_lock(pa->mainloop); + size_t length = pa_stream_writable_size(pa->stream); + pa_threaded_mainloop_unlock(pa->mainloop); + return length; +} + +static size_t pulse_buffer_size(void *data) +{ + pa_t *pa = (pa_t*)data; + return pa->buffer_size; +} + const audio_driver_t audio_pulse = { pulse_init, pulse_write, @@ -230,6 +249,8 @@ const audio_driver_t audio_pulse = { pulse_set_nonblock_state, pulse_free, pulse_use_float, - "pulse" + "pulse", + pulse_write_avail, + pulse_buffer_size, };