介绍一种很棒的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 如何替换系统声音的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ROM修改教程】添加高级电源重启菜单(
- 下一篇: WinCE系统声音定制