前面有做一个操作系统为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经由项目编译。

谢谢他的分享!

如何修改点击触摸屏的默认声音相关推荐

  1. 使用系统默认声音、震动

    导入框架: 代码: [cpp] view plaincopy #import <UIKit/UIKit.h> #import <AudioToolbox/AudioToolbox.h ...

  2. 如何修改Windows 7登录界面默认输入法?

    Windows 7用户都有这样的经历,每次进入登录界面时,当用户在输入用户名时,其输入法默认被设置为"微软拼音"输入. 由于大多数时候用户名是全英文字符串,"微软拼音&q ...

  3. OneNote中英文格式不同,OneNote无法修改英文字体,OneNote默认英文字体为Calibri无法修改的问题。

    OneNote中英文格式不同,OneNote无法修改英文字体,OneNote默认英文字体为Calibri无法修改的问题. 问题 我在使用OneNote中遇到一个问题中文英文字体格式不一致,在英文输入状 ...

  4. 站住!你会修改NPM全局模式的默认安装路径嘛?

    修改NPM全局模式的默认安装路径 一.下载Nodejs: 二.新建path变量值: 三.输入命令查看当前配置: 四.修改路径 本次分享就到此结束啦. 2020-12-14 一般情况下,我们安装Node ...

  5. 参考 | ffmpeg 修改多音轨视频的默认音轨

    参考 | ffmpeg 修改多音轨视频的默认音轨 文章目录 参考 | ffmpeg 修改多音轨视频的默认音轨 0. 起因 1. 解决 a. 先安装 ffmpeg b. 修改视频的默认音轨 0. 起因 ...

  6. 【Windows美化】:修改磁盘或U盘默认图标(常见方式与无需重启、可随时修改、支持中文文件名的独家方式)

    Windows美化--修改磁盘或U盘默认图标(常见方式与无需重启支持中文的独家方式) 文章目录 Windows美化--修改磁盘或U盘默认图标(常见方式与无需重启支持中文的独家方式) 一.适用场景 二. ...

  7. Android系统修改gmail和google日历默认铃声,区别于系统的默认通知音

    需求: 单独修改gmail和google日历默认铃声,区别于系统的默认通知音 解决方法: 因为GMS包没有源码,所以无法通过修改apk的方法解决,只能修改获取默认铃声时的uri实现. 具体设计到的文件 ...

  8. html单选按钮字体,如何修改radio,input元素默认样式

    一.背景介绍 下拉列表由select标签实现,单选按钮由表单元素input的type属性radio定义.以下分别是一个简单的下拉列表和单选按钮. 二.知识剖析 1.form元素 form元素定义HTM ...

  9. 如何修改电脑桌面文件夹的默认根目录

    桌面默认是C盘,为了降低C盘的容量,修改电脑桌面文件夹的默认根目录 一.找到[桌面]文件夹 点开任意文件夹,右侧可找到[桌面]文件夹,进入后,右键,然后选择属性, ![在这里插入图片描述](https ...

最新文章

  1. CCNP ONT LAB之PQ WFQ
  2. python有哪些常见的开发环境_Python集成开发环境有哪些
  3. 曾在字节实习的程序员小姐姐,教你一步提取动漫线稿!比用PS更清晰
  4. 2018视频人物识别挑战赛冠军经验分享:在现有机器资源条件下更快速验证是关键...
  5. Cloudstack介绍(一)
  6. Sklearn(v3)——朴素贝叶斯(3)
  7. Git的branch
  8. RMAN的一些术语解释
  9. 鼠标移入时闪闪发光的效果
  10. Struts2之文件上传(单文件/多文件)
  11. 请求参数 统一 管理 java_Retrofit+Rxjava+okhttp基本操作和统一处理 – R...
  12. 把C#当作脚本语言来用
  13. AspSpider再次开放asp.net2.0 免费空间注册
  14. 学习Wireshark之二:数据包分析
  15. 【Go】高性能的简繁体转换
  16. ceph rbd mysql_ceph rbd操作
  17. Widows系统截屏工具
  18. Netty实战:Springboot+Netty+protobuf开发高性能服务器 (附源码下载)
  19. MNIST数据集手写数字识别
  20. 使用PHP实现密保卡功能

热门文章

  1. Python全栈最全学习之路-Python基础(七)
  2. XPath实例教程十六、following轴
  3. React-Native清除缓存汇总
  4. ESP32学习microPython之(1)--machine内置函数
  5. ironbot智能编程机器人_RoboSpaceIronBot机器人套件 | 视频 | 可编程组装机器人,自定义玩法孩子超爱-极果...
  6. 一篇解决 —— 报税系统的分析与解决方案
  7. 悟空与佛祖的经典对话
  8. 【VirtualAPP 双开系列04】VirtualAPP 可扩展 AIDL 分析
  9. Shell脚本中简单脚本示例
  10. 数据库——oracle查询表信息