提示: 设备写满缓冲区返回给程序后, 须调用此函数;释放(GlobalFree)缓冲区前, 须调用此函数;取消一个尚未准备的缓冲区将无效, 但函数返回 0 
 
//声明:
waveInUnprepareHeader(
  hWaveIn: HWAVEIN;      
{设备句柄}
  lpWaveInHdr: PWaveHdr; 
{TWaveHdr 结构的指针}
  uSize: UINT            
{TWaveHdr 结构大小}
): MMRESULT;             
{成功返回 0; 可能的错误值见下:}
MMSYSERR_INVALHANDLE = 
5;  
{设备句柄无效}
MMSYSERR_HANDLEBUSY  = 
12; 
{设备已被另一线程使用}
WAVERR_STILLPLAYING  = 
33; 
{缓冲区还在队列中}
//TWaveHdr 是 wavehdr_tag 结构的重定义
wavehdr_tag = 
record
  lpData: PChar;          
{指向波形数据缓冲区}
  dwBufferLength: DWORD;  
{波形数据缓冲区的长度}
  dwBytesRecorded: DWORD; 
{若首部用于输入, 指出缓冲区中的数据量}
  dwUser: DWORD;          
{指定用户的32位数据}
  dwFlags: DWORD;         
{缓冲区标志}
  dwLoops: DWORD;         
{循环播放次数, 仅用于输出缓冲区}
  lpNext: PWaveHdr;       
{保留}
  reserved: DWORD;        
{保留}
end;
//TWaveHdr 中的 dwFlags 的可选值:
WHDR_DONE      = 
$00000001; 
{设备已使用完缓冲区, 并返回给程序}
WHDR_PREPARED  = 
$00000002; 
{waveInPrepareHeader 或 waveOutPrepareHeader 已将缓冲区准备好}
WHDR_BEGINLOOP = 
$00000004; 
{缓冲区是循环中的第一个缓冲区, 仅用于输出}
WHDR_ENDLOOP   = 
$00000008; 
{缓冲区是循环中的最后一个缓冲区, 仅用于输出}
WHDR_INQUEUE   = 
$00000010; 
{ reserved for driver }