wince下音频驱动架构及数据输出流程

WINCE 播放声音类 立即下载

wince7下音频驱动学习(以DM3730为例,主要是数据的输出控制流程)


1、音频硬件连接如下所示:

        McBsp是DM3730上的一个多通道缓冲串行端口,这里音频驱动使用了其中的模块2。音频数据从McBsp2输出,TPS659XX将其解码后输出模拟信号到喇叭。


        在wince下音频驱动有3种模式:1.MDD/PDD模式.2.Wavedev2模式.3.UAM模式。我的代码中音频驱动是分为两层的,一层是与硬件无关的驱动tps659xx_wave.dll(WAV层),另一层是与硬件相关的驱动omap_mcbsp.dll(MCP),这两个驱动都是标准的流接口驱动。

2、tps659xx_wave.dll的流接口函数在Wavemain.cpp中,如下所示:


        这几个函数名是微软统一的音频驱动接口,wince系统通过这几个函数来实现音频的各种功能。其中最重要的是WAV_IOControl(),系统调用WAV_IOControl()并通过PMMDRV_MESSAGE_PARAMS结构体的uMsg成员传入各种命令来控制音频驱动,所以驱动中需要实现这些命令各自对应的功能。

对于音频输出的命令主要有(并没有全部列出,在vs2008的help文档可看到全部命令的详解)

WODM_OPEN:请求音频驱动创建一个指定设备的实例

WODM_CLOSE:关闭由WODM_OPEN所创建的指定设备的实例

WODM_PAUSE:暂停音频输出

WODM_RESTART:继续音频输出

WODM_WRITE:向指定设备写入波形数据块

WODM_SETVOLUME:设置音量

WODM_GETPOS:获取当前音频播放位置


以下是加载tps659xx_wave.dll驱动,并发出一次触摸屏声音时所打印的信息。

加载dll时打印的信息

PID:00400002 TID:01F7000EWAV:WIDM_GETNUMDEVS

PID:00400002 TID:01F7000E WAV:WIDM_SETPROP

PID:00400002 TID:01F7000EWAV:WODM_GETNUMDEVS

PID:00400002 TID:01F7000EWAV:WODM_GETEXTDEVCAPS

PID:00400002 TID:01F7000E WAV:WODM_SETPROP

PID:00400002 TID:01F7000EWAV:WODM_SETVOLUME

PID:00400002 TID:01F7000EWAV:+process_MixerMessage()

PID:00400002 TID:01F7000EWAV:MXDM_GETNUMDEVS

PID:00400002 TID:01F7000EWAV:-process_MixerMessage()

点击screen一次打印的信息

PID:00400002 TID:074A3C5A WAV:WODM_OPEN

PID:00400002 TID:074A3C5A WAV:WODM_PAUSE

PID:00400002 TID:074A3C5A WAV:WODM_WRITE

PID:00400002 TID:074A3C5A WAV:WODM_WRITE

PID:00400002 TID:074A3C5A WAV:WODM_WRITE

PID:00400002 TID:074A3C5A WAV:WODM_WRITE

PID:00400002 TID:074A3C5A WAV:WODM_RESTART

PID:00400002 TID:0769001A WAV:WODM_WRITE

PID:00400002 TID:0769001A WAV:WODM_WRITE

PID:00400002 TID:0769001A WAV:WODM_WRITE

PID:00400002 TID:0769001A WAV:WODM_WRITE

PID:00400002 TID:0769001A WAV:WODM_WRITE

PID:00400002 TID:0769001A WAV:WODM_PAUSE

PID:00400002 TID:0769001A WAV: WODM_CLOSE

每次发出一段声音时,流程都与此类似,唯有WODM_WRITE次数不一样(声音数据大小有关)。

3、omap_mcbsp.dll驱动主要是对McBsp模块直接进行初始化和操作,接口函数为:


CopyTransferInfo():在这个函数中会相互交换MCP驱动和WAV驱动的一些接口函数指针,这样这两个驱动就能通过这些函数指针调用对方的接口函数了。

TxCommand():当系统给WAV层传入WODM_RESTART和WODM_PAUSE命令时,WAV层就会调用这个函数,并通过这个函数来调用StartTransmit()和StopTransmit()来开启或者关闭MCP层的DMA音频数据传输。

StartTransmit():用于开启MCP层的第一次DMA数据传输,

