Java Applet パッケージ (java.applet) では、Applet クラスと AudioClip インタ フェースがサウンド再生の基本的なサポートを行う。 現在、Java API がサポートするサウンド形式は、8 ビット、law、 8000Hz 、1 チャネル、Sun の ".au" ファイルの 1 つだけである。このようなサ ウンド形式は、audiotool アプリケーションを使用して Sun ワークステーシ ョン上で作成することができる。 オーディオ形式変換プログラムを使用すれば、他のサウンド形式からファイルを変換 することも可能である。
サウンド関連のメソッド
以下にサウンド関連の Applet メソッドを示す。 各メソッドの 2 つの引数をとる書式では、ベースの URL (一般に、getDocumentBase() または getCodeBase() のどちらか から返される) と、そのベース URL からの相対的なサウンドファイルの位置を引数 とする。 アプレットにとって不可欠なサウンドには通常、コードベースを使用するべきである 。 文書ベースは一般に、アプレットユーザがアプレットのパラメータを介するなどして指定するサウンドのために使用する。
- getAudioClip(URL)、 getAudioClip(URL, String)
- AudioClip インタフェースを実装するオブジェクトを返す。
- pl ay(URL), play(URL, String)
- 指定された URL に対応する AudioClip を再生する。
AudioClip インタフェースは以下のメソッドを定義する。
- loop()
- クリップの再生を繰り返し開始する。
- play()
- クリップを一度再生する。
- stop()
例
ここでは、SoundExample という名前のアプレットを例示し、サウンドに関するいく つかのことを説明する。 学習目的のため、このアプレットでは各サウンドのロード時間に 10 秒を加えている。 サウンドがもっと大きい場合や、ユーザの接続が遅い場合は、10 秒という遅れは現実的なものかもしれない。
使用中の環境ではアプレットを実行することはできない。できた場合には次のような メッセージが表示される。
SoundExample アプレットはアプレットで多数のサウンドをロードし再生するための アーキテクチャを提供する。このため、必要以上に複雑になっている。 サウンドをロードし再生するコードは、基本的には次のように要約される。
AudioClip onceClip, loopClip; onceClip = applet.getAudioClip(getCodeBase(), "bark.au"); loopClip = applet.getAudioClip(getCodeBase(), "train.au"); onceClip.play(); //1 回再生する。 loopClip.loop(); //サウンドループを開始する。 loopClip.stop(); //サウンドループを停止する。ユーザがページを出た後も雑音を出し続けるアプレットほど迷惑なものはない。このため、 SoundExample アプレットは、ユーザがページを出ると、連続的にループしていたサ ウンドの再生を停止し、ユーザが戻ってきたときに再開するようになっている。 これは stop() と start() メソッドを次のように実装 することによって行われる。
public void stop() { //一度のサウンドが長い場合は、ここでも停止する。 //looping は初期値に false が設定された論理値型インスタンス //である。"Start sound loop" ボタンがクリックされると true に、 //"Stop sound loop" または "Reload sounds" がクリックされると false に //設定される。 if (looping) { loopClip.stop(); //サウンドループを停止する。 } } public void start() { if (looping) { loopClip.loop(); //サウンドループを再開する。 } }SoundExample アプレットでは次の 3 つのクラスが重要な役割を果たしている。
- Applet サブクラスの SoundExample 。アプレットの実行を制御する。
- Hashtable サブクラスの SoundList。 AudioClip を保持する。 これはこのアプレットには過剰な機能であるが、大量のサ ウンドファイルを使用するアプレットを書く場合には、このようなクラスが便利である。
- Thread サブクラスの SoundLoader。 この各インスタンスは AudioClip をバックグラウンドでロードする。 アプレットの初期化の間に、アプレットは各サウンドの SoundLoader を作成す ることによって各サウンドをプリロードする。
サウンドをバックグラウンドスレッドに (SoundLoader で) プリロードすると、ユーザがアプレットと相互作用を行えるようになるまでの待ち時間が減り、目に見える性能が向上する。これは init() メソッドに費やす時間を短縮すること によるものである。 アプレットの init() メソッドで単に getAudioClip() を呼び出すだけであれば、getAudioClip() が戻るまでにかなりの時間がかかるはずである。つまり、アプレットがその init() メソッドの 他の文を実行することができず、アプレットの start() が呼び出され ないということである。 (ここに示した特別なアプレットでは、start() メソッドの呼び出しで の遅れは問題ではない。)
サウンドをバックグラウンドスレッドでロードするもう 1 つの利点は、通常はサウ ンドを再生させようとするユーザ入力に、サウンドのロードが完了していなくても、 適切に (しかも直ちに) 応答できることである。たとえば、単に Applet のplay() メソッドを使用するだけであれば、特定のサウンドをアプレッ トに再生させるためにユーザが最初に何かを行っても、アプレットの描画とイベント 処理はサウンドがロードされる間、凍結されたままである。それに対し、この例のアプレッ トはサウンドがまだロードされていないことを検出し、適切に応答するようになって いる。
この例は、アプレットでのスレッド: 例でさら に詳しく説明されている。