如果我println!
从以下代码中删除 ,则waveOutPrepareHeader
返回 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));
}
}
即使添加另一个println!
或删除thread::sleep
afterwaveOutWrite
也会导致waveOutPrepareHeader
return MMSYSERR_INVALPARAM
。
否则它工作正常。