0

如果我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::sleepafterwaveOutWrite也会导致waveOutPrepareHeaderreturn MMSYSERR_INVALPARAM

否则它工作正常。

4

0 回答 0