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() に類似した構造になっています。