我无法让 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 调用回调。
我的 AUallocateRenderResourcesAndReturnError
被要求使用 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;
}
为了简单起见,我在启动应用程序之前设置了采样率。
我不知道从哪里开始追踪这个。
更新
这是一个重现我遇到的问题的小项目:
在某些采样率下,您会从输入中提取错误。
在我以 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
.