首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在AudioKit中重放带有信封的振荡器?

如何在AudioKit中重放带有信封的振荡器?
EN

Stack Overflow用户
提问于 2019-10-13 05:02:02
回答 1查看 97关注 0票数 1

我让下面的玩家发出短促的嘟嘟声。但是,"Player.shared.play()“第一次只播放一次。我不能按要求再次触发它。任何帮助都将不胜感激。

代码语言:javascript
复制
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()
        }

}
EN

回答 1

Stack Overflow用户

发布于 2019-10-14 09:18:18

@jl303,

由于某些原因,您必须在振荡器和包络的启动和停止之间添加延迟。我添加了一个DispatchQueue延迟,如下所示:

代码语言:javascript
复制
func playOsc() {
    osc.start()
    env.start()
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [unowned self] in
        self.osc.stop()
        self.env.stop()
    }
}

下面是上下文中修改后的Player类:

代码语言:javascript
复制
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()
        }
    }
}

下面是触发振荡器声音on命令的ViewController

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58358480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档