pub struct WavPlayer;
impl WavPlayer {
pub fn play(wav_bytes: &[u8]) -> anyhow::Result<()> {
unsafe { play_inner(wav_bytes) }
}
}
unsafe fn play_inner(wav_bytes: &[u8]) -> anyhow::Result<()> {
let pcm = strip_wav_header(wav_bytes)?;
let _ = pcm;
let path = std::env::temp_dir().join(format!("ct_play_{}.wav", uuid::Uuid::new_v4()));
std::fs::write(&path, wav_bytes)?;
open::that(&path)?;
Ok(())
}
fn strip_wav_header(wav: &[u8]) -> anyhow::Result<&[u8]> {
if wav.len() < 44 {
anyhow::bail!("WAV data too short: {} bytes", wav.len());
}
if &wav[0..4] != b"RIFF" || &wav[8..12] != b"WAVE" {
anyhow::bail!("not a valid WAV file");
}
let mut offset = 12usize;
while offset + 8 <= wav.len() {
let id = &wav[offset..offset + 4];
let size = u32::from_le_bytes(wav[offset + 4..offset + 8].try_into()?) as usize;
if id == b"data" {
let end = (offset + 8 + size).min(wav.len());
return Ok(&wav[offset + 8..end]);
}
offset += 8 + size;
}
anyhow::bail!("no data chunk found in WAV")
}