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

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

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

2009年10月18日

Bug-org 520417 Redesign nsSound structure
初回投稿日時: 2009年10月18日01時37分25秒
最終更新日時: 2009年10月18日02時06分29秒
カテゴリ: Mozilla Core バグ修正
SNS: (list)

いい加減に問題が山積していたnsSoundまわりを再設計するというバグです。

当初はシンプルにnsSoundのインスタンスを隠蔽して、全プラットフォーム、別のスレッドで再生することでUI操作を妨害しないように、というシンプルなパッチを出しましたが、色々な理由から却下されました。

rocの提案により、nsSoundの機能をシステム音再生機能とWAVEファイルの再生機能とに分割し、なおかつWAVEファイルの再生はaudio要素を使うように、という話になり、そのように実装しています。

nsISoundは今回の修正により、Gecko 1.9.3(つまりFx3.7以降)ではobsoleteとなりました。互換性のため、引き続きnsISoundはサポートされますが、新たなAPI、定数の追加等は行われません。

nsISound::init()は残っていますが、必要なくなったため、何もしないようになっています。

nsISound::play()nsISoundPlayer::play()に置き換わりました。

nsISound::PlaySystemSound()に相当する新しいメソッドは用意されていません。nsSound::Play()は各プラットフォームでできるだけ以前の動作と同じ結果になるように新しいインターフェースのメソッドを呼び出しますが、動作がプラットフォーム毎に異なっているため、あまり利用価値はありません。

nsISound::playEventSound()nsISystemSoundService::playEventSound()に置き換わりました。

nsISound::beep()nsISystemSoundService::beep()に置き換わりました。

nsISystemSoundService::playAlias()はWindowsと、OS/2でのみサポートされていたサウンドの別名による再生が実装されています。ですが、互換のためのものなので、利用機会はほとんど無いかと思います。

新旧のインターフェースの同名メソッドではパラメータに変更は無いため、利用側のコードは、nsISoundcreateInstanceしていた部分をnsISystemSoundServicensISoundPlayerのインスタンスをgetServiceで取得するように変更し、nsISoundの定数を使っていた部分はnsISystemSoundServiceに同じ定数を定義しているので、インターフェース名を書きかえるだけで新しいインターフェースを直接使うコードに書きかえることができます。

新しい二つのインターフェースは共にシングルトンで実装されていますので、createInstanceを利用してもgetServiceと同じ結果が返りますが、コードの意味上、よろしくないので、後者を使うようにしてください。

nsISoundは引き続き利用可能ですが、createInstanceを実行するとその度にインスタンスが生成され、さらに、その実行時に新しいインターフェースのインスタンスを取得して、同じメソッドを呼び出すだけなので効率が悪く、利用価値はありません。

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

bug-org 520417を含むエントリ

Bug-org 520417 Redesign nsSound structure #2