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
use nom;
use nom::*;
use nom::IResult;
use error;
use macros;
use std::vec;

#[derive(Debug)]
pub enum Sample {
    U8(u8),
    U16(u16),
    U32(u32),
    U64(u64)
}

pub type SampleSet = Vec<Sample>;

pub type Channels = Vec<SampleSet>;

pub fn sample(input:&[u8],size:u32) -> IResult<&[u8],Sample> {

  match size {
        8 => {
            le_u8(input).map(|(input,s)|{(input,Sample::U8(s))})
        },
        16 => {
            le_u16(input).map(|(input,s)|{(input,Sample::U16(s))})
        },
        32 => {
            le_u32(input).map(|(input,s)|{(input,Sample::U32(s))})
        }
        64 => {
            le_u64(input).map(|(input,s)|{(input,Sample::U64(s))})
        }
        _ => {
            custom_error!(input,error::UNSUPPORTED_BITS)
        }
    }
}

pub fn channels(input:&[u8],len:usize,num_channels:u32,size:u32) -> IResult<&[u8],Channels> {
    let mut channels:Channels = vec::Vec::with_capacity(num_channels as usize);
    for _ in 0..num_channels {
        channels.push(SampleSet::new());
    }
    let mut next:&[u8] = input;
    let mut temp_sample:Sample;
    let mut used = 0;
    while used < len - size as usize {
        for c in 0..num_channels {
            let ret = sample(next, size);
            if ret.is_err() {
                return Err(ret.err().unwrap());
            }
            let (n, t) = ret.unwrap();
            next = n;
            temp_sample = t;
            channels[c as usize].push(temp_sample);
            used += (size as usize);
        }
    }
    Ok((next,channels))
}