Как я могу воспроизвести генератор с конвертом в AudioKit? - PullRequest
1 голос
/ 13 октября 2019

У меня есть игрок ниже, который делает короткий гудок. Тем не менее, Player.shared.play () воспроизводится только один раз в первый раз. Я не могу вызвать его снова по требованию. Любая помощь будет оценена.

import Foundation
import AudioKit

class Player {

    static let shared = Player()
    let osc = AKOscillator()
    let env:AKAmplitudeEnvelope
    var panner = AKPanner()

    init() {
        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()
        osc.start()
        env.start()
        panner.start()
    }

    func play() {
            osc.stop()
            osc.start()
            env.stop()
            env.start()
        }

}

1 Ответ

0 голосов
/ 14 октября 2019

@ 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

...