aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/pipewire/pipewire_test.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-11-28 00:34:32 +0900
committerOphestra <cat@gensokyo.uk>2025-11-28 00:35:10 +0900
commit72a2601d7461c0e2e24a3f97f19392dc30ee4c68 (patch)
tree6785b8956b8259f0cf402bb69830c986896d79e2 /internal/pipewire/pipewire_test.go
parent1dab87aaf07ad43c145f28fecfb73c7d801d3344 (diff)
internal/pipewire: store sample iovec continuously
This removes the need for manual splitting. The understanding of the format is robust enough to allow this to happen anyway. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pipewire/pipewire_test.go')
-rw-r--r--internal/pipewire/pipewire_test.go100
1 files changed, 49 insertions, 51 deletions
diff --git a/internal/pipewire/pipewire_test.go b/internal/pipewire/pipewire_test.go
index 586e5f6e..63b5f4fb 100644
--- a/internal/pipewire/pipewire_test.go
+++ b/internal/pipewire/pipewire_test.go
@@ -2,60 +2,58 @@ package pipewire_test
import (
_ "embed"
+ "encoding/binary"
+
+ "hakurei.app/internal/pipewire"
)
var (
- //go:embed testdata/c0s0p0
- c0s0header string
- //go:embed testdata/c0s0p1
- c0s0pod string
-
- //go:embed testdata/c0s1p0
- c0s1header string
- //go:embed testdata/c0s1p1
- c0s1pod string
-
- //go:embed testdata/c0s2p0
- c0s2header string
- //go:embed testdata/c0s2p1
- c0s2pod string
-
- //go:embed testdata/c0s3p0
- c0s3header string
- //go:embed testdata/c0s3p1
- c0s3pod string
-
- //go:embed testdata/c1r0p0
- c1r0header string
- //go:embed testdata/c1r0p1
- c1r0pod string
- //go:embed testdata/c1r0p2
- c1r0footer string
+ //go:embed testdata/pw-container-00-sendmsg
+ samplePWContainer00 string
+ //go:embed testdata/pw-container-01-recvmsg
+ samplePWContainer01 string
+ //go:embed testdata/pw-container-03-sendmsg
+ samplePWContainer03 string
+ //go:embed testdata/pw-container-04-recvmsg
+ samplePWContainer04 string
+ //go:embed testdata/pw-container-06-sendmsg
+ samplePWContainer06 string
+ //go:embed testdata/pw-container-07-recvmsg
+ samplePWContainer07 string
- //go:embed testdata/c1r1p0
- c1r1header string
- //go:embed testdata/c1r1p1
- c1r1pod string
-
- //go:embed testdata/c1r2p0
- c1r2header string
- //go:embed testdata/c1r2p1
- c1r2pod string
-
- //go:embed testdata/c1r3p0
- c1r3header string
- //go:embed testdata/c1r3p1
- c1r3pod string
+ // samplePWContainer is a collection of messages from the pw-container sample.
+ samplePWContainer = [...][][3][]byte{
+ splitMessages(samplePWContainer00),
+ splitMessages(samplePWContainer01),
+ nil,
+ splitMessages(samplePWContainer03),
+ splitMessages(samplePWContainer04),
+ nil,
+ splitMessages(samplePWContainer06),
+ splitMessages(samplePWContainer07),
+ nil,
+ }
+)
- //go:embed testdata/c1r4p0
- c1r4header string
- //go:embed testdata/c1r4p1
- c1r4pod string
+// splitMessages splits concatenated messages into groups of
+// header, payload, footer of each individual message.
+// splitMessages panics on any decoding error.
+func splitMessages(iovec string) (messages [][3][]byte) {
+ data := []byte(iovec)
+ messages = make([][3][]byte, 0, 1<<7)
- //go:embed testdata/c1r5p0
- c1r5header string
- //go:embed testdata/c1r5p1
- c1r5pod string
- //go:embed testdata/c1r5p2
- c1r5footer string
-)
+ var header pipewire.Header
+ for len(data) != 0 {
+ if err := header.UnmarshalBinary(data[:pipewire.SizeHeader]); err != nil {
+ panic(err)
+ }
+ size := pipewire.SizePrefix + binary.NativeEndian.Uint32(data[pipewire.SizeHeader:])
+ messages = append(messages, [3][]byte{
+ data[:pipewire.SizeHeader],
+ data[pipewire.SizeHeader : pipewire.SizeHeader+size],
+ data[pipewire.SizeHeader+size : pipewire.SizeHeader+header.Size],
+ })
+ data = data[pipewire.SizeHeader+header.Size:]
+ }
+ return
+}