iOS LPCM Аудио вход без чередования с 2 каналами: невозможно? - PullRequest
2 голосов
/ 12 декабря 2010

В приложении-образце 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 канала? Я даже не думаю, что микрофон - это стереомикрофон.

Ответы [ 3 ]

2 голосов
/ 13 декабря 2010

Вход для встроенного микрофона и микрофона гарнитуры монофонический.

Возможно, комплект подключения камеры позволял вводить стереозвук с некоторых микрофонов USB на некоторых новых устройствах iOS, работающих под управлением некоторых предыдущих версий ОС, но у меня нетНи одного сообщения об этой работе с текущим выпуском ОС не было.

Также проверьте, может ли 2-канальный (стерео) не чередующийся формат вернуть 2 буфера для обратного вызова RemoteIO вместо объединенных данных в 1.буфер.

1 голос
/ 17 ноября 2014

Проблема в (иногда) вводящих в заблуждение именах переменных. Мне это тоже не нравится, но вот объяснение тому, что происходит.

Если для mFormatFlags установлено значение NonInterleaved (of any form), тогда mChannelsPerFrame указывает количество каналов, а остальные поля должны указывать требуемые свойства для одного канала. Следовательно, вам НЕ нужно будет умножать количество каналов. Правильные значения будут:

mBytesPerPacket = mFramesPerPacket * sizeof(sampleSizeInBytes);   // e.g. sizeof(float)
mBytesPerFrame = sizeof(sampleSizeInBytes);
1 голос
/ 17 сентября 2012

Я думаю, вы путаете слова «чередующийся» и «не чередующийся» и то, как CoreAudio предоставляет вам эти данные в списках ABL. SetAUCanonical () делает правильные вещи. ABL имеет переменный массив буферов, где в случае без чередования каждый буфер содержит данные только для одного канала.

...