В приложении-образце aurioTouch аудиоустройство RemoteIO настроено для 2-канального LPCM без чередования в формате с фиксированной запятой 8.24. Это предпочтительный формат на платформе iOS, и я предполагаю, что это то, что излучает аппаратный АЦП. Они даже сделали комментарий по этому поводу ( source ):
// 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;
}
}
Если 'interleaved' равно false, это не умножает 'mBytesPerPacket' и mBytesPerFrame 'на количество каналов. В кадре не будет достаточно битов для хранения дополнительного канала.
Значит, пример кода слегка вводит в заблуждение, когда запрашивает 2 канала? Должен ли он просто просить 1 канал, так как это все равно вернется:
outFormat.SetAUCanonical(1, false);
Могу ли я просто «исправить» SetAUCnononical, как это, чтобы прояснить ситуацию?:
mChannelsPerFrame = nChannels;
if (!interleaved) {
mChannelsPerFrame = 1
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
}
mFramesPerPacket = 1;
mBitsPerChannel = 8 * sizeof(AudioUnitSampleType);
mBytesPerPacket = mBytesPerFrame = nChannels * sizeof(AudioUnitSampleType);
Или есть какая-то другая причина, по которой вы просили бы 2 канала? Я даже не думаю, что микрофон - это стереомикрофон.