X-Git-Url: https://git.nihav.org/?p=nihav-tool.git;a=blobdiff_plain;f=src%2Fwavwriter.rs;h=e32a4ec69a23fb5e7a84aa72e5dd7c2d9d53d549;hp=58523b720d3c117c7f2cfe38c219de603a99398f;hb=HEAD;hpb=f7e9662a6343256ffdf5d1fc6bc7da45f2fb20e6 diff --git a/src/wavwriter.rs b/src/wavwriter.rs index 58523b7..e32a4ec 100644 --- a/src/wavwriter.rs +++ b/src/wavwriter.rs @@ -77,14 +77,14 @@ impl<'a> WavWriter<'a> { self.io.write_u32le(16)?; self.io.write_u16le(0x0001)?; // PCM self.io.write_u16le(ainfo.get_channels() as u16)?; - self.io.write_u32le(ainfo.get_sample_rate() as u32)?; + self.io.write_u32le(ainfo.get_sample_rate())?; - if bits < 16 { - self.io.write_u32le((ainfo.get_channels() as u32) * (ainfo.get_sample_rate() as u32))?; + if bits <= 8 { + self.io.write_u32le((ainfo.get_channels() as u32) * ainfo.get_sample_rate())?; self.io.write_u16le(ainfo.get_channels() as u16)?; // block align self.io.write_u16le(8)?; } else { - self.io.write_u32le(2 * (ainfo.get_channels() as u32) * (ainfo.get_sample_rate() as u32))?; + self.io.write_u32le(2 * (ainfo.get_channels() as u32) * ainfo.get_sample_rate())?; self.io.write_u16le((2 * ainfo.get_channels()) as u16)?; // block align self.io.write_u16le(16)?; } @@ -112,35 +112,51 @@ impl<'a> WavWriter<'a> { write_data!(&mut self.io, buf, write_f32); } NABufferType::AudioPacked(ref buf) => { - if !self.be || self.bits == 8 { - self.io.write_buf(buf.get_data().as_slice())?; - } else { - let data = buf.get_data(); - match self.bits { - 16 => { - for samp in data.chunks(2) { - self.io.write_byte(samp[1])?; - self.io.write_byte(samp[0])?; - } - }, - 24 => { - for samp in data.chunks(3) { - self.io.write_byte(samp[2])?; - self.io.write_byte(samp[1])?; - self.io.write_byte(samp[0])?; - } - }, - 32 => { - for samp in data.chunks(4) { - self.io.write_byte(samp[3])?; - self.io.write_byte(samp[2])?; - self.io.write_byte(samp[1])?; - self.io.write_byte(samp[0])?; - } - }, - _ => unimplemented!(), - }; - } + let data = buf.get_data(); + match self.bits { + _ if !self.be && (self.bits & 7) == 0 => { + self.io.write_buf(data.as_slice())?; + }, + 8 => { + self.io.write_buf(data.as_slice())?; + }, + 12 if !self.be => { + let mut src = data.chunks_exact(3); + for chunk in src.by_ref() { + self.io.write_byte(chunk[0] << 4)?; + self.io.write_byte((chunk[1] << 4) | (chunk[0] >> 4))?; + self.io.write_byte(chunk[1] & 0xF0)?; + self.io.write_byte(chunk[2])?; + } + let tail = src.remainder(); + if tail.len() == 2 { + self.io.write_byte(tail[0] << 4)?; + self.io.write_byte(tail[1] << 4)?; + } + } + 16 => { + for samp in data.chunks(2) { + self.io.write_byte(samp[1])?; + self.io.write_byte(samp[0])?; + } + }, + 24 => { + for samp in data.chunks(3) { + self.io.write_byte(samp[2])?; + self.io.write_byte(samp[1])?; + self.io.write_byte(samp[0])?; + } + }, + 32 => { + for samp in data.chunks(4) { + self.io.write_byte(samp[3])?; + self.io.write_byte(samp[2])?; + self.io.write_byte(samp[1])?; + self.io.write_byte(samp[0])?; + } + }, + _ => unimplemented!(), + }; } _ => {}, }; @@ -156,7 +172,8 @@ impl<'a> Drop for WavWriter<'a> { let res = self.io.seek(SeekFrom::Start(4)); let res = self.io.write_u32le((size - 8) as u32); let res = self.io.seek(SeekFrom::Start(self.data_pos - 4)); - let res = self.io.write_u32le(((size as u64) - self.data_pos) as u32); + let res = self.io.write_u32le((size - self.data_pos) as u32); + let res = self.io.flush(); } } }