Swift 如何使用AVAudioPlayer在鼓型之间平滑过渡?

Swift 如何使用AVAudioPlayer在鼓型之间平滑过渡?,swift,avaudioplayer,audio-player,Swift,Avaudioplayer,Audio Player,我正在编写一个音乐应用程序,它可以让用户通过按屏幕上所需的按钮在不同的鼓模式之间“顺利”切换。(我所说的“平滑”是指模式将在用户按下按钮后立即切换) 我的问题是,我计算的下一个模式延迟启动的时间延迟比期望的稍大。我可以通过将时间延迟减少0.1秒来修复,但如果使用与我当前用于测试的速度不同的速度,则这可能不起作用 计算延迟的代码为: func startClock() { let aSelector : Selector = "updateClock" clock = NSTime

我正在编写一个音乐应用程序,它可以让用户通过按屏幕上所需的按钮在不同的鼓模式之间“顺利”切换。(我所说的“平滑”是指模式将在用户按下按钮后立即切换)

我的问题是,我计算的下一个模式延迟启动的时间延迟比期望的稍大。我可以通过将时间延迟减少0.1秒来修复,但如果使用与我当前用于测试的速度不同的速度,则这可能不起作用

计算延迟的代码为:

func startClock() {
    let aSelector : Selector = "updateClock"
    clock = NSTimer.scheduledTimerWithTimeInterval(0.001, target: self, selector: aSelector, userInfo: nil, repeats: true)
    startTime = CFAbsoluteTimeGetCurrent()
}

func stopClock() {
    clock.invalidate()
}

func updateClock() {
    currentTime = CFAbsoluteTimeGetCurrent()

    elapsedTime = currentTime - startTime
    elapsedBeats = UInt(elapsedTime / audioMeterUpdateInterval)
    elapsedMeasures = UInt( Double(elapsedBeats) / Double(beatUnit[patternSelectIdx]) )

    requiredMeasures = elapsedMeasures + 1
    requiredBeats = requiredMeasures * UInt(beatUnit[patternSelectIdx])
    requiredTime = Double(requiredBeats) * audioMeterUpdateInterval

    delayTime = requiredTime - elapsedTime - 0.1 // 0.1 sec is chosen ad hoc

}
用于结束滚筒模式的其中一个按钮的代码为:

@IBAction func endShort(sender: UIButton) {

    fileName = patternSelect + "End1"
    if startPlay == true {
        play(fileName, numberOfLoops: 0, delaySec: delayTime)
    } else {
        play(fileName, numberOfLoops: 0, delaySec: 0) 
    }
    playPauseButton.setImage(playImage, forState: UIControlState.Normal)
    startPlay = false

}
最后,上述代码调用的函数
play

func play(fileName: String, numberOfLoops: Int, delaySec: Double){

    if delaySec > 0 {
        let delayNSec = Double(NSEC_PER_SEC)*delaySec
        let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delayNSec))

        self.ButtonAudioPlayer.numberOfLoops = numberOfLoops
        self.ButtonAudioPlayer.volume = 1.0
        self.ButtonAudioURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(fileName, ofType: "wav")!)

        dispatch_after(dispatchTime, dispatch_get_main_queue(),{
        self.ButtonAudioPlayer = try! AVAudioPlayer(contentsOfURL: self.ButtonAudioURL)
            self.ButtonAudioPlayer.play()
        })
    } else {
        ButtonAudioPlayer.numberOfLoops = numberOfLoops
        ButtonAudioPlayer.volume = 1.0
        ButtonAudioURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(fileName, ofType: "wav")!)
        ButtonAudioPlayer = try! AVAudioPlayer(contentsOfURL: ButtonAudioURL)
        ButtonAudioPlayer.play()
    }
}
有没有其他办法?此外,0.1秒是否可以是与按钮动画时间相关的固定延迟,因此始终保持固定且可以修改?谢谢