0

I´m trying to fade out an mp3 file using AVAudioEngine and AVAudioPlayerNode. I cannot figure it out. Can anybody please help in Swift?

I tried some things already. Everything works quite good but not as smooth as I would like it to be.

    var fadeOutPlayer: Float = playerVolume
            var fadeOutQuinte: Float = playerQuinteVolume
            while fadeOutPlayer > 0.0 {
                player.volume = fadeOutPlayer
                playerQuinte.volume = fadeOutQuinte
                fadeOutPlayer -= 0.001
                fadeOutQuinte -= 0.001
                usleep(100)
            }


I also tried a timer (which doesn't do a fade):

if !isTimerFadeOutRunning {
            player.volume = 0
            playerQuinte.volume = 0
            counter = 0
            timerFadeOut = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(runTimerFadeOut), userInfo: nil, repeats: true)
            isTimerFadeOutRunning = true
        }
    }

    @objc func runTimerFadeOut() {
        counter += 0.1
        if counter == 0.2 {
            player.pause()
            playerQuinte.pause()
        }
    }

1 Answers1

0

I've attached an AVAudioUnitEQ to my flow before mainMixerNode and then controlled the globalGain. The following code shows the idea:

private func manageFadeOut(volume: Double, fadeOutSecs: Double) {
    let timeSecs = 0.001
    DispatchQueue.main.asyncAfter(deadline: .now() + timeSecs) {
        if !self.isFadingOut { return }
        for fx in self.fadeOutEffects { fx.globalGain = Float(-96 * (1.0 - volume)) }
        if volume <= 0 {
            for player in self.players { player.stop() }
            self.isFadingOut = false
            return
        }
        let fade = timeSecs / fadeOutSecs
        self.manageFadeOut(volume: volume - fade, fadeOutSecs: fadeOutSecs)
    }
}
Ráfagan
  • 2,165
  • 2
  • 15
  • 22