diff --git a/src/pipewire/remote.c b/src/pipewire/remote.c index 20783fc12..ae84efeec 100644 --- a/src/pipewire/remote.c +++ b/src/pipewire/remote.c @@ -861,18 +861,15 @@ client_node_set_io(void *object, pw_log_debug("node %p: set io %s %p", proxy, spa_debug_type_find_name(spa_type_io, id), ptr); - if (id == PW_IO_ClientNodePosition) { + if (id == SPA_IO_Position) { if (ptr == NULL && data->position) { m = find_mem_ptr(data, data->position); if (m && --m->ref == 0) clear_mem(data, m); } data->position = ptr; - data->node->rt.position = ptr; - } - else { - pw_log_warn("unknown io id %u", id); } + spa_node_set_io(data->node->node, id, ptr, size); } static void client_node_event(void *object, const struct spa_event *event) diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 124c6f7b0..76a40d170 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -109,6 +109,7 @@ struct stream { struct spa_io_buffers *io; struct spa_io_sequence *io_control; struct spa_io_sequence *io_notify; + struct spa_io_position *position; uint32_t io_notify_size; struct pw_array params; @@ -247,6 +248,8 @@ static void call_process(struct stream *impl) static int impl_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) { + struct stream *impl = SPA_CONTAINER_OF(node, struct stream, impl_node); + impl->position = data; return 0; } @@ -653,14 +656,16 @@ static int process_notify(struct stream *impl, struct spa_pod_sequence *sequence static inline void copy_position(struct stream *impl, int64_t queued) { - struct spa_io_position *p = impl->node->rt.position; - __atomic_add_fetch(&impl->seq, 1, __ATOMIC_SEQ_CST); - impl->time.now = p->clock.nsec; - impl->time.rate = p->clock.rate; - impl->time.ticks = p->clock.position; - impl->time.delay = p->clock.delay; - impl->time.queued = queued; - __atomic_add_fetch(&impl->seq, 1, __ATOMIC_SEQ_CST); + struct spa_io_position *p = impl->position; + if (p != NULL) { + __atomic_add_fetch(&impl->seq, 1, __ATOMIC_SEQ_CST); + impl->time.now = p->clock.nsec; + impl->time.rate = p->clock.rate; + impl->time.ticks = p->clock.position; + impl->time.delay = p->clock.delay; + impl->time.queued = queued; + __atomic_add_fetch(&impl->seq, 1, __ATOMIC_SEQ_CST); + } if (impl->io_control) process_control(impl, &impl->io_control->sequence); diff --git a/src/pipewire/type.h b/src/pipewire/type.h index 975395e7b..bc1b37b41 100644 --- a/src/pipewire/type.h +++ b/src/pipewire/type.h @@ -47,11 +47,6 @@ enum { }; -enum { - PW_IO_BASE = PW_TYPE_FIRST, - PW_IO_ClientNodePosition, -}; - #define PW_TYPE_BASE "PipeWire:" #define PW_TYPE__Object PW_TYPE_BASE "Object"