package pipewire import ( "encoding/binary" "fmt" ) // A SPAKind describes the kind of data being encoded right after it. // // These do not always follow the same rules, and encoding/decoding // is very much context-dependent. Callers should therefore not // attempt to use these values directly and rely on [Marshal] and // [Unmarshal] and their variants instead. type SPAKind Word /* Basic types */ const ( /* POD's can contain a number of basic SPA types: */ SPA_TYPE_START SPAKind = 0x00000 + iota SPA_TYPE_None // No value or a NULL pointer. SPA_TYPE_Bool // A boolean value. SPA_TYPE_Id // An enumerated value. SPA_TYPE_Int // An integer value, 32-bit. SPA_TYPE_Long // An integer value, 64-bit. SPA_TYPE_Float // A floating point value, 32-bit. SPA_TYPE_Double // A floating point value, 64-bit. SPA_TYPE_String // A string. SPA_TYPE_Bytes // A byte array. SPA_TYPE_Rectangle // A rectangle with width and height. SPA_TYPE_Fraction // A fraction with numerator and denominator. SPA_TYPE_Bitmap // An array of bits. /* POD's can be grouped together in these container types: */ SPA_TYPE_Array // An array of equal sized objects. SPA_TYPE_Struct // A collection of types and objects. SPA_TYPE_Object // An object with properties. SPA_TYPE_Sequence // A timed sequence of POD's. /* POD's can also contain some extra types: */ SPA_TYPE_Pointer // A typed pointer in memory. SPA_TYPE_Fd // A file descriptor. SPA_TYPE_Choice // A choice of values. SPA_TYPE_Pod // A generic type for the POD itself. _SPA_TYPE_LAST // not part of ABI ) // append appends the representation of [SPAKind] to data and returns the appended slice. func (kind SPAKind) append(data []byte) []byte { return binary.NativeEndian.AppendUint32(data, Word(kind)) } // String returns the name of the [SPAKind] for basic types. func (kind SPAKind) String() string { switch kind { case SPA_TYPE_None: return "None" case SPA_TYPE_Bool: return "Bool" case SPA_TYPE_Id: return "Id" case SPA_TYPE_Int: return "Int" case SPA_TYPE_Long: return "Long" case SPA_TYPE_Float: return "Float" case SPA_TYPE_Double: return "Double" case SPA_TYPE_String: return "String" case SPA_TYPE_Bytes: return "Bytes" case SPA_TYPE_Rectangle: return "Rectangle" case SPA_TYPE_Fraction: return "Fraction" case SPA_TYPE_Bitmap: return "Bitmap" case SPA_TYPE_Array: return "Array" case SPA_TYPE_Struct: return "Struct" case SPA_TYPE_Object: return "Object" case SPA_TYPE_Sequence: return "Sequence" case SPA_TYPE_Pointer: return "Pointer" case SPA_TYPE_Fd: return "Fd" case SPA_TYPE_Choice: return "Choice" case SPA_TYPE_Pod: return "Pod" default: return fmt.Sprintf("invalid type field %#x", Word(kind)) } } /* Pointers */ const ( SPA_TYPE_POINTER_START = 0x10000 + iota SPA_TYPE_POINTER_Buffer SPA_TYPE_POINTER_Meta SPA_TYPE_POINTER_Dict _SPA_TYPE_POINTER_LAST // not part of ABI ) /* Events */ const ( SPA_TYPE_EVENT_START = 0x20000 + iota SPA_TYPE_EVENT_Device SPA_TYPE_EVENT_Node _SPA_TYPE_EVENT_LAST // not part of ABI ) /* Commands */ const ( SPA_TYPE_COMMAND_START = 0x30000 + iota SPA_TYPE_COMMAND_Device SPA_TYPE_COMMAND_Node _SPA_TYPE_COMMAND_LAST // not part of ABI ) /* Objects */ const ( SPA_TYPE_OBJECT_START = 0x40000 + iota SPA_TYPE_OBJECT_PropInfo SPA_TYPE_OBJECT_Props SPA_TYPE_OBJECT_Format SPA_TYPE_OBJECT_ParamBuffers SPA_TYPE_OBJECT_ParamMeta SPA_TYPE_OBJECT_ParamIO SPA_TYPE_OBJECT_ParamProfile SPA_TYPE_OBJECT_ParamPortConfig SPA_TYPE_OBJECT_ParamRoute SPA_TYPE_OBJECT_Profiler SPA_TYPE_OBJECT_ParamLatency SPA_TYPE_OBJECT_ParamProcessLatency SPA_TYPE_OBJECT_ParamTag _SPA_TYPE_OBJECT_LAST // not part of ABI ) /* vendor extensions */ const ( SPA_TYPE_VENDOR_PipeWire = 0x02000000 SPA_TYPE_VENDOR_Other = 0x7f000000 ) /* spa/include/spa/utils/type.h */ const ( SPA_TYPE_INFO_BASE = "Spa:" SPA_TYPE_INFO_Flags = SPA_TYPE_INFO_BASE + "Flags" SPA_TYPE_INFO_FLAGS_BASE = SPA_TYPE_INFO_Flags + ":" SPA_TYPE_INFO_Enum = SPA_TYPE_INFO_BASE + "Enum" SPA_TYPE_INFO_ENUM_BASE = SPA_TYPE_INFO_Enum + ":" SPA_TYPE_INFO_Pod = SPA_TYPE_INFO_BASE + "Pod" SPA_TYPE_INFO_POD_BASE = SPA_TYPE_INFO_Pod + ":" SPA_TYPE_INFO_Struct = SPA_TYPE_INFO_POD_BASE + "Struct" SPA_TYPE_INFO_STRUCT_BASE = SPA_TYPE_INFO_Struct + ":" SPA_TYPE_INFO_Object = SPA_TYPE_INFO_POD_BASE + "Object" SPA_TYPE_INFO_OBJECT_BASE = SPA_TYPE_INFO_Object + ":" SPA_TYPE_INFO_Pointer = SPA_TYPE_INFO_BASE + "Pointer" SPA_TYPE_INFO_POINTER_BASE = SPA_TYPE_INFO_Pointer + ":" SPA_TYPE_INFO_Interface = SPA_TYPE_INFO_POINTER_BASE + "Interface" SPA_TYPE_INFO_INTERFACE_BASE = SPA_TYPE_INFO_Interface + ":" SPA_TYPE_INFO_Event = SPA_TYPE_INFO_OBJECT_BASE + "Event" SPA_TYPE_INFO_EVENT_BASE = SPA_TYPE_INFO_Event + ":" SPA_TYPE_INFO_Command = SPA_TYPE_INFO_OBJECT_BASE + "Command" SPA_TYPE_INFO_COMMAND_BASE = SPA_TYPE_INFO_Command + ":" ) /* pipewire/device.h */ const ( PW_TYPE_INTERFACE_Device = PW_TYPE_INFO_INTERFACE_BASE + "Device" PW_DEVICE_PERM_MASK = PW_PERM_RWXM PW_VERSION_DEVICE = 3 ) const ( PW_DEVICE_CHANGE_MASK_PROPS = 1 << iota PW_DEVICE_CHANGE_MASK_PARAMS PW_DEVICE_CHANGE_MASK_ALL = 1<