Module  java.desktop
软件包  javax.sound.sampled

Interface SourceDataLine

  • All Superinterfaces:
    AutoCloseableDataLineLine


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

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

    可以通过调用具有适当的DataLine.Info对象的MixerMixer270783174183535方法从混合器获得源数据线。

    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 - 一个包含要写入数据线的数据的字节数组
        len - 数组中有效数据的长度(以字节为单位)(换句话说,要写入的请求数据量,以字节为单位)
        off - 从数组开始的偏移量(以字节为单位)
        结果
        实际写入的字节数
        异常
        IllegalArgumentException - 如果请求的字节数不表示采样帧的整数,或者如果 len为负数
        ArrayIndexOutOfBoundsException - 如果 off为负数,或 off+len大于数组长度 b
        另请参见:
        TargetDataLine.read(byte[], int, int)DataLine.available()