// Copyright 2025 System76 // SPDX-License-Identifier: MPL-2.0 use libspa::pod::Pod; use std::ffi::CStr; /// Read a `Pod`'s string if it contains a string. pub fn string_from_pod(pod: &Pod) -> Option { if !pod.is_string() { return None; } let mut cstr = std::ptr::null(); unsafe { // SAFETY: Pod is checked to be a string beforehand if libspa_sys::spa_pod_get_string(pod.as_raw_ptr(), &mut cstr) == 0 && !cstr.is_null() { return Some(String::from_utf8_lossy(CStr::from_ptr(cstr).to_bytes()).into_owned()); } } None } /// SAFETY: Must be absolutely certain that the array is a compatible array. pub unsafe fn array_from_pod(pod: &Pod) -> Option> { if !pod.is_array() { return None; } let mut len = 0; unsafe { let array: *mut CType = libspa_sys::spa_pod_get_array(pod.as_raw_ptr(), &mut len).cast(); if array.is_null() { return None; } Some(std::slice::from_raw_parts(array, len as usize).to_vec()) } } #[repr(u32)] #[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] pub enum Channel { #[default] UNKNOWN = 0, // unspecified NA, // N/A, silent MONO, // mono stream FL, // front left FR, // front right FC, // front center LFE, // LFE SL, // side left SR, // side right FLC, // front left center FRC, // front right center RC, // rear center RL, // rear left RR, // rear right TC, // top center TFL, // top front left TFC, // top front center TFR, // top front right TRL, // top rear left TRC, // top rear center TRR, // top rear right RLC, // rear left center RRC, // rear right center FLW, // front left wide FRW, // front right wide LFE2, // LFE 2 FLH, // front left high FCH, // front center high FRH, // front right high TFLC, // top front left center TFRC, // top front right center TSL, // top side left TSR, // top side right LLFE, // left LFE RLFE, // right LFE BC, // bottom center BLC, // bottom left center BRC = 37, // bottom right center AUX0 = 4096, // aux channels AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8, AUX9, AUX10, AUX11, AUX12, AUX13, AUX14, AUX15, AUX16, AUX17, AUX18, AUX19, AUX20, AUX21, AUX22, AUX23, AUX24, AUX25, AUX26, AUX27, AUX28, AUX29, AUX30, AUX31, AUX32, AUX33, AUX34, AUX35, AUX36, AUX37, AUX38, AUX39, AUX40, AUX41, AUX42, AUX43, AUX44, AUX45, AUX46, AUX47, AUX48, AUX49, AUX50, AUX51, AUX52, AUX53, AUX54, AUX55, AUX56, AUX57, AUX58, AUX59, AUX60, AUX61, AUX62, AUX63 = 4159, }