@ jl303,
По какой-то причине вам необходимо добавить задержку между запуском и остановкой генератора и огибающей. Я добавил его с задержкой DispatchQueue следующим образом:
func playOsc() {
osc.start()
env.start()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [unowned self] in
self.osc.stop()
self.env.stop()
}
}
Вот пересмотренный класс Player в контексте:
import Foundation
import AudioKit
class Player {
static let sharedInstance = Player()
let osc = AKOscillator()
let env: AKAmplitudeEnvelope
var panner = AKPanner()
init() {
AKSettings.bufferLength = .medium
AKSettings.playbackWhileMuted = true
do {
try AKSettings.setSession(category: .playAndRecord, with: [.defaultToSpeaker, .allowBluetooth, .mixWithOthers])
} catch {
AKLog("Could not set session category.")
}
osc.amplitude = 0.3
env = AKAmplitudeEnvelope(osc)
env.attackDuration = 0.01
env.decayDuration = 0.01
env.sustainLevel = 0.0
env.releaseDuration = 0.01
panner = AKPanner(env)
AudioKit.output = panner
try! AudioKit.start()
}
func playOsc() {
osc.start()
env.start()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { [unowned self] in
self.osc.stop()
self.env.stop()
}
}
}
Вот ViewController
для запуска звука генератора по команде:
import UIKit
class ViewController: UIViewController {
var player = Player.sharedInstance
@IBOutlet weak var oscPlayStopButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
setUpButtonStyle()
}
fileprivate func setUpButtonStyle() {
oscPlayStopButton.layer.cornerRadius = 12.0
oscPlayStopButton.layer.borderColor = UIColor.systemBlue.cgColor
oscPlayStopButton.layer.borderWidth = 1.0
}
@IBAction func playOscAction(_ sender: UIButton) {
player.playOsc()
}
}
Вы можете скачать проект Xcode здесь:
https://github.com/markjeschke/osc-player