[英]Play sounds with the Symbol Developer Kit in C#
我們正在開發一個移動應用程序,其目標是由 Symbol 制造的設備。 在這些設備上,Windows Mobile 是系統。
我們的應用程序播放聲音(實際上是簡單的嗶嗶聲):我們使用 Symbol 提供的開發工具包訪問設備聲卡以播放聲音。
這是我們使用的代碼:
Symbol.Audio.Device MyDevice = (Symbol.Audio.Device)Symbol.StandardForms.SelectDevice.Select(
Symbol.Audio.Controller.Title,
Symbol.Audio.Device.AvailableDevices);
Symbol.Audio.Controller sound_card = new Symbol.Audio.StandardAudio(MyDevice);
int Duration = 15;
int Frequency = 3000;
sound_card.PlayAudio(Duration, Frequency);
持續時間以毫秒為單位,頻率以赫茲為單位。
幾乎總是正確播放聲音(我的意思是聲音以正確的持續時間播放)。
但有時,聲音播放的時間要長得多(播放時間大約為一秒鍾)。
我們希望避免這樣的事情,因為這對用戶的耳朵來說是非常令人不安的。
我不知道為什么會出現這種行為:應用程序在短音和長音之間沒有任何變化。 應用程序數據相同,應用程序不執行其他任務和后台任務。
當向用戶顯示特定屏幕時會播放此提示音(我的意思是創建了一個 Form 對象,並在其初始化期間播放提示音)。 所以我認為,也許是在強烈使用設備cpu時播放聲音。 並且由於 cpu 很忙,因此無法在正確的持續時間內成功播放聲音。
也許這個問題是 Symbol Developer 工具包特有的?
我怎樣才能避免這種更長的嗶嗶聲?
我實現了 ctacke 解決方案:我在一個具有高優先級的單獨線程中播放嗶嗶聲。 此外,我增加了聲音的持續時間(我把 30 毫秒而不是 15 毫秒:也許持續時間越長,系統在正確的時間內播放聲音的效果就越好)。
我還不知道這個實現是否解決了這個問題; 由於錯誤的不確定性,需要一些時間來確保問題得到解決。
我的猜測是,當音頻正在播放時,你會得到一個 GC,這對開/關造成了嚴重破壞(盡管不知道 Symbol 是如何實現調用的,這很難說)。
作為第一次嘗試,我會將播放的聲音扔到一個單獨的線程中,並使用 P/Invoke 到 CeSetThreadPriority(不僅僅是托管的 Thread.Priority 屬性)來提高它的優先級。 這將排除您將量子丟失給驅動程序或其他東西,盡管暫停的長度表明這不是量子問題,而更可能是應用程序問題。
如果事實證明它與 GC 相關(RPM 可能會幫助您確定這一點),那么我會創建一個本地庫來處理音頻並 P/Invoke 它。 GC 不會干擾本地線程,因此您可以保持確定性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.