< 目次

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

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

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

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

AudioSystem.javaのgetMixerInfo()の動作フロー

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

 


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.