Я пытаюсь сыграть ноту, а затем определить частоту микрофона. Когда я играю ноту с помощью осциллятора, она работает, если я подключаю наушники к устройству, но не со встроенными динамиками. Когда я пытаюсь определить частоту звука по входу от микрофона, все наоборот; он работает только со встроенным микрофоном, но не при подключении гарнитуры.
Это то, что я использую для отслеживания частоты звука с микрофона:
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)")
}
}
}
Если у меня подключены наушники, звук начинается, как и ожидалось, но если я пытаюсь воспроизвести звук с помощью встроенного динамика, звук не выходит (но он все равно выводит частоту на консоль).
Есть идеи, как заставить его играть и слушать, независимо от того, подключаю я гарнитуру или нет?