rust - Why does removing println! cause a Windows API function called through FFI to fail? -
if remove println! 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() winapi::minwindef::dword; header.lpdata = block.as_ptr() winapi::winnt::lpstr; println!("ptr: {:?}\nlength: {:?}", // removing causes error header.lpdata, header.dwbufferlength); let header_size: winapi::minwindef::uint = mem::size_of::<mmsystem::wavehdr>() u32 + header.dwbufferlength 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 println! or removing thread::sleep after waveoutwrite cause waveoutprepareheader return mmsyserr_invalparam.
otherwise works fine.
Comments
Post a Comment