aboutsummaryrefslogtreecommitdiffhomepage
AgeCommit message (Collapse)Author
2025-12-02internal/pipewire: fail on unacknowledged proxiesOphestra
These proxies (with special cases documented in the implementation) are only safe for use after acknowledgement from the server. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-12-02internal/pipewire: handle Core::ErrorOphestra
This event is not encountered in the pw-container sample, but already has existing sample from an excerpt. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-12-02internal/pipewire: implement client contextOphestra
This consumes the entire sample, is validated to send identical messages and correctly handle received messages. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-12-02internal/pipewire: use correct types in headerOphestra
This was written when the protocol was still barely understood, so none of the types here are correct and match the rest of the protocol. This change corrects these types. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-12-02internal/pipewire: wrap EOF error for deserialisationOphestra
The io.ErrUnexpectedEOF error can be returned from multiple places. This change eases error handling. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-12-02internal/pipewire: preallocate for footerOphestra
This is useful during serialisation. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-30internal/pipewire: benchmarks against Gob and JSONOphestra
Performance does not matter for the use case of this library, but it is still interesting to know. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-30internal/pipewire: implement Core::ErrorOphestra
Sample was captured from pw-cli. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-29internal/pipewire: implement Core::Ping, Core::PongOphestra
I could not get the server to produce these events, however I am confident enough with the implementation to do it by hand. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-29internal/pipewire: implement SecurityContext::CreateOphestra
This is finally the thing we are after. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-29internal/pipewire: implement Registry::BindOphestra
This change also adds test cases for messages before this one. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-29internal/pipewire: implement client generation footerOphestra
This corresponds with the core generation footer and seem to be the only other possible footer type. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-28internal/pipewire: implement Registry::GlobalOphestra
Dealing with this event reawakened my burning hatred for OOP. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-28internal/pipewire: add json struct tagsOphestra
These match the names found in documentation. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-28internal/pipewire: do not store spa_dict fieldsOphestra
This is effectively a poor man's slice, it is entirely unnecessary here and can be handled internally. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-28internal/pipewire: store sample iovec continuouslyOphestra
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>
2025-11-27internal/pipewire: add missing constantsOphestra
These did not appear useful at first since it was assumed to be filenames for loading modules. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-27internal/pipewire: shorten test data filenamesOphestra
These were getting very annoying to type. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-27internal/pipewire: spa_dict size nil checkOphestra
This fixes serialisation of NULL spa_dict. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-27internal/pipewire: require appending marshalerOphestra
This eliminates all non-reflect allocations. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-27internal/pipewire: preallocate for known sizeOphestra
This is still not efficient by any means, but it should eliminate most non-reflect allocation (all allocation if PODMarshaler is not used). Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-27internal/pipewire: size without serialisationOphestra
This is required to achieve zero allocation (other than reflect). Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-27internal/pipewire: simplify spa_dict appendsOphestra
This change uses the (somewhat) newly exposed MarshalAppend which improves readability. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-27internal/pipewire: define size constantsOphestra
This gets rid of magic numbers in marshal/unmarshal. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-26internal/pipewire: implement Core::DoneOphestra
The message in the sample does not correspond to any known method call. The spec does not mention what to do with messages like this, but all existing usage code simply drops it. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-26internal/pipewire: optional final trailing garbage checkOphestra
Omitting the check is only useful for custom unmarshaler. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-26internal/pipewire: additional Client::Info test caseOphestra
This appears to add *one single entry* compared to the message before it. The inefficiency of this protocol is beyond imagination. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-26internal/pipewire: additional Client::Info test caseOphestra
This message follows the other Client::Info event before it. No idea why. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-26internal/pipewire: implement Client::InfoOphestra
Everything is already supported, as usual. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement Core::BoundPropsOphestra
Very straightforward type, everything is already supported. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: check nil marshalerOphestra
NULL values have special case in the format. This check ensures correctness serialising nil pointers. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement Core::Info and generation footerOphestra
These are not directly related but are first encountered on the same message in the capture. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement footerOphestra
The POD itself is serialised without requiring a special case, however its presence is only indicated by the difference in size recorded in the header and payload. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement Long typeOphestra
Thankfully no special case here. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement Id typeOphestra
This is, in fact, just a glorified Int type. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: slice at POD boundaryOphestra
This prevents incorrectly reading trailing data as part of the current POD. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: bounds check against wire sizeOphestra
This covers cases where wire size is not known ahead of time. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: spa_dict trailing garbage within PODOphestra
This performs the check within the bounds of the POD only. This was not caught since spa_dict was only used as the final struct field until now. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: zero size before validationOphestra
Leftover values from previous invocations cause incorrect behaviour here. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement Core::SyncOphestra
Once again, already entirely supported, the offset is not yet fully verified but makes intuitive sense. Will verify this on future occurrences of the message. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement Core::GetRegistryOphestra
This struct is entirely supported, so this change is very straightforward. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: move test data to filesOphestra
These get very big later on, and would be painful to represent as the compound literal. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement Client::UpdatePropertiesOphestra
This is the second message on the captured sample. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement spa_dict typeOphestra
This is a terrible type that defies the type system. It is implemented on the concrete type to avoid special cases. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: use custom marshaler when availableOphestra
This reduces special cases. This change also exposes unmarshalled message size on the wire. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement string typeOphestra
This is still NUL terminated strings, and an extra NUL character on an 8-byte string does cause an extra 7 bytes of padding. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: check for trailing garbageOphestra
This is useful during development. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-25internal/pipewire: implement Core::HelloOphestra
This implements enough types to correctly marshal and unmarshal Core::Hello. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-24internal/pipewire: add type constantsOphestra
This change also centralises encoding testing. Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-11-23internal/pipewire: implement message headerOphestra
Test cases are from interactions between pw-container and PipeWire. Results are validated against corresponding body. Signed-off-by: Ophestra <cat@gensokyo.uk>