aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/pipewire/pipewire.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-12-07 13:54:11 +0900
committerOphestra <cat@gensokyo.uk>2025-12-07 13:54:11 +0900
commitb9b9705b520cd3effaba3dc5e94c83e36f655bc4 (patch)
treeda70316f6ac5971746d526031592cd2bfcd11143 /internal/pipewire/pipewire.go
parent246e04214a3554826be1f4285f56044b0850102d (diff)
internal/pipewire: specify opcode and file count with message
This adds checking of FileCount while writing a message. Message encoding is relocated to an exported method to be used externally, probably for test stubbing. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pipewire/pipewire.go')
-rw-r--r--internal/pipewire/pipewire.go40
1 files changed, 17 insertions, 23 deletions
diff --git a/internal/pipewire/pipewire.go b/internal/pipewire/pipewire.go
index 65178bf6..d17edf90 100644
--- a/internal/pipewire/pipewire.go
+++ b/internal/pipewire/pipewire.go
@@ -191,36 +191,30 @@ func (ctx *Context) queueFiles(fds ...int) (offset Fd) {
return
}
+// InconsistentFilesError describes an implementation error where an incorrect amount
+// of files is queued between two messages.
+type InconsistentFilesError [2]Int
+
+func (e *InconsistentFilesError) Error() string {
+ return "queued " + strconv.Itoa(int(e[0])) + " files instead of the expected " + strconv.Itoa(int(e[1]))
+}
+
// writeMessage appends the POD representation of v and an optional footer to buf.
-func (ctx *Context) writeMessage(
- Id Int, opcode byte,
- v KnownSize,
-) (err error) {
- if ctx.pendingFooter == nil && ctx.deferredPendingFooter != nil {
- ctx.pendingFooter, ctx.deferredPendingFooter = ctx.deferredPendingFooter, nil
+func (ctx *Context) writeMessage(Id Int, v Message) (err error) {
+ if fileCount := Int(len(ctx.pendingFiles) - ctx.headerFiles); fileCount != v.FileCount() {
+ return &InconsistentFilesError{fileCount, v.FileCount()}
}
- size := v.Size()
- if ctx.pendingFooter != nil {
- size += ctx.pendingFooter.Size()
- }
- if size&^SizeMax != 0 {
- return ErrSizeRange
+ if ctx.pendingFooter == nil && ctx.deferredPendingFooter != nil {
+ ctx.pendingFooter, ctx.deferredPendingFooter = ctx.deferredPendingFooter, nil
}
- ctx.buf = slices.Grow(ctx.buf, int(SizeHeader+size))
- ctx.buf = (&Header{
- ID: Id, Opcode: opcode, Size: size,
- Sequence: ctx.sequence,
- FileCount: Int(len(ctx.pendingFiles) - ctx.headerFiles),
- }).append(ctx.buf)
- ctx.headerFiles = len(ctx.pendingFiles)
- ctx.buf, err = MarshalAppend(ctx.buf, v)
- if err == nil && ctx.pendingFooter != nil {
- ctx.buf, err = MarshalAppend(ctx.buf, ctx.pendingFooter)
+ ctx.buf, err = MessageEncoder{v}.AppendMessage(ctx.buf, Id, ctx.sequence, ctx.pendingFooter)
+ if err == nil {
+ ctx.headerFiles = len(ctx.pendingFiles)
ctx.pendingFooter = nil
+ ctx.sequence++
}
- ctx.sequence++
return
}