この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2009年8月)

2009年8月26日

システムサウンドの再生と問題と、今後どうしよう
初回投稿日時: 2009年08月26日20時19分49秒
最終更新日時: 2009年08月26日20時50分04秒
カテゴリ: Memo Mozilla Core 雑談
SNS: (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のメソッドを呼び出す時に常に別スレッドで呼び出すようにすれば二番目の問題も解決できそうです。

なんていうことを考えてはいるものの、さていつから取りかかれるやら……

関連するかもしれないエントリ

関連するかもしれないエントリを発見できませんでしたが、無いとは限りません。