使用Core Audio控制单声道播放输出

我正在开发iOS应用程序,使用RemoteIOaudio单元录制来自麦克风的audio,进行处理并输出到扬声器(耳机)。 目前我使用单声道(单声道)进行input和输出。

我想要做的是让用户select一个输出扬声器:只剩下,只有右侧,或两者兼而有之。 我目前的代码只支持“两个”设置 – 两个扬声器都有相同的声音。

以下是我如何设置input和输出总线的stream格式(kAudioUnitProperty_StreamFormat):

AudioStreamBasicDescription ASBD = {0}; size_t bytesPerSample = sizeof(SInt16); ASBD.mFormatID = kAudioFormatLinearPCM; ASBD.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; ASBD.mSampleRate = 44100; ASBD.mFramesPerPacket = 1; ASBD.mBytesPerFrame = bytesPerSample; ASBD.mBytesPerPacket = bytesPerSample; ASBD.mBitsPerChannel = 8 * bytesPerSample; ASBD.mChannelsPerFrame = 1; 

而我的渲染callback(kAudioUnitProperty_SetRenderCallback)看起来大致是这样的:

 AudioUnitRender(remoteIO, ioActionFlags, inTimeStamp, inputBus, inNumberFrames, ioData); SInt16 *renderBuffer = ioData->mBuffers[0].mData; // Process renderBuffer and modify the samples 

什么是最简单的方式来实现只有左侧/只有权限的设置? 如果有任何相关的话,我不介意更改设备设置。

最简单的方法是在你控制的两个RemoteIO元素(即input范围的输出元素和输出范围的input元素)上使用立体声ASBD,并发送零作为非活动通道的样本,如果有的话。

RemoteIO单元的dynamic格式转换能力有限,但可以使用其内部格式转换器将来自麦克风的单声道stream分离为立体声stream。

如果configuration正确,则根据确切的ASBD,呈现callback将接收缓冲区列表,每个通道(非交错)或单个交错缓冲区都有单独的缓冲区。 您需要使用bzero其中一个缓冲区(非交错的情况),或迭代采样并使其静音(设置为零;交织的情况)。

(注意:select性通道静音大概会在您自己的处理之后进行,因此您可能需要更改自己的代码以适应立体声数据;或者,将RemoteIO单元的input范围的输出元素设置为发出单声道采样,在那里处理,然后使用自己的AudioConverter将stream分成立体声。)