// Copyright © 2017-2018 Mozilla Foundation
//
// This program is made available under an ISC-style license. See the
// accompanying file LICENSE for details.
use ffi;
bitflags! {
/// Some common layout definitions
pub struct ChannelLayout: ffi::cubeb_channel_layout {
///
const FRONT_LEFT = ffi::CHANNEL_FRONT_LEFT;
const FRONT_RIGHT = ffi::CHANNEL_FRONT_RIGHT;
const FRONT_CENTER = ffi::CHANNEL_FRONT_CENTER;
const LOW_FREQUENCY = ffi::CHANNEL_LOW_FREQUENCY;
const BACK_LEFT = ffi::CHANNEL_BACK_LEFT;
const BACK_RIGHT = ffi::CHANNEL_BACK_RIGHT;
const FRONT_LEFT_OF_CENTER = ffi::CHANNEL_FRONT_LEFT_OF_CENTER;
const FRONT_RIGHT_OF_CENTER = ffi::CHANNEL_FRONT_RIGHT_OF_CENTER;
const BACK_CENTER = ffi::CHANNEL_BACK_CENTER;
const SIDE_LEFT = ffi::CHANNEL_SIDE_LEFT;
const SIDE_RIGHT = ffi::CHANNEL_SIDE_RIGHT;
const TOP_CENTER = ffi::CHANNEL_TOP_CENTER;
const TOP_FRONT_LEFT = ffi::CHANNEL_TOP_FRONT_LEFT;
const TOP_FRONT_CENTER = ffi::CHANNEL_TOP_FRONT_CENTER;
const TOP_FRONT_RIGHT = ffi::CHANNEL_TOP_FRONT_RIGHT;
const TOP_BACK_LEFT = ffi::CHANNEL_TOP_BACK_LEFT;
const TOP_BACK_CENTER = ffi::CHANNEL_TOP_BACK_CENTER;
const TOP_BACK_RIGHT = ffi::CHANNEL_TOP_BACK_RIGHT;
}
}
macro_rules! bits {
($($x:ident => $y:ident),*) => {
$(pub const $x: ChannelLayout = ChannelLayout::from_bits_truncate(ffi::$y);)*
}
}
impl ChannelLayout {
bits!(UNDEFINED => CUBEB_LAYOUT_UNDEFINED,
MONO => CUBEB_LAYOUT_MONO,
MONO_LFE => CUBEB_LAYOUT_MONO_LFE,
STEREO => CUBEB_LAYOUT_STEREO,
STEREO_LFE => CUBEB_LAYOUT_STEREO_LFE,
_3 F => CUBEB_LAYOUT_3F,
_3 F_LFE => CUBEB_LAYOUT_3F_LFE,
_2 F1 => CUBEB_LAYOUT_2F1,
_2 F1_LFE => CUBEB_LAYOUT_2F1_LFE,
_3 F1 => CUBEB_LAYOUT_3F1,
_3 F1_LFE => CUBEB_LAYOUT_3F1_LFE,
_2 F2 => CUBEB_LAYOUT_2F2,
_2 F2_LFE => CUBEB_LAYOUT_2F2_LFE,
QUAD => CUBEB_LAYOUT_QUAD,
QUAD_LFE => CUBEB_LAYOUT_QUAD_LFE,
_3 F2 => CUBEB_LAYOUT_3F2,
_3 F2_LFE => CUBEB_LAYOUT_3F2_LFE,
_3 F2_BACK => CUBEB_LAYOUT_3F2_BACK,
_3 F2_LFE_BACK => CUBEB_LAYOUT_3F2_LFE_BACK,
_3 F3R_LFE => CUBEB_LAYOUT_3F3R_LFE,
_3 F4_LFE => CUBEB_LAYOUT_3F4_LFE
);
}
impl From<ffi::cubeb_channel> for ChannelLayout {
fn from(x: ffi::cubeb_channel) -> Self {
ChannelLayout::from_bits_truncate(x)
}
}
impl From<ChannelLayout> for ffi::cubeb_channel {
fn from(x: ChannelLayout) -> Self {
x.bits()
}
}
impl ChannelLayout {
pub fn num_channels(&self ) -> u32 {
unsafe { ffi::cubeb_channel_layout_nb_channels(self .bits()) }
}
}
#[ cfg(test)]
mod test {
use ffi;
#[ test]
fn channel_layout_from_raw() {
macro_rules! check(
($($raw:ident => $real:ident),*) => (
$(let x = super ::ChannelLayout::from(ffi::$raw);
assert_eq!(x, super ::ChannelLayout::$real);
)*
) );
check!(CUBEB_LAYOUT_UNDEFINED => UNDEFINED,
CUBEB_LAYOUT_MONO => MONO,
CUBEB_LAYOUT_MONO_LFE => MONO_LFE,
CUBEB_LAYOUT_STEREO => STEREO,
CUBEB_LAYOUT_STEREO_LFE => STEREO_LFE,
CUBEB_LAYOUT_3F => _3 F,
CUBEB_LAYOUT_3F_LFE => _3 F_LFE,
CUBEB_LAYOUT_2F1 => _2 F1,
CUBEB_LAYOUT_2F1_LFE => _2 F1_LFE,
CUBEB_LAYOUT_3F1 => _3 F1,
CUBEB_LAYOUT_3F1_LFE => _3 F1_LFE,
CUBEB_LAYOUT_2F2 => _2 F2,
CUBEB_LAYOUT_2F2_LFE => _2 F2_LFE,
CUBEB_LAYOUT_QUAD => QUAD,
CUBEB_LAYOUT_QUAD_LFE => QUAD_LFE,
CUBEB_LAYOUT_3F2 => _3 F2,
CUBEB_LAYOUT_3F2_LFE => _3 F2_LFE,
CUBEB_LAYOUT_3F2_BACK => _3 F2_BACK,
CUBEB_LAYOUT_3F2_LFE_BACK => _3 F2_LFE_BACK,
CUBEB_LAYOUT_3F3R_LFE => _3 F3R_LFE,
CUBEB_LAYOUT_3F4_LFE => _3 F4_LFE);
}
#[ test]
fn channel_layout_into_raw() {
macro_rules! check(
($($real:ident => $raw:ident),*) => (
$(let x = super ::ChannelLayout::$real;
let x: ffi::cubeb_channel_layout = x.into();
assert_eq!(x, ffi::$raw);
)*
) );
check!(UNDEFINED => CUBEB_LAYOUT_UNDEFINED,
MONO => CUBEB_LAYOUT_MONO,
MONO_LFE => CUBEB_LAYOUT_MONO_LFE,
STEREO => CUBEB_LAYOUT_STEREO,
STEREO_LFE => CUBEB_LAYOUT_STEREO_LFE,
_3 F => CUBEB_LAYOUT_3F,
_3 F_LFE => CUBEB_LAYOUT_3F_LFE,
_2 F1 => CUBEB_LAYOUT_2F1,
_2 F1_LFE=> CUBEB_LAYOUT_2F1_LFE,
_3 F1 => CUBEB_LAYOUT_3F1,
_3 F1_LFE => CUBEB_LAYOUT_3F1_LFE,
_2 F2 => CUBEB_LAYOUT_2F2,
_2 F2_LFE => CUBEB_LAYOUT_2F2_LFE,
QUAD => CUBEB_LAYOUT_QUAD,
QUAD_LFE => CUBEB_LAYOUT_QUAD_LFE,
_3 F2 => CUBEB_LAYOUT_3F2,
_3 F2_LFE => CUBEB_LAYOUT_3F2_LFE,
_3 F2_BACK => CUBEB_LAYOUT_3F2_BACK,
_3 F2_LFE_BACK => CUBEB_LAYOUT_3F2_LFE_BACK,
_3 F3R_LFE => CUBEB_LAYOUT_3F3R_LFE,
_3 F4_LFE => CUBEB_LAYOUT_3F4_LFE);
}
}
Messung V0.5 in Prozent C=71 H=92 G=81
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-18)
¤
*© Formatika GbR, Deutschland