ST_TxDMA():与StartTransmit()函数一样,用于开启MCP层的DMA数据传输。不同的是IST_TxDMA()是线程函数,这个线程在MCP_Init()中被创建,它会等待DMA数据传输完成中断,然后开启下一次DMA传输。这就解释了,为什么只要发送一次WODM_RESTART命令(只执行一次StartTransmit()函数),音频数据就能一段一段的被McBsp2发送出去。

4、音频数据的输出传递

        我们知道系统通过WODM_WRITE命令将音频数据一段一段的传输到WAV层,WAV层再将这些音频数据传输到MCP层,MCP层将这些数据通过McBsp2发送给解码器。那么音频数据具体是怎么存储怎么传递的呢?实际上音频数据采用的是先进先出的队列(单链表结构)存储方式,数据由WAV层入队,由MCP层出队。


        在WAV层使用了3个指针来管理这个链表:m_lpWaveHdrHead、m_lpWaveHdrCureent、m_lpWaveHdrTail,分别指向了链表头单元、当前单元、链表尾单元。假设当前系统将data5数据块传输到WAV层,WAV层就会将这个data5插入队尾,此时m_lpWaveHdrTail就会指向这个data5数据块。当MCP层需要获取音频数据时(执行StartTransmit和ST_TxDMA这两个函数时),就会调用WAV层的接口函数(在CopyTransferInfo()函数中获取的)从这个队列的头部获取数据块,然后m_lpWaveHdrHead和m_lpWaveHdrCureent指针会指向队列中的下一个数据块。




wince6.0 音频播放器 能够播放mp3、wav等音频格式 立即下载

相关推荐

wince 6.0系统上录音及播放程序源码

wince 6.0系统上录音及播放程序源码

Tps659xx 电源管理芯片PWM 背光控制无法关闭

根据TRM手册,我们知道,如果PWM0或者PWM1控制背光,在需要关闭背光的时候,可以关闭PWM的时钟信号,用于省电,PWM的控制分两部分;       比如说PWM0,一部分是使能,也就是enable,寄存器GPBR1的第2位,另一部分是时钟输出,也就是GPBR1寄存器的第0位,关于这一块的控制,TRM手册有一点没有说明,比如说打开或者关闭PWM0的时候,这两个位不要同时设置,有人这样设置:

生于忧患,死于安乐 2484

最好的无损音频播放器

可能是目前最好的无损播放器,不但音质出众,而且用来进行格式转换也极端方便,值得爱好音乐的朋友试试。

DAVINCI DM3730开发攻略——开发环境篇

    深圳的春天,梧桐山上绿意浓浓,山花醉人香,蜂蝶采蜜忙!现在只能在山上看到这些生机勃勃的景象了,山下的水污染完了,空气也不咋样。但相对北方的兄弟姐妹长期生活在灰霾和沙尘的环境,这里也很难得了,地下水的污染,不单单北方有,南方很早就打井排污了,治理要近1000年的才能恢复 。这些企业和贪官庸官断子绝孙的发展模式,注定不长久。而对于我们这些差不多吃尽整个元素周期表的中国平民百...

kunkliu的博客 999

wince下音乐播放器

一款比较华丽的播放器,支持的音频格式有:MP3, OGG, Flac, WMA, WAV等,播放清单:m3u,pls,AVPL;非常好的UI界面。支持本地文件播放,播客播放,在线电台播放等等

对E-R模型向关系模式转换的认识

一:基本E-R图的转换 1     属性处理 派生属性:直接忽略。 复合属性:展平技术。 多值属性:单独建立一个关系表,关系名就是多值属性名,如果是实体集的多值属性,关系的属性就是实体集的码加上多值属性,如果是联系集的多值属性,关系的属性就是各个实体集的码加上多值属性,关系的码要具体情况具体分析。 2     基本E-R图转换为关系模式 强实体集:一个关系,关系名就是强实体集名,关系属

优快云_LYY的专栏 2731

TI TPS电源管理芯片工作原理图解说明

深入解读TI TPS系列电源管理芯片的工作机制,结合图解方式清晰展示其内部结构与运行逻辑,帮助理解电源管理芯片在实际电路中的应用与设计要点。

weixin_35734408的博客 974

进阶数据结构——链式前向星

