背景
AVAudioPlayerDelegateのaudioPlayerDidFinishPlayingメソッドでは、音楽の再生が終わったことを検知することができるが、次の曲を再生する方法がわからなかった。
解決方法
以下のようにすることで実現できた。
1.現在再生中のインデックスを保持する。
2.MPMediaItemCollectionから次の曲を取り出して設定する。
3.最後の曲を再生した場合は曲を停止する。
Player.h
@interface Player : UIViewController <AVAudioPlayerDelegate>
@property (nonatomic) AVAudioPlayer *player;
@property (nonatomic) MPMediaItemCollection *mediaItems;
@property (nonatomic) NSInteger currentItem;
@end
Player.m
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
[self play];
}
- (void)play {
// 曲情報はmediaItemsに追加済み
if (self.currentItem >= self.mediaItems.count) {
// 停止する
[self.player stop];
self.player = nil;
return;
}
// 次に再生したい曲情報をMPMediaItemに設定する
MPMediaItem *item = [[self.mediaItems items] objectAtIndex:self.currentItem];
NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
self.player.delegate = self;
[self.player play];
self.currentItem++;
}