我正在开发一个使用核心音频的音频处理应用程序,通过耳机麦克风录制声音并通过耳机播放。
我添加了一个平衡功能,即仅将播放转移到一只耳朵上。
这完全适用于我测试过的iPod和iPhone。但不是在iPad上。在iPad上,声音的位置根本不会改变。
这是用于呈现音频输出的代码:
static OSStatus renderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
// Get a pointer to the dataBuffer of the AudioBufferList
AudioBuffer firstBuffer = ioData->mBuffers[0];
AudioSampleType *outA = (AudioSampleType *)firstBuffer.mData;
int numChannels = firstBuffer.mNumberChannels;
NSLog(@"numChannels = %d, left = %d, right = %d", numChannels, leftBalVolume, rightBalVolume);
// Loop through the callback buffer, generating samples
for (UInt32 i = 0; i < inNumberFrames * numChannels; i += numChannels) {
int outSignal = getFilteredSampleData(sampleDataTail);
outA[i] = (outSignal * leftBalVolume) / 32768;
if (numChannels > 1) {
outA[i + 1] = (outSignal * rightBalVolume) / 32768;
}
sampleDataTail = (sampleDataTail + 1) % sampleDataLen;
}
return noErr;
}
NSLog的输出如下:
numChannels = 2, left = 16557, right = 32767
...告诉我它基本上是在立体声模式下工作,我应该听到右边的音频。但即使我把它100%放在右边,我仍然可以听到中间的音频,两个耳机的音量相同。
显然,iPad 2将音频信号混合为单声道,然后在两部耳机上播放。我认为它可能与iPad只有一个扬声器这一事实有关,因此通常会混合到单声道......但为什么它会这样做,即使连接了立体声耳机?
非常感谢任何帮助!
答案 0 :(得分:2)
找到了罪魁祸首:
我打电话给
desc.SetAUCanonical(1, true);
在混音器输出的StreamFormat描述符上。现在我只是为每个属性设置值,它也适用于iPad ......
desc.mSampleRate = kGraphSampleRate;
desc.mFormatID = kAudioFormatLinearPCM;
desc.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
desc.mFramesPerPacket = 1;
desc.mChannelsPerFrame = 2;
desc.mBitsPerChannel = 16;
desc.mBytesPerPacket = 4;
desc.mBytesPerFrame = 4;
似乎SetAUCanonical在iPad上与iPod Touch和iPhone上做了不同的事情