diff options
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) |
