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

时间:2012-05-30 19:55:58

标签: ios core-audio playback audiounit

我正在开发一个iOS应用程序,它使用RemoteIO音频设备录制麦克风的音频,处理它并输出到扬声器(耳机)。目前我使用单通道(单声道)进行输入和输出。

我想做的是允许用户选择输出扬声器:仅左侧,右侧或两者。我目前的代码仅支持“both”设置 - 两个扬声器都发出相同的声音。

以下是我如何设置输入和输出总线的流格式(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;

我的渲染回调(kAudioUnitProperty_SetRenderCallback)看起来大致如下:

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

实施仅限左/右设置的最简单方法是什么?如果有任何相关内容,我不介意更改设备设置。

1 个答案:

答案 0 :(得分:1)

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

RemoteIO设备的动态格式转换容量有限,但它可以使用内置格式转换器将单声道流从麦克风分割为立体声流。

如果配置正确,根据确切的ASBD,渲染回调将接收缓冲区列表,每个通道(非交错)或单个交错缓冲区具有单独的缓冲区。您需要bzero其中一个缓冲区(非交错的情况),或迭代样本并将它们静音(设置为零;交错情况)。

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