当前位置:首页 > 消费电子 > 消费电子
[导读] 最近用libmad做了些mp3解码的工作,顺便也研究了一下windows下播放PCM音频数据的双缓冲用法。 libmad的调用在此暂略过不表。 libmad解码出来的是16bit的PCM数据,调用windows API可对其实现播放。不过

  最近用libmad做了些mp3解码的工作,顺便也研究了一下windows下播放PCM音频数据的双缓冲用法。

       libmad的调用在此暂略过不表。

       libmad解码出来的是16bit的PCM数据,调用windows API可对其实现播放。不过如果解码一段播放一段,听起来会有一顿一顿的感觉,不流畅,究其原因,是没有使用双缓冲。

       吭哧吭哧研究了半天,终于编码实现,播放出来的效果倒也很流畅。

       流程如下:

       1)声明两个WAVEHDR结构waveHeader1,waveHeader2,并分别对其lpData参数分配缓冲buf1,buf2;

       2)声明WAVEFORMATEX结构waveFormat,以及HWAVEOUT结构hWaveOut。调用函数
  waveOutOpen( &hWaveOut, WAVE_MAPPER, &waveFormat, (DWORD)waveOutProc, NULL, CALLBACK_FUNCTION );
  waveOutProc为回调函数,在后面会提到。

       也说一下waveFormat的各参数。根据MSDN解释,nChannels为通道数,nSamplesPerSec为采样率, wFormatTag的值为WAVE_FORMAT_PCM,wBitsPerSample为16,nBlockAlign为 nChannels*wBitsPerSample/8,nAvgBytesPerSec为nSamplesPerSec*nBlockAlign;

       3)读入buf1,buf2,并设置好相应长度;

       4)将waveHeader1,waveHeader2写入wave设备:
  waveOutPrepareHeader( hWaveOut, &waveHeader1, sizeof(WAVEHDR));
  waveOutPrepareHeader( hWaveOut, &waveHeader2, sizeof(WAVEHDR));

  waveOutWrite( hWaveOut, &waveHeader1, sizeof(WAVEHDR) );
  waveOutWrite( hWaveOut, &waveHeader2, sizeof(WAVEHDR) );

       5)关于回调
    void CALLBACK  waveOutProc( HWAVEOUT hwo,    
                   UINT uMsg,       
                   DWORD dwInstance,
                   DWORD dwParam1,  
                   DWORD dwParam2     )
    {
        if(uMsg == WOM_DONE)
       {
        LPWAVEHDR pWaveHeader = (LPWAVEHDR)dwParam1;//系统自动识别是哪一个WAVEHDR播放完毕

        waveOutUnprepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR) );//播放完后须调用此函数

        //此处填充WAVEHDR的lpdate缓冲

        waveOutPrepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR));
        waveOutWrite( hwo, pWaveHeader, sizeof(WAVEHDR) );

        //...
       }
       return ;
    }

       6)播放完毕后,调用waveOutClose,释放缓冲。其他的一些waveOut函数,如waveOutPause、 waveOutReset等等,在做播放器的时候会用得到。若播放过程中终止,须先调用waveOutReset,再调用waveOutClose。

       本文为Windows Embedded征文比赛获奖文章。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

近日,一个存在于Windows Mark of the Web (MotW)中的零日漏洞被发现,并正在被攻击者积极利用。但有趣的是,在微软官方还没有对该漏洞做出修复之前,第三方平台0patch就提供了该漏洞的修复补丁。据...

关键字: PATCH Windows 微软 APP

洛杉矶2022年10月17日 /美通社/ -- 卫澎资本(WestPark Capital),一家提供全方位服务的投资银行和证券经纪交易商,今天宣布完成Mobile Global Esports(NASDAQ:...

关键字: GLOBAL MOBILE SPORT API

(全球TMT2022年9月22日讯)Granite River Labs(简称"GRL")日前宣布,其位于中国东莞的实验室已获英特尔公司(Intel® Corporation)授权,可为Windows系统平台开展Thu...

关键字: Windows THUNDERBOLT ST OS

GRL东莞实验室将与上海和台北实验室一同,提供Windows Host认证服务 加利福尼亚州圣克拉拉市2022年9月22日 /美通社/ -- 高速信号和充电技术测...

关键字: Windows THUNDERBOLT USB OS

加利福尼亚州库比蒂诺2022年9月15日 /美通社/ -- 全球领先的漫游和网络服务、安全、风险管理、测试和服务保证以及用户智能分析解决方案提供商Mobileum Inc.(...

关键字: MOBILE GARTNER PI BSP

(全球TMT2022年9月16日讯)思享无限公布截至2022年6月30日的2022年第二季度暨上半年财务业绩。2022年第二季度,营收同比增长28.8%,从2021年同期的3.932亿元人民币增至5.065亿元人民币(...

关键字: ST GARTNER MOBILE OS

(全球TMT2022年9月8日讯)爱立信携手谷歌成功展示灵活性更高的网络切片技术,推动网络切片发展。爱立信在与谷歌最近的一次合作中,与生态系统合作伙伴成功展示了爱立信网络基础设施可支持单台Android 13设备上的多...

关键字: 摩托罗拉 爱立信 音频 网络切片

(全球TMT2022年9月8日讯)SGW Global和Motorola Mobility LLC宣布签署一项多年期扩展交易,授予SGW Global在全球范围内开发和销售摩托罗拉品牌家庭音频产品的独家权利。...

关键字: 摩托罗拉 音频 GLOBAL LLC

(全球TMT2022年9月2日讯)音频、视频和协作解决方案企业Jabra宣布与富士胶片商业创新(原富士施乐)合作,为亚太区客户提供基于Jabra Evolve2 系列专业办公耳麦及Speak系列全向麦的统一通讯解决方案...

关键字: 富士 通讯 音频 EV

合作旨在促进亚太区企业无缝统一通讯 上海2022年9月2日 /美通社/ -- 音频、视频和协作解决方案领军企业 Jabra 今日宣布与富士胶片商业创新(原富士施乐)合作,为亚太区客户提供基于Jabra Evolve2...

关键字: 富士 数字化 通讯 音频

消费电子

95979 篇文章

关注

发布文章

编辑精选

技术子站

关闭