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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//! Structures related to `Floaout`
//! 
//! Floaout is the forefront audio format that enables immersive sound which takes advantage of both channel-based and object-based system.

use crate::format::{BubbleFieldSize, Color};
use crate::format::bub::BubbleBlock;

/// Details of the Floaout file.
#[derive(Clone, Copy, Debug, Default, Hash, Eq, Ord, PartialEq, PartialOrd)]
pub struct Floaout {
    /// This is the number of `Floaout` version.
    pub version: u8,
    /// It links to title, artist, lyrics, image, etc.
    /// This ID will save the file size and enhance versatility.
    ///  Developers also have the merit that they don't have to process title string and so on in the file and allow concentrate on audio processing.
    ///  If Song ID is "0x0000000000000000", this means no link.
    pub song_id: u64,
    /// This includes length, width and height.
    pub bub_field_size: BubbleFieldSize,
    // Format
    /// Number of Bubble in Floaout
    pub bubbles: u16,
    /// This is number of block.
    pub blocks: u64,
    /// Sampling Rate
    pub sampling_rate: u32,
    /// Bits Per Sample
    pub bits_per_sample: u16
}

/// This structure contains data about Bubble in Floaout.
#[derive(Clone, Debug, Default, Hash, Eq, Ord, PartialEq, PartialOrd)]
pub struct BubbleInFloaout {
    /// Bubble Name Size
    pub name_size: u8,
    /// Name of Bubble
    pub name: String,
    /// This includes red, green, blue.
    pub color: Color
}

/// This structure covers all 'BubbleInFloaout' in Floaout.
/// This block is Vec of Bubble block.
#[derive(Clone, Debug, Default, Hash, Eq, Ord, PartialEq, PartialOrd)]
pub struct BubblesInFloaout(pub Vec<BubbleInFloaout>);

impl From<Vec<BubbleInFloaout>> for BubblesInFloaout {
    fn from(value: Vec<BubbleInFloaout>) -> Self {
        BubblesInFloaout(value)
    }
}

impl Into<Vec<BubbleInFloaout>> for BubblesInFloaout {
    fn into(self) -> Vec<BubbleInFloaout> {
        self.0 as Vec<BubbleInFloaout>
    }
}

/// Block of Floaout
/// This block is Vec of Bubble block.
#[derive(Clone, Debug, PartialEq, PartialOrd)]
pub struct FloaoutBlock(pub Vec<BubbleBlock>);

impl From<Vec<BubbleBlock>> for FloaoutBlock {
    fn from(value: Vec<BubbleBlock>) -> Self {
        FloaoutBlock(value)
    }
}

impl Into<Vec<BubbleBlock>> for FloaoutBlock {
    fn into(self) -> Vec<BubbleBlock> {
        self.0 as Vec<BubbleBlock>
    }
}

/// Blocks of Floaout
#[derive(Clone, Debug, PartialEq, PartialOrd)]
pub struct FloaoutBlocks(pub Box<[FloaoutBlock]>);

impl From<Box<[FloaoutBlock]>> for FloaoutBlocks {
    fn from(buf: Box<[FloaoutBlock]>) -> Self {
        FloaoutBlocks(buf)
    }
}

impl Into<Box<[FloaoutBlock]>> for FloaoutBlocks {
    fn into(self) -> Box<[FloaoutBlock]> {
        self.0
    }
}