WinAPI Wave相关函数.docx
《WinAPI Wave相关函数.docx》由会员分享,可在线阅读,更多相关《WinAPI Wave相关函数.docx(95页珍藏版)》请在冰豆网上搜索。
WinAPIWave相关函数
目录
WinAPI:
waveInAddBuffer-向波形输入设备发送一个输入缓冲区2
WinAPI:
waveInGetPosition-获取当前输入设备的输入位置3
WinAPI:
waveInGetNumDevs-获取波形输入设备的数目4
WinAPI:
waveInGetID-获取输入设备ID4
WinAPI:
waveInClose-关闭指定的波形输入设备4
WinAPI:
waveInGetDevCaps-查询输入设备的性能5
WinAPI:
waveInGetErrorText-根据错误号得到错误描述6
WinAPI:
waveInMessage-向波形输入设备发送一条消息6
WinAPI:
waveInOpen-打开波形输入设备6
WinAPI:
waveInPrepareHeader-为波形输入准备一个缓冲区8
WinAPI:
waveInReset-重置输入9
WinAPI:
waveInStart-启动输入9
WinAPI:
waveInStop-停止输入9
WinAPI:
waveInUnprepareHeader-清除由waveInPrepareHeader完成的准备10
WinAPI:
waveOutBreakLoop-跳出循环11
WinAPI:
waveOutClose-关闭设备12
WinAPI:
waveOutGetDevCaps-查询输出设备的性能12
WinAPI:
waveOutGetID-获取输出设备ID13
WinAPI:
waveOutGetNumDevs-获取波形输出设备的数目13
WinAPI:
waveOutGetPitch-获取输出设备当前的音调设置(音高的倍数值)14
WinAPI:
waveOutGetPlaybackRate-获取输出设备当前的播放速度设置(默认速度值的倍数)14
WinAPI:
waveOutGetPosition-获取输出设备当前的播放位置15
WinAPI:
waveOutGetVolume-获取输出设备当前的音量设置16
WinAPI:
waveOutMessage-向波形输出设备发送一条消息16
WinAPI:
waveOutOpen-打开波形输出设备16
WinAPI:
waveOutPause-暂停播放18
WinAPI:
waveOutPrepareHeader-准备一个波形数据块用于播放18
WinAPI:
waveOutReset-重置输出19
WinAPI:
waveOutRestart-重新启动一个被暂停的输出设备19
WinAPI:
waveOutSetPitch-设置输出设备的音调设置(音高的倍数值)20
WinAPI:
waveOutGetPlaybackRate-设置输出设备的播放速度(默认速度值的倍数)20
WinAPI:
waveOutUnprepareHeader-清除由waveOutPrepareHeader完成的准备21
WinAPI:
waveOutWrite-向输出设备发送一个数据块22
{合并两个Wav文件的函数}23
合并两个Wav文件流的函数-回复"刘文强"的问题25
操作Wave文件
(1):
关于Wave文件的基础知识与文件格式28
操作Wave文件
(2):
判断一个文件是否是Wave文件30
操作Wave文件(3):
接触mmio系列函数33
操作Wave文件(4):
获取Wave文件主块与子块的信息35
操作Wave文件(5):
获取Wave文件的格式信息38
操作Wave文件(6):
获取Wave文件的波形数据41
操作Wave文件(7):
建立一个空的Wave文件(三种方法)42
操作Wave文件(8):
使用TMediaPlayer录制wav文件46
操作Wave文件(9):
使用waveOut...函数播放wav文件48
操作Wave文件(10):
输入输出设备与格式支持54
操作Wave文件(11):
使用waveIn...函数录制wav文件56
操作Wave文件(12):
使用waveOut...重复播放wav文件63
操作Wave文件(13):
waveOutGetVolume、waveOutSetVolume66
操作Wave文件(14):
waveOutSetPlaybackRate、waveOutSetPitch71
操作Wave文件(15):
合并与剪裁wav文件78
WinAPI:
waveInAddBuffer-向波形输入设备发送一个输入缓冲区
提示:
缓冲区写满后送回应用程序.
在缓冲区给waveInAddBuffer前,先要调用waveInPrepareHeader准备;还要调用GlobalAlloc给TWaveHdr和其中lpData指向的缓冲区分配内存(使用GMEM_MOVEABLE、GMEM_SHARE),并用GlobalLock锁定.
--------------------------------------------------------------------------------
//声明:
waveInAddBuffer(
hWaveIn:
HWAVEIN;{波形输入设备句柄}
lpWaveInHdr:
PWaveHdr;{TWaveHdr结构的指针}
uSize:
UINT{TWaveHdr结构大小}
):
MMRESULT;{成功返回0;可能的错误值如下:
}
MMSYSERR_INVALHANDLE=5;{设备句柄无效}
WAVERR_UNPREPARED=34;{没准备好缓冲区}
MMSYSERR_HANDLEBUSY=12;{设备已被另一线程使用}
//TWaveHdr是wavehdr_tag结构的重定义
wavehdr_tag=record
lpData:
PChar;{指向波形数据缓冲区}
dwBufferLength:
DWORD;{波形数据缓冲区的长度}
dwBytesRecorded:
DWORD;{若首部用于输入,指出缓冲区中的数据量}
dwUser:
DWORD;{指定用户的32位数据}
dwFlags:
DWORD;{缓冲区标志}
dwLoops:
DWORD;{循环播放次数,仅用于输出缓冲区}
lpNext:
PWaveHdr;{保留}
reserved:
DWORD;{保留}
end;
//dwFlags的可选值:
WHDR_DONE=$00000001;{设备已使用完缓冲区,并返回给程序}
WHDR_PREPARED=$00000002;{waveInPrepareHeader或waveOutPrepareHeader已将缓冲区准备好}
WHDR_BEGINLOOP=$00000004;{缓冲区是循环中的第一个缓冲区,仅用于输出}
WHDR_ENDLOOP=$00000008;{缓冲区是循环中的最后一个缓冲区,仅用于输出}
WHDR_INQUEUE=$00000010;{reservedfordriver}
WinAPI:
waveInGetPosition-获取当前输入设备的输入位置
//声明:
waveInGetPosition(
hWaveIn:
HWAVEIN;{设备句柄}
lpInfo:
PMMTime;{TMMTime结构的指针}
uSize:
UINT{TMMTime结构大小}
):
MMRESULT;{成功返回0;可能的错误值见下:
}
MMSYSERR_INVALHANDLE=5;{设备句柄无效}
//TMMTime是mmtime_tag结构的重定义:
mmtime_tag=record
casewType:
UINTof
TIME_MS:
(ms:
DWORD);{毫米}
TIME_SAMPLES:
(sample:
DWORD);{波形音频取样数}
TIME_BYTES:
(cb:
DWORD);{波形音频字节数(字节偏移量)}
TIME_TICKS:
(ticks:
DWORD);{TICK数}
TIME_SMPTE:
({动画及电视协会的SMPTE时间,是个内嵌结构}
hour:
Byte;{时}
min:
Byte;{分}
sec:
Byte;{秒}
frame:
Byte;{帧}
fps:
Byte;{每秒帧数}
dummy:
Byte;{填充字节(为对齐而用)}
pad:
array[0..1]ofByte);{}
TIME_MIDI:
(songptrpos:
DWORD);{MIDI时间}
end;
//使用TMMTime结构前,应先指定TMMTime.wType:
TIME_MS=$0001;{默认;打开或复位时将回到此状态}
TIME_SAMPLES=$0002;
TIME_BYTES=$0004;
TIME_SMPTE=$0008;
TIME_MIDI=$0010;
TIME_TICKS=$0020;
WinAPI:
waveInGetNumDevs-获取波形输入设备的数目
//声明:
waveInGetNumDevs:
UINT;{无参数;返回波形输入设备的数目}
WinAPI:
waveInGetID-获取输入设备ID
//声明:
waveInGetID(
hWaveIn:
HWAVEIN;{获取输入设备句柄}
lpuDeviceID:
PUINT{接受ID的变量的指针}
):
MMRESULT;{成功返回0;可能的错误值见下:
}
MMSYSERR_INVALHANDLE=5;{设备句柄无效}
MMSYSERR_HANDLEBUSY=12;{设备已被另一线程使用}
WinAPI:
waveInClose-关闭指定的波形输入设备
提示:
若waveInAddBuffer送出的缓冲区未返回则失败;可用waveInReset放弃所有未用完的缓冲区.
--------------------------------------------------------------------------------
//声明:
waveInClose(
hWaveIn:
HWAVEIN{设备句柄;函数若成功返回,句柄则不再有效}
):
MMRESULT;{成功返回0;可能的错误值见下:
}
MMSYSERR_INVALHANDLE=5;{设备句柄无效}
WAVERR_STILLPLAYING=33;{缓冲区还在队列中}
WinAPI:
waveInGetDevCaps-查询输入设备的性能
//声明:
waveInGetDevCaps(
hwo:
HWAVEOUT;{输入设备ID;HWAVEIN?
}
lpCaps:
PWaveInCaps;{TWaveInCaps结构的指针,用于接受设备信息}
uSize:
UINT{TWaveInCaps结构大小}
):
MMRESULT;{成功返回0;可能的错误值见下:
}
MMSYSERR_BADDEVICEID=2;{设备ID超界}
MMSYSERR_NODRIVER=6;{没有安装驱动程序}
//TWaveInCaps是tagWAVEINCAPSA结构的重定义:
tagWAVEINCAPSA=record
wMid:
Word;{制造商ID}
wPid:
Word;{产品ID}
vDriverVersion:
MMVERSION;{版本号;高字节是主版本号,低字节是次版本号}
szPname:
array[0..MAXPNAMELEN-1]ofAnsiChar;{产品名称}
dwFormats:
DWORD;{支持的格式}
wChannels:
Word;{单声道
(1)还是立体声
(2)}
wReserved1:
Word;{structurepacking}
end;
//dwFormats:
WAVE_INVALIDFORMAT=$00000000;{invalidformat}
WAVE_FORMAT_1M08=$00000001;{11.025kHz,Mono,8-bit}
WAVE_FORMAT_1S08=$00000002;{11.025kHz,Stereo,8-bit}
WAVE_FORMAT_1M16=$00000004;{11.025kHz,Mono,16-bit}
WAVE_FORMAT_1S16=$00000008;{11.025kHz,Stereo,16-bit}
WAVE_FORMAT_2M08=$00000010;{22.05kHz,Mono,8-bit}
WAVE_FORMAT_2S08=$00000020;{22.05kHz,Stereo,8-bit}
WAVE_FORMAT_2M16=$00000040;{22.05kHz,Mono,16-bit}
WAVE_FORMAT_2S16=$00000080;{22.05kHz,Stereo,16-bit}
WAVE_FORMAT_4M08=$00000100;{44.1kHz,Mono,8-bit}
WAVE_FORMAT_4S08=$00000200;{44.1kHz,Stereo,8-bit}
WAVE_FORMAT_4M16=$00000400;{44.1kHz,Mono,16-bit}
WAVE_FORMAT_4S16=$00000800;{44.1kHz,Stereo,16-bit}
WinAPI:
waveInGetErrorText-根据错误号得到错误描述
提示:
错误文本的长度一般不超过MAXERRORLENGTH=128;如果缓冲区太小,文本会被截断.
--------------------------------------------------------------------------------
//声明:
waveInGetErrorText(
mmrError:
MMRESULT;{错误号}
lpText:
PChar;{缓冲区}
uSize:
UINT{缓冲区大小}
):
MMRESULT;{成功返回0;失败再返回错误号,可能的错误是:
}
MMSYSERR_BADERRNUM=9;{错误号超界}
WinAPI:
waveInMessage-向波形输入设备发送一条消息
//声明:
waveInMessage(
hWaveIn:
HWAVEIN;{设备句柄}
uMessage:
UINT;{消息}
dw1:
DWORD{消息参数}
dw2:
DWORD{消息参数}
):
MMRESULT;{将由设备给返回值}
WinAPI:
waveInOpen-打开波形输入设备
提示:
因为其中的回调函数是在中断时间内访问的,必须在DLL中;要访问的数据都必须是在固定的数据段中;除了
PostMessage
timeGetSystemTime
timeGetTime
timeSetEvent
timeKillEvent
midiOutShortMsg
midiOutLongMsg
OutputDebugString外,也不能有其他系统调用.
--------------------------------------------------------------------------------
//声明:
waveInOpen(
lphWaveIn:
PHWAVEIN;{用于返回设备句柄的指针;如果dwFlags=WAVE_FORMAT_QUERY,这里应是nil}
uDeviceID:
UINT;{设备ID;可以指定为:
WAVE_MAPPER,这样函数会根据给定的波形格式选择合适的设备}
lpFormatEx:
PWaveFormatEx;{TWaveFormat结构的指针;TWaveFormat包含要申请的波形格式}
dwCallback:
DWORD{回调函数地址或窗口句柄;若不使用回调机制,设为nil}
dwInstance:
DWORD{给回调函数的实例数据;不用于窗口}
dwFlags:
DWORD{打开选项}
):
MMRESULT;{成功返回0;可能的错误值见下:
}
MMSYSERR_BADDEVICEID=2;{设备ID超界}
MMSYSERR_ALLOCATED=4;{指定的资源已被分配}
MMSYSERR_NODRIVER=6;{没有安装驱动程序}
MMSYSERR_NOMEM=7;{不能分配或锁定内存}
WAVERR_BADFORMAT=32;{设备不支持请求的波形格式}
//TWaveFormatEx结构:
TWaveFormatEx=packedrecord
wFormatTag:
Word;{指定格式类型;默认WAVE_FORMAT_PCM=1;}
nChannels:
Word;{指出波形数据的声道数;单声道为1,立体声为2}
nSamplesPerSec:
DWORD;{指定采样频率(每秒的样本数)}
nAvgBytesPerSec:
DWORD;{指定数据传输的传输速率(每秒的字节数)}
nBlockAlign:
Word;{指定块对齐(每个样本的字节数),块对齐是数据的最小单位}
wBitsPerSample:
Word;{采样大小(字节),每个样本的量化位数}
cbSize:
Word;{附加信息的字节大小}
end;
{16位立体声PCM的块对齐是4字节(每个样本2字节,2个通道)}
//打开选项dwFlags的可选值:
WAVE_FORMAT_QUERY=$0001;{只是判断设备是否支持给定的格式,并不打开}
WAVE_ALLOWSYNC=$0002;{当是同步设备时必须指定}
CALLBACK_WINDOW=$00010000;{当dwCallback是窗口句柄时指定}
CALLBACK_FUNCTION=$00030000;{当dwCallback是函数指针时指定}
//如果选择窗口接受回调信息,可能会发送到窗口的消息有:
MM_WIM_OPEN=$3BE;
MM_WIM_CLOSE=$3BF;
MM_WIM_DATA=$3C0;
//如果选择函数接受回调信息,可能会发送给函数的消息有:
WIM_OPEN=MM_WIM_OPEN;
WIM_CLOSE=MM_WIM_CLOSE;
WIM_DATA=MM_WIM_DATA;
WinAPI:
waveInPrepareHeader-为波形输入准备一个缓冲区
提示:
必须调用GlobalAlloc给TWaveHdr和其中的lpData指向的缓冲区分配内存(使用GMEM_MOVEABLE、GMEM_SHARE),并用GlobalLock锁定.
--------------------------------------------------------------------------------
//声明:
waveInPrepareHeader(
hWaveIn:
HWAVEIN;{设备句柄}
lpWaveInHdr:
PWaveHdr;{TWaveHdr结构的指针}
uSize:
UINT{TWaveHdr结构大小}
):
MMRESULT;{成功返回0;可能的错误值见下:
}
MMSYSERR_INVALHANDLE=5;{设备句柄无效}
MMSYSERR_NOMEM=7;{不能分配或锁定内存}
MMSYSERR_HANDLEBUSY=12;{其他线程正在使用该设备}
//TWaveHdr是wavehdr_tag结构的重定义
wavehdr_tag=record
lpData:
PChar;{指向波形数据缓冲区}
dwBufferLength:
DWORD;{波形数据缓冲区的长度}
dwBytesRecorded:
DWORD;{若TWaveHdr用于输入,指出缓冲区中的数据量}
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;{reservedfordriver}
WinAPI:
waveInReset-重置输入
提示:
函数会终止输入,位置清0;放弃未处理的缓冲区并返回给程序;
TWaveHdr结构中的dwBytesRecorded将包含实际数据的长度.
--------------------------------------------------------------------------------
//声明:
waveInReset(
hWaveIn:
HWAVEIN{设备句柄}
):
MMRESULT;{成功返回0;可能的错误值见下:
}
MMSYSERR_INVALHANDLE=5;{设备句柄无效}
MMSYSERR_HANDLEBUSY=12;{设备已被