portable_audio_library/compression/
mod.rs

1use crate::error::PortableAudioLibraryResult;
2use serde::{Deserialize, Serialize};
3use std::io::{Read, Write};
4
5pub mod gz;
6pub mod lz4;
7pub mod none;
8pub mod snap;
9
10/// Compression type.
11#[derive(Debug, Clone, Default, PartialEq, PartialOrd, Serialize, Deserialize)]
12pub enum CompressionType {
13    #[default]
14    None,
15    Lz4(u32),
16    Snap,
17    Gz(u32),
18}
19
20/// Compresses and decompresses audio data.
21pub trait Compression<R, W>
22where
23    R: Read,
24    W: Write,
25{
26    /// Compresses the audio data from the reader to the writer.
27    fn compress(&self, reader: &mut R, writer: &mut W) -> PortableAudioLibraryResult<()>;
28
29    /// Decompresses the audio data from the reader to the writer.
30    fn decompress(&self, reader: &mut R, writer: &mut W) -> PortableAudioLibraryResult<()>;
31}
32
33/// Returns a compression based on the given compression type.
34pub fn get_compression<R, W>(compression_type: &CompressionType) -> Box<dyn Compression<R, W>>
35where
36    R: Read,
37    W: Write,
38{
39    match compression_type {
40        CompressionType::None => Box::new(none::None),
41        CompressionType::Lz4(level) => Box::new(lz4::Lz4(*level)),
42        CompressionType::Snap => Box::new(snap::Snap),
43        CompressionType::Gz(level) => Box::new(gz::Gz(*level)),
44    }
45}