public interface SourceDataLine
源数据行是可以写入数据的数据行。它充当其混频器的源。应用程序将音频字节写入源数据行,这样可处理字节缓冲并将它们传递给混频器。混频器可以将这些样本与取自其他源的样本混合起来,然后将该混合物传递到输出端口之类的目标(它可表示声卡上的音频输出设备)。
注意,此接口的命名约定反映了数据行及其混频器之间的关系。从应用程序的角度来看,源数据行可能充当音频数据的目标。
可以通过使用适当
对象调用 DataLine.Info
Mixer
的
方法从混频器获得源数据行。 getLine
SourceDataLine
接口提供将音频数据写入数据行的缓冲区中的方法。播放或混合音频的应用程序应该以足够快的速度将数据写入源数据行,以防缓冲区下溢(排空),下溢可能导致单击时音频数据中出现可感知的间断。应用程序可以使用在 DataLine
接口中定义的
方法来确定当前在数据行缓冲区中列队的数据量。可以不受阻塞地写入缓冲区的数据量是缓冲区大小和已列队数据量之间的差值。如果由于下溢而导致音频输出的传递停止,则生成 available
事件。恢复音频输出时生成 STOP
事件。 START
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 |
方法详细信息 |
---|
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
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
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()