16 Javaサウンド

この章では、Javaサウンド・テクノロジで発生する可能性のあるいくつかの問題を説明し、その原因と回避方法を提示します。

次のトピックでは、Javaサウンドの問題のトラブルシューティング・シナリオについて説明します。

Javaサウンドの問題のトラブルシューティング

システム・サウンド構成、オーディオ・ファイル形式、オーディオ形式、およびオーバーランとアンダーランの条件など、Javaサウンドの問題をトラブルシューティングします。

システム・サウンド構成

使用中のオーディオ・システムが正しく構成されていることを確認します(Windows: サウンド・カード・ドライバ/DirectSound、Linux: ALSA)。さらに、スピーカが接続されており、サウンド・カードのボリュームとミュートの状態が適切な値に調整されていることを確認します。サウンドの構成をテストするには、任意のネイティブ・サウンド・アプリケーションを実行し、そこで何らかのサウンドを再生します。

Linuxオペレーティング・システムではサウンドを再生できない可能性がありますが、それは、アプリケーション(またはesdartsdなどのサウンド・デーモン)がオーディオ・デバイスを排他的に開くために、デバイスへのJava Soundのアクセスが拒否されるためです。

オーディオ・ファイル形式

Java SoundはAU、AIF、WAVなど、一連のオーディオ・ファイル形式をサポートしています。ほとんどのファイル形式は単なるコンテナなので、さまざまな圧縮オーディオ形式のオーディオ・データを格納できます。Java Soundのファイル・リーダーはいくつかの形式(非圧縮PCM、a-law、mu-law)をサポートしていますが、ADPCMやMP3などはサポートしていません。

また、Java Soundはサービス・プロバイダ・インタフェース(SPI)経由でファイル・リーダー/ライター用のプラグインもサポートしています。Oracle、サードパーティ、またはユーザー独自のプラグインを使用して、様々なオーディオ・ファイルを読み取れます。いずれにしても、必要なプラグインをアプリケーションと一緒に配布したり、クライアントのJava環境にプラグインがインストールされることを要求したりするなどして、プラグインの存在を管理する必要があります。

オーディオ形式

Java Soundは様々なオーディオ形式をサポートしていますが、それらを利用できるかどうかはオペレーティング・システムごとに異なります。録音または再生用になんらかのオーディオ形式を使用するには、使用しているシステム(サウンド・カード・ドライバ)でその形式がサポートされている必要があります。サポートされている形式をできるだけ使用してください(PCM、8または16ビット、8000、11025、22050、44100 Hz)。これらの形式は、存在しているサウンド・カードのほとんどでサポートされています。ほとんどのサウンド・カードはPCM形式しかサポートしていないため、そのドライバがmu-lawをサポートしている場合でも、ソフトウェアに多少の変更を加える必要があります。mu-lawデータを録音または再生する必要がある場合は、形式コンバータによってそれをPCM形式に変換するのが望ましい方法です。

形式変換の詳細については、AudioSystem.getAudioInputStreamのドキュメントを参照してください。

オーバーランとアンダーランの条件

録音データはDataLineバッファ内に格納されます。長い間ラインからの読出しが行われなかった場合、オーバーラン状態が発生し、古いデータが新しいデータに置き換えられます。このため、録音されたオーディオ・データにアーティファクトが発生します。

再生時も似た状況が発生します。バッファ内のすべてのデータが再生されたとき、ラインに新しいデータが書き込まれていない場合、アンダーラン状態が発生し、ラインにオーディオ・データの新しい部分が書き込まれるまで無音になります。

推奨の録音方法は、ほかのタスク(UI処理など)の潜在的な影響を受けないように、独立したスレッドでデータを読み取ることです。再生にSourceDataLineを使用する場合は、ラインにデータを書き込むためのスレッドを個別に用意することをお薦めします。再生にClipを使用する場合、Clipの実装自体によってこのタイプのスレッドが作成されます。