WinAPI Wave相关函数.docx

上传人:b****3 文档编号:4959399 上传时间:2022-12-12 格式:DOCX 页数:95 大小:50.43KB
下载 相关 举报
WinAPI Wave相关函数.docx_第1页
第1页 / 共95页
WinAPI Wave相关函数.docx_第2页
第2页 / 共95页
WinAPI Wave相关函数.docx_第3页
第3页 / 共95页
WinAPI Wave相关函数.docx_第4页
第4页 / 共95页
WinAPI Wave相关函数.docx_第5页
第5页 / 共95页
点击查看更多>>
下载资源
资源描述

WinAPI Wave相关函数.docx

《WinAPI Wave相关函数.docx》由会员分享,可在线阅读,更多相关《WinAPI Wave相关函数.docx(95页珍藏版)》请在冰豆网上搜索。

WinAPI Wave相关函数.docx

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;{设备已被

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1