Использование аудиоустройства ввода-вывода с несколькими обработчиками голоса в iOS

Я работаю над проектом VOIP на iOS. Согласно документам Apple, я использую аудиоустройство VoiceProcessingIO, чтобы получить поддержку эхоподавления.

Поскольку мое приложение требует отдельных операций на сторонах рендеринга и захвата (например, выключить динамик, но позволить микрофону продолжать работу), я создаю два аудиоустройства, у одного из которых отключен порт захвата, а у другого отключен порт рендеринга.

Текущий код работает хорошо, пока я не узнаю, как работает эхоподавление: он требует сравнения сигналов от микрофона и динамика. Поэтому меня беспокоит: безопасно ли использовать два аудиоустройства для обработки голоса, как в моем подходе? Кроме того, поскольку подавление звука работает в основном со стороны захвата, можно ли использовать аудиоустройство RemoteIO для рендеринга (подключение к динамику)?

Я не уверен на 100%, так как вхожу в эту область на короткое время. Я также пробовал с сайта developer.apple.com, но во всех примерах, которые я нашел на сайте developer.apple.com, обычно используется только один аудиоблок.

Может кто-нибудь подскажет? Влияет ли мой подход на функции модуля VoiceProcessingIO?

Спасибо, Фучжоу


person Fuzhou Chen    schedule 17.05.2012    source источник


Ответы (1)


Во-первых, VoiceProcessingIO (на момент написания этой статьи) - это только подавление эха, а не подавление эха. По сути, он просто отключает вход, если выход слишком громкий. Это означает, например, что при вызове VOIP удаленный абонент не сможет вас слышать, пока он разговаривает. Полное подавление эха оставит вход включенным, но попытается вычесть эхо на выходе.

Я бы посоветовал использовать только один блок, а случай «выключения динамика» обрабатывать самостоятельно программно. Ваш выходной обратный вызов может выглядеть так:

OSStatus output_callback(
    void *inRefCon,
    AudioUnitRenderActionFlags  *ioActionFlags,
    const AudioTimeStamp        *inTimeStamp,
    UInt32                      inInputBusNumber,
    UInt32                      inNumberFrames,
    AudioBufferList             *ioData)
{
  my_context_t *context = inRefCon;
  audio_sample_t *dst = (audio_sample_t *)ioData->mBuffers[0].mData;

  if (context->muted) {
    memset(dst, 0, inNumberFrames * sizeof(audio_sample_t));
  } else {
    get_output_samples(context, dst, inNumberFrames);
  }
  return noErr;
}

Молчание для подавления эха не должно отрицательно сказаться на нем.

person robbie_c    schedule 10.10.2012