Как управлять вводом и выводом на iOS с помощью AudioKit - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь сыграть ноту, а затем определить частоту микрофона. Когда я играю ноту с помощью осциллятора, она работает, если я подключаю наушники к устройству, но не со встроенными динамиками. Когда я пытаюсь определить частоту звука по входу от микрофона, все наоборот; он работает только со встроенным микрофоном, но не при подключении гарнитуры.

Это то, что я использую для отслеживания частоты звука с микрофона:

    private var micTrackerTimer: Timer? = nil
    private var micTracker: AKMicrophoneTracker? = nil

    @IBAction func listen(_ sender: UIButton) {
        micTrackerTimer?.invalidate()
        micTracker?.stop()

        micTracker = AKMicrophoneTracker()
        micTracker!.start()
        DispatchQueue.main.async {
            self.micTrackerTimer = Timer.scheduledTimer(
                timeInterval: 0.02,
                target: self,
                selector: #selector(self.renderPitch),
                userInfo: nil,
                repeats: true
            )
        }
    }

renderPitch просто выводит высоту тона на UITextField на данный момент. Если у меня нет подключенной гарнитуры, она успешно определяет частоту с помощью встроенного микрофона. Если у меня подключена гарнитура, она не работает, и на консоль Xcode выводится следующее:

2019-03-30 15:14:50.449326+0100 Interval Training[994:165902] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Headphones (type: Headphones)
2019-03-30 15:14:50.450672+0100 Interval Training[994:165902] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Headphones (type: Headphones)
2019-03-30 15:14:50.611809+0100 Interval Training[994:165902] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Headphones (type: Headphones)
2019-03-30 15:14:50.614450+0100 Interval Training[994:165902] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Headset Microphone (type: MicrophoneWired)
2019-03-30 15:14:50.614522+0100 Interval Training[994:165902] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Headphones (type: Headphones)
2019-03-30 15:14:50.619233+0100 Interval Training[994:165902] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Headset Microphone (type: MicrophoneWired)
2019-03-30 15:14:50.619377+0100 Interval Training[994:165902] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Headphones (type: Headphones)
2019-03-30 15:14:50.625743+0100 Interval Training[994:165902] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Headset Microphone (type: MicrophoneWired)
2019-03-30 15:14:50.625829+0100 Interval Training[994:165902] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Headphones (type: Headphones)

Я играю звук, используя другое действие:

    var player: Player!

    @IBAction func play(_ sender: UIButton) {
        player = Player()
        player.playNote()
    }

Мой очень простой класс игрока выглядит так:

import Foundation
import AudioKit

let triangle = AKTable(.triangle, count: 256)

class Player {
    var oscillator: AKOscillator!

    func playNote() {
        oscillator = AKOscillator(waveform: triangle)
        AudioKit.output = oscillator
        do {
            try AudioKit.start()
        } catch {
            print("Unable to start AudioKit. \(error)")
        }
        oscillator.start()
        let note: MIDINoteNumber = 57
        oscillator.frequency = note.midiNoteToFrequency()
        print("\(note.midiNoteToFrequency())")
        oscillator.rampDuration = 0.0
        oscillator.amplitude = 0.5

    }

    func stop() {
        oscillator.stop()
        do {
            try AudioKit.stop()
        } catch {
            print("Failed to stop AudioKit...\(error)")
        }
    }
}

Если у меня подключены наушники, звук начинается, как и ожидалось, но если я пытаюсь воспроизвести звук с помощью встроенного динамика, звук не выходит (но он все равно выводит частоту на консоль).

Есть идеи, как заставить его играть и слушать, независимо от того, подключаю я гарнитуру или нет?

...