From 634c21dc9a8416c1f2bae1f0e42ffa94fbb972fd Mon Sep 17 00:00:00 2001 From: Jamie Hardt Date: Sat, 2 Jan 2021 12:23:08 -0800 Subject: [PATCH] Added buffered IO And updated tests to reflect this --- src/wavereader.rs | 15 ++++++++++++--- src/wavewriter.rs | 13 +++++++++++-- tests/ffprobe_media_tests.rs | 2 +- tests/integration_test.rs | 2 +- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/wavereader.rs b/src/wavereader.rs index 5e85411..b3ddac9 100644 --- a/src/wavereader.rs +++ b/src/wavereader.rs @@ -13,7 +13,7 @@ use super::chunks::ReadBWaveChunks; use super::cue::Cue; use std::io::Cursor; -use std::io::{Read, Seek}; +use std::io::{Read, Seek, BufReader}; @@ -68,13 +68,22 @@ pub struct WaveReader { pub inner: R, } +impl WaveReader> { + + pub fn open(path: &str) -> Result { + let f = File::open(path)?; + let inner = BufReader::new(f); + Ok( Self::new(inner)? ) + } +} + impl WaveReader { - /// Open a file for reading. + /// Open a file for reading with unbuffered IO. /// /// A convenience that opens `path` and calls `Self::new()` - pub fn open(path: &str) -> Result { + pub fn open_unbuffered(path: &str) -> Result { let inner = File::open(path)?; return Ok( Self::new(inner)? ) } diff --git a/src/wavewriter.rs b/src/wavewriter.rs index bd2987e..5e153fb 100644 --- a/src/wavewriter.rs +++ b/src/wavewriter.rs @@ -1,5 +1,5 @@ use std::fs::File; -use std::io::{Write,Seek,SeekFrom,Cursor}; +use std::io::{Write,Seek,SeekFrom,Cursor,BufWriter}; use super::Error; use super::fourcc::{FourCC, WriteFourCC, RIFF_SIG, RF64_SIG, DS64_SIG, @@ -209,10 +209,19 @@ pub struct WaveWriter where W: Write + Seek { const DS64_RESERVATION_LENGTH : u32 = 96; -impl WaveWriter { +impl WaveWriter> { /// Create a new Wave file at `path`. pub fn create(path : &str, format : WaveFmt) -> Result { + let f = File::create(path)?; + let b = BufWriter::new(f); + Ok( Self::new(b, format)? ) + } +} + +impl WaveWriter { + /// Creare a new Wave file with unbuffered IO at `path` + pub fn create_unbuffered(path : &str, format : WaveFmt) -> Result { let f = File::create(path)?; Ok( Self::new(f, format)? ) } diff --git a/tests/ffprobe_media_tests.rs b/tests/ffprobe_media_tests.rs index 5965b2d..2b8213b 100644 --- a/tests/ffprobe_media_tests.rs +++ b/tests/ffprobe_media_tests.rs @@ -30,7 +30,7 @@ fn assert_match_stream(stream_key: &str, .for_each(|value| { let filen : &str = value["format"]["filename"].as_str().unwrap(); let json_value : &Value = &value["streams"][0][stream_key]; - let mut wavfile = WaveReader::open(filen).unwrap(); + let mut wavfile = WaveReader::open_unbuffered(filen).unwrap(); let wavfile_value: T = other(&mut wavfile); println!("asserting {} for {}",stream_key, filen); assert_eq!(Into::::into(wavfile_value), *json_value); diff --git a/tests/integration_test.rs b/tests/integration_test.rs index 759151c..dcbdd53 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -165,7 +165,7 @@ fn test_frame_reader_consumes_reader() { use bwavfile::WaveFmt; use bwavfile::AudioFrameReader; use std::fs::File; - fn from_wav_filename(wav_filename: &str) -> Result<(WaveFmt, AudioFrameReader), ()> { + fn from_wav_filename(wav_filename: &str) -> Result<(WaveFmt, AudioFrameReader>), ()> { if let Ok(mut r) = WaveReader::open(&wav_filename) { let format = r.format().unwrap(); let frame_reader = r.audio_frame_reader().unwrap();