ApplicationMusicPlayer / MediaPlayer Refuses to Play

We use BassDSDPlayer / SFBAudioEngine to play just about any file, but playing Apple Music is failing. All subscriptions are up to date. We stop the SFBAudioEngine and the BassDSDPlayer before playing Apple Music to no avail.

PRINTS:

Supported files in /Users/dorian/Music/Music/Media.localized/Music/4: 28364 Apple Music is authorized and can play catalog. Resetting default output device... Releasing BassDSDPlayer audio device... BassDSDPlayer: Audio device released. STOPPED sfbAudioDevice Default output device is ID: 76 applicationQueuePlayer _establishConnectionIfNeeded timeout [ping did not pong] applicationQueuePlayer _establishConnectionIfNeeded timeout [ping did not pong] Player State - After resetting output: Playback Status: stopped Queue Count: 0 No track is playing.

Music player reset successfully. BassDSDPlayer: Audio device released. Default output device set successfully: 76 Default output device is ID: 76 Default output device set successfully: 76 Default output device ID: 76 Validated PlayParameters for track: squabble up PlayParameters: PlayParameters(id: 1781270321, kind: "song", isLibrary: nil, catalogID: nil, libraryID: nil, deviceLocalID: nil, rawValues: [:]) Starting playback... Player State - After playback: Playback Status: stopped Queue Count: 1 No track is playing.

Notification BASS DSD NSConcreteNotification 0x600007ce2b00 {name = kUpdateSongInfo; object = { AlbumTitle = GNX; ArtistName = "Kendrick Lamar"; SongArtwork = "<NSImage 0x6000041b7ca0 Size={300, 300} RepProvider=<NSImageArrayRepProvider: 0x600003518770, reps:(\n "NSBitmapImageRep 0x600009ed9dc0 Size={300, 300} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=300x300 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x600007ce15c0"\n)>>"; SongLength = "157.992"; SongTitle = "squabble up"; Source = AppleMusic; }} Apple Music track loaded: squabble up by Kendrick Lamar Player State - Before play: Playback Status: stopped Queue Count: 1 No track is playing.

prepareToPlay failed [no target descriptor] NSError Code: 1, Domain: MPMusicPlayerControllerErrorDomain Player State - After play: Playback Status: stopped Queue Count: 1 No track is playing.

func playAppleMusicTracks(tracks: [Track]) {
    AppleMusicManager.shared.isAuthorizedAndReadyForPlayback { isAuthorized in
        guard isAuthorized else {
            print("Apple Music authorization or capabilities insufficient for playback.")
            return
        }

        print("Resetting default output device...")
        self.stopSFBAudioDevice()
        self.resetMusicPlayer()
        self.resetAudioSystem()
        self.ensureOutputDeviceReady()

        Task {
            for track in tracks {
                guard self.validatePlayParameters(for: track) else { continue }
                
                do {
                    try await ApplicationMusicPlayer.shared.queue.insert(track, position: .afterCurrentEntry)
                    
                    guard !ApplicationMusicPlayer.shared.queue.entries.isEmpty else {
                        print("Queue is empty after queuing. Playback cannot proceed.")
                        return
                    }
                    self.notifyAppleMusicTrackInfo(track)

                } catch {
                    print("Error starting playback: \(error)")
                    if let nsError = error as NSError? {
                        print("NSError Code: \(nsError.code), Domain: \(nsError.domain)")
                    }
                }
            }

            MusicKitWrapper.shared.logPlayerState(message: "After playback")
        }
    }
}

@objc public class MusicKitWrapper: NSObject {

@objc public static let shared = MusicKitWrapper()
private let player = ApplicationMusicPlayer.shared

// Play the current track
@objc public func play() {
    
    guard !player.queue.entries.isEmpty else {
        print("Queue is empty. Cannot start playback.")
        return
    }
    logPlayerState(message: "Before play")

    Task {
        do {
            try await player.prepareToPlay()
            try await player.play()
            print("Playback started successfully.")
        } catch {
            if let nsError = error as NSError? {
                print("NSError Code: \(nsError.code), Domain: \(nsError.domain)")
            }
        }
        logPlayerState(message: "After play")
    }
}

Any help would be appreciated.

Thanks!

This error is thrown if there is no queue. Its hard to tell which code is 3rd party vs native but you can start debugging at your queue level to ensure it's being passed to your player correctly.

ApplicationMusicPlayer.Queue usually takes an initializer, not an insert so I would start with the queue creation code to make sure it works, then compare vs a completely plain native app using on the Apple provided player to make sure your other players aren't interfering with your audio sessions (although less likely than a simple issue with your queue creation).

Hopefully this helps.

Rico


WWDR | DTS | Software Engineer

ApplicationMusicPlayer / MediaPlayer Refuses to Play
 
 
Q