システムサウンドの再生と問題と、今後どうしよう
初回投稿日時: 2009年08月26日20時19分49秒
最終更新日時: 2009年08月26日20時50分04秒
カテゴリ: Memo Mozilla Core 雑談
SNS:
Tweet (list)
Geckoではシステムサウンドやビープ音の再生をnsISound
を通して行っていますが、MDCのドキュメントにもあるように、
var sound = Components.classes["@mozilla.org/sound;1"] .createInstance(Components.interfaces.nsISound);
このようにインスタンスを生成して呼び出し、ということをしなくてはいけません。そしてSeaMonkeyのコード以外(何のコードかは忘れましたが)は再生の度にnsISound
のインスタンスを作成して呼び出して破棄、ということを実際に繰り返しています。
案の定このやり方のままでナビゲーションに関するシステム音の再生を実装してみると、ページの読み込み速度に関わってしまって、スコアを落としてしまう結果になっています。
Windows版のみ、再生時に別スレッドで再生するAPIを呼び出すことでUIがロックされることを防ぐようにしましたが、同様の問題はLinuxも抱えているようです。また、他のプラットフォームもAPI自体が完全に非同期なものでない限り、少なくともそれは発生してしまいます。
今更nsISound
自体を廃止する訳にもいかないので、従来のコードとの互換性を維持したままこれらを解決しようとすると、nsISoundService
というサービスでも作り、これがnsISound
のインスタンスを一つだけ内部に確保しておき、このインスタンスを使い回すようにすれば一つ目の問題を解決できそうです。
またnsISound
のメソッドを呼び出す時に常に別スレッドで呼び出すようにすれば二番目の問題も解決できそうです。
なんていうことを考えてはいるものの、さていつから取りかかれるやら……