模块  java.desktop
软件包  javax.sound.sampled

Interface SourceDataLine

  • All Superinterfaces:
    AutoCloseableDataLineLine

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

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

    源数据行可以从混合器通过调用来获得getLine的方法Mixer用适当DataLine.Info对象。

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

    从以下版本开始:
    1.3
    另请参见:
    MixerDataLineTargetDataLine
    • 方法详细信息

      • open

        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
      • open

        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
      • 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
        另请参见:
        TargetDataLine.read(byte[], int, int)DataLine.available()