Проблемы с выводом AudioKit v5, нет звука при использовании AVAudioSession defaultToSpeaker

#ios #swift #audiokit

#iOS #swift #audiokit

Вопрос:

РЕДАКТИРОВАТЬ # 2: Хорошо, я пропустил здесь что-то важное, но у меня все еще есть проблема. Причина, по которой звук тихий, и я должен его усилить, заключается в том, что он исходит из динамика, а не из динамика. Когда я добавляю option .defaultToSpeaker в setCategory, я вообще не получаю звука.

Итак, это настоящая проблема, когда я устанавливаю категорию.Воспроизведение и запись и опция .defaultToSpeaker, почему я вообще не слышу звука на реальном телефоне? В дополнение к отсутствию звука я также не получал ввода с микрофона. Звук в симуляторе в порядке.

РЕДАКТИРОВАНИЕ # 3: я начал наблюдать изменения маршрута, и мой код сообщает следующее, когда включена опция .defaultToSpeaker.

 2020-12-26 12:17:56.212366-0700 SST[13807:3950195] Current route:

2020-12-26 12:17:56.213275-0700 SST[13807:3950195] <AVAudioSessionRouteDescription: 0x2816af8e0, 
inputs = (
    "<AVAudioSessionPortDescription: 0x2816af900, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = Bottom>"
); 
outputs = (
    "<AVAudioSessionPortDescription: 0x2816af990, type = Speaker; name = Speaker; UID = Speaker; selectedDataSource = (null)>"
)>
  

Для вывода установлено значение Speaker. Важно ли, что выбранный источник данных равен (null)? До того, как была добавлена опция .defaultToSpeaker, этот вывод сообщал о наборе в Receiver, также с selectedDataSource = (null), поэтому я бы предположил, что нет.

РЕДАКТИРОВАТЬ: я добавил код для установки категории аудиосеанса. Новый код показан ниже. Пока это, похоже, не имеет никакого эффекта. Если я оставлю это или закомментирую, я не вижу никакой разницы. У меня также есть код (который я удалил здесь для простоты), который изменяет шаблон микрофона. Это тоже не имело заметного эффекта. Возможно, этого следовало ожидать?

В дополнение к приведенным ниже симптомам, если я использую Настройки / Bluetooth для выбора AirPods, приложение не выводит данные даже после удаления AirPods.

Чего мне здесь не хватает?

/РЕДАКТИРОВАТЬ

После того, как это хорошо работало на симуляторе, я перешел к отладке на моем 11 Pro Max. При воспроизведении нот на струне мандолины звук из симулятора (11 Pro Max или 8) громкий и четкий. На реальном телефоне звук едва слышен и только из динамика. Он не поступает на подключенный аудиодинамик, будь то HomePod или AirPods. Это ошибка версии 5? Нужно ли мне что-то делать с выводом?

Вторая, менее важная проблема заключается в том, что когда я создаю экземпляр этого объекта, MandolinString запускается без моего вызова чего-либо. Дополнительный фейдер и сброс усиления с 0 на 1 после задержки подавляют этот звук.

 private let engine    = AudioEngine()
    private let mic       : AudioEngine.InputNode
    private let micAmp    : Fader
    private let mixer1    : Mixer
    private let mixer2    : Mixer
    private let silence   : Fader
    private let stringAmp : Fader
    private var pitchTap  : PitchTap
    
    private var tockAmp   : Fader
    private var metro     = Timer()
    
    private let sampler   = MIDISampler(name: "click")

    private let startTime = NSDate.timeIntervalSinceReferenceDate
    private var ampThreshold: AUValue = 0.12
    private var ampJumpSize: AUValue = 0.05

    private var samplePause = 0
    private var trackingNotStarted = true
    private var tracking = false
    private var ampPrev: AUValue = 0.0
    private var freqArray: [AUValue] = []
    
    init() {
        
        // Set up mic input and pitchtap
        mic = engine.input!
        micAmp = Fader(mic, gain: 1.0)
        mixer1 = Mixer(micAmp)
        silence = Fader(mixer1, gain: 0)
        mixer2 = Mixer(silence)
        pitchTap = PitchTap(mixer1, handler: {_ , _ in })
        
        // All sound is fed into mixer2
        // Mic input is faded to zero
        
        // Now add String sound to Mixer2 with a Fader
        pluckedString = MandolinString()
        stringAmp = Fader(pluckedString, gain: 4.0)
        mixer2.addInput(stringAmp)
        
        // Create a sound for the metronome (tock), add as input to mixer2
        try! sampler.loadWav("Click")
        tockAmp = Fader(sampler, gain: 1.0)
        mixer2.addInput(tockAmp)

        engine.output = mixer2

        self.pitchTap = PitchTap(micAmp,
                                 handler:
        { freq, amp in
            if (self.samplePause <= 0 amp;amp; self.tracking) {
                self.samplePause = 0
                self.sample(freq: freq[0], amp: amp[0])
            }
        })
        
        do {
            //try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.measurement)
            try audioSession.setCategory(AVAudioSession.Category.playAndRecord)
            //, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
            try audioSession.setActive(true)
        } catch let error as NSError {
            print("Unable to create AudioSession: (error.localizedDescription)")
        }
        
        do {
            try engine.start()
            akStartSucceeded = true
        } catch {
            akStartSucceeded = false
        }
    } // init
  

XCode 12, iOS 14, SPM. Все обновлено

Ответ №1:

Скорее всего, это не проблема AudioKit как таковая, это связано с AVAudioSession, вам, вероятно, нужно установить его на устройстве как defaultToSpeaker. AudioKit 5 имеет меньше автоматического управления сеансами по сравнению с версией 4, что позволяет делать меньше предположений и позволяет разработчику контролировать ситуацию.

Комментарии:

1. Я добавил AVAudioSession и не нашел способа улучшить ситуацию. Я попробовал опцию категории defaultToSpeaker, и в результате звук вообще не выводился. Попытка выбора разных параметров микрофона и полярной ориентации привела к некоторым изменениям в отслеживании. Использование режима ghte «Измерение» резко сократило количество сэмплов, которые я получил от tap, что явно контрпродуктивно.

2. Я отредактировал приведенный выше код, добавив код AVAudioSession. Пожалуйста, помогите.

3. Когда я включаю опцию defaultToSpeaker, я вообще не получаю звука. Только с категорией воспроизведения и записи я, по крайней мере, получаю звук.

Ответ №2:

Ответ действительно заключался в добавлении кода для AVAudioSession. Однако он не работал там, где я его впервые поставил. У меня это сработало только тогда, когда я поместил его в делегат приложения didFInishLauchWithOptions. Я нашел это в кулинарной книге AudioKit. Это работает:

 class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        #if os(iOS)
            self.audioSetup()
        #endif

        return true
    }

    #if os(iOS)
    func audioSetup() {
        let session = AVAudioSession.sharedInstance()
        
        do {
            Settings.bufferLength = .short
            try session.setPreferredIOBufferDuration(Settings.bufferLength.duration)
            try session.setCategory(.playAndRecord,
                                                            options: [.defaultToSpeaker, .mixWithOthers])
            try session.setActive(true)
        } catch let err {
            print(err)
        }
    
        // Other AudioSession stuff here
        
        do {
            try session.setActive(true)
        } catch let err {
            print(err)
        }
    }
    #endif

}