Search code examples
audiokit

Playing random audio files in sequence with AKPlayer


I am working on a sort of multiple audio playback project. First, I have 10 mp3 files in a folder. I wanted AKPlayer to play one of these audio files randomly, but in sequence - one after the other. But playing a random file after another random file seems to be tricky. Here's what I've written:

let file = try? AKAudioFile(readFileName: String(arc4random_uniform(9)+1) + ".mp3")

let player = AKPlayer(audioFile: file!)

player1.isLoopiong = true
player.buffering = .always

AudioKit.output = AKPlayer

try? AudioKit.start()
player.start(at: startTime)

This code loops the first chosen random file forever - but I simply wanted to play each random files once. Is there any way I can reload the 'file' so the player starts again when it's done playing? I've tried calling multiple AKPlayers (but calling 10 players must be wrong), if player.isPlaying = false, sequencer, etc, but couldn't exactly figure out how. Apologize for such a newbie question. Thank you so much.


Solution

  • AKPlayer has a completion handler

    to be called when Audio is done playing. The handler won’t be called if stop() is called while playing or when looping from a buffer.

    The completion handler type is AKCallback, which is a typealias for () -> Void. If you have some good reason not to use 10 AKPlayers, you could probably use the completion handler to change the file and restart the player. But you could also create an array with 10 AKPlayers, each loaded with a different file, and have a function that selects a player at random for playback (or that cycles through a a pre-shuffled array). The completion handler for each player in the array could call this function, when appropriate. As per the doc quoted above, make sure that the AKPlayer is not looping or else the completion handler won't be called.