使用单声道输入和立体声输出设置音频单元iOS

时间:2014-04-14 21:07:55

标签: ios core-audio audiounit

我正在尝试设置一个能够进行单声道输入和立体声输出的音频设备。打算通过左声道输出播放正弦波音,并通过右声道输出不同的符号波。

我收到错误,

'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它会回馈所以我不确定它不喜欢什么。我已经截止日期,所以任何帮助都非常感激。

2 个答案:

答案 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。