【问题标题】:How Do I Replay Oscillator With Envelope in AudioKit?如何在 AudioKit 中使用信封重放振荡器?
【发布时间】:2019-10-12 21:02:01
【问题描述】:

下面的播放器发出短促的哔声。但是,“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】:

    @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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 2019-12-24
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      相关资源
      最近更新 更多