use smol_str::SmolStr;
use std::vec::Vec;
use crate::audio::{ChannelLayout, ChannelOrder, ChannelSpec};
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(default)
)]
#[cfg_attr(
feature = "quickcheck",
derive(::quickcheck_richderive::Arbitrary),
quickcheck(arbitrary = "crate::quickcheck_helpers::composite::channel_layout_description")
)]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ChannelLayoutDescription {
order: ChannelOrder,
channels: u32,
known_kind: ChannelLayout,
native_mask: Option<u64>,
custom_channels: Vec<ChannelSpec>,
text: SmolStr,
}
impl Default for ChannelLayoutDescription {
#[cfg_attr(not(tarpaulin), inline(always))]
fn default() -> Self {
Self::new(0)
}
}
impl ChannelLayoutDescription {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(channels: u32) -> Self {
Self {
order: ChannelOrder::Unspecified,
channels,
known_kind: ChannelLayout::Other(SmolStr::new_inline("")),
native_mask: None,
custom_channels: Vec::new(),
text: SmolStr::new_inline(""),
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn order(&self) -> ChannelOrder {
self.order
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn channels(&self) -> u32 {
self.channels
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn known_kind(&self) -> &ChannelLayout {
&self.known_kind
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn native_mask(&self) -> Option<u64> {
self.native_mask
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn custom_channels(&self) -> &[ChannelSpec] {
self.custom_channels.as_slice()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn text(&self) -> &str {
self.text.as_str()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn is_empty(&self) -> bool {
self.channels == 0
&& self.order.is_unspecified()
&& self.known_kind == ChannelLayout::default()
&& self.native_mask.is_none()
&& self.custom_channels.is_empty()
&& self.text.is_empty()
}
#[must_use]
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_order(mut self, v: ChannelOrder) -> Self {
self.order = v;
self
}
#[must_use]
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_channels(mut self, v: u32) -> Self {
self.channels = v;
self
}
#[must_use]
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_known_kind(mut self, v: ChannelLayout) -> Self {
self.known_kind = v;
self
}
#[must_use]
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_native_mask(mut self, v: Option<u64>) -> Self {
self.native_mask = v;
self
}
#[must_use]
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_custom_channels(mut self, v: Vec<ChannelSpec>) -> Self {
self.custom_channels = v;
self
}
#[must_use]
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_text(mut self, v: impl Into<SmolStr>) -> Self {
self.text = v.into();
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_order(&mut self, v: ChannelOrder) -> &mut Self {
self.order = v;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_channels(&mut self, v: u32) -> &mut Self {
self.channels = v;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_known_kind(&mut self, v: ChannelLayout) -> &mut Self {
self.known_kind = v;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_native_mask(&mut self, v: Option<u64>) -> &mut Self {
self.native_mask = v;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_custom_channels(&mut self, v: Vec<ChannelSpec>) -> &mut Self {
self.custom_channels = v;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_text(&mut self, v: impl Into<SmolStr>) -> &mut Self {
self.text = v.into();
self
}
#[cfg(feature = "buffa")]
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn push_custom_channel(&mut self, v: ChannelSpec) -> &mut Self {
self.custom_channels.push(v);
self
}
}
#[cfg(test)]
mod tests;