В примере приложения aurioTouch аудиоустройство RemoteIO настроен для 2-канального LPCM без чередования в формате с фиксированной точкой 8.24. Это предпочтительный формат на платформе iOS, и я предполагаю, что это то, что излучает аппаратный АЦП. Они даже прокомментировали это (источник а>):
// set our required format - Canonical AU format: LPCM non-interleaved 8.24 fixed point
outFormat.SetAUCanonical(2, false);
Поэтому я ожидаю, что когда приложение позже получит аудиобуфер, оно будет иметь данные для двух каналов, упакованные в его элемент mData в некотором порядке. Что-то вроде этого:
mData = [L1, L2, L3, L4, R1, R2, R3, R4];
Где L и R представляют данные левого и правого каналов стереомикрофона. Только кажется, что этого не может быть, потому что SetAUCannonical()
не устанавливает достаточно памяти для хранения дополнительного канала:
void SetAUCanonical(UInt32 nChannels, bool interleaved)
{
mFormatID = kAudioFormatLinearPCM;
#if CA_PREFER_FIXED_POINT
mFormatFlags = kAudioFormatFlagsCanonical | (kAudioUnitSampleFractionBits << kLinearPCMFormatFlagsSampleFractionShift);
#else
mFormatFlags = kAudioFormatFlagsCanonical;
#endif
mChannelsPerFrame = nChannels;
mFramesPerPacket = 1;
mBitsPerChannel = 8 * sizeof(AudioUnitSampleType);
if (interleaved)
mBytesPerPacket = mBytesPerFrame = nChannels * sizeof(AudioUnitSampleType);
else {
mBytesPerPacket = mBytesPerFrame = sizeof(AudioUnitSampleType);
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
}
}
Если «чередование» равно false, «mBytesPerPacket» и «mBytesPerFrame» не умножаются на количество каналов. В кадре не будет достаточно битов для хранения дополнительного канала.
Так что пример кода просто немного вводит в заблуждение, когда он запрашивает 2 канала? Должен ли он просто запрашивать 1 канал, так как это все равно вернется:
outFormat.SetAUCanonical(1, false);
Могу ли я просто «исправить» SetAUCannonical, чтобы все стало ясно?:
mChannelsPerFrame = nChannels;
if (!interleaved) {
mChannelsPerFrame = 1
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
}
mFramesPerPacket = 1;
mBitsPerChannel = 8 * sizeof(AudioUnitSampleType);
mBytesPerPacket = mBytesPerFrame = nChannels * sizeof(AudioUnitSampleType);
Или есть какая-то другая причина, по которой вы просите 2 канала? Я даже не думаю, что микрофон стереомикрофон.