1use nom::IResult;
2
3use crate::{parser::event::parse_event, types::Track};
4
5pub fn parse_track_chunk_header(i: &[u8]) -> IResult<&[u8], &[u8]> {
6 use nom::{
7 bytes::streaming::{tag, take},
8 number::streaming::be_u32,
9 };
10
11 let (i, _) = tag("MTrk")(i)?;
12 let (i, length) = be_u32(i)?;
13 take(length)(i)
14}
15
16pub fn parse_track_chunk(i: &[u8]) -> IResult<&[u8], Track> {
17 let (i, mut data) = parse_track_chunk_header(i)?;
18 let mut events = vec![];
19 while data.len() > 0 {
20 let (data_after, evt) = parse_event(data)?;
21 data = data_after;
22 events.push(evt);
23 }
24 Ok((i, Track { events: events }))
25}