fix write_wav

png-branch
an 2019-02-22 20:34:43 -05:00
parent eac8686324
commit e18385c524
1 changed files with 12 additions and 16 deletions

View File

@ -5,34 +5,30 @@ use std::io;
pub fn write_wav(out: &mut impl io::Write, snd: &impl Sound) -> ResultS<()> pub fn write_wav(out: &mut impl io::Write, snd: &impl Sound) -> ResultS<()>
{ {
let rate = u32::from(snd.rate()); let rate = u32::from(snd.rate());
let bps = rate * 2; let bps = rate * 2;
let ssize = bps * snd.len() as u32; let ssize = snd.len() as u32 * 2;
let fsize = 36 + ssize; let fsize = 36 + ssize;
out.write_all(b"RIFF")?; out.write_all(b"RIFF")?;
out.write_all(&fsize.to_le_bytes())?; out.write_all(&u32::to_le_bytes(fsize))?;
out.write_all(b"WAVE")?; out.write_all(b"WAVE")?;
out.write_all(b"fmt ")?; out.write_all(b"fmt ")?;
out.write_all(&16u32.to_le_bytes())?; out.write_all(&u32::to_le_bytes(16))?;
out.write_all(&1u16.to_le_bytes())?; // PCM out.write_all(&u16::to_le_bytes(1))?; // PCM
out.write_all(&1u16.to_le_bytes())?; // mono out.write_all(&u16::to_le_bytes(1))?; // mono
out.write_all(&rate.to_le_bytes())?; // rate out.write_all(&u32::to_le_bytes(rate))?;
out.write_all(&bps.to_le_bytes())?; // bytes per second out.write_all(&u32::to_le_bytes(bps))?;
out.write_all(&2u16.to_le_bytes())?; // block alignment out.write_all(&u16::to_le_bytes(2))?; // block alignment
out.write_all(&16u16.to_le_bytes())?; // bits per sample out.write_all(&u16::to_le_bytes(16))?; // bits per sample
out.write_all(b"data")?; out.write_all(b"data")?;
out.write_all(&ssize.to_le_bytes())?; out.write_all(&u32::to_le_bytes(ssize))?;
for p in 0..snd.len() { for p in 0..snd.len() {
let sample = snd.index(p); let sample = snd.index(p);
out.write_all(&sample.to_le_bytes())?; out.write_all(&sample.to_le_bytes())?;
} }
if ssize & 1 == 1 {
out.write_all(&[0])?;
}
Ok(()) Ok(())
} }