internal/pipewire: implement Client::UpdateProperties
All checks were successful
Test / Create distribution (push) Successful in 36s
Test / Sandbox (push) Successful in 2m17s
Test / Hakurei (push) Successful in 3m14s
Test / Hpkg (push) Successful in 4m14s
Test / Sandbox (race detector) (push) Successful in 4m26s
Test / Hakurei (race detector) (push) Successful in 5m10s
Test / Flake checks (push) Successful in 1m29s

This is the second message on the captured sample.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
Ophestra 2025-11-25 04:16:11 +09:00
parent e51e81bb22
commit 88d3e46413
Signed by: cat
SSH Key Fingerprint: SHA256:gQ67O0enBZ7UdZypgtspB2FDM1g3GVw8nX0XSdcFw8Q
4 changed files with 507 additions and 35 deletions

View File

@ -0,0 +1,51 @@
package pipewire
/* pipewire/client.h */
const (
PW_TYPE_INTERFACE_Client = PW_TYPE_INFO_INTERFACE_BASE + "Client"
PW_CLIENT_PERM_MASK = PW_PERM_RWXM
PW_VERSION_CLIENT = 3
PW_ID_CLIENT = 1
)
const (
PW_CLIENT_CHANGE_MASK_PROPS = 1 << iota
PW_CLIENT_CHANGE_MASK_ALL = 1<<iota - 1
)
const (
PW_CLIENT_EVENT_INFO = iota
PW_CLIENT_EVENT_PERMISSIONS
PW_CLIENT_EVENT_NUM
PW_VERSION_CLIENT_EVENTS = 0
)
const (
PW_CLIENT_METHOD_ADD_LISTENER = iota
PW_CLIENT_METHOD_ERROR
PW_CLIENT_METHOD_UPDATE_PROPERTIES
PW_CLIENT_METHOD_GET_PERMISSIONS
PW_CLIENT_METHOD_UPDATE_PERMISSIONS
PW_CLIENT_METHOD_NUM
PW_VERSION_CLIENT_METHODS = 0
)
// ClientUpdateProperties is used to update the properties of a client.
type ClientUpdateProperties struct {
// Props are properties to update on the client.
Props *SPADict
}
// MarshalBinary satisfies [encoding.BinaryMarshaler] via [Marshal].
func (c *ClientUpdateProperties) MarshalBinary() ([]byte, error) { return Marshal(c) }
// UnmarshalBinary satisfies [encoding.BinaryUnmarshaler] via [Unmarshal].
func (c *ClientUpdateProperties) UnmarshalBinary(data []byte) error {
_, err := Unmarshal(data, c)
return err
}

View File

