与核心音频控制单声道播放输出(Control mono playback output with C

2019-09-17 15:53发布

我正在开发的iOS应用程序,使用该RemoteIO音频单元,从麦克风,并处理和输出到扬声器(耳机)录制音频。 目前我使用的输入和输出的单声道(单声道)。

我今天准备这样做,是为了让用户选择一个输出扬声器:左只,右只或两者兼而有之。 我当前的代码只支持“两”设置 - 同样的声音是从两个扬声器来。

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

什么是执行左/只右只设置最简单的方法? 我不介意改变设备的设置,如果有任何相关信息。

Answer 1:

做到这一点的最简单的方法是使用一个立体声ASBD上您可以控制RemoteIO元件(即,所述输入范围的输出元件和所述输出范围的输入元件),和只发送零作为样品用于非活动频道,如果有的话。

所述RemoteIO单元具有有限的能力上的即时格式转换,但它可以从麦克风单流分成使用其内部格式转换器中的立体声流。

当该配置正确,取决于确切的ASBD,渲染回调将收到具有用于每个信道(非交错),或一个单一的,交错缓冲单独的缓冲器缓冲列表。 你需要bzero缓冲器(非交错的情况下)中的一个,或遍历样本,将其设为静音(设为零;交错的情况下)。

(注:该选择性信道静音大概会发生自己的处理之后,所以你可能需要更改自己的代码,以适应立体声数据,或者设置RemoteIO单元的输入范围的输出元件以发射单样本,做你的处理存在,并使用自己的AudioConverter到后来分裂流立体声)。



文章来源: Control mono playback output with Core Audio