日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

介绍一种很棒的wince 如何替换系统声音的方法

發布時間:2025/4/16 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 介绍一种很棒的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 如何替换系统声音的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。