Play music if not playing, but don't if it is already playing (Xcode,Swift4)












0















I got a question about the AVFoundation and AVAudioPlayer.



In my project I have a view where you start in and a second on where the action happens. When I start the app I told the first view to start playing my background music and it has to continue when the user is in the second view. But whenever you come back to the first view it starts the song again, even though it is already playing. So I end up with a lot of echos.
How can I prevent that from happening?



Here is my code that I have yet:



import UIKit
import AVFoundation

class StartViewController: UIViewController {
var backgroundPlayer = AVAudioPlayer()

override func viewDidLoad() {
super.viewDidLoad()

//background music file
let sound = Bundle.main.path(forResource: "background_music", ofType: "mp3")

do {
backgroundPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: sound!))
}
catch {
print(error)
}

playBackgorundMusic()
}

func playBackgorundMusic() {
if backgroundPlayer.isPlaying {
//do nothing
} else {
backgroundPlayer.play()
}
}
}









share|improve this question

























  • If you want to play pause your play multiple ViewController then implement Play Pause code in AppDelegate so you can easily play pause player.

    – Kuldeep
    Nov 21 '18 at 12:57











  • How do you switch between the two view controllers? Because if you push and dismiss the second view controller on your first one, this should work properly already.

    – gebirgsbärbel
    Nov 21 '18 at 13:16
















0















I got a question about the AVFoundation and AVAudioPlayer.



In my project I have a view where you start in and a second on where the action happens. When I start the app I told the first view to start playing my background music and it has to continue when the user is in the second view. But whenever you come back to the first view it starts the song again, even though it is already playing. So I end up with a lot of echos.
How can I prevent that from happening?



Here is my code that I have yet:



import UIKit
import AVFoundation

class StartViewController: UIViewController {
var backgroundPlayer = AVAudioPlayer()

override func viewDidLoad() {
super.viewDidLoad()

//background music file
let sound = Bundle.main.path(forResource: "background_music", ofType: "mp3")

do {
backgroundPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: sound!))
}
catch {
print(error)
}

playBackgorundMusic()
}

func playBackgorundMusic() {
if backgroundPlayer.isPlaying {
//do nothing
} else {
backgroundPlayer.play()
}
}
}









share|improve this question

























  • If you want to play pause your play multiple ViewController then implement Play Pause code in AppDelegate so you can easily play pause player.

    – Kuldeep
    Nov 21 '18 at 12:57











  • How do you switch between the two view controllers? Because if you push and dismiss the second view controller on your first one, this should work properly already.

    – gebirgsbärbel
    Nov 21 '18 at 13:16














0












0








0








I got a question about the AVFoundation and AVAudioPlayer.



In my project I have a view where you start in and a second on where the action happens. When I start the app I told the first view to start playing my background music and it has to continue when the user is in the second view. But whenever you come back to the first view it starts the song again, even though it is already playing. So I end up with a lot of echos.
How can I prevent that from happening?



Here is my code that I have yet:



import UIKit
import AVFoundation

class StartViewController: UIViewController {
var backgroundPlayer = AVAudioPlayer()

override func viewDidLoad() {
super.viewDidLoad()

//background music file
let sound = Bundle.main.path(forResource: "background_music", ofType: "mp3")

do {
backgroundPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: sound!))
}
catch {
print(error)
}

playBackgorundMusic()
}

func playBackgorundMusic() {
if backgroundPlayer.isPlaying {
//do nothing
} else {
backgroundPlayer.play()
}
}
}









share|improve this question
















I got a question about the AVFoundation and AVAudioPlayer.



In my project I have a view where you start in and a second on where the action happens. When I start the app I told the first view to start playing my background music and it has to continue when the user is in the second view. But whenever you come back to the first view it starts the song again, even though it is already playing. So I end up with a lot of echos.
How can I prevent that from happening?



Here is my code that I have yet:



import UIKit
import AVFoundation

class StartViewController: UIViewController {
var backgroundPlayer = AVAudioPlayer()

override func viewDidLoad() {
super.viewDidLoad()

//background music file
let sound = Bundle.main.path(forResource: "background_music", ofType: "mp3")

do {
backgroundPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: sound!))
}
catch {
print(error)
}

