[英]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.