介绍一种很棒的wince 如何替换系统声音的方法
Topic:介绍一种很棒的wince 如何替换系统声音的方法(作者:Baiduluckyboy)
//------------------------------------------------------------------------------------------------------------------------------
// Topic:介绍一种很棒的wince 如何替换系统声音的方法(作者:Baiduluckyboy)
// 作者:Baiduluckyboy(wangyuluyulu@126.com)
// 论坛账号:Baiduluckyboy (经常在CSDN出没)
// 版权:解放军电子工程学院Baiduluckyboy(wangyuluyulu@126.com)
// 平台:wince6.0.0 S5PC100 BSP
// 发布日期:2010-09-08
// 最后修改:
// 注意事项:未经作者同意,商业网站不能转载,并且不得在转载的时候擅自修改、删除文章的任何部分
//------------------------------------------------------------------------------------------------------------------------------
前面有做一个操作系统为WinCE5.0的嵌入式设备,临到发布阶段版本了,突然来了个新需求(一直痛恨随意变更和拍脑袋式样的软件需求,但是顾客是上帝,没有办法),要求更改点击触摸屏的声音(还要怪微软默认的声音太难听)为自定义的声音。
根据以往经验,以为只要替换一下Image里面包含的声音文件,顶多再修改注册表里面某个键值就可以了;却发现这次不管用了,在注册表里根本找不到相关的项。在设备的Windows目录下虽然找到很多.wav的声音文件,却都是一些比如菜单选择,连接断开等事件对应的声音,唯独没有键盘音和触摸屏的声音文件。
于是发动Google大法,遍寻天下WinCE高手留下的语录和足迹,终于有所领悟,原来这两种声音不是直接以.wav形式存在在设备当中,而是被当作资源文件编译到动态链接库当中。不过还是搜索到这两种声音.wav的名称,键盘音两个为keysoft.wav和keyloud.wav,触摸屏的声音为tchsoft.wav和tchloud.wav. 再用Windows 搜索工具在WinCE500目录下定位到这个目录:../WINCE500/PUBLIC/COMMON/OAK/DRIVERS/WAVEUI. 这个目录下除了有上述四个文件,waveui.c里面没有实际内容,主要是waveui.rc这个资源文件和
它使用的头文件resource.h.
接下来看看这个目录下的sources文件,目标文件是生成waveui.lib,连接的文件是waveui.c和waveui.rc。在../WINCE500目录下的build.log(sysgen时生成的)里面找了下,这个库最终是被waveapi.dll链接的。使用sysgen_capture工具获取到生成waveapi.dll的sources文件,主要内容如下:
TARGETNAME=waveapi
TARGETTYPE=DYNLINK
RELEASETYPE=PLATFORM
SYNCHRONIZE_DRAIN=1
DLLENTRY=WaveApiDllEntry
DEFFILE=$(_PUBLICROOT)/common/oak/lib/$(_CPUINDPATH)/waveapi.def
SOURCELIBS=/
$(_PUBLICROOT)/common/oak/lib/$(_CPUINDPATH)/wapiwave.lib /
$(_PUBLICROOT)/common/oak/lib/$(_CPUINDPATH)/wapimap.lib /
$(_PUBLICROOT)/common/oak/lib /$(_CPUINDPATH)/waveui.lib
TARGETLIBS=/
$(_SYSGENSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib /
$(_SYSGENOAKROOT)/lib/$(_CPUINDPATH)/audevman.lib /
$(_PUBLICROOT)/common/oak/lib/$(_CPUINDPATH)/wapistub.lib /
$(_PUBLICROOT)/common/oak/lib/$(_CPUINDPATH)/0409/waveapi.res
SOURCES=
从上面可以看到,和waveui这个目录有关的一个是waveui.lib被链接,一个是waveapi.res这个文件的输入文件之一应该就是waveui.rc.
到这一步,基本上可以确定触摸屏的声音通过waveui.rc文件编译为资源文件waveapi.res,然后成为waveapi.dll的一部分供系统调用。现在的问题是应该如何通过更新waveapi.dll来达到更新触摸屏的声音?
Waveapi.dll在系统Image文件生成前存在于release目录下,所以我们只需要保证release目录下的waveapi.dll包含的声音更新即可。
一种办法是直接用自定义文件重命名后替换../WINCE500/PUBLIC/COMMON/OAK/DRIVERS/WAVEUI下的.wav文件,然后在WinCE Platform Builder的Build OS菜单里面打开的命令行里面重新编译这个目录(Build -c),最后用Build OS菜单里面的sysgen命令重新生成整个工程文件和镜像文件。这种办法在一些论坛上也有找到一些前辈的说法为依据,不过却违反了BSP开发的独立性原则,即BSP的实现应该仅在BSP的代码中修改实现,而不应该修改公共目录代码。另外这种办法也显得有些笨拙。
[注意,即使是这种笨拙的办法也会遇到一些意想不到的问题,比如自定义的.wav文件大小和内容要适合,我开始用一个音乐文件做了一个较大(两秒,约8K)的.wav,结果重复试了好几次,就是没有声音;后面换了客户提供的声音文件就OK了。Faint中]。
借鉴以前移植public下的驱动代码的经验,于是有了第二种想法,将Waveapi的相关实现都移植到BSP中。在BSP下新建waveapi目录,将/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/WAVEUI拷贝到下面作为一个子目录,新建另外一个子目录Dll,里面存放以下文件
(1) makefile:从其他任意目录拷贝
(2) sources:使用上述用sysgen_capture获取的sources文件,作适当修改(红色部分),如下
TARGETNAME=waveapi
TARGETTYPE=DYNLINK
RELEASETYPE=PLATFORM
SYNCHRONIZE_DRAIN=1
TARGETDEFNAME=waveapi
DEFFILE=$(TARGETDEFNAME).def
DLLENTRY=WaveApiDllEntry
SOURCELIBS=/
$(_PUBLICROOT)/common/oak/lib/$(_CPUINDPATH)/wapiwave.lib /
$(_PUBLICROOT)/common/oak/lib/$(_CPUINDPATH)/wapimap.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/waveui.lib
TARGETLIBS=/
$(_SYSGENSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib /
$(_SYSGENOAKROOT)/lib/$(_CPUINDPATH)/audevman.lib /
$(_PUBLICROOT)/common/oak/lib/$(_CPUINDPATH)/wapistub.lib /
waveapi.res
SOURCES=
(3) waveapi.def,新建如下
LIBRARY WAVEAPI
EXPORTS WAM_Init
WAM_Deinit
WAM_Open
WAM_Close
WAM_Read
WAM_Write
WAM_Seek
WAM_IOControl
WAM_PowerDown
WAM_PowerUp
(4) waveapi.res:这个是关键,如何从waveui.rc和替换的.wav文件生成一个新的waveapi.res文件,然后放在这个目录下。
一种做法是通过VS2005建立一个Win32 Smart Device应用程序的工程,将waveui.rc文件、头文件resource.h以及新的声音文件加入进去编译,生成的waveui.res,然后重命名为waveapi.res拷贝过来。不过这种方法的缺点是要依赖PB编译器以外的工具。
完成以上文件操作之后,即可在PB当中单独编译这个目录,或者将这个目录加入到上一级目录的dirs文件当中编译,生成新的waveapi.dll到release目录,然后重新makeimg即可。
关于waveapi.res生成方法的另外一种想法是使用WinCE自带的资源编译器Resource Compiler—rc.exe在命令行里面编译这个rc文件,碰到一些编译错误,在PB命令行环境里面(工程已经打开)windows.h这个头文件没有办法找到,造成编译错误,一时还没有办法继续下去。
不知道是否还有其他更好的办法,希望各位踏足此地的WinCE前辈们指点,十分感谢!
一位WINCE同好给我的回复:
我也发现可以不需要使用VS2005,单独用PlatformBuilder即可以编译BSP底下的WaveApi目录,
1. 无法编译WAVEUI是因为sources File缺少WINCEOEM=1
2. 修改sources File WINCETARGETFILES=$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/waveapi.res 为WINCETARGETFILES=$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/waveapi.res
3. 修改makefile.inc $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/waveapi.res:$(_OBJDIR)/$(TARGETNAME).res 为$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/waveapi.res:$(_OBJDIR)/$(TARGETNAME).res
4. 移除Dll目录下waveapi.res
5. 修改Dll目录下的sources File将 TARGETLIBS=/ waveapi.res修改为 $(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/waveapi.res
6. 在该项目的Release目录下的bib文件的waveapi.dll.0804.mui必须Mask起来,否则没有作用,上述档案的0804为其项目的default language.
7. 主要目的是将独立的waveapi.res导到参考TARGETPLATROOT下的waveapi.res
8. 当然也可以加上DIR档案,由PlatformBuilder经由项目编译。
介绍一种很棒的wince 如何替换系统声音的方法的更多相关文章
- 干货:结合Scikit-learn介绍几种常用的特征选择方法
原文 http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非 ...
- IOS学习资源收集--关于动画的代码学习资源总汇(很棒的动画效果哦)
目录大纲: 1.很棒的iOS加载动画. github网址:https://github.com/NghiaTranUIT/FeSpinner 游老师的译文blog:http://www.cnblogs ...
- 下面我会介绍几种轻轻松松访问Google的方法
好人一生平安的大招 Google在大陆已经封了差不多有20天 访问是极其的困难 下面我会介绍几种轻轻松松访问Google的方法 首先 你需要个可靠的hosts 比如 https://git.os ...
- 结合Scikit-learn介绍几种常用的特征选择方法
特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...
- 21个很棒的jQuery分页插件下载
分页是指将一个大内容划分为各种不同的页面,因此网站的分页是一个很重要的部分,必须让内容有组织性和易于访问.分页有各两种不同的方式,手动跟自动.最受欢迎简单和广泛的方法是jQuery插件.下面我们收集了 ...
- Redis集群方案怎么做?大牛给你介绍五种方案!
Redis集群方案 Redis数据量日益增大,而且使用的公司越来越多,不仅用于做缓存,同时趋向于存储这块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架 ...
- Makefile经典教程(一个很棒很清晰的讲解)【转】
转自:https://blog.csdn.net/seven_amber/article/details/70216216 该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神 ...
- Spring Boot 揭秘与实战(四) 配置文件篇 - 有哪些很棒的特性
文章目录 1. 使用属性文件2. YAML文件 1.1. 自定义属性 1.2. 参数引用 1.3. 随机数属性 1.4. application-{profile}.properties参数加载 3. ...
- [转载]Scikit-learn介绍几种常用的特征选择方法
#### [转载]原文地址:http://dataunion.org/14072.html 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解 ...
随机推荐
- [Flask]学习杂记一 Hello程序
这几天买了本 <Flask Web开发:基于Python的Web应用开发实战>,之前也用过flask 但是不怎么系统,有时候需要搭建一些临时的测试服务,用falsk比较方面,一个文件就可 ...
- SQLite 数据类型(http://www.w3cschool.cc/sqlite/sqlite-data-types.html)
SQLite 数据类型 SQLite 数据类型是一个用来指定任何对象的数据类型的属性.SQLite 中的每一列,每个变量和表达式都有相关的数据类型. 您可以在创建表的同时使用这些数据类型.SQLite ...
- Android简易实战教程--第二十九话《创建图片副本》
承接第二十八话加载大图片,本篇介绍如何创建一个图片的副本. 安卓中加载的原图是无法对其修改的,因为默认权限是只读的.但是通过创建副本,就可以对其做一些修改,绘制等了. 首先创建一个简单的布局.一个放原 ...
- SSH网上商城---用户激活
在前面的博客中,小编主要结合SSH网上商城这个项目,简单的介绍了如何实现邮件发送的这个功能,邮件发送了,接下来就是激活了,为什么呢?现在大多网站都要通过对账号进行激活,然后才能注册成功,这是防止恶性注 ...
- 剑指Offer——回溯算法解迷宫问题(java版)
剑指Offer--回溯算法解迷宫问题(java版) 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路. 下面我们来详细讲一 ...
- 福利:工作经常用到的Mac软件整理(全)
每日更新关注:http://weibo.com/hanjunqiang 新浪微博!iOS开发者交流QQ群: 446310206 前言 这是我个人在工作中会用到的Mac软件,其中包括办公.开发.视频等 ...
- 09 ExpanableListView 的代码例子
<span style="font-size:18px;">package com.qf.day09_expandablelistview03; import andr ...
- 【一天一道LeetCode】#160. Intersection of Two Linked Lists
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Write a ...
- (七十六)CoreLocation(二)获取经纬度、速度、方向,进行区域监听
上节说明了如何在iOS7和iOS8上完成授权,并且开始获取位置,这一节介绍获取位置信息的方法. [定位精度] 定位精度有多种选择:根据字面意思即可理解 extern const CLLocationA ...
- Beanstalkd 一个高性能分布式内存队列系统
需要一个分布式内存队列,能支持这些特性:任务不重不漏的分发给消费者(最基础的).分布式多点部署.任务持久化.批量处理.错误重试..... 转载:http://rdc.taobao.com/blog/c ...