I wonder why you are not setting the queue directly instead of setting the current entry. Something like this:
player.queue = [track]
try await player.play()
Or if you want to start from a specific track from the album, you can do:
player.queue = ApplicationMusicPlayer.Queue(for: tracks, startingAt: track)
The code I used to test:
struct AlbumsView: View {
@State private var albums: MusicItemCollection<Album> = []
var body: some View {
NavigationView {
List {
ForEach(albums) { album in
NavigationLink(destination: AlbumView(album: album)) {
Text(album.title)
}
}
}
}
.task {
do {
if await MusicAuthorization.request() == .authorized {
let request = MusicLibraryRequest<Album>()
let response = try await request.response()
albums = response.items
}
} catch {
print(error)
}
}
}
}
struct AlbumView: View {
var album: Album
@State private var tracks: MusicItemCollection<Track> = []
@State private var player = ApplicationMusicPlayer.shared
var body: some View {
List {
Button("Play album") {
player.queue = [album]
}
ForEach(tracks) { track in
Button(action: {
player.queue = ApplicationMusicPlayer.Queue(for: tracks, startingAt: track)
play()
}) {
Text(track.title)
}
}
}
.task {
do {
tracks = try await album.with(.tracks).tracks ?? []
} catch {
print(error)
}
}
}
private func play() {
Task {
do {
try await player.play()
} catch {
print(error)
}
}
}
}
Topic:
Media Technologies
SubTopic:
General
Tags: