Skip to content

Commit

Permalink
writer ok
Browse files Browse the repository at this point in the history
  • Loading branch information
kali committed Sep 3, 2018
1 parent b2df4fd commit 9406cdc
Show file tree
Hide file tree
Showing 3 changed files with 302 additions and 192 deletions.
75 changes: 43 additions & 32 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,7 @@ fn append_works_on_files() {
let len = fs::metadata("append.wav").unwrap().len();

let mut appender = WavWriter::append("append.wav").unwrap();
println!("appender: {:?} len:{}", appender.spec(), len);

appender.write_sample(19_i16).unwrap();
appender.write_sample(23_i16).unwrap();
Expand All @@ -801,6 +802,8 @@ fn append_works_on_files() {

#[test]
fn write_read_chunks_is_lossless() {
use std::io::Read;

let vec = Vec::new();
let mut buffer = io::Cursor::new(vec);
let write_spec = WavSpec {
Expand All @@ -810,21 +813,16 @@ fn write_read_chunks_is_lossless() {
sample_format: SampleFormat::Int,
};
{
let mut writer = WavWriter::new(&mut buffer, write_spec).unwrap();
for s in -1024_i16..1024 {
writer.write_sample(s).unwrap();
}
writer.finalize().unwrap();
}
/*
{
let mut writer = WavWriter::new_with_chunks(&mut buffer, write_spec, &[(*b"houn", b"1234")]).unwrap();
let mut writer = ::write::ChunksWriter::new(&mut buffer).unwrap();
writer.write_fmt(write_spec).unwrap();
writer.write_chunk_buffer(::read::ChunkKind::Unknown(*b"houn"), b"1234").unwrap();
writer.open_chunk(::read::ChunkKind::Data).unwrap();
let mut writer = writer.into_wav_writer().unwrap();
for s in -1024_i16..1024 {
writer.write_sample(s).unwrap();
}
writer.finalize().unwrap();
}
*/
{
buffer.set_position(0);
//let mut chunk_counter = 0;
Expand All @@ -835,20 +833,17 @@ fn write_read_chunks_is_lossless() {
assert!(fmt.kind == read::ChunkKind::Fmt);
let _spec = reader.read_fmt_chunk().unwrap();

let unknown = reader.next_chunk().unwrap().unwrap();
assert_eq!(unknown.kind, read::ChunkKind::Unknown(*b"houn"));
assert_eq!(unknown.len, 4);
let mut value = vec!();
reader.read_to_end(&mut value).unwrap();
assert!(value == b"1234");

let data = reader.next_chunk().unwrap().unwrap();
assert!(data.kind == read::ChunkKind::Data);
let mut reader = reader.into_wav_reader().unwrap();

/*
let mut reader = WavReader::new_with_unknown_handler(&mut buffer, Some(&mut |code, data| {
assert_eq!(code, *b"houn");
assert_eq!(data, b"1234");
chunk_counter += 1;
Ok(())
})).unwrap();
*/
//assert_eq!(chunk_counter, 1);

assert_eq!(write_spec, reader.spec());
assert_eq!(reader.len(), 2048);
for (expected, read) in (-1024_i16..1024).zip(reader.samples()) {
Expand All @@ -857,9 +852,10 @@ fn write_read_chunks_is_lossless() {
}
}

/*
#[test]
fn write_read_chunks_odd_size_is_lossless() {
fn write_read_chunks_is_lossless_with_odd_size() {
use std::io::Read;

let vec = Vec::new();
let mut buffer = io::Cursor::new(vec);
let write_spec = WavSpec {
Expand All @@ -869,27 +865,42 @@ fn write_read_chunks_odd_size_is_lossless() {
sample_format: SampleFormat::Int,
};
{
let mut writer = WavWriter::new_with_chunks(&mut buffer, write_spec, &[(*b"houn", b"12345")]).unwrap();
let mut writer = ::write::ChunksWriter::new(&mut buffer).unwrap();
writer.write_fmt(write_spec).unwrap();
writer.write_chunk_buffer(::read::ChunkKind::Unknown(*b"houn"), b"12345").unwrap();
writer.open_chunk(::read::ChunkKind::Data).unwrap();
let mut writer = writer.into_wav_writer().unwrap();
for s in -1024_i16..1024 {
writer.write_sample(s).unwrap();
}
writer.finalize().unwrap();
}
{
buffer.set_position(0);
let mut chunk_counter = 0;
let mut reader = WavReader::new_with_unknown_handler(&mut buffer, Some(&mut |code, data| {
assert_eq!(code, *b"houn");
assert_eq!(data, b"12345");
chunk_counter += 1;
Ok(())
})).unwrap();
assert_eq!(chunk_counter, 1);
//let mut chunk_counter = 0;

let mut reader = read::ChunksReader::new(&mut buffer).unwrap();

let fmt = reader.next_chunk().unwrap().unwrap();
assert!(fmt.kind == read::ChunkKind::Fmt);
let _spec = reader.read_fmt_chunk().unwrap();

let unknown = reader.next_chunk().unwrap().unwrap();
assert_eq!(unknown.kind, read::ChunkKind::Unknown(*b"houn"));
assert_eq!(unknown.len, 5);
let mut value = vec!();
reader.read_to_end(&mut value).unwrap();
assert!(value == b"12345");

let data = reader.next_chunk().unwrap().unwrap();
assert!(data.kind == read::ChunkKind::Data);
let mut reader = reader.into_wav_reader().unwrap();

assert_eq!(write_spec, reader.spec());
assert_eq!(reader.len(), 2048);
for (expected, read) in (-1024_i16..1024).zip(reader.samples()) {
assert_eq!(expected, read.unwrap());
}
}
}
*/

7 changes: 3 additions & 4 deletions src/read.rs
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ pub enum ChunkKind {
Fmt,
Fact,
Data,
Unknown,
Unknown([u8;4]),
}

/// Describes the structure of a chunk in the WAVE file.
Expand Down Expand Up @@ -244,7 +244,7 @@ impl<R: io::Read> ChunksReader<R> {
b"fmt " => ChunkKind::Fmt,
b"fact" => ChunkKind::Fact,
b"data" => ChunkKind::Data,
_ => ChunkKind::Unknown,
_ => ChunkKind::Unknown(kind_str),
};

Ok(ChunkHeader { kind: kind, len: len })
Expand All @@ -259,7 +259,6 @@ impl<R: io::Read> ChunksReader<R> {
loop {
let header = try!(self.next_chunk());
let header = try!(header.ok_or(Error::FormatError("Wave file without DATA chunk")));
println!("see header: {:?}", header);
match header.kind {
ChunkKind::Fmt => {
try!(self.read_fmt_chunk());
Expand All @@ -283,7 +282,7 @@ impl<R: io::Read> ChunksReader<R> {
return Err(Error::FormatError("missing fmt chunk"));
}
}
ChunkKind::Unknown => { }
ChunkKind::Unknown(_) => { }
}
// If no data chunk is ever encountered, the function will return
// via one of the try! macros that return an Err on end of file.
Expand Down
Loading

0 comments on commit 9406cdc

Please sign in to comment.