javax.sound.sampled

接口
异常
所有超级接口:
DataLine, Line

public interface SourceDataLine
     
extends DataLine

源数据行是可以写入数据的数据行。它充当其混频器的源。应用程序将音频字节写入源数据行,这样可处理字节缓冲并将它们传递给混频器。混频器可以将这些样本与取自其他源的样本混合起来,然后将该混合物传递到输出端口之类的目标(它可表示声卡上的音频输出设备)。

注意,此接口的命名约定反映了数据行及其混频器之间的关系。从应用程序的角度来看,源数据行可能充当音频数据的目标。

可以通过使用适当 DataLine.Info 对象调用 MixergetLine 方法从混频器获得源数据行。

SourceDataLine 接口提供将音频数据写入数据行的缓冲区中的方法。播放或混合音频的应用程序应该以足够快的速度将数据写入源数据行,以防缓冲区下溢(排空),下溢可能导致单击时音频数据中出现可感知的间断。应用程序可以使用在 DataLine 接口中定义的 available 方法来确定当前在数据行缓冲区中列队的数据量。可以不受阻塞地写入缓冲区的数据量是缓冲区大小和已列队数据量之间的差值。如果由于下溢而导致音频输出的传递停止,则生成 STOP 事件。恢复音频输出时生成 START 事件。

从以下版本开始:
1.3
另请参见:
Mixer, DataLine, TargetDataLine

嵌套类摘要
 
从接口 javax.sound.sampled.DataLine 继承的嵌套类/接口
DataLine.Info
 
方法摘要
 void open(AudioFormat format)
          打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作。
 void open(AudioFormat format, int bufferSize)
          打开具有指定格式和建议缓冲区大小的行,这样可使该行获得所有所需系统资源并变得可操作。
 int write(byte[] b, int off, int len)
          通过此源数据行将音频数据写入混频器。
 
从接口 javax.sound.sampled.DataLine 继承的方法
available, drain, flush, getBufferSize, getFormat, getFramePosition, getLevel, getLongFramePosition, getMicrosecondPosition, isActive, isRunning, start, stop
 
从接口 javax.sound.sampled.Line 继承的方法
addLineListener, close, getControl, getControls, getLineInfo, isControlSupported, isOpen, open, removeLineListener
 

方法详细信息

open

void open(AudioFormat format,
          int bufferSize)
          throws LineUnavailableException
打开具有指定格式和建议缓冲区大小的行,这样可使该行获得所有所需系统资源并变得可操作。

以字节为单位指定缓冲区大小,但该大小必须表示整数形式的样本帧数。使用不满足此要求的所请求缓冲区大小调用此方法可能导致 IllegalArgumentException。已打开的行的实际缓冲区大小可能与所请求缓冲区大小不同。实际设置的值可以通过后续调用 DataLine.getBufferSize() 来查询。

如果此操作成功,则将该行标记为 open,并向行的侦听器指派一个 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,并向行的侦听器指派一个 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 - 包含要写入数据行的数据的字节数组
len - 数组中的有效数据的长度,以字节为单位(即要写入的请求数据量,以字节为单位)
off - 数组开始处的偏移量,以字节为单位
返回:
实际写入的字节数
抛出:
IllegalArgumentException - 如果所请求字节数不表示整数形式的样本帧数,或者 len 为负
ArrayIndexOutOfBoundsException - 如果 off 为负,或者 off+len 大于数组 b 的长度。
另请参见:
TargetDataLine.read(byte[], int, int), DataLine.available()