From fc6245dca3291bd5acbbb9f899d412d7ae5cf140 Mon Sep 17 00:00:00 2001 From: hackerman-kl Date: Thu, 28 May 2026 11:45:00 +0000 Subject: [PATCH 1/3] milan-avb: stream: flag CRF streams and ignore CRF packets by subtype in RX --- src/modules/module-avb/stream.c | 4 ++++ src/modules/module-avb/stream.h | 1 + 2 files changed, 5 insertions(+) diff --git a/src/modules/module-avb/stream.c b/src/modules/module-avb/stream.c index 682c843bf..589101ae4 100644 --- a/src/modules/module-avb/stream.c +++ b/src/modules/module-avb/stream.c @@ -877,6 +877,10 @@ static void on_socket_data(void *data, int fd, uint32_t mask) (struct avb_packet_iec61883 *)ph, len - (int)sizeof(*h)); break; + case AVB_SUBTYPE_CRF: + /* CRF clock-reference stream: no audio data plane. + * Consume and ignore (clock recovery is future work). */ + break; default: pw_log_warn("unsupported subtype 0x%02x", ph->subtype); break; diff --git a/src/modules/module-avb/stream.h b/src/modules/module-avb/stream.h index 87c623732..7b3895f5a 100644 --- a/src/modules/module-avb/stream.h +++ b/src/modules/module-avb/stream.h @@ -37,6 +37,7 @@ struct stream { struct spa_source *source; struct spa_source *flush_timer; uint64_t flush_last_ns; + bool is_crf; int prio; int mtt; int t_uncertainty; From 9d08cb87c613cdc47c31571f722adece932f39c8 Mon Sep 17 00:00:00 2001 From: hackerman-kl Date: Thu, 28 May 2026 11:50:00 +0000 Subject: [PATCH 2/3] milan-avb: stream: do not wire CRF streams into the PipeWire audio graph --- src/modules/module-avb/stream.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/modules/module-avb/stream.c b/src/modules/module-avb/stream.c index 589101ae4..4b2cdd56a 100644 --- a/src/modules/module-avb/stream.c +++ b/src/modules/module-avb/stream.c @@ -593,12 +593,13 @@ struct stream *server_create_stream(struct server *server, struct stream *stream if (stream->stream == NULL) goto error_free; - pw_stream_add_listener(stream->stream, - &stream->stream_listener, - direction == SPA_DIRECTION_INPUT ? - &source_stream_events : - &sink_stream_events, - stream); + if (!stream->is_crf) + pw_stream_add_listener(stream->stream, + &stream->stream_listener, + direction == SPA_DIRECTION_INPUT ? + &source_stream_events : + &sink_stream_events, + stream); { uint16_t desc_type = (direction == SPA_DIRECTION_INPUT) @@ -625,7 +626,8 @@ struct stream *server_create_stream(struct server *server, struct stream *stream params[n_params++] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat, &stream->info.info.raw); - if ((res = pw_stream_connect(stream->stream, + if (!stream->is_crf && + (res = pw_stream_connect(stream->stream, pw_direction_reverse(direction), PW_ID_ANY, PW_STREAM_FLAG_MAP_BUFFERS | From 98ab3d73d42f1f988622ca086ce1b390b65072b9 Mon Sep 17 00:00:00 2001 From: hackerman-kl Date: Thu, 28 May 2026 11:55:00 +0000 Subject: [PATCH 3/3] milan-avb: es-builder: create and flag CRF input streams (fix NULL-server crash on activate) --- src/modules/module-avb/es-builder.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/modules/module-avb/es-builder.c b/src/modules/module-avb/es-builder.c index b56c37e74..4eb7222dd 100644 --- a/src/modules/module-avb/es-builder.c +++ b/src/modules/module-avb/es-builder.c @@ -34,6 +34,7 @@ static struct descriptor *es_buidler_desc_stream_general_prepare(struct server * if (type == AVB_AEM_DESC_STREAM_INPUT) { struct aecp_aem_stream_input_state_milan_v12 *w; const struct avb_aem_desc_stream *body = ptr; + struct avb_aem_stream_format_info fi; desc = server_add_descriptor(server, type, index, sizeof(*w), size, ptr); @@ -46,13 +47,13 @@ static struct descriptor *es_buidler_desc_stream_general_prepare(struct server * /* Milan v1.2 Section 5.3.8.7: started/stopped state defaults to started. */ w->stream_in_sta.started = true; - struct avb_aem_stream_format_info fi; avb_aem_stream_format_decode(body->current_format, &fi); - if (fi.kind == AVB_AEM_STREAM_FORMAT_KIND_CRF) - return desc; stream = &w->stream_in_sta.common.stream; direction = SPA_DIRECTION_INPUT; + stream->is_crf = (fi.kind == AVB_AEM_STREAM_FORMAT_KIND_CRF); + if (stream->is_crf) + pw_log_info("stream %u: CRF clock-reference, no audio data plane", index); } else if (type == AVB_AEM_DESC_STREAM_OUTPUT) { struct aecp_aem_stream_output_state_milan_v12 *w;