pwf->wFormatTag = pdi->wFormatTag;
ACMFORMATDETAILS fd;
……
fd.cbStruct = sizeof(fd);
fd.pwfx = pwf;
fd.cbwfx = dwSize;
fd.dwFormatTag = pdi->wFormatTag;
mmr=acmFormatEnum(had, &fd, find_format_enum, (DWORD)(VOID*)pdi, 0); //枚举格式
……
acmDriverClose(had, 0); //关闭驱动器
……
}
根据指定的格式要找到其所对应的ACM驱动器号可以用枚举所有音频CODECs的ACM API函数acmDriverEnum来实现,在acmDriverEnum() 的参数中指定了在前面描述过的回调函数find_driver_enum,可以 进 一 步查询每个CODEC的信息,最终可以获取到ACM驱动器号的句柄。实现此功能的回调函数名为find_driver,本文后面将会用到。
在把原始Wave音频数据转换到中间PCM格式数据之前,需要做些前期准备工作,填充一些相关的结构信息,具体有:WAVEFORMATEX结构描述源格式、中间PCM格式、以及最终的压缩格式等。下面先填充一个用来描述源数据格式的WAVEFORMATEX结构:
| WAVEFORMATEX wfSrc; memset(&wfSrc, 0, sizeof(wfSrc)); wfSrc.cbSize = 0; wfSrc.wFormatTag = WAVE_FORMAT_PCM; //PCM脉冲编码调制 wfSrc.nChannels = 1; //单声道 wfSrc.nSamplesPerSec = 11025; //11.025kHz wfSrc.wBitsPerSample = 8; //8 bit wfSrc.nBlockAlign = wfSrc.nChannels * wfSrc.wBitsPerSample / 8; wfSrc.nAvgBytesPerSec = wfSrc.nSamplesPerSec * wfSrc.nBlockAlign; |
然后通过前面提到的回调函数find_driver来获取由wFormatTag指定的中间数据格式所对应的驱动程序的ACM驱动器号,在此设定的是由WAVE_FORMAT_DSPGROUP_TRUESPEECH指定的有Windows 98系统自带的TrueSpeech CODEC:
| WORD wFormatTag = WAVE_FORMAT_DSPGROUP_TRUESPEECH; HACMDRIVERID hadid = find_driver(wFormatTag); |
选定了驱动程序,现在要为最终驱动程序将产生的压缩数据格式创建一个WAVEFORMATEX结构,并为驱动程序用于输入的中间PCM格式产生一个WAVEFORMATEX结构:
WAVEFORMATEX* pwfDrv = get_driver_format(had <script type="text/java script">
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732">
<script type="text/java script" id="bdshell_js">
<script type="text/java script">
var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}};
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)
<iframe src="http://www.2cto.com/uapi.php tid=12643&catid=82&title=VkPPwrX308NBQ03S9Ma1seCzzL3Tv9rRucv1V2F2ZdL0xrU=&forward=http://www.2cto.com/kf/200609/12643.html" width="100%" height="100%" id="comment_iframe" name="comment_iframe" frameborder="0" scrolling="no">
|