链式前向星是一种进阶的数据结构,主要用于图的存储。我希望大家先看这个视频(蓝色字体点进去) 不然你很难理解的。在图论中,图的存储方式主要有邻接矩阵和邻接表两种。邻接矩阵虽然建图简单方便,但占内存较大,节点数量稍微大点的题目就难以使用(适合稠密图);而邻接表虽然节省空间,但其指针形式难写易错,且vector形式的读取速度较慢,易导致大数据下的超时(TLE)。针对上述问题,链式前向星作为一种折中的方式应运而生。链式前向星本质上是一种静态链表,它将数据以链表形式连接在一起。

ycs66的博客 2134

wince 音频学习

解析的Wave 驱动的架构。我们了解一个驱动的时候,先不去看具体跟硬件操作相关的东西,而是从流程入手,把整个流程搞清楚了,调试起来就非常的容易了。我们着重看hwctxt.cpp,hwctxt.H,devctxt.cpp,devctxt.H,strmctxt.cpp,strmctxt.H这几个源文件。其中hwctxt是类HardwareContext代码文件,devctxt是DeviceContex

xingyuan1hao的专栏 1270

优化问题-半正定规划(Semi-Definite Program, SDP)

半正定规划(Semi-Definite Program, SDP)在MIMO无线通信相关的信号处理中具有广泛的应用,在某些场景可以分析证明SDP的得到的解释原问题的全局最优化或者次优解。

qq_33668008的博客 1万+

基于gem5模拟trace的cache模拟器的实现

在做计算机体系结构的时候,模拟器是一个重要且又有效的工具。其中gem5集成了gem和m5的优点,使用起来比较简单和方便。其中包括了se模式和fs模式,se模式是在gem5运行我们已经编译好的程序,可以获取cache,cpu状态等数据,fs模式下可以模拟操作系统,我们可以将我们自己修改的linux内核加载到哥们上运行。下面介绍了使用gem5的se模式,运行编译好的ARM可执行文件。获取访存的trac

gaoxiang的专栏 8891

WINCE 音频驱动之二:驱动模型

音频驱动采用Wavedev2模式来实现,这是单层的驱动模式,平台相关的都在hwctxt.h和hwctxt.cpp中,此外还加入了midi支持、software mixer支持、S/PDIF接口、gain class接口、forcespeaker接口等等。                                                              (1)音频

cjwsimple 818

药物相关 PK(药代动力) 、PD(药效)指标知识

PK代表药物的药代动力学,指的是药物在体内的吸收、分布、代谢和排泄等过程,包括药物的药代动力学参数如Cmax(最大血药浓度)、Tmax(最大血药浓度出现的时间)、t1/2(半衰期)、AUC(药物曲线下面积)等。PD代表药物的药效学,指的是药物与生物体相互作用所产生的药理效应,包括药物的药效学参数如EC50(半数最大有效浓度)、ED50(半数最大效应剂量)、Emax(最大效应)等。PD(Pharmacodynamics)则研究药物的药效学特性,如药物的作用机制、效力、最大疗效、最小毒性等。

weixin_42357472的博客 2万+

wince IIS 音频驱动

IIS音频 技术   2009-10-05 21:26   阅读114   评论0   字号: 大  中  小 1 IIS总线     IIS(Integrate Interface of Sound)即集成音频接口,在上个世纪80年代首先被Philips公司用于消费产品的音频设备,并在一个称为LRCLK(Left/Right CLOCK)的信号机制中经过多路转换,

lqxandroid2012的专栏 1878

第182期 Claude Skills:深入探究Anthropic的智能体框架(一篇彻底讲透彻)

摘要: Claude Skills是Anthropic推出的智能体框架,通过连接外部工具和服务扩展Claude AI的功能,支持实时交互与任务执行。其核心架构包含技能路由器、注册表、执行引擎等模块,采用渐进式披露机制优化上下文管理。与MCP和A2A相比,Skills更注重模块化设计与Claude深度集成,通过SKILL.md文件定义可重复工作流程,兼具高效性和灵活性。开发者可创建自定义技能,遵循聚焦用户价值、安全隐私等最佳实践,实现AI能力的场景化拓展。该框架与MCP、A2A形成互补,共同推动智能体生态发展

全网120W+关注AI拉呱,专注人工智能以及科技前沿! 2131

手把手教你学Simulink——基于Simulink的无感FOC(滑模观测器+PLL)实战

