aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/pipewire/core.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/pipewire/core.go')
-rw-r--r--internal/pipewire/core.go26
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)