付録 A: コードの概要: AudioSystem.java


サービスプロバイダや API 実装者のために、JavaSound のソースコードの概要について説明します。

javax.sound.sampled.AudioSystem は、ミキサーやラインといったリソースを取得するための JavaSound へのエントリポイントになります。 AudioSystem の各メソッドでは、MixerProvider[]FormatConversionProvider[]AudioFileReader[]AudioFileWriter[] など、サービスのプロバイダが取得されます。 次に、メソッドでは、特定の情報の取得や、特定の処理が行われます。 これらのメソッドの動作は、多くの点で類似しています。 getMixerInfo() の動作を見てみましょう。

次の図は、AudioSystem.javagetMixerInfo() の動作フローです。

AudioSystemgetMixerInfo() は、まずgetMixerProviders() を呼び出します。これは AudioSystemprivate static メソッドです。 getMixerProviders() は、まず sun.misc.Service のロードを試みます。 例外がスローされた場合は、JRE 1.3 より前のバージョンが使用されており、サービスプロバイダのルックアップ機構がないことを示しています。 例外がスローされると、sun.media.sound.DefaultServices を使ってサービスプロバイダが取得されます (上の図には示されていません)。 1.3 の機構が備わっている場合は、上図のように getJDK13Serives() が呼び出されます。このとき、引数として "javax.sound.sampled.spi.MixerProvider" が指定されます。

getJDK13Services() も、AudioSystemprivate static メソッドです。 このメソッドは、"com.sun.media.sound.JDK13Services" のクラスのロードを試み、成功した場合は、このクラスを Class jdk13Services に設定します。 次に、やや技巧的ですが、Class.getMethod() を使って jdk13ServicesgetProviders() メソッドを取得します。これは Method m オブジェクトとして返されます。 次に、このメソッドが呼び出され、その結果 JDK13Services に対して getProviders("javax.sound.sampled.spi.MixerProvider") が呼び出されます。 ここでは、sun.misc.Serviceproviders() メソッドを使って、ミキサープロバイダのベクトル MixerProvider[] が返されます。 次に、このベクトルの各要素に対し MixerProvidergetMixerInfo() メソッドが呼び出されて、Mixer.info が返されます。これは、すべてのミキサープロバイダの全ミキサーに関する情報です。

他のサービスも同様の仕組みで処理されます。 たとえば、getTargetEncodings()getFormatConversionProviders() を呼び出し、getAudioFileFormat()getAudioFileReaders() を呼び出しますが、これらは getMixerProviders() に類似した構造になっています。