本文详细介绍了基于Simulink的无感FOC(滑模观测器+PLL)实现方法。主要内容包括:1)SMO+PLL原理精讲,阐述滑模观测器核心思想和PLL的作用;2)系统架构全景图展示;3)Simulink建模全流程,从基础FOC框架到SMO和PLL模块的实现;4)关键参数整定指南和工程实践要点;5)仿真结果分析及常见问题解决方案。该方法可有效替代机械传感器,降低成本并提高可靠性,适用于空调压缩机、电动汽车水泵等工业场景。文章还提供了详细的调试建议和动手实践指导。

MHD0815的博客 83

winCE下使用一组buffer实现音频回环

  最近有做项目,在WinCE下从一个音频设备获取数据,通过另一个音频设备输出。要求是尽量小的延迟,声音不要有停顿,也不能有丢失,在高的采样率的情况下,尽量少的占用cpu。东西很简单,但要做好也挺麻烦,特别是有了上面的要求。先简单介绍一下思路:使用wavein系列API,从一个音频驱动中读数据,然后使用waveout系列的API,把读到的数据写到另外一个音频驱动中。 如何实

i_am_j的专栏 2867

一句话看懂 vibing-steampunk

摘要: vibing-steampunk(vsp)是一个连接SAP ABAP开发工具(ADT)与AI编码代理(如Claude、GitHub Copilot)的桥梁,通过MCP协议实现自动化代码读写、调试和部署。它利用ADT API直接访问SAP系统,绕过传统GUI操作,支持ECC和S/4HANA等环境。工具提供包分析、依赖检查、LUW行为识别等功能,显著提升ABAP项目维护效率。其创新Hyperfocused模式和方法级编辑大幅降低token消耗,而上下文压缩技术则优化了AI对ABAP代码的理解能力,特别适

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 114

WinCE驱动编写 小结

1、基础知识:1)系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件细节,在应用程序看来硬件只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动是内核的一部分。2)驱动程序完成以下功能:——对设备初始化和释放;——把数据从内核传送到硬件和从硬件读取数据;——读取应用程序传送给设备文

@塘外人 4331

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

wince音频驱动模型

http://blog.youkuaiyun.com/luixing67/article/details/5602950   1.1 WINCE的声音模型 标准的WINDOWS CE下的声音处理模型。 1)  声音应用在使用WAVE接口函数的时候被COREDLL模块分了类:如果是简单的PCM数据,则直接进入ADM模块,进行SoftWare Mixer或者连Mixer也省了,直接

a6930756的专栏 963

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

wince驱动开发

首先是wince驱动的分类问题。按照书上讲的说CE下驱动分成单体驱动和分层驱动,而看到另一种说法是本机驱动和流式驱动。经过microsun大哥的指点,把这两种分类法分开了。在这里引用一下:“单体与分层只是从代码的形式上做的分类.分层驱动代码上分为PDD与MDD,一般的微软已经实现了MDD,可能也实现了PDD,我们只需要对PDD做些修改就能使用,比如音频的驱动,显示的驱动。单层驱动是把PDD与MDD

chenyt2007的专栏 817

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

详解Wavedev2模式的音频驱动

WinCE 音频驱动 一、WinCE目前有3种音频模式:MDD/PDD、WaveDev2和UAM。 这些模式的存在是有历史原因的,下面具体说明一下。首先,这3个模式是使用同一套WaveAPI的驱动接口,在系统中以驱动形式存在,都会导出WAV_Open、WAV_Close等接口。通过IoControl带入IOCTL_WAV_MESSAGE,与waveapi的子系统配合使用。对下都

sunxiao061015的专栏 2373

wince驱动

        首先是wince驱动的分类问题。按照书上讲的说CE下驱动分成单体驱动和分层驱动,而看到另一种说法是本机驱动和流式驱动。单体与分层只是从代码的形式上做的分类.分层驱动代码上分为PDD与MDD,一般的微软已经实现了MDD,可能也实现了PDD,我们只需要对PDD做些修改就能使用,比如音频的驱动,显示的驱动。单层驱动是把PDD与MDD写在一起,没有做严格的区分,通常这种驱动比较简单,比

lizh0526的专栏 495
上一篇: Windows下socket简单的编程实例
下一篇: 2014.4新版uboot启动流程分析
EmSoftEn
博客等级 码龄12年 40粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值