モジュール java.desktop
パッケージ javax.sound.sampled

インタフェースSourceDataLine

すべてのスーパー・インタフェース:
AutoCloseable, DataLine, Line

public interface SourceDataLine
extends DataLine
ソース・データ・ラインはデータを書き込めるデータ・ラインです。 ソース・データ・ラインはミキサーに対してソースとして動作します。 アプリケーションがオーディオ・バイトをソース・データ・ラインに書き込むと、ソース・データ・ラインはバイトのバッファリングを処理し、それをミキサーに配信します。 ミキサーはサンプルを他のソースからのサンプルとミックスし、それを出力ポートなどのターゲットに配信します。出力ポートとは、サウンド・カードのオーディオ出力デバイスなどのことです。

このインタフェースの命名規則は、ラインとミキサーの関係を反映しています。 アプリケーションから見ると、ソース・データ・ラインはオーディオ・データのターゲットの役割を果たします。

ソース・データ・ラインは、適切なDataLine.Infoオブジェクトを使用してMixergetLineメソッドを呼び出すことによって、ミキサーから取得できます。

SourceDataLineインタフェースは、オーディオ・データをデータ・ラインのバッファに書き込むメソッドを提供します。 オーディオを再生またはミックスするアプリケーションは、バッファがアンダーフロー(空白化)しないうちにデータをすばやくソース・データ・ラインに書き込みます。アンダーフローによりオーディオに不連続部(クリック音として聞こえる)が生じることがあります。 アプリケーションは、DataLineインタフェースで定義されたavailableメソッドを使用して、データ・ライン・バッファに現在キューイングされているデータの量を判断できます。 ブロックせずにバッファに書き込めるデータ量は、バッファ・サイズとキューに入っているデータ量との差です。 アンダーフローのためにオーディオ出力の配信が停止した場合は、STOPイベントが生成されます。 オーディオ出力が再開すると、STARTイベントが生成されます。

導入されたバージョン:
1.3
関連項目:
MixerDataLineTargetDataLine
  • メソッドの詳細

    • open

      void open​(AudioFormat format, int bufferSize) throws LineUnavailableException
      指定されたフォーマットと指定されたバッファ・サイズでラインを開き、ラインが必要なシステム・リソースを獲得して操作可能になるようにします。

      バッファ・サイズはバイト単位で指定しますが、サンプル・フレームの整数値を表す必要があります。 リクエストされたバッファ・サイズがこの要件を満たさない場合にこのメソッドを呼び出すと、IllegalArgumentExceptionが返される可能性があります。 開いたラインの実際のバッファ・サイズは、指定したバッファ・サイズとは異なることがあります。 実際に設定された値は、その後DataLine.getBufferSize()を呼び出して問合せすることができます。

      この操作が成功すると、その行は開いているとマークされ、OPENイベントが行リスナーにディスパッチされます。

      すでに開いているラインでこのメソッドを呼び出すのは不適切なアクションであるため、IllegalStateExceptionが表示されることがあります。

      ラインによっては、一度閉じると再度開くことができない場合があります。 こうしたラインを再度開こうとすると、常にLineUnavailableExceptionが表示されます。

      パラメータ:
      format - 目的のオーディオ形式
      bufferSize - 目的のバッファ・サイズ
      例外:
      LineUnavailableException - リソースの制約のためにラインを開けない場合
      IllegalArgumentException - バッファ・サイズがサンプル・フレームの整数値を表さない場合、あるいはformatの指定が不完全または無効な場合
      IllegalStateException - ラインがすでに開いている場合
      SecurityException - セキュリティの制約のためにラインを開けない場合
      関連項目:
      open(AudioFormat)Line.open()Line.close()Line.isOpen()LineEvent
    • open

      void open​(AudioFormat format) throws LineUnavailableException
      指定されたフォーマットでラインを開き、ラインが必要なシステム・リソースを獲得して操作可能になるようにします。

      バッファ・サイズは実装により選択されます。バッファ・サイズはバイト単位ですが、サンプル・フレームの整数値であることが必要です。 システムが選択したサイズは、続いてDataLine.getBufferSize()を呼び出して問合せすることができます。

      この操作が成功すると、その行は開いているとマークされ、OPENイベントが行リスナーにディスパッチされます。

      すでに開いているラインでこのメソッドを呼び出すのは不適切なアクションであるため、IllegalStateExceptionが表示されることがあります。

      ラインによっては、一度閉じると再度開くことができない場合があります。 こうしたラインを再度開こうとすると、常にLineUnavailableExceptionが表示されます。

      パラメータ:
      format - 目的のオーディオ形式
      例外:
      LineUnavailableException - リソースの制約のためにラインを開けない場合
      IllegalArgumentException - formatの指定が不完全または無効な場合
      IllegalStateException - ラインがすでに開いている場合
      SecurityException - セキュリティの制約のためにラインを開けない場合
      関連項目:
      open(AudioFormat, int)Line.open()Line.close()Line.isOpen()LineEvent
    • write

      int write​(byte[] b, int off, int len)
      このソース・データ・ラインを介してオーディオ・データをミキサーに書き込みます。 要求されたバイト数のデータが、指定されたオフセットを始点として指定された配列から読み込まれ、データ・ラインのバッファに書き込まれます。 呼び出し元が現在(availableを参照してください)と書かれている以上のデータを書き込もうとすると、リクエストされたデータ量が書き込まれるまでブロックされます。 これは、書込みを要求されたデータの量がデータ・ラインのバッファ・サイズより大きい場合にも当てはまります。 ただし、要求された量の書込みが終わる前にデータ・ラインがクローズ、停止、またはフラッシュされた場合は、メソッドのブロックが解除されて、それまでに書き込まれたバイト数が返されます。

      ブロックせずに書き込むことができるバイト数は、DataLineインタフェースのavailableメソッドを使用して確認できます。 このバイト数はブロックされずに確実に書き込めますが、追加データを書き込もうとしたときにブロックされるかどうかは確実ではありません。

      書き込まれるバイト数は、次のようにサンプル・フレームの整数値を表す必要があります。

      [ bytes written ] % [frame size in bytes ] == 0

      戻り値は常にこの条件を満たしています。 サンプル・フレームの非整数値を表すバイト数を書き込む要求は実行できず、IllegalArgumentExceptionがスローされる場合があります。

      パラメータ:
      b - データ・ラインに書き込まれるデータを含むバイト配列
      off - 配列の先頭からの座標、バイト単位
      len - バイト単位での配列の有効データの長さ(つまり、書込みを要求するバイト単位のデータ量)
      戻り値:
      実際に書き込まれるバイト数
      例外:
      IllegalArgumentException - 要求されたバイト数がサンプル・フレームの整数値を表さない場合、またはlenが負の値の場合
      ArrayIndexOutOfBoundsException - offが負の値の場合、またはoff+lenが配列bの長さより大きい場合
      関連項目:
      TargetDataLine.read(byte[], int, int), DataLine.available()