diff --git a/internal/pipewire/core.go b/internal/pipewire/core.go index a54ec11..9e3613b 100644 --- a/internal/pipewire/core.go +++ b/internal/pipewire/core.go @@ -81,6 +81,16 @@ type FooterCoreGeneration struct { RegistryGeneration Long `json:"registry_generation"` } +// The FooterClientGeneration indicates to the server what is the last +// registry generation number the client has processed. +// +// The client shall include this footer in the next message it sends, +// after it has processed an incoming message whose footer includes a +// registry generation update. +type FooterClientGeneration struct { + ClientGeneration Long `json:"client_generation"` +} + // A CoreInfo event is emitted by the server upon connection // with the more information about the server. type CoreInfo struct { diff --git a/internal/pipewire/core_test.go b/internal/pipewire/core_test.go index 0997e9c..c6d1157 100644 --- a/internal/pipewire/core_test.go +++ b/internal/pipewire/core_test.go @@ -10,15 +10,32 @@ func TestFooterCoreGeneration(t *testing.T) { t.Parallel() encodingTestCases[pipewire.Footer[pipewire.FooterCoreGeneration], *pipewire.Footer[pipewire.FooterCoreGeneration]]{ - {"sample", samplePWContainer[1][0][2], pipewire.Footer[pipewire.FooterCoreGeneration]{ + /* recvmsg 0 */ + + {"sample0", samplePWContainer[1][0][2], pipewire.Footer[pipewire.FooterCoreGeneration]{ Opcode: pipewire.FOOTER_CORE_OPCODE_GENERATION, Payload: pipewire.FooterCoreGeneration{RegistryGeneration: 0x22}, }, nil}, - {"sample*", samplePWContainer[1][5][2], pipewire.Footer[pipewire.FooterCoreGeneration]{ + {"sample1", samplePWContainer[1][5][2], pipewire.Footer[pipewire.FooterCoreGeneration]{ Opcode: pipewire.FOOTER_CORE_OPCODE_GENERATION, Payload: pipewire.FooterCoreGeneration{RegistryGeneration: 0x23}, }, nil}, + + {"sample2", samplePWContainer[1][42][2], pipewire.Footer[pipewire.FooterCoreGeneration]{ + Opcode: pipewire.FOOTER_CORE_OPCODE_GENERATION, + Payload: pipewire.FooterCoreGeneration{RegistryGeneration: 0x24}, + }, nil}, + }.run(t) + + encodingTestCases[pipewire.Footer[pipewire.FooterClientGeneration], *pipewire.Footer[pipewire.FooterClientGeneration]]{ + /* sendmsg 1 */ + + {"sample0", samplePWContainer[3][0][2], pipewire.Footer[pipewire.FooterClientGeneration]{ + Opcode: pipewire.FOOTER_CORE_OPCODE_GENERATION, + // why does this not match FooterCoreGeneration sample2? + Payload: pipewire.FooterClientGeneration{ClientGeneration: 0x23}, + }, nil}, }.run(t) }