我正在尝试设置一个能够进行单声道输入和立体声输出的音频设备。打算通过左声道输出播放正弦波音,并通过右声道输出不同的符号波。
我收到错误,
'NSInternalInconsistencyException', reason: ' Error initialing unit: -50;
当我尝试在此处初始化音频单元时,
// Initialize audio unit
OSErr err = AudioUnitInitialize(self.ioUnit);
NSAssert1(err == noErr, @"Error initializing unit: %hd", err);
我认为这与我如何设置音频单元有关,
// Audio component description
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
// Get component
AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);
// Get Audio units
AudioComponentInstanceNew(inputComponent, &ioUnit);
// Enable input, which disabled by default. Output enable by default
UInt32 enableInput = 1;
AudioUnitSetProperty(ioUnit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input,
kInputBus,
&enableInput,
sizeof(enableInput));
AudioStreamBasicDescription monoStreamFormat;
monoStreamFormat.mSampleRate = 44100.00;
monoStreamFormat.mFormatID = kAudioFormatLinearPCM;
monoStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
monoStreamFormat.mBytesPerPacket = 2;
monoStreamFormat.mBytesPerFrame = 2;
monoStreamFormat.mFramesPerPacket = 1;
monoStreamFormat.mChannelsPerFrame = 1;
monoStreamFormat.mBitsPerChannel = 16;
// Apply format to input of ioUnit
AudioUnitSetProperty(ioUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
kInputBus,
&monoStreamFormat,
sizeof(monoStreamFormat));
AudioStreamBasicDescription stereoStreamFormat;
stereoStreamFormat.mSampleRate = 44100.00;
stereoStreamFormat.mFormatID = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket = 4;
stereoStreamFormat.mBytesPerFrame = 4;
stereoStreamFormat.mFramesPerPacket = 1;
stereoStreamFormat.mChannelsPerFrame = 2;
stereoStreamFormat.mBitsPerChannel = 32;
// Apply format to output of ioUnit
AudioUnitSetProperty(ioUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
kOutputBus,
&stereoStreamFormat,
sizeof(stereoStreamFormat));
// Set input callback
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = inputCallback;
callbackStruct.inputProcRefCon = (__bridge void *)(self);
AudioUnitSetProperty(ioUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Global,
kInputBus,
&callbackStruct,
sizeof(callbackStruct));
// Set output callback
callbackStruct.inputProc = outputCallback;
callbackStruct.inputProcRefCon = (__bridge void *)(self);
AudioUnitSetProperty(ioUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Global,
kOutputBus,
&callbackStruct,
sizeof(callbackStruct));
但我无法找到任何有关错误代码的内容-50它会回馈所以我不确定它不喜欢什么。我已经截止日期,所以任何帮助都非常感激。
答案 0 :(得分:2)
kAudioFormatFlagsAudioUnitCanonical是32位8.24定点格式。这意味着mBytesPerFrame应为4为单声道,8为立体声,mBitsPerChannel应为32为立体声和单声道。将其设置为16位可能会产生此错误。
那就是说,我怀疑你想要8.24。您可能希望kAudioFormatFlagsCanonical获得标准的16位音频。或者,如果您想要32位,请使用32位浮点数(kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsNonInterleaved)。在处理过程中更容易处理数学。
此外,您正在设置虚拟输入和输出的格式,而不是客户端输入和输出,我认为这不是您想要的。这里的API相当混乱,但要设置客户端输入格式,请使用kAudioUnitScope_Input,kOutputBus。这里的逻辑是您正在设置内部Core Audio 输入转换器单元的输出的格式,从您的代码的角度来看,它是输入音频。令我感到困惑,我知道。有关详细信息,请参阅音频单元文档。同样,要设置客户端输出格式,请使用kAudioUnitScope_Output,kInputBus。
答案 1 :(得分:0)
每个通道32位是太多位,无法将2个通道装入4个字节。试试16。