playBackgorundMusic()
}

func playBackgorundMusic() {
if backgroundPlayer.isPlaying {
//do nothing
} else {
backgroundPlayer.play()
}
}
}






ios swift4 xcode10






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 21 '18 at 13:02









Kuldeep

2,53141736




2,53141736










asked Nov 21 '18 at 12:44









Benjamin H.Benjamin H.

53




53













  • If you want to play pause your play multiple ViewController then implement Play Pause code in AppDelegate so you can easily play pause player.

    – Kuldeep
    Nov 21 '18 at 12:57











  • How do you switch between the two view controllers? Because if you push and dismiss the second view controller on your first one, this should work properly already.

    – gebirgsbärbel
    Nov 21 '18 at 13:16



















  • If you want to play pause your play multiple ViewController then implement Play Pause code in AppDelegate so you can easily play pause player.

    – Kuldeep
    Nov 21 '18 at 12:57











  • How do you switch between the two view controllers? Because if you push and dismiss the second view controller on your first one, this should work properly already.

    – gebirgsbärbel
    Nov 21 '18 at 13:16

















If you want to play pause your play multiple ViewController then implement Play Pause code in AppDelegate so you can easily play pause player.

– Kuldeep
Nov 21 '18 at 12:57





If you want to play pause your play multiple ViewController then implement Play Pause code in AppDelegate so you can easily play pause player.

– Kuldeep
Nov 21 '18 at 12:57













How do you switch between the two view controllers? Because if you push and dismiss the second view controller on your first one, this should work properly already.

– gebirgsbärbel
Nov 21 '18 at 13:16





How do you switch between the two view controllers? Because if you push and dismiss the second view controller on your first one, this should work properly already.

– gebirgsbärbel
Nov 21 '18 at 13:16












1 Answer
1






active

oldest

votes


















0














You should make a singleton class for Music player to maintain state like play, pause, stop etc.



class MusicPlayerManager{

static let shared = MusicPlayerManager()
var backgroundPlayer = AVAudioPlayer()

init(){}

func playMusic(){
if backgroundPlayer.isPlaying {
//do nothing
} else {
backgroundPlayer.play()
}
}

}





share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53412321%2fplay-music-if-not-playing-but-dont-if-it-is-already-playing-xcode-swift4%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    You should make a singleton class for Music player to maintain state like play, pause, stop etc.



    class MusicPlayerManager{

    static let shared = MusicPlayerManager()
    var backgroundPlayer = AVAudioPlayer()

    init(){}

    func playMusic(){
    if backgroundPlayer.isPlaying {
    //do nothing
    } else {
    backgroundPlayer.play()
    }
    }

    }





    share|improve this answer




























      0














      You should make a singleton class for Music player to maintain state like play, pause, stop etc.



      class MusicPlayerManager{

      static let shared = MusicPlayerManager()
      var backgroundPlayer = AVAudioPlayer()

      init(){}

      func playMusic(){
      if backgroundPlayer.isPlaying {
      //do nothing
      } else {
      backgroundPlayer.play()
      }
      }

      }





      share|improve this answer


























        0












        0








        0







        You should make a singleton class for Music player to maintain state like play, pause, stop etc.



        class MusicPlayerManager{

        static let shared = MusicPlayerManager()
        var backgroundPlayer = AVAudioPlayer()

        init(){}

        func playMusic(){
        if backgroundPlayer.isPlaying {
        //do nothing
        } else {
        backgroundPlayer.play()
        }
        }

        }





        share|improve this answer













        You should make a singleton class for Music player to maintain state like play, pause, stop etc.



        class MusicPlayerManager{

        static let shared = MusicPlayerManager()
        var backgroundPlayer = AVAudioPlayer()

        init(){}

        func playMusic(){
        if backgroundPlayer.isPlaying {
        //do nothing
        } else {
        backgroundPlayer.play()
        }
        }

        }






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 21 '18 at 13:03









        SachinVsSachinSachinVsSachin

        5,02112735




        5,02112735
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53412321%2fplay-music-if-not-playing-but-dont-if-it-is-already-playing-xcode-swift4%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            這個網誌中的熱門文章

            Academy of Television Arts & Sciences

            L'Équipe

            1995 France bombings