具有回调的PyAudio - 损坏的音频输出

时间:2014-10-24 13:50:05

标签: python real-time portaudio pyaudio

同事和我正在使用具有回调功能的pyaudio。我们很少遇到音频输出信号错误。 我们看到了两种错误:

  • 16个样本的块具有前一个块的样本。
  • 信号的一部分为零。样本中的长度是16的倍数。

回调函数的(简化)版本在这里:

def callback(in_data, frame_count, time_info, status):
  if self.dataIndex+frame_count < self.length or self.length == "infinite":
    whatToDo = pyaudio.paContinue
  else:
    whatToDo = pyaudio.paComplete

  # RME needs 24 bit value disguised as 32 bit. The lower 8 bits have to be zero.
  dataStr = ((self.playData[:,self.dataIndex:self.dataIndex+frame_count].T*
              (2**23-1)).astype('<i4') << 8).astype('<i4').tostring()

  self.dataIndex += frame_count
  return (dataStr, whatToDo)

因为问题很少发生,所以很难尝试不同的事情。

我怀疑使用Python函数进行实时需求的回调。如果在关键时刻完成垃圾收集怎么办?即使主线程中只有time.sleep(),我们也看到了错误,所以我猜这不包括GIL的问题。

更多信息:

  • 声卡:RME Hammerfall DSP Multiface II
  • 使用ASIO驱动程序,10个通道输入和10个通道输出,我们尝试了不同的样本/帧设置
  • PyAudio版本0.2.7
  • Python 2.7.5
  • 操作系统:Windows 7

0 个答案:

没有答案