記事一覧

MPMusicPlayer : Rewind and standby at song's end

自分のアプリはいちどに一つの曲しか扱わないのだけど、MPMusicPlayerは基本的に複数の曲を扱う仕様になってる。
これがちょっと面倒なんだな;

再生してる曲が終わると MPMusicPlayerController は次の曲に行こうとする。次の曲がキューにあれば nowPlayingItem に次の曲の mediaItem がセットされるのだけど、次の曲が無い場合は nowPlayingItem は nil になる。
queueに1曲しか無い場合、曲が最後まで行ったまま放っておくと必ず nil になってしまうわけで、そのままだともう一度その曲をプレイすることができなくなってしまう。

解決策は簡単っちゃあ簡単で、曲が終わったのを検知して nowPlayingItem をセットし直せば良い。ただ、そのためには
MPMusicPlayerControllerNowPlayingItemDidChangeNotification を扱うセレクタを記述して、あと通知センター登録とかごにょごにょしなきゃいけないし、あと mediaItem をインスタンス変数として保持したりしなきゃいけない。
こういうのって Bad Access の原因になるからイヤなんだよなぁ・・・

MPMusicRepeatMode に MPMusicRepeatModeOne_RewindAndStop みたいのがありさえすればすごく楽なんだけどな・・・

My app deals with only one song at a time, while MPMusicPlayer is designed for playing multiple songs;
This mismatch makes my app slightly more complex.

When the currently playing song comes to its end MPMusicPlayerController tries to move to the next song.
If there is the next song in the queue nowPlayingItem will be set to its mediaItem variable, but if there is none nowPlayingItem will be set to nil.
The problem here is, my queue always contains only one song, so nowPlayingItem will be reset to nil everytime you play a song to the end, and you cannot replay the song.

The solution is pretty simple to say : reset the nowPlayingItem when the player has finished playing, but to do this you have to write the selector to receive MPMusicPlayerControllerNowPlayingItemDidChangeNotification and some other codes to make it work.
And you also have to retain the mediaItem variable of the song as the instance variable.
I don't like this kind of thing because it often causes the Bad Access error...

It will be much easier only if MPMusicRepeatMode had something like MPMusicRepeatModeOne_RewindAndStop.