summaryrefslogtreecommitdiffstats
path: root/audio/out/ao_jack.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/out/ao_jack.c')
-rw-r--r--audio/out/ao_jack.c41
1 files changed, 34 insertions, 7 deletions
diff --git a/audio/out/ao_jack.c b/audio/out/ao_jack.c
index 2ad3cad586..597835c989 100644
--- a/audio/out/ao_jack.c
+++ b/audio/out/ao_jack.c
@@ -33,6 +33,7 @@
#include "ao.h"
#include "internal.h"
#include "audio/format.h"
+#include "osdep/atomic.h"
#include "osdep/timer.h"
#include "options/m_config.h"
#include "options/m_option.h"
@@ -67,7 +68,10 @@ static const struct m_sub_options ao_jack_conf = {
struct priv {
jack_client_t *client;
- float jack_latency;
+
+ atomic_uint graph_latency_max;
+ atomic_uint buffer_size;
+
int last_chunk;
int num_ports;
@@ -78,6 +82,29 @@ struct priv {
struct jack_opts *opts;
};
+static int graph_order_cb(void *arg)
+{
+ struct ao *ao = arg;
+ struct priv *p = ao->priv;
+
+ jack_latency_range_t jack_latency_range;
+ jack_port_get_latency_range(p->ports[0], JackPlaybackLatency,
+ &jack_latency_range);
+ atomic_store(&p->graph_latency_max, jack_latency_range.max);
+
+ return 0;
+}
+
+static int buffer_size_cb(jack_nframes_t nframes, void *arg)
+{
+ struct ao *ao = arg;
+ struct priv *p = ao->priv;
+
+ atomic_store(&p->buffer_size, nframes);
+
+ return 0;
+}
+
static int process(jack_nframes_t nframes, void *arg)
{
struct ao *ao = arg;
@@ -88,8 +115,11 @@ static int process(jack_nframes_t nframes, void *arg)
for (int i = 0; i < p->num_ports; i++)
buffers[i] = jack_port_get_buffer(p->ports[i], nframes);
+ jack_nframes_t jack_latency =
+ atomic_load(&p->graph_latency_max) + atomic_load(&p->buffer_size);
+
int64_t end_time = mp_time_us();
- end_time += (p->jack_latency + nframes / (double)ao->samplerate) * 1000000.0;
+ end_time += (jack_latency + nframes) / (double)ao->samplerate * 1000000.0;
ao_read_data(ao, buffers, nframes, end_time);
@@ -212,11 +242,8 @@ static int init(struct ao *ao)
ao->samplerate = jack_get_sample_rate(p->client);
- jack_latency_range_t jack_latency_range;
- jack_port_get_latency_range(p->ports[0], JackPlaybackLatency,
- &jack_latency_range);
- p->jack_latency = (float)(jack_latency_range.max + jack_get_buffer_size(p->client))
- / (float)ao->samplerate;
+ jack_set_buffer_size_callback(p->client, buffer_size_cb, ao);
+ jack_set_graph_order_callback(p->client, graph_order_cb, ao);
if (!ao_chmap_sel_get_def(ao, &sel, &ao->channels, p->num_ports))
goto err_chmap_sel_get_def;