Ошибка инициализации звукового графика с подтипом аудио ввода-вывода kAudioUnitSubType_VoiceProcessingIO - PullRequest
6 голосов
/ 12 апреля 2011

Я работаю над проектом iOS, который нуждается в акустическом эхоподавлении, поэтому подтип kAudioUnitSubType_VoiceProcessingIO представляется хорошим выбором.Ниже приведено описание моего аудиоустройства

//io unit description 
AudioComponentDescription ioUnitDescription;
ioUnitDescription.componentType = kAudioUnitType_Output;
ioUnitDescription.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
ioUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
ioUnitDescription.componentFlags = 0;
ioUnitDescription.componentFlagsMask = 0;

И на основании моего опыта работы с подтипом RemoteIO я включил элемент ввода:

UInt32  enable = 1;
AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enable, sizeof(enable));

Однако при инициализации звукового графика я получил ошибку.Тот же звуковой график работает хорошо, если VoiceProcessingIO заменен на RemoteIO.

Есть ли разница между RemoteIO и VoiceProcessingIO, требующим особого внимания?

Спасибо, Chuankai

1 Ответ

0 голосов
/ 06 апреля 2012

По моему опыту, аудиоустройство VoiceProcessingIO гораздо более разборчиво в отношении размера буфера и частоты дискретизации.Попробуйте частоту дискретизации ниже 32000 Гц (возможно, начните с 8000 Гц и поднимитесь вверх) и достаточно большой размер буфера (скажем, 2048 выборок или около того).Это не задокументировано.rdar номер, который придет, как только у меня будет возможность подать один.

Я использую следующий формат во время настройки:

    size_t bytesPerSample = sizeof(AudioSampleType);
    AudioStreamBasicDescription canonicalFormat;
    canonicalFormat.mSampleRate         = self.samplerate;
    canonicalFormat.mFormatID           = kAudioFormatLinearPCM;
    canonicalFormat.mFormatFlags        = kAudioFormatFlagsCanonical;
    canonicalFormat.mFramesPerPacket    = 1;
    canonicalFormat.mChannelsPerFrame   = 1;
    canonicalFormat.mBitsPerChannel     = 8 * bytesPerSample;
    canonicalFormat.mBytesPerPacket     = bytesPerSample;
    canonicalFormat.mBytesPerFrame      = bytesPerSample;
...