- 所有超接口:
-
AutoCloseable
,DataLine
,Line
请注意,此接口的命名约定反映了线路与其混音器之间的关系。从应用程序的角度来看,源数据线可以作为音频数据的目标。
可以通过使用适当的DataLine.Info
对象调用Mixer
的getLine
方法从混音器获取源数据线。
SourceDataLine
接口提供了一种向数据线缓冲区写入音频数据的方法。播放或混合音频的应用程序应该快速地向源数据线写入数据,以防止缓冲区下溢(清空),这可能会导致被感知为点击的音频不连续。应用程序可以使用DataLine
接口中定义的available
方法来确定当前在数据线缓冲区中排队的数据量。可以写入缓冲区而不阻塞的数据量是缓冲区大小与排队数据量之间的差异。如果由于下溢而导致音频输出停止,则会生成一个STOP
事件。当音频输出恢复时,会生成一个START
事件。
- 自 JDK 版本:
- 1.3
- 参见:
-
Nested Class Summary
Nested classes/interfaces declared in interface javax.sound.sampled.DataLine
DataLine.Info
-
Method Summary
Modifier and TypeMethodDescriptionvoid
open
(AudioFormat format) 使用指定的格式打开线路,使线路获取任何所需的系统资源并变为可操作状态。void
open
(AudioFormat format, int bufferSize) 使用指定的格式和建议的缓冲区大小打开线路,使线路获取任何所需的系统资源并变为可操作状态。int
write
(byte[] b, int off, int len) 通过此源数据线将音频数据写入混音器。Methods declared in interface javax.sound.sampled.DataLine
available, drain, flush, getBufferSize, getFormat, getFramePosition, getLevel, getLongFramePosition, getMicrosecondPosition, isActive, isRunning, start, stop
Methods declared in interface javax.sound.sampled.Line
addLineListener, close, getControl, getControls, getLineInfo, isControlSupported, isOpen, open, removeLineListener
-
Method Details
-
open
使用指定的格式和建议的缓冲区大小打开线路,使线路获取任何所需的系统资源并变为可操作状态。缓冲区大小以字节为单位指定,但必须表示为样本帧的整数倍。如果使用不符合此要求的请求缓冲区大小调用此方法,可能会导致
IllegalArgumentException
。实际打开线路的缓冲区大小可能与请求的缓冲区大小不同。可以通过随后调用DataLine.getBufferSize()
来查询实际设置的值。如果此操作成功,线路将标记为打开,并向线路的侦听器分派一个
OPEN
事件。在已经打开的线路上调用此方法是非法的,可能会导致
IllegalStateException
。请注意,一些线路一旦关闭就无法重新打开。尝试重新打开此类线路将始终导致
LineUnavailableException
。- 参数:
-
format
- 所需的音频格式 -
bufferSize
- 所需的缓冲区大小 - 抛出:
-
LineUnavailableException
- 如果由于资源限制而无法打开线路 -
IllegalArgumentException
- 如果缓冲区大小不表示样本帧的整数倍,或者format
未完全指定或无效 -
IllegalStateException
- 如果线路已经打开 -
SecurityException
- 如果由于安全限制而无法打开线路 - 参见:
-
open
使用指定的格式打开线路,使线路获取任何所需的系统资源并变为可操作状态。实现会选择一个缓冲区大小,以字节为单位,但包含整数样本帧。系统选择的缓冲区大小可以通过随后调用
DataLine.getBufferSize()
来查询。如果此操作成功,线路将标记为打开,并向线路的侦听器分派一个
OPEN
事件。在已经打开的线路上调用此方法是非法的,可能会导致
IllegalStateException
。请注意,一些线路一旦关闭就无法重新打开。尝试重新打开此类线路将始终导致
LineUnavailableException
。- 参数:
-
format
- 所需的音频格式 - 抛出:
-
LineUnavailableException
- 如果由于资源限制而无法打开线路 -
IllegalArgumentException
- 如果format
未完全指定或无效 -
IllegalStateException
- 如果线路已经打开 -
SecurityException
- 如果由于安全限制而无法打开线路 - 参见:
-
write
int write(byte[] b, int off, int len) 通过此源数据线将音频数据写入混音器。从指定数组中读取请求的数据字节数,从数组中的给定偏移量开始,并将其写入数据线的缓冲区。如果调用者尝试写入的数据量超过当前可写入的数据量(请参见available
),此方法将阻塞,直到请求的数据量已写入。即使要写入的数据量大于数据线的缓冲区大小,也适用此规则。但是,如果在请求的数据量被写入之前数据线关闭、停止或刷新,该方法将不再阻塞,而是返回到目前为止已写入的字节数。可以通过
DataLine
接口的available
方法确定可以无阻塞写入的字节数。 (虽然保证可以写入这些字节数而不会阻塞,但不能保证尝试写入其他数据会阻塞。)要写入的字节数必须表示样本帧的整数倍,即:
[写入的字节数] % [每帧的字节大小] == 0
返回值将始终满足此要求。请求写入代表非整数样本帧数量的字节数无法满足,可能会导致
IllegalArgumentException
。- 参数:
-
b
- 包含要写入数据线的数据的字节数组 -
off
- 从数组开头的偏移量,以字节为单位 -
len
- 数组中有效数据的长度(换句话说,要写入的请求数据量,以字节为单位) - 返回:
- 实际写入的字节数
- 抛出:
-
IllegalArgumentException
- 如果请求的字节数不表示样本帧的整数倍,或者len
为负 -
ArrayIndexOutOfBoundsException
- 如果off
为负,或者off+len
大于数组b
的长度 - 参见:
-