AudioUnit не воспроизводит звук на tvOS - PullRequest
1 голос
/ 06 августа 2020

Я работаю над приложением для платформы tvOS для воспроизведения звука с помощью WebRT C (https://webrtc.org/). WebRT C использует AudioUnit для воспроизведения звука (https://chromium.googlesource.com/external/webrtc/+/7a82467d0db0d61f466a1da54b94f6a136726a3c/sdk/objc/native/src/audio/voice_processing_audio_unit.mm). Он отлично работает на iOS, но выдает ошибки на tvOS.

Прежде всего, я вообще отключил захват звука. Первая ошибка возникает при создании аудиоустройства ввода-вывода голосовой обработки:

// Create an audio component description to identify the Voice Processing
  // I/O audio unit.
  AudioComponentDescription vpio_unit_description;
  vpio_unit_description.componentType = kAudioUnitType_Output;
  vpio_unit_description.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
  vpio_unit_description.componentManufacturer = kAudioUnitManufacturer_Apple;
  vpio_unit_description.componentFlags = 0;
  vpio_unit_description.componentFlagsMask = 0;
  // Obtain an audio unit instance given the description.
  AudioComponent found_vpio_unit_ref =
      AudioComponentFindNext(nullptr, &vpio_unit_description);
  // Create a Voice Processing IO audio unit.
  OSStatus result = noErr;
  result = AudioComponentInstanceNew(found_vpio_unit_ref, &vpio_unit_);
  if (result != noErr) {
    vpio_unit_ = nullptr;
    RTCLogError(@"AudioComponentInstanceNew failed. Error=%ld.", (long)result);
    return false;
  }

AudioComponentInstanceNew возвращает -3000 OSStatus (я предполагаю, что это означает недопустимый идентификатор компонента). Эту проблему можно исправить, заменив kAudioUnitSubType_VoiceProcessingIO → kAudioUnitSubType_GenericOutput (я не уверен, что это правильная замена, но ошибка исчезла).

После этого WebRT C пытается включить вывод

// Enable output on the output scope of the output element.
  UInt32 enable_output = 1;
  result = AudioUnitSetProperty(vpio_unit_, kAudioOutputUnitProperty_EnableIO,
                                kAudioUnitScope_Output, kOutputBus,
                                &enable_output, sizeof(enable_output));
  if (result != noErr) {
    DisposeAudioUnit();
    RTCLogError(@"Failed to enable output on output scope of output element. "
                 "Error=%ld.",
                (long)result);
    return false;
  }   

, и это тоже не работает: он возвращает -10879 OSStatus (я полагаю, это означает недопустимое свойство). Я думаю, что проблема заключается в предоставлении свойства kAudioOutputUnitProperty_EnableIO, но я понятия не имею, почему его следует использовать вместо него.

Любые идеи pr-советы очень ценятся. Заранее спасибо.

...