mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-06-13 03:01:58 -04:00
milan-avb: don't arm SPA_IO_IN on the talker (STREAM_OUTPUT) socket
This commit is contained in:
parent
7262d0f34c
commit
bd17904bbe
1 changed files with 15 additions and 2 deletions
|
|
@ -1540,8 +1540,18 @@ int stream_activate(struct stream *stream, uint16_t index, uint64_t now)
|
||||||
if ((fd = setup_socket(stream)) < 0)
|
if ((fd = setup_socket(stream)) < 0)
|
||||||
return fd;
|
return fd;
|
||||||
|
|
||||||
|
/* milan-avb: only listeners (STREAM_INPUT) have an RX path. The talker
|
||||||
|
* (STREAM_OUTPUT) is the graph driver and transmits on this same fd via
|
||||||
|
* sendmsg(); since the socket is AF_PACKET/SOCK_RAW opened with ETH_P_ALL
|
||||||
|
* and the OUTPUT branch never bind()s it, arming SPA_IO_IN would make the
|
||||||
|
* kernel packet-tap loop every transmitted frame (PACKET_OUTGOING) back
|
||||||
|
* into on_socket_data. plus all other host egress/ingress — flooding the
|
||||||
|
* "short packet" guard and even re-ingesting our own AAF egress (h->dest
|
||||||
|
* == stream->addr matches the RX filter). Talkers get mask 0 so the fd is
|
||||||
|
* still held for sendmsg()/cleanup but never wakes on inbound packets. */
|
||||||
stream->source = pw_loop_add_io(server->impl->loop, fd,
|
stream->source = pw_loop_add_io(server->impl->loop, fd,
|
||||||
SPA_IO_IN, true, on_socket_data, stream);
|
stream->direction == SPA_DIRECTION_INPUT ? SPA_IO_IN : 0,
|
||||||
|
true, on_socket_data, stream);
|
||||||
if (stream->source == NULL) {
|
if (stream->source == NULL) {
|
||||||
res = -errno;
|
res = -errno;
|
||||||
pw_log_error("stream %p: can't create source: %m", stream);
|
pw_log_error("stream %p: can't create source: %m", stream);
|
||||||
|
|
@ -1698,8 +1708,11 @@ int stream_activate_virtual(struct stream *stream, uint16_t index)
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return fd;
|
return fd;
|
||||||
|
|
||||||
|
/* milan-avb: see stream_activate (talkers) (STREAM_OUTPUT) take mask 0
|
||||||
|
* so the shared TX fd never loops egress back into on_socket_data. */
|
||||||
stream->source = pw_loop_add_io(server->impl->loop, fd,
|
stream->source = pw_loop_add_io(server->impl->loop, fd,
|
||||||
SPA_IO_IN, true, on_socket_data, stream);
|
stream->direction == SPA_DIRECTION_INPUT ? SPA_IO_IN : 0,
|
||||||
|
true, on_socket_data, stream);
|
||||||
if (stream->source == NULL)
|
if (stream->source == NULL)
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue