skip to Main Content

This is what I have in my singleton:

import AVFoundation
import Foundation

class SharingMusicPlayer {
    static let sharingMusicPlayer = SharingMusicPlayer(backgroundMusicPlayer: AVAudioPlayer)
    let backgroundMusicPlayer : AVAudioPlayer

    private init(backgroundMusicPlayer: AVAudioPlayer) {
        self.backgroundMusicPlayer = backgroundMusicPlayer
    }

    func playMusic() {
        // open and play an mp3 file...
    }
}

But I am getting this error:

SharingMusicPlayer.swift:12:79: Cannot convert value of type 'AVAudioPlayer.Type' to expected argument type 'AVAudioPlayer'

Here is another post I have investigated but the solution does not appear to apply here:

"Cannot convert value of type 'AVAudioPlayer.Type' to expected argument type"

BTW, I based my singleton pattern on this article:

https://cocoacasts.com/what-is-a-singleton-and-how-to-create-one-in-swift

Does anyone have any suggestions?

UPDATE:

Please note that I realize that I can play a sound in my app using this code:

run(SKAction.playSoundFileNamed("MySound.mp3", waitForCompletion: false))

But I want to play background music in this case so the above doesn’t work.

2

Answers


  1. Chosen as BEST ANSWER

    This is what I came up with, though I am still not sure if this is the right way to do a singleton in swift:

    class SharingMusicPlayer {
        static var sharingMusicPlayer = SharingMusicPlayer()
        var backgroundMusicPlayer : AVAudioPlayer?
        
        private init() {
            
        }
        
        func playBackgroundMusic(filename: String) {
            let url = Bundle.main.url(
                forResource: filename, withExtension: nil)
            if (url == nil) {
                print("Could not find file: (filename)")
                return
            }
            do {
                try self.backgroundMusicPlayer = AVAudioPlayer(contentsOf: url!)
            } catch {
                print("Could not create audio player")
            }
            
    
            backgroundMusicPlayer!.numberOfLoops = -1
            backgroundMusicPlayer!.prepareToPlay()
            backgroundMusicPlayer!.play()
        }
        
        func stopBackgroundMusic(filename: String) {
            self.backgroundMusicPlayer!.stop()
        }
    }
    

    Then this is how I would call the functions to start and stop the music:

    override func touchesBegan(_ touches: Set<UITouch>,
                                        with event: UIEvent?) {
       /* Called when a touch begins */
       for touch: AnyObject in touches {
          //1
          let location = touch.location(in:self)
          //2
          let theNode = self.atPoint(location)
    
          //... 
           
          if theNode.name == playMusicButton!.name {
               print("The (playMusicButton!.name!) is touched ")
              SharingMusicPlayer.sharingMusicPlayer.playBackgroundMusic(
                filename: "BeethovenPianoSonataNr15InDmajorOp28Pastoral.mp3")
          }
    
           if theNode.name == stopMusicButton!.name {
                print("The (stopMusicButton!.name!) is touched ")
               SharingMusicPlayer.sharingMusicPlayer.stopBackgroundMusic()
           }
       }
    

    Please note that the above buttons are in SpriteKit so they are different than the usual UIButton objects in Main.storyboard.


  2. You are passing it the type AVAudioPlayer when you need to pass an instance of AVAudioPlayer. This should work I guess:

    Change

    static let sharingMusicPlayer = SharingMusicPlayer(backgroundMusicPlayer: AVAudioPlayer)
    

    to

    static let sharingMusicPlayer
        = SharingMusicPlayer(backgroundMusicPlayer: AVAudioPlayer())
    

    Update

    This is the full code that compiles at my end

    class SharingMusicPlayer {
        static let sharingMusicPlayer
            = SharingMusicPlayer(backgroundMusicPlayer: AVAudioPlayer())
        let backgroundMusicPlayer : AVAudioPlayer
    
        private init(backgroundMusicPlayer: AVAudioPlayer) {
            self.backgroundMusicPlayer = backgroundMusicPlayer
        }
    
        func playMusic() {
            // open and play an mp3 file...
        }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search