diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-12-07 14:48:42 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-12-07 14:55:56 +0900 |
| commit | 15c2839a0997dd13e5a41e6a35b656e934f22040 (patch) | |
| tree | 56e43a1d3bc400dd6e83114b9a3ce02ff8fa61a0 /internal/pipewire/core.go | |
| parent | b9b9705b520cd3effaba3dc5e94c83e36f655bc4 (diff) | |
internal/pipewire: respond to Core::Ping
There is currently no known message that will get the PipeWire server to emit this event. It should be handled regardless.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pipewire/core.go')
| -rw-r--r-- | internal/pipewire/core.go | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/internal/pipewire/core.go b/internal/pipewire/core.go index 35340c88..18d664e2 100644 --- a/internal/pipewire/core.go +++ b/internal/pipewire/core.go @@ -6,6 +6,7 @@ import ( "maps" "slices" "strconv" + "syscall" "time" ) @@ -615,6 +616,14 @@ func (e *UnknownBoundIdError[E]) Error() string { return "unknown bound proxy id " + strconv.Itoa(int(e.Id)) } +// An InvalidPingError is a [CorePing] event targeting a proxy id that was never allocated. +type InvalidPingError CorePing + +func (e *InvalidPingError) Error() string { + return "received Core::Ping seq " + strconv.Itoa(int(e.Sequence)) + + " targeting unknown proxy id " + strconv.Itoa(int(e.ID)) +} + func (core *Core) consume(opcode byte, files []int, unmarshal func(v any)) error { closeReceivedFiles(files...) switch opcode { @@ -637,6 +646,23 @@ func (core *Core) consume(opcode byte, files []int, unmarshal func(v any)) error // anything, and this behaviour is never mentioned in documentation return nil + case PW_CORE_EVENT_PING: + var ping CorePing + unmarshal(&ping) + if _, ok := core.ctx.proxy[ping.ID]; ok { + core.ctx.mustWriteMessage(PW_ID_CORE, (*CorePong)(&ping)) + return nil + } else { + invalidPingError := InvalidPingError(ping) + core.ctx.mustWriteMessage(PW_ID_CORE, &CoreErrorMethod{CoreError{ + ID: PW_ID_CORE, + Sequence: core.ctx.currentRemoteSeq(), + Result: -Int(syscall.EINVAL), + Message: invalidPingError.Error(), + }}) + return &invalidPingError + } + case PW_CORE_EVENT_ERROR: var coreError CoreError unmarshal(&coreError) |
