AudioSystem.java
サービス・プロバイダやAPI実装者のために、Java Soundのソース・コードの概要について説明します。
javax.sound.sampled.AudioSystem
は、ミキサーやラインといったリソースを取得するためのJavaSoundへのエントリ・ポイントになります。AudioSystem
の各メソッドでは、MixerProvider[]
、FormatConversionProvider[]
、AudioFileReader[]
、AudioFileWriter[]
など、サービスのプロバイダが取得されます。次に、メソッドは、特定の情報を取得したり、特定のタスクを実行したりします。これらのメソッドの動作は、多くの点で類似しています。getMixerInfo()
の動作を見てみましょう。
次の図は、AudioSystem.java
のgetMixerInfo()
の動作フローです。
AudioSystem
のgetMixerInfo()
は、まずgetMixerProviders()
を呼び出します。これはAudioSystem
のprivate static
メソッドです。getMixerProviders()
は、まずsun.misc.Service
のロードを試みます。例外がスローされた場合は、JRE 1.3より前のバージョンが使用されており、サービス・プロバイダのルックアップ・メカニズムがないことを示しています。例外がスローされると、sun.media.sound.DefaultServices
を使ってサービス・プロバイダが取得されます(上の図には示されていません)。1.3のメカニズムが備わっている場合は、上図のようにgetJDK13Serives()
が呼び出されます。このとき、引数として「javax.sound.sampled.spi.MixerProvider」
が指定されます。
getJDK13Services()
も、AudioSystem
のprivate static
メソッドです。このメソッドは、「com.sun.media.sound.JDK13Services」
のクラスのロードを試み、成功した場合は、このクラスをClass jdk13Services
に設定します。次に、ややトリッキーな方法ですが、Class.getMethod()
を使ってjdk13Services
のgetProviders()
メソッドを取得します。これはMethod m
オブジェクトとして返されます。次に、このメソッドが呼び出され、その結果JDK13Services
に対してgetProviders(「javax.sound.sampled.spi.MixerProvider」)
が呼び出されます。ここでは、sun.misc.Service
のproviders()
メソッドを使って、ミキサー・プロバイダのベクトルMixerProvider[]
が返されます。次に、このベクトルの各要素に対しMixerProvider
のgetMixerInfo()
メソッドが呼び出されて、Mixer.info
が返されます。これは、すべてのミキサー・プロバイダの全ミキサーに関する情報です。
ほかのサービスも同様の仕組みで処理されます。たとえば、getTargetEncodings()
はgetFormatConversionProviders()
を呼び出し、getAudioFileFormat()
はgetAudioFileReaders()
を呼び出しますが、これらはgetMixerProviders()
に類似した構造になっています。