150 lines
3.2 KiB
Rust
150 lines
3.2 KiB
Rust
// Copyright 2025 System76 <info@system76.com>
|
|
// 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<String> {
|
|
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<CType: Copy>(pod: &Pod) -> Option<Vec<CType>> {
|
|
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,
|
|
}
|