From 5b05b21865e3ccb5110d5c5c66ae948bd034632c Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 24 May 2018 16:13:23 +0200 Subject: [PATCH] jack: implement more transport info --- src/pipewire-jack.c | 51 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/src/pipewire-jack.c b/src/pipewire-jack.c index b3aa63e41..b5c5eb2bf 100644 --- a/src/pipewire-jack.c +++ b/src/pipewire-jack.c @@ -251,6 +251,10 @@ struct client { void *connect_arg; JackGraphOrderCallback graph_callback; void *graph_arg; + JackSyncCallback sync_callback; + void *sync_arg; + JackTimebaseCallback timebase_callback; + void *timebase_arg; struct pw_client_node_position *position; uint32_t sample_rate; @@ -270,6 +274,8 @@ struct client { bool started; int status; + + jack_position_t jack_position; }; static void init_port_pool(struct client *c, enum spa_direction direction) @@ -667,10 +673,27 @@ on_rtsocket_condition(void *data, int fd, enum spa_io mask) c->srate_callback(c->sample_rate, c->srate_arg); } + c->jack_position.usecs = c->position->nsec/1000; + c->jack_position.frame_rate = c->sample_rate; + c->jack_position.frame = c->position->position / sizeof(float); + + if (c->sync_callback) { + c->sync_callback(JackTransportRolling, + &c->jack_position, c->sync_arg); + } + pw_log_trace("do process %d %d", c->buffer_size, c->sample_rate); if (c->process_callback) c->process_callback(c->buffer_size, c->process_arg); + if (c->timebase_callback) { + c->timebase_callback(JackTransportRolling, + buffer_size, + &c->jack_position, + false, + c->timebase_arg); + } + cmd = 1; write(c->writefd, &cmd, 8); } @@ -1817,12 +1840,16 @@ int jack_set_buffer_size (jack_client_t *client, jack_nframes_t nframes) jack_nframes_t jack_get_sample_rate (jack_client_t *client) { struct client *c = (struct client *) client; + if (c->sample_rate == -1) + return DEFAULT_SAMPLE_RATE; return c->sample_rate; } jack_nframes_t jack_get_buffer_size (jack_client_t *client) { struct client *c = (struct client *) client; + if (c->buffer_size == -1) + return DEFAULT_BUFFER_SIZE; return c->buffer_size; } @@ -2514,14 +2541,14 @@ jack_nframes_t jack_frames_since_cycle_start (const jack_client_t *client) jack_nframes_t jack_frame_time (const jack_client_t *client) { - pw_log_warn("not implemented"); - return 0; + struct client *c = (struct client *) client; + return c->jack_position.frame; } jack_nframes_t jack_last_frame_time (const jack_client_t *client) { - pw_log_warn("not implemented"); - return 0; + struct client *c = (struct client *) client; + return c->jack_position.frame; } int jack_get_cycle_times(const jack_client_t *client, @@ -2577,8 +2604,10 @@ int jack_set_sync_callback (jack_client_t *client, JackSyncCallback sync_callback, void *arg) { - pw_log_warn("not implemented"); - return -ENOTSUP; + struct client *c = (struct client *) client; + c->sync_callback = sync_callback; + c->sync_arg = arg; + return 0; } int jack_set_sync_timeout (jack_client_t *client, @@ -2593,8 +2622,10 @@ int jack_set_timebase_callback (jack_client_t *client, JackTimebaseCallback timebase_callback, void *arg) { - pw_log_warn("not implemented"); - return -ENOTSUP; + struct client *c = (struct client *) client; + c->timebase_callback = timebase_callback; + c->timebase_arg = arg; + return 0; } int jack_transport_locate (jack_client_t *client, @@ -2607,7 +2638,9 @@ int jack_transport_locate (jack_client_t *client, jack_transport_state_t jack_transport_query (const jack_client_t *client, jack_position_t *pos) { - pw_log_warn("not implemented"); + struct client *c = (struct client *) client; + if (pos != NULL) + memcpy(pos, &c->jack_position, sizeof(jack_position_t)); return JackTransportRolling; }