打开TargetDataLine时未引发异常

时间:2012-05-17 09:55:37

标签: java audio javasound

根据Javadocs的说法,当我使用javax.sound.sampledTargetDataLine的以下方法时:

public void open(AudioFormat format,int bufferSize)

其中说:

  

使用不符合此要求的请求缓冲区大小调用此方法可能会导致IllegalArgumentException。

所以当我实现以下Java代码时:

AudioFormat format = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);

// open the TargetDataLine for capture.
try {
     TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
     line.open(format, line.getBufferSize()+3000); 
    }    
catch (LineUnavailableException ex)
{         
   ex.printStackTrace();        
}

但是当我运行上面的代码时,它不会抛出任何异常。现在根据文件:

  

public int getBufferSize()
  获得适合数据行内部缓冲区的最大数据字节数。对于源数据行,这是可以写入数据的缓冲区的大小。对于目标数据行,它是可以从中读取数据的缓冲区的大小。请注意,使用的单位是字节,但始终对应于音频数据的整数样本帧。

其中表示将返回最大尺寸,而我已添加3000

line.open(format, line.getBufferSize()+3000); 

如上所示,为什么不抛出任何异常?

1 个答案:

答案 0 :(得分:2)

您从open的JavaDoc中遗漏了一些重要的描述。更完整的是,它说:

void open(AudioFormat format,
          int bufferSize)
          throws LineUnavailableException
  

打开具有指定格式和请求的缓冲区大小的行,   导致该线路获得任何所需的系统资源并成为   操作。缓冲区大小以字节为单位指定,但必须表示   整数个样本帧。用a调用此方法   可能会导致请求的缓冲区大小不符合此要求   在IllegalArgumentException中。打开的实际缓冲区大小   line可能与请求的缓冲区大小不同。实际设定的值   可以通过随后调用DataLine.getBufferSize()

来查询

因此,您指定的缓冲区大小可能不是内部缓冲区的大小,甚至可能超过它。

但是,它必须“表示整数个样本帧”,否则它将抛出IllegalArgumentException。如果您请求内存比内部分配的内存,那么您将收到LineUnavailableException。这并不意味着请求比当前内部缓冲区更大的大小将导致LineUnavailableException

至少那是我对文档的阅读。