- 所有父级接口:
AutoCloseable,Line
- 所有已知的子接口:
Clip,SourceDataLine,TargetDataLine
DataLine 将与媒体相关的功能添加到其超级接口 Line 。此功能包括启动、停止、耗尽和刷新通过线路的音频数据的传输控制方法。数据线还可以报告媒体的当前位置、音量和音频格式。数据线通过子接口 SourceDataLine 或 Clip 用于音频输出,允许应用程序写入数据。同样,音频输入由子接口 TargetDataLine 处理,它允许读取数据。
数据线有一个内部缓冲区,传入或传出的音频数据在其中排队。 drain() 方法阻塞,直到这个内部缓冲区变空,通常是因为所有排队的数据都已处理。 flush() 方法从内部缓冲区中丢弃任何可用的排队数据。
每当数据线开始或停止主动呈现或捕获数据时,它就会产生 START 和 STOP 事件。这些事件可以响应特定请求而生成,或者作为不太直接的状态更改的结果。例如,如果在非活动数据线上调用start() ,并且数据可用于捕获或回放,则当数据回放或捕获实际开始时,将很快生成START事件。或者,如果到活动数据线的数据流受到限制,导致数据显示出现间隙,则会生成STOP 事件。
调音台通常支持多条数据线的同步控制。可以通过Mixer接口的synchronize 方法建立同步。有关更完整的描述,请参阅 Mixer 接口的描述。
- 自从:
- 1.3
- 参见:
-
内部类总结
内部类 -
方法总结
修饰符和类型方法描述int获取数据行内部缓冲区中当前可供应用程序处理的数据字节数。voiddrain()通过继续数据 I/O 直到数据行的内部缓冲区被清空,从行中排出排队的数据。voidflush()从行中清除排队的数据。int获取适合数据行内部缓冲区的最大数据字节数。获取数据线音频数据的当前格式(编码、采样率、通道数等)。int在样本帧中获取音频数据中的当前位置。floatgetLevel()获取线路的当前音量级别。long在样本帧中获取音频数据中的当前位置。long获取音频数据中的当前位置,以微秒为单位。booleanisActive()指示线路是否正在进行活动 I/O(例如播放或捕获)。boolean指示线路是否正在运行。voidstart()允许线路参与数据 I/O。voidstop()停线。在接口 javax.sound.sampled.Line 中声明的方法
addLineListener, close, getControl, getControls, getLineInfo, isControlSupported, isOpen, open, removeLineListener
-
方法详情
-
drain
void drain()通过继续数据 I/O 直到数据行的内部缓冲区被清空,从行中排出排队的数据。此方法会阻塞,直到排空完成。因为这是一种阻塞方法,所以应该小心使用。如果drain()在其队列中有数据的已停止行上调用,则该方法将阻塞,直到该行正在运行并且数据队列变空。如果drain()被一个线程调用,而另一个线程继续填充数据队列,则操作将无法完成。当数据行关闭时,此方法总是返回。- 参见:
-
flush
void flush()从行中清除排队的数据。刷新的数据被丢弃。在某些情况下,并非所有排队的数据都可以被丢弃。例如,混音器可以从特定输入行的缓冲区中刷新数据,但输出缓冲区中已存在的任何未播放数据(混音结果)仍将被播放。如果您想在重新开始播放或捕获时跳过“陈旧”数据,则可以在暂停一行(正常情况)后调用此方法。 (刷新未停止的行是合法的,但在活动行上这样做可能会导致数据不连续,从而导致可察觉的咔哒声。)- 参见:
-
start
void start()允许线路参与数据 I/O。如果在已经运行的行上调用,则此方法不执行任何操作。除非缓冲区中的数据已被刷新,否则该行会从该行停止时未处理的第一帧开始恢复 I/O。当音频捕获或播放开始时,将生成一个START事件。- 参见:
-
stop
void stop()停线。停止的行应该停止 I/O 活动。但是,如果生产线已开通并正在运行,它应该保留恢复活动所需的资源。停止的行应该保留其缓冲区中的任何音频数据而不是丢弃它,以便在恢复时 I/O 可以在可能的情况下从它停止的地方继续。 (当然,这不能保证在当前缓冲区之外永远不会有不连续性;如果停止条件持续时间过长,输入或输出样本可能会被丢弃。)如果需要,可以通过调用flush方法。当音频捕获或播放停止时,将生成一个STOP事件。- 参见:
-
isRunning
boolean isRunning()指示线路是否正在运行。默认值为false。当响应调用start方法而呈现第一个数据时,开放线开始运行,并一直持续到响应调用stop或因为播放完成而停止呈现。- 返回:
true如果线路正在运行,否则false- 参见:
-
isActive
boolean isActive()- 返回:
true如果线路正在主动捕获或渲染声音,否则false- 参见:
-
getFormat
AudioFormat getFormat()获取数据线音频数据的当前格式(编码、采样率、通道数等)。如果该行未打开且从未打开过,则返回默认格式。默认格式是特定于实现的音频格式,或者,如果用于检索此
DataLine的DataLine.Info对象指定至少一种完全合格的音频格式,则最后一种将用作默认格式。打开具有特定音频格式(例如SourceDataLine.open(AudioFormat))的行将覆盖默认格式。- 返回:
- 当前音频数据格式
- 参见:
-
getBufferSize
int getBufferSize()获取适合数据行内部缓冲区的最大数据字节数。对于源数据行,这是可以写入数据的缓冲区的大小。对于目标数据行,它是可以从中读取数据的缓冲区的大小。请注意,使用的单位是字节,但始终对应于整数个音频数据样本帧。- 返回:
- 缓冲区的大小,以字节为单位
-
available
int available()获取数据行内部缓冲区中当前可供应用程序处理的数据字节数。对于源数据行,这是可以无阻塞地写入缓冲区的数据量。对于目标数据行,这是可供应用程序读取的数据量。对于剪辑,此值始终为 0,因为音频数据在剪辑打开时加载到缓冲区中,并且在剪辑关闭之前一直保持不变。请注意,使用的单位是字节,但始终对应于整数个音频数据样本帧。
应用程序保证最多从
available()返回的字节数的读取或写入操作不会阻塞;但是,不能保证读取或写入更多数据的尝试会被阻止。- 返回:
- 可用数据量,以字节为单位
-
getFramePosition
int getFramePosition()在样本帧中获取音频数据中的当前位置。帧位置测量自线打开以来由该线捕获或渲染的样本帧数。此返回值将在 2^31 帧后回绕。建议改用getLongFramePosition。- 返回:
- 自该行打开以来已经处理的帧数
- 参见:
-
getLongFramePosition
long getLongFramePosition()在样本帧中获取音频数据中的当前位置。帧位置测量自线打开以来由该线捕获或渲染的样本帧数。- 返回:
- 自该行打开以来已经处理的帧数
- 自从:
- 1.5
-
getMicrosecondPosition
long getMicrosecondPosition()获取音频数据中的当前位置,以微秒为单位。微秒位置测量的时间对应于自该行打开以来由该行捕获或渲染的样本帧数。无法保证精度水平。例如,一个实现可能会根据当前帧位置和音频采样帧速率计算微秒位置。然后,以微秒为单位的精度将被限制为每个样本帧的微秒数。- 返回:
- 自该行打开以来处理的数据的微秒数
-
getLevel
float getLevel()获取线路的当前音量级别。该电平是信号当前幅度的度量,不应与增益控制的当前设置相混淆。范围从 0.0(静音)到 1.0(声音波形的最大可能振幅)。这些单位测量的是线性振幅,而不是分贝。- 返回:
-
此行中信号的当前幅度,或
AudioSystem.NOT_SPECIFIED
-