summaryrefslogtreecommitdiffstats
path: root/third_party/rust/cubeb/src/frame.rs
blob: 70b7d6a2318a7b953155a086c57c2d98c1da1ae7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//! Frame utilities

use std::{mem, slice};

/// A `Frame` is a collection of samples which have a a specific
/// layout represented by `ChannelLayout`
pub trait Frame {}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
/// A monaural frame.
pub struct MonoFrame<T> {
    /// Mono channel
    pub m: T,
}

impl<T> Frame for MonoFrame<T> {}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
/// A stereo frame.
pub struct StereoFrame<T> {
    /// Left channel
    pub l: T,
    /// Right channel
    pub r: T,
}

impl<T> Frame for StereoFrame<T> {}

pub unsafe fn frame_from_bytes<F: Frame>(bytes: &[u8]) -> &[F] {
    debug_assert_eq!(bytes.len() % mem::size_of::<F>(), 0);
    slice::from_raw_parts(
        bytes.as_ptr() as *const F,
        bytes.len() / mem::size_of::<F>(),
    )
}

pub unsafe fn frame_from_bytes_mut<F: Frame>(bytes: &mut [u8]) -> &mut [F] {
    debug_assert!(bytes.len() % mem::size_of::<F>() == 0);
    slice::from_raw_parts_mut(bytes.as_ptr() as *mut F, bytes.len() / mem::size_of::<F>())
}