johnCole
johnCole

Reputation: 103

Using only one AVAudioPlayer instead of three

I created three AVAudioPlayer, each plays an audio file. While the audio is playing the UIButton is set selected by audioPlayerDidFinishPlaying.

Insted of using three different AVAudioPlayer, I would like to use only one AVAudioPlayer for the efficiency of code.

However when I try to rewrite code with only one AVAudioPlayer, I can not use audioPlayerDidFinishPlaying to set more than one UIButtons selected.

How can I solve this problem?

Here is the code with three different AVAudioPlayer.

        let url1 = Bundle.main.bundleURL.appendingPathComponent("audioFile1.mp3")
        let url2 = Bundle.main.bundleURL.appendingPathComponent("audioFile2.mp3")
        let url3 = Bundle.main.bundleURL.appendingPathComponent("audioFile3.mp3")


        @IBOutlet weak var yourButton1: customButton!
        @IBOutlet weak var yourButton2: customButton!
        @IBOutlet weak var yourButton3: customButton!


        fileprivate var player1:AVAudioPlayer?
        fileprivate var player2:AVAudioPlayer?
        fileprivate var player3:AVAudioPlayer?


        @IBAction func pushButton1(sender: UIButton) {
            audioPlayer1(url: url1)
        }

        @IBAction func pushButton2(sender: UIButton) {
            audioPlayer2(url: url2)
        }

        @IBAction func pushButton3(_ sender: UIButton) {
            audioPlayer3(url: url3)
        }



        func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
            if (player === player1) {
                yourButton.isSelected = false
            } else if (player === player2) {
                yourButton2.isSelected = false
            } else if (player === player3) {
                yourButton3.isSelected = true
            }
        }

        func audioPlayer1(url: URL) {
            do {
                try player1 = AVAudioPlayer(contentsOf:url)
                player1!.play()
                yourButton1.isSelected = true
                player1!.delegate = self
            } catch {
                print(error)
            }
        }

        func audioPlayer2(url: URL) {
            do {
                try player2 = AVAudioPlayer(contentsOf:url)
                player2!.play()
                yourButton2.isSelected = true
                player2!.delegate = self

            } catch {
                print(error)
            }
        }

     func audioPlayer3(url: URL) {
            do {
                try player3 = AVAudioPlayer(contentsOf:url)
                player3!.play()
                yourButton3.isSelected = true
                player3!.delegate = self

            } catch {
                print(error)
            }
        }

Upvotes: 1

Views: 56

Answers (1)

KrishnaCA
KrishnaCA

Reputation: 5695

You can use a integer to identify between different files currently playing. I modified your code given in the question and wrote it below. Please have a look at it and tell me if you have any doubts

let url1 = Bundle.main.bundleURL.appendingPathComponent("audioFile1.mp3")
let url2 = Bundle.main.bundleURL.appendingPathComponent("audioFile2.mp3")
let url3 = Bundle.main.bundleURL.appendingPathComponent("audioFile3.mp3")

@IBOutlet weak var yourButton1: UIButton!
@IBOutlet weak var yourButton2: UIButton!
@IBOutlet weak var yourButton3: UIButton!

fileprivate var lonelyPlayer:AVAudioPlayer?
var currentPlayer: Int = 0

@IBAction func pushButton1(sender: UIButton) {
    if self.lonelyPlayer == nil {

    }else {
        if (self.lonelyPlayer?.isPlaying)! {
            self.lonelyPlayer?.stop()
        }
    }
    audioPlayer(url: url1, buttonId: 1)
}

@IBAction func pushButton2(sender: UIButton) {
    if self.lonelyPlayer == nil {

    }else {
        if (self.lonelyPlayer?.isPlaying)! {
            self.lonelyPlayer?.stop()
        }
    }
    audioPlayer(url: url2, buttonId: 2)
}

@IBAction func pushButton3(_ sender: UIButton) {
    if self.lonelyPlayer == nil {

    }else {
        if (self.lonelyPlayer?.isPlaying)! {
            self.lonelyPlayer?.stop()
        }
    }
    audioPlayer(url: url3, buttonId: 3)
}

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    if (self.currentPlayer == 1) {
        yourButton1.isSelected = false
    } else if (self.currentPlayer == 2) {
        yourButton2.isSelected = false
    } else if (self.currentPlayer == 3) {
        yourButton3.isSelected = false
    }
}

func audioPlayer(url: URL, buttonId: Int) {
    do {
        try lonelyPlayer = AVAudioPlayer(contentsOf:url)
        lonelyPlayer!.play()
        lonelyPlayer!.delegate = self
        yourButton1.isSelected = (buttonId == 1)
        yourButton2.isSelected = (buttonId == 2)
        yourButton3.isSelected = (buttonId == 3)
        currentPlayer = buttonId
    } catch {
        print(error)
    }
}

Upvotes: 2

Related Questions