public interface SourceDataLine extends DataLine
请注意,此接口的命名约定反映了线路与其调音台之间的关系。 从应用的角度来看,源数据线可以用作音频数据的目标。
可以通过调用具有适当的
对象的DataLine.Info
Mixer
的
方法从混合器获得源数据线。 getLine
SourceDataLine
接口提供了一种将音频数据写入数据线的缓冲区的方法。 播放或混合音频的应用程序应该将数据快速写入源数据行,以使缓冲区不会下溢(排空),这可能会导致音频中的不连续性被视为点击。 应用程序可以使用
中所定义的方法available
DataLine
界面来确定当前在数据线的缓冲器排队的数据的量。 可以写入缓冲区而不阻塞的数据量是缓冲区大小与排队数据量之间的差异。 如果由于下溢导致音频输出的传送停止,则会生成
事件。 音频输出恢复时会产生STOP
事件。 START
Mixer
, DataLine
, TargetDataLine
DataLine.Info
Modifier and Type | Method and Description |
---|---|
void |
open(AudioFormat format)
以指定的格式打开行,使该行获取任何所需的系统资源,并可以运行。
|
void |
open(AudioFormat format, int bufferSize)
以指定的格式和建议的缓冲区大小打开行,使该行获取任何所需的系统资源并变为可操作。
|
int |
write(byte[] b, int off, int len)
通过该源数据线将音频数据写入混频器。
|
available, drain, flush, getBufferSize, getFormat, getFramePosition, getLevel, getLongFramePosition, getMicrosecondPosition, isActive, isRunning, start, stop
addLineListener, close, getControl, getControls, getLineInfo, isControlSupported, isOpen, open, removeLineListener
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
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
int write(byte[] b, int off, int len)
available
),则该方法将阻塞,直到请求的数据量被写入。
即使要写入的数据量大于数据行的缓冲区大小,也适用。
但是,如果数据行在写入请求的数据量之前关闭,停止或刷新,则该方法不再阻塞,而是返回到目前为止写入的字节数。
可以不受阻塞被写的字节数可使用被确定
所述的方法available
DataLine
接口。 (虽然保证这个字节数可以写入而不阻塞,但不能保证写入附加数据的尝试将被阻止。)
要写入的字节数必须表示采样帧的整数,使得:
[ bytes written ] % [frame size in bytes ] == 0
IllegalArgumentException
。
b
- 包含要写入数据线的数据的字节数组
len
- 数组中有效数据的长度(以字节为单位)(换言之,要写入的请求数据量,以字节为单位)
off
- 数组
off
的偏移量(以字节为单位)
IllegalArgumentException
- 如果请求的字节数不表示采样帧的整数,或者如果
len
为负数
ArrayIndexOutOfBoundsException
- 如果
off
为负数,或
off+len
大于阵列长度
b
。
TargetDataLine.read(byte[], int, int)
,
DataLine.available()