@ -0,0 +1,442 @@
package pipewire_test
import (
"testing"
"hakurei.app/internal/pipewire"
)
func TestClientUpdateProperties(t *testing.T) {
encodingTestCases[pipewire.ClientUpdateProperties, *pipewire.ClientUpdateProperties]{
{"sample", []byte{
// ClientUpdateProperties: size
0xf8, 5, 0, 0,
// ClientUpdateProperties: struct
0xe, 0, 0, 0,
// ClientUpdateProperties.Props: size
0xf0, 5, 0, 0,
// ClientUpdateProperties.Props: struct
0xe, 0, 0, 0,
// ClientUpdateProperties.Props.NItems: size
4, 0, 0, 0,
// ClientUpdateProperties.Props.NItems: int
4, 0, 0, 0,
0x1e, 0, 0, 0,
0, 0, 0, 0,
// ClientUpdateProperties.Props.Items
0x11, 0, 0, 0,
8, 0, 0, 0,
0x72, 0x65, 0x6d, 0x6f,
0x74, 0x65, 0x2e, 0x69,
0x6e, 0x74, 0x65, 0x6e,
0x74, 0x69, 0x6f, 0x6e,
0, 0, 0, 0,
0, 0, 0, 0,
8, 0, 0, 0,
8, 0, 0, 0,
0x6d, 0x61, 0x6e, 0x61,
0x67, 0x65, 0x72, 0,
0x11, 0, 0, 0,
8, 0, 0, 0,
0x61, 0x70, 0x70, 0x6c,
0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e,
0x6e, 0x61, 0x6d, 0x65,
0, 0, 0, 0,
0, 0, 0, 0,
0xd, 0, 0, 0,
8, 0, 0, 0,
0x70, 0x77, 0x2d, 0x63,
0x6f, 0x6e, 0x74, 0x61,
0x69, 0x6e, 0x65, 0x72,
0, 0, 0, 0,
0x1b, 0, 0, 0,
8, 0, 0, 0,
0x61, 0x70, 0x70, 0x6c,
0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e,
0x70, 0x72, 0x6f, 0x63,
0x65, 0x73, 0x73, 0x2e,
0x62, 0x69, 0x6e, 0x61,
0x72, 0x79, 0, 0,
0, 0, 0, 0,
0xd, 0, 0, 0,
8, 0, 0, 0,
0x70, 0x77, 0x2d, 0x63,
0x6f, 0x6e, 0x74, 0x61,
0x69, 0x6e, 0x65, 0x72,
0, 0, 0, 0,
0x15, 0, 0, 0,
8, 0, 0, 0,
0x61, 0x70, 0x70, 0x6c,
0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e,
0x6c, 0x61, 0x6e, 0x67,
0x75, 0x61, 0x67, 0x65,
0, 0, 0, 0,
0xc, 0, 0, 0,
8, 0, 0, 0,
0x65, 0x6e, 0x5f, 0x55,
0x53, 0x2e, 0x55, 0x54,
0x46, 0x2d, 0x38, 0,
0, 0, 0, 0,
0x17, 0, 0, 0,
8, 0, 0, 0,
0x61, 0x70, 0x70, 0x6c,
0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e,
0x70, 0x72, 0x6f, 0x63,
0x65, 0x73, 0x73, 0x2e,
0x69, 0x64, 0, 0,
5, 0, 0, 0,
8, 0, 0, 0,
0x31, 0x34, 0x34, 0x33,
0, 0, 0, 0,
0x19, 0, 0, 0,
8, 0, 0, 0,
0x61, 0x70, 0x70, 0x6c,
0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e,
0x70, 0x72, 0x6f, 0x63,
0x65, 0x73, 0x73, 0x2e,
0x75, 0x73, 0x65, 0x72,
0, 0, 0, 0,
0, 0, 0, 0,
6, 0, 0, 0,
8, 0, 0, 0,
0x61, 0x6c, 0x69, 0x63,
0x65, 0, 0, 0,
0x19, 0, 0, 0,
8, 0, 0, 0,
0x61, 0x70, 0x70, 0x6c,
0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e,
0x70, 0x72, 0x6f, 0x63,
0x65, 0x73, 0x73, 0x2e,
0x68, 0x6f, 0x73, 0x74,
0, 0, 0, 0,
0, 0, 0, 0,
6, 0, 0, 0,
8, 0, 0, 0,
0x6e, 0x69, 0x78, 0x6f,
0x73, 0, 0, 0,
0x1f, 0, 0, 0,
8, 0, 0, 0,
0x61, 0x70, 0x70, 0x6c,
0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e,
0x70, 0x72, 0x6f, 0x63,
0x65, 0x73, 0x73, 0x2e,
0x73, 0x65, 0x73, 0x73,
0x69, 0x6f, 0x6e, 0x2d,
0x69, 0x64, 0, 0,
2, 0, 0, 0,
8, 0, 0, 0,
0x31, 0, 0, 0,
0, 0, 0, 0,
0x13, 0, 0, 0,
8, 0, 0, 0,
0x77, 0x69, 0x6e, 0x64,
0x6f, 0x77, 0x2e, 0x78,
0x31, 0x31, 0x2e, 0x64,
0x69, 0x73, 0x70, 0x6c,
0x61, 0x79, 0, 0,
0, 0, 0, 0,
3, 0, 0, 0,
8, 0, 0, 0,
0x3a, 0x30, 0, 0,
0, 0, 0, 0,
0xc, 0, 0, 0,
8, 0, 0, 0,
0x63, 0x70, 0x75, 0x2e,
0x76, 0x6d, 0x2e, 0x6e,
0x61, 0x6d, 0x65, 0,
0, 0, 0, 0,
5, 0, 0, 0,
8, 0, 0, 0,
0x71, 0x65, 0x6d, 0x75,
0, 0, 0, 0,
0xa, 0, 0, 0,
8, 0, 0, 0,
0x6c, 0x6f, 0x67, 0x2e,
0x6c, 0x65, 0x76, 0x65,
0x6c, 0, 0, 0,
0, 0, 0, 0,
2, 0, 0, 0,
8, 0, 0, 0,
0x30, 0, 0, 0,
0, 0, 0, 0,
0xe, 0, 0, 0,
8, 0, 0, 0,
0x63, 0x70, 0x75, 0x2e,
0x6d, 0x61, 0x78, 0x2d,
0x61, 0x6c, 0x69, 0x67,
0x6e, 0, 0, 0,
3, 0, 0, 0,
8, 0, 0, 0,
0x33, 0x32, 0, 0,
0, 0, 0, 0,
0x13, 0, 0, 0,
8, 0, 0, 0,
0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x2e,
0x63, 0x6c, 0x6f, 0x63,
0x6b, 0x2e, 0x72, 0x61,
0x74, 0x65, 0, 0,
0, 0, 0, 0,
6, 0, 0, 0,
8, 0, 0, 0,
0x34, 0x38, 0x30, 0x30,
0x30, 0, 0, 0,
0x16, 0, 0, 0,
8, 0, 0, 0,
0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x2e,
0x63, 0x6c, 0x6f, 0x63,
0x6b, 0x2e, 0x71, 0x75,
0x61, 0x6e, 0x74, 0x75,
0x6d, 0, 0, 0,
5, 0, 0, 0,
8, 0, 0, 0,
0x31, 0x30, 0x32, 0x34,
0, 0, 0, 0,
0x1a, 0, 0, 0,
8, 0, 0, 0,
0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x2e,
0x63, 0x6c, 0x6f, 0x63,
0x6b, 0x2e, 0x6d, 0x69,
0x6e, 0x2d, 0x71, 0x75,
0x61, 0x6e, 0x74, 0x75,
0x6d, 0, 0, 0,
0, 0, 0, 0,
3, 0, 0, 0,
8, 0, 0, 0,
0x33, 0x32, 0, 0,
0, 0, 0, 0,
0x1a, 0, 0, 0,
8, 0, 0, 0,
0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x2e,
0x63, 0x6c, 0x6f, 0x63,
0x6b, 0x2e, 0x6d, 0x61,
0x78, 0x2d, 0x71, 0x75,
0x61, 0x6e, 0x74, 0x75,
0x6d, 0, 0, 0,
0, 0, 0, 0,
5, 0, 0, 0,
8, 0, 0, 0,
0x32, 0x30, 0x34, 0x38,
0, 0, 0, 0,
0x1c, 0, 0, 0,
8, 0, 0, 0,
0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x2e,
0x63, 0x6c, 0x6f, 0x63,
0x6b, 0x2e, 0x71, 0x75,
0x61, 0x6e, 0x74, 0x75,
0x6d, 0x2d, 0x6c, 0x69,
0x6d, 0x69, 0x74, 0,
0, 0, 0, 0,
5, 0, 0, 0,
8, 0, 0, 0,
0x38, 0x31, 0x39, 0x32,
0, 0, 0, 0,
0x1c, 0, 0, 0,
8, 0, 0, 0,
0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x2e,
0x63, 0x6c, 0x6f, 0x63,
0x6b, 0x2e, 0x71, 0x75,
0x61, 0x6e, 0x74, 0x75,
0x6d, 0x2d, 0x66, 0x6c,
0x6f, 0x6f, 0x72, 0,
0, 0, 0, 0,
2, 0, 0, 0,
8, 0, 0, 0,
0x34, 0, 0, 0,
0, 0, 0, 0,
0x14, 0, 0, 0,
8, 0, 0, 0,
0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x2e,
0x76, 0x69, 0x64, 0x65,
0x6f, 0x2e, 0x77, 0x69,
0x64, 0x74, 0x68, 0,
0, 0, 0, 0,
4, 0, 0, 0,
8, 0, 0, 0,
0x36, 0x34, 0x30, 0,
0, 0, 0, 0,
0x15, 0, 0, 0,
8, 0, 0, 0,
0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x2e,
0x76, 0x69, 0x64, 0x65,
0x6f, 0x2e, 0x68, 0x65,
0x69, 0x67, 0x68, 0x74,
0, 0, 0, 0,
4, 0, 0, 0,
8, 0, 0, 0,
0x34, 0x38, 0x30, 0,
0, 0, 0, 0,
0x17, 0, 0, 0,
8, 0, 0, 0,
0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x2e,
0x76, 0x69, 0x64, 0x65,
0x6f, 0x2e, 0x72, 0x61,
0x74, 0x65, 0x2e, 0x6e,
0x75, 0x6d, 0, 0,
3, 0, 0, 0,
8, 0, 0, 0,
0x32, 0x35, 0, 0,
0, 0, 0, 0,
0x19, 0, 0, 0,
8, 0, 0, 0,
0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x2e,
0x76, 0x69, 0x64, 0x65,
0x6f, 0x2e, 0x72, 0x61,
0x74, 0x65, 0x2e, 0x64,
0x65, 0x6e, 0x6f, 0x6d,
0, 0, 0, 0,
0, 0, 0, 0,
2, 0, 0, 0,
8, 0, 0, 0,
0x31, 0, 0, 0,
0, 0, 0, 0,
0x1b, 0, 0, 0,
8, 0, 0, 0,
0x63, 0x6c, 0x6f, 0x63,
0x6b, 0x2e, 0x70, 0x6f,
0x77, 0x65, 0x72, 0x2d,
0x6f, 0x66, 0x2d, 0x74,
0x77, 0x6f, 0x2d, 0x71,
0x75, 0x61, 0x6e, 0x74,
0x75, 0x6d, 0, 0,
0, 0, 0, 0,
5, 0, 0, 0,
8, 0, 0, 0,
0x74, 0x72, 0x75, 0x65,
0, 0, 0, 0,
0x11, 0, 0, 0,
8, 0, 0, 0,
0x6c, 0x69, 0x6e, 0x6b,
0x2e, 0x6d, 0x61, 0x78,
0x2d, 0x62, 0x75, 0x66,
0x66, 0x65, 0x72, 0x73,
0, 0, 0, 0,
0, 0, 0, 0,
3, 0, 0, 0,
8, 0, 0, 0,
0x36, 0x34, 0, 0,
0, 0, 0, 0,
0xf, 0, 0, 0,
8, 0, 0, 0,
0x6d, 0x65, 0x6d, 0x2e,
0x77, 0x61, 0x72, 0x6e,
0x2d, 0x6d, 0x6c, 0x6f,
0x63, 0x6b, 0, 0,
6, 0, 0, 0,
8, 0, 0, 0,
0x66, 0x61, 0x6c, 0x73,
0x65, 0, 0, 0,
0x10, 0, 0, 0,
8, 0, 0, 0,
0x6d, 0x65, 0x6d, 0x2e,
0x61, 0x6c, 0x6c, 0x6f,
0x77, 0x2d, 0x6d, 0x6c,
0x6f, 0x63, 0x6b, 0,
5, 0, 0, 0,
8, 0, 0, 0,
0x74, 0x72, 0x75, 0x65,
0, 0, 0, 0,
0x17, 0, 0, 0,
8, 0, 0, 0,
0x73, 0x65, 0x74, 0x74,
0x69, 0x6e, 0x67, 0x73,
0x2e, 0x63, 0x68, 0x65,
0x63, 0x6b, 0x2d, 0x71,
0x75, 0x61, 0x6e, 0x74,
0x75, 0x6d, 0, 0,
6, 0, 0, 0,
8, 0, 0, 0,
0x66, 0x61, 0x6c, 0x73,
0x65, 0, 0, 0,
0x14, 0, 0, 0,
8, 0, 0, 0,
0x73, 0x65, 0x74, 0x74,
0x69, 0x6e, 0x67, 0x73,
0x2e, 0x63, 0x68, 0x65,
0x63, 0x6b, 0x2d, 0x72,
0x61, 0x74, 0x65, 0,
0, 0, 0, 0,
6, 0, 0, 0,
8, 0, 0, 0,
0x66, 0x61, 0x6c, 0x73,
0x65, 0, 0, 0,
0xd, 0, 0, 0,
8, 0, 0, 0,
0x63, 0x6f, 0x72, 0x65,
0x2e, 0x76, 0x65, 0x72,
0x73, 0x69, 0x6f, 0x6e,
0, 0, 0, 0,
6, 0, 0, 0,
8, 0, 0, 0,
0x31, 0x2e, 0x34, 0x2e,
0x37, 0, 0, 0,
0xa, 0, 0, 0,
8, 0, 0, 0,
0x63, 0x6f, 0x72, 0x65,
0x2e, 0x6e, 0x61, 0x6d,
0x65, 0, 0, 0,
0, 0, 0, 0,
0x14, 0, 0, 0,
8, 0, 0, 0,
0x70, 0x69, 0x70, 0x65,
0x77, 0x69, 0x72, 0x65,
0x2d, 0x61, 0x6c, 0x69,
0x63, 0x65, 0x2d, 0x31,
0x34, 0x34, 0x33, 0,
0, 0, 0, 0,
}, pipewire.ClientUpdateProperties{Props: &pipewire.SPADict{NItems: 0x1e, Items: []pipewire.SPADictItem{
{Key: "remote.intention", Value: "manager"},
{Key: "application.name", Value: "pw-container"},
{Key: "application.process.binary", Value: "pw-container"},
{Key: "application.language", Value: "en_US.UTF-8"},
{Key: "application.process.id", Value: "1443"},
{Key: "application.process.user", Value: "alice"},
{Key: "application.process.host", Value: "nixos"},
{Key: "application.process.session-id", Value: "1"},
{Key: "window.x11.display", Value: ":0"},
{Key: "cpu.vm.name", Value: "qemu"},
{Key: "log.level", Value: "0"},
{Key: "cpu.max-align", Value: "32"},
{Key: "default.clock.rate", Value: "48000"},
{Key: "default.clock.quantum", Value: "1024"},
{Key: "default.clock.min-quantum", Value: "32"},
{Key: "default.clock.max-quantum", Value: "2048"},
{Key: "default.clock.quantum-limit", Value: "8192"},
{Key: "default.clock.quantum-floor", Value: "4"},
{Key: "default.video.width", Value: "640"},
{Key: "default.video.height", Value: "480"},
{Key: "default.video.rate.num", Value: "25"},
{Key: "default.video.rate.denom", Value: "1"},
{Key: "clock.power-of-two-quantum", Value: "true"},
{Key: "link.max-buffers", Value: "64"},
{Key: "mem.warn-mlock", Value: "false"},
{Key: "mem.allow-mlock", Value: "true"},
{Key: "settings.check-quantum", Value: "false"},
{Key: "settings.check-rate", Value: "false"},
{Key: "core.version", Value: "1.4.7"},
{Key: "core.name", Value: "pipewire-alice-1443"},
}}}, nil},
}.run(t)
}

