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


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

javax.sound.sampled.AudioSystem は、ミキサーやラインといったリソースを取得するための Java Sound へのエントリポイントになります。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() に類似した構造になっています。