AudioSystem.java サービスプロバイダや API 実装者のために、Java Sound のソースコードの概要について説明します。
javax.sound.sampled.AudioSystem は、ミキサーやラインといったリソースを取得するための Java Sound へのエントリポイントになります。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() に類似した構造になっています。