View File

@ -25,6 +25,20 @@ func TestHeader(t *testing.T) {
}, pipewire.Header{ID: pipewire.PW_ID_CORE, Opcode: pipewire.PW_CORE_METHOD_HELLO,
Size: 0x18, Sequence: 0, FileCount: 0}, nil},
{"PW_CLIENT_METHOD_UPDATE_PROPERTIES", []byte{
// Id
1, 0, 0, 0,
// size
0, 6, 0,
// opcode
2,
// seq
1, 0, 0, 0,
// n_fds
0, 0, 0, 0,
}, pipewire.Header{ID: pipewire.PW_ID_CLIENT, Opcode: pipewire.PW_CLIENT_METHOD_UPDATE_PROPERTIES,
Size: 0x600, Sequence: 1, FileCount: 0}, nil},
{"PW_SECURITY_CONTEXT_METHOD_CREATE", []byte{
// Id
3, 0, 0, 0,

View File

@ -14,41 +14,6 @@
// for any other uses of the protocol.
package pipewire
/* pipewire/client.h */
const (
PW_TYPE_INTERFACE_Client = PW_TYPE_INFO_INTERFACE_BASE + "Client"
PW_CLIENT_PERM_MASK = PW_PERM_RWXM
PW_VERSION_CLIENT = 3
PW_ID_CLIENT = 1
)
const (
PW_CLIENT_CHANGE_MASK_PROPS = 1 << iota
PW_CLIENT_CHANGE_MASK_ALL = 1<<iota - 1
)
const (
PW_CLIENT_EVENT_INFO = iota
PW_CLIENT_EVENT_PERMISSIONS
PW_CLIENT_EVENT_NUM
PW_VERSION_CLIENT_EVENTS = 0
)
const (
PW_CLIENT_METHOD_ADD_LISTENER = iota
PW_CLIENT_METHOD_ERROR
PW_CLIENT_METHOD_UPDATE_PROPERTIES
PW_CLIENT_METHOD_GET_PERMISSIONS
PW_CLIENT_METHOD_UPDATE_PERMISSIONS
PW_CLIENT_METHOD_NUM
PW_VERSION_CLIENT_METHODS = 0
)
/* pipewire/device.h */
const (