// RAW Audio
// Copyright © 2021 Jeron Aldaron Lau.
//
// Licensed under the Boost Software License, Version 1.0
// (https://www.boost.org/LICENSE_1_0.txt or see accompanying file
// LICENSE_BOOST_1_0.txt)

//! Supported Audio formats by this crate.

mod seal {
    pub trait Seal {}
}

/// A PCM Format
pub trait Pcm: seal::Seal {}

/// Unsigned 8-bit PCM
pub struct U8;
/// Signed 8-bit PCM
pub struct S8;
/// Signed 8-bit µ-Law Companded PCM
pub struct MuLaw;
/// Signed 8-bit A-Law Companded PCM
pub struct ALaw;

/// Unsigned 16-bit PCM Little Endian
pub struct U16Le;
/// Unsigned 16-bit PCM Big Endian
pub struct U16Be;
/// Signed 16-bit PCM Little Endian
pub struct S16Le;
/// Signed 16-bit PCM Big Endian
pub struct S16Be;

/// Unsigned 24-bit PCM Little Endian
pub struct U24Le;
/// Unsigned 24-bit PCM Big Endian
pub struct U24Be;
/// Signed 24-bit PCM Little Endian
pub struct S24Le;
/// Signed 24-bit PCM Big Endian
pub struct S24Be;

/// Unsigned 32-bit PCM Little Endian
pub struct U32Le;
/// Unsigned 32-bit PCM Big Endian
pub struct U32Be;
/// Signed 32-bit PCM Little Endian
pub struct S32Le;
/// Signed 32-bit PCM Big Endian
pub struct S32Be;

/// 32-bit Floating Point PCM Little Endian
pub struct F32Le;
/// 32-bit Floating Point PCM Big Endian
pub struct F32Be;
/// 64-bit Floating Point PCM Little Endian
pub struct F64Le;
/// 64-bit Floating Point PCM Big Endian
pub struct F64Be;

impl seal::Seal for U8 {}
impl Pcm for U8 {}
impl seal::Seal for S8 {}
impl Pcm for S8 {}
impl seal::Seal for MuLaw {}
impl Pcm for MuLaw {}
impl seal::Seal for ALaw {}
impl Pcm for ALaw {}

impl seal::Seal for U16Le {}
impl Pcm for U16Le {}
impl seal::Seal for U16Be {}
impl Pcm for U16Be {}
impl seal::Seal for S16Le {}
impl Pcm for S16Le {}
impl seal::Seal for S16Be {}
impl Pcm for S16Be {}

impl seal::Seal for U24Le {}
impl Pcm for U24Le {}
impl seal::Seal for U24Be {}
impl Pcm for U24Be {}
impl seal::Seal for S24Le {}
impl Pcm for S24Le {}
impl seal::Seal for S24Be {}
impl Pcm for S24Be {}

impl seal::Seal for U32Le {}
impl Pcm for U32Le {}
impl seal::Seal for U32Be {}
impl Pcm for U32Be {}
impl seal::Seal for S32Le {}
impl Pcm for S32Le {}
impl seal::Seal for S32Be {}
impl Pcm for S32Be {}

impl seal::Seal for F32Le {}
impl Pcm for F32Le {}
impl seal::Seal for F32Be {}
impl Pcm for F32Be {}
impl seal::Seal for F64Le {}
impl Pcm for F64Le {}
impl seal::Seal for F64Be {}
impl Pcm for F64Be {}