2

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);

持続時間はミリ秒、周波数はヘルツです。

ほとんどの場合、サウンドは正しく再生されます (つまり、サウンドは適切な長さで再生されます)。

ただし、サウンドがより長く再生される場合があります (約 1 秒間再生されます)。

このようなことは、ユーザーの耳にかなり邪魔になるので避けたいと思います。

この動作が存在する理由がわかりません。アプリケーションでは、短い音と長い音の間で何も変わりません。アプリケーション データは同じであり、他のタスクやバックグラウンド タスクはアプリケーションによって実行されません。

このビープ音は、特定の画面がユーザーに表示されるときに再生されます (つまり、フォーム オブジェクトが作成され、その初期化中にビープ音が再生されます)。ということで、デバイスのCPU使用率が高い時に音が出るのではないかと思います。また、CPU がビジーであるため、サウンドを適切な時間だけ再生することができません。

この問題は、Symbol Developer Kit に固有のものでしょうか?

このような長いビープ音を避けるにはどうすればよいですか?

編集

ctacke ソリューションを実装しました。ビープ音を別のスレッドで優先度を高くして再生します。また、サウンドの長さを増やしました (15 ミリ秒ではなく 30 ミリ秒にしました。持続時間が長いほど、システムが正しい時間内にサウンドを再生できるようになる可能性があります)。

この実装がこの問題を解決するかどうかはまだわかりません。バグの不確定性のため、問題が確実に解決されるまでには時間がかかります。

4

2 に答える 2

1

私の推測では、オーディオの再生中に GC が発生し、オン/オフで大混乱を引き起こしていると思います (ただし、Symbol が呼び出しをどのように実装したかを正確に知ることはできません)。

最初の刺し傷として、再生中のサウンドを別のスレッドに放り込み、P/Invoke を使用して CeSetThreadPriority (マネージされた Thread.Priority プロパティだけでなく) の優先度を上げます。これは、ドライバーなどにクォンタムを失うことを除外しますが、一時停止の長さは、クォンタムの問題ではなく、アプリの問題である可能性が高いことを示唆しています.

それが GC に関連していることが判明した場合 (RPM はおそらくそれを判断するのに役立つでしょう)、オーディオを実行するネイティブ ライブラリを作成し、それを P/Invoke します。GC はネイティブ スレッドをいじることができないため、決定論を維持できます。

于 2010-03-04T15:11:05.920 に答える
0

最新のSDKを使用していることを確認してください。ご存知かもしれませんが、SymbolはMotorolaの一部になり、SymbolDeveloperKitはEnterpriseMobilityDeveloperKitに名前が変更されました。EMDKの最新バージョンはv2.3で 1月にリリースされました。

SDKのバグであれば、発生している問題はすでに修正されている可能性があります(すべてのSDKのリリースノートはサポートWebサイトにあります)。

于 2010-03-04T17:38:24.640 に答える