If I remove the println!
from the following code, waveOutPrepareHeader
returns code MMSYSERR_INVALPARAM
.
fn write_audio_block(device: &PlaybackDevice, block: &[u8]) {
use std::mem;
use std::{thread, time};
let mut header: mmsystem::WAVEHDR = unsafe { mem::uninitialized() };
header.dwBufferLength = block.len() as winapi::minwindef::DWORD;
header.lpData = block.as_ptr() as winapi::winnt::LPSTR;
println!("ptr: {:?}\nlength: {:?}", // removing this causes error
header.lpData,
header.dwBufferLength);
let header_size: winapi::minwindef::UINT = mem::size_of::<mmsystem::WAVEHDR>() as u32 +
header.dwBufferLength as u32;
catch_errors(unsafe { winmm::waveOutPrepareHeader(device.handle, &mut header, header_size) });
catch_errors(unsafe { winmm::waveOutWrite(device.handle, &mut header, header_size) });
thread::sleep(time::Duration::from_millis(100));
while unsafe { winmm::waveOutUnprepareHeader(device.handle, &mut header, header_size) } ==
mmsystem::WAVERR_STILLPLAYING {
thread::sleep(time::Duration::from_millis(10));
}
}
Even adding another println!
or removing the thread::sleep
after waveOutWrite
will cause waveOutPrepareHeader
to return MMSYSERR_INVALPARAM
.
Otherwise it works fine.