Module java.desktop

Interface SourceDataLine

所有超接口:
AutoCloseable, DataLine, Line

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

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

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

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

自 JDK 版本:
1.3
参见:
  • Method Details

    • 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方法确定可以无阻塞写入的字节数。 (虽然保证可以写入这些字节数而不会阻塞,但不能保证尝试写入其他数据会阻塞。)

      要写入的字节数必须表示样本帧的整数倍,即:

      [写入的字节数] % [每帧的字节大小] == 0

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

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