首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioKit快速平移

AudioKit快速平移
EN

Stack Overflow用户
提问于 2021-03-29 21:10:15
回答 1查看 86关注 0票数 1

我目前正在audioKit的帮助下开发一个应用程序。我正在尝试平移音频,以便它一次只在一只耳朵中播放。有什么想法可能是错误的吗?

声音正在播放,但它在两只耳朵中同时播放。

代码语言:javascript
复制
func createTone(freq: Double, dB: Int, isLeftEar: Bool){
        currentFreq = Int(freq)
        currentdB = dB
        isAudioOn = true
        osciliator.frequency = freq
        osciliator.amplitude = calculateVolume(dB: dB)
        osciliator.rampDuration = 0.25
        let leftPan = AKPanner(osciliator, pan: -1)
        let rightPan = AKPanner(osciliator, pan: 1)
        if(isLeftEar){
            AudioKit.AKManager.output = leftPan
            
        }else{
            
            AudioKit.AKManager.output = rightPan
        }
        do{
            try AudioKit.AKManager.start()
        }catch{
            print("could not start AudioKit.")
        }
        
        if isLeftEar {
            leftPan.start()
        }else{
            rightPan.start()
        }
        
        osciliator.start()
        sleep(2)
        
        do{
            try AudioKit.AKManager.stop()}
        catch{
            print("AudioKit could not stop")
        }
EN

回答 1

Stack Overflow用户

发布于 2021-03-29 22:52:10

通常,节点是在类级别声明的,而不是局部变量。所以你会有类似这样的东西:

代码语言:javascript
复制
class ViewController: UIViewController {

var panner: AKPanner!

func createTone(freq: Double, dB: Int, isLeftEar: Bool){
    // ...

    panner = AKPanner(oscillator, pan: (isLeftEar) ? -1 : 1)
    // ...
}

此外,永远不应该在主线程中调用sleep。您应该使用DispatchQueue.main.asyncAfter

代码语言:javascript
复制
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    do{
        try AKManager.stop()}
    catch{
        print("AudioKit could not stop")
    }
}

更新

我用AudioKit 4.10.1测试了以下代码,它确实正确地平移到了左声道。

代码语言:javascript
复制
var panner: AKPanner!
var oscillator: AKOscillator!

func createTone(){
    oscillator = AKOscillator()
    panner = AKPanner(oscillator, pan: -1)
    AKManager.output = panner
    do{
        try AudioKit.AKManager.start()
    }catch{
        print("could not start AudioKit.")
    }
    
    panner.start()
    oscillator.start()
    
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 20.0) {
        do {
            try AudioKit.AKManager.stop()
        } catch {
            print("AudioKit could not stop")
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66854828

复制
相关文章

相似问题

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