如何在AudioKit中用信封重放振荡器?

问题描述 投票:0回答:1

我下面有一个播放器,发出一声短促的哔哔声。但是,“ 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()
        }

}
swift macos audiokit
1个回答
0
投票

@ 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

© www.soinside.com 2019 - 2024. All rights reserved.