AVAudioUnit(OS X)渲染块仅针对某些采样率调用

时间:2016-05-10 23:07:07

标签: audiounit avaudioengine

我无法让AVAudioEngine(OS X)在所有采样率下都能玩得很好。

这是构建连接的代码:

- (void)makeAudioConnections {  

  auto hardwareFormat = [self.audioEngine.outputNode outputFormatForBus:0];  
  auto format = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:hardwareFormat.sampleRate channels:2];  
  NSLog(@"format: %@", format);  

  @try {  
    [self.audioEngine connect:self.avNode to:self.audioEngine.mainMixerNode format:format];  
    [self.audioEngine connect:self.audioEngine.inputNode to:self.avNode format:format];  
  } @catch(NSException* e) {  
    NSLog(@"exception: %@", e);  
  }  
}  

在我的音频接口上,调用44.1,48和176.4kHz的渲染回调。它不需要96和192 kHz。在内置音频上,回调的调用是44.1,48,88而不是96。

我的AU allocateRenderResourcesAndReturnError被称为96kHz。没有错误返回。

- (BOOL) allocateRenderResourcesAndReturnError:(NSError * _Nullable *)outError {

  if(![super allocateRenderResourcesAndReturnError:outError]) {
    return NO;
  }

  _inputBus.allocateRenderResources(self.maximumFramesToRender);
  _sampleRate = _inputBus.bus.format.sampleRate;

  return YES;
}

这是我的AU的init方法,主要是切割和放大从Apple的AUv3演示中粘贴:

- (instancetype)initWithComponentDescription:(AudioComponentDescription)componentDescription options:(AudioComponentInstantiationOptions)options error:(NSError **)outError {

  self = [super initWithComponentDescription:componentDescription options:options error:outError];

  if (self == nil) {
    return nil;
  }

  // Initialize a default format for the busses.
  AVAudioFormat *defaultFormat = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:44100. channels:2];

  // Create the input and output busses.
  _inputBus.init(defaultFormat, 8);
  _outputBus = [[AUAudioUnitBus alloc] initWithFormat:defaultFormat error:nil];

  // Create the input and output bus arrays.
  _inputBusArray  = [[AUAudioUnitBusArray alloc] initWithAudioUnit:self busType:AUAudioUnitBusTypeInput  busses: @[_inputBus.bus]];
  _outputBusArray = [[AUAudioUnitBusArray alloc] initWithAudioUnit:self busType:AUAudioUnitBusTypeOutput busses: @[_outputBus]];

  self.maximumFramesToRender = 256;

  return self;

}

为了简单起见,我在启动应用程序之前设置了采样率。

我不知道从哪里开始跟踪它。

更新

这是一个小项目,它重现了我遇到的问题:

Xcode project to reproduce issue

您会在某些采样率下从输入中获取错误。

在96kHz运行的内置音频上,调用渲染块,分别交替显示511和513帧数以及错误-10863(kAudioUnitErr_CannotDoInCurrentContext)和-10874(kAudioUnitErr_TooManyFramesToProcess)。增加maximumFramesToRender似乎没有帮助。

更新2

我将测试简化为仅将输入连接到主混音器:

[self.audioEngine connect:self.audioEngine.inputNode to:self.audioEngine.mainMixerNode format:nil];

我试着明确设置格式参数。

这仍然无法在96kHz播放。所以我认为这可能是AVAudioEngine中的错误。

1 个答案:

答案 0 :(得分:2)

对于AVAudioEngine的播放,输入和输出硬件格式以及所有连接格式必须采用相同的采样率。所以以下内容应该有效。

AVAudioFormat *outputHWFormat = [self.audioEngine.outputNode outputFormatForBus:0];
AVAudioFormat *inputHWFormat  = [self.audioEngine.inputNode inputFormatForBus:0];

if (inputHWFormat.sampleRate == outputHWFormat.sampleRate) {
    [self.audioEngine connect:self.audioEngine.inputNode to:self.audioEngine.mainMixerNode format:inputHWFormat];
    [self.audioEngine connect:self.audioEngine.mainMixerNode to:self.audioEngine.outputNode format:inputHWFormat];

}