AudioSystem.java
サービスプロバイダや API 実装者のために、JavaSound のソースコードの概要について説明します。
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()
に類似した構造になっています。