模块 java.desktop

接口 SourceDataLine

所有父级接口:
AutoCloseable , DataLine , Line

public interface SourceDataLine extends DataLine
源数据线是可以写入数据的数据线。它充当其混音器的来源。应用程序将音频字节写入源数据线,源数据线处理字节的缓冲并将它们传送到混音器。混音器可以将样本与来自其他源的样本混合,然后将混合传送到目标,例如输出端口(它可以代表声卡上的音频输出设备)。

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

通过使用适当的 DataLine.Info 对象调用 MixergetLine 方法,可以从混音器中获取源数据线。

SourceDataLine 接口提供了一种将音频数据写入数据线缓冲区的方法。播放或混合音频的应用程序应以足够快的速度将数据写入源数据线,以防止缓冲区下溢(清空),这可能会导致音频不连续,并被视为咔哒声。应用程序可以使用 DataLine 接口中定义的 available 方法来确定当前在数据行缓冲区中排队的数据量。可以在不阻塞的情况下写入缓冲区的数据量是缓冲区大小与排队数据量之间的差值。如果音频输出的传送由于下溢而停止,则会生成 STOP 事件。音频输出恢复时会生成 START 事件。

自从:
1.3
参见:
  • 方法详情

    • open

      void open(AudioFormat  format, int bufferSize) throws LineUnavailableException
      打开具有指定格式和建议缓冲区大小的行,使该行获取任何所需的系统资源并开始运行。

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

      如果此操作成功,该线路将被标记为打开,并且 OPEN 事件将分派给该线路的监听器。

      在已经打开的行上调用此方法是非法的,可能会导致 IllegalStateException

      请注意,某些线路一旦关闭,将无法重新开通。尝试重新打开此类行将始终导致 LineUnavailableException

      参数:
      format - 所需的音频格式
      bufferSize - 所需的缓冲区大小
      抛出:
      LineUnavailableException - 如果由于资源限制而无法打开该行
      IllegalArgumentException - 如果缓冲区大小不代表样本帧的整数,或者如果 format 未完全指定或无效
      IllegalStateException - 如果线路已经打开
      SecurityException - 如果由于安全限制而无法打开线路
      参见:
    • open

      void open(AudioFormat  format) throws LineUnavailableException
      打开具有指定格式的行,使该行获取任何所需的系统资源并开始运行。

      该实现选择缓冲区大小,以字节为单位测量但包含整数个样本帧。系统选择的缓冲区大小可以通过随后调用 DataLine.getBufferSize() 来查询。

      如果此操作成功,该线路将被标记为打开,并且 OPEN 事件将分派给该线路的监听器。

      在已经打开的行上调用此方法是非法的,可能会导致 IllegalStateException

      请注意,某些线路一旦关闭,将无法重新开通。尝试重新打开此类行将始终导致 LineUnavailableException

      参数:
      format - 所需的音频格式
      抛出:
      LineUnavailableException - 如果由于资源限制而无法打开该行
      IllegalArgumentException - 如果 format 未完全指定或无效
      IllegalStateException - 如果线路已经打开
      SecurityException - 如果由于安全限制而无法打开线路
      参见:
    • write

      int write(byte[] b, int off, int len)
      通过此源数据线将音频数据写入混音器。从指定数组中读取请求的字节数的数据,从数组中的给定偏移量开始,然后写入数据行的缓冲区。如果调用者尝试写入比当前可以写入的数据更多的数据(请参阅 available ),则此方法将阻塞,直到写入请求的数据量为止。即使请求写入的数据量大于数据行的缓冲区大小,这也适用。但是,如果在写入请求的数量之前关闭、停止或刷新数据行,则该方法不再阻塞,而是返回到目前为止写入的字节数。

      可以使用 DataLine 接口的 available 方法确定无阻塞可写入的字节数。 (虽然保证可以无阻塞地写入此字节数,但不能保证尝试写入额外数据时会阻塞。)

      要写入的字节数必须代表整数个样本帧,这样:

      [ bytes written ] % [frame size in bytes ] == 0

      返回值将始终满足此要求。写入表示非整数样本帧的字节数的请求无法满足,可能会导致 IllegalArgumentException

      参数:
      b - 包含要写入数据线的数据的字节数组
      off - 从数组开始的偏移量,以字节为单位
      len - 数组中有效数据的长度,以字节为单位(换句话说,请求写入的数据量,以字节为单位)
      返回:
      实际写入的字节数
      抛出:
      IllegalArgumentException - 如果请求的字节数不代表样本帧的整数,或者如果 len 为负
      ArrayIndexOutOfBoundsException - 如果 off 为负,或者 off+len 大于数组的长度 b
      参见: