俺様用メモ
iOS SDKでは、iPod.appみたいな音楽プレイヤや動画の再生とかなんとかはまるっとフレームワークにまとまっています。MediaPlayer.frameworkがそれ。とりあえずここでは音楽プレイヤとしての話を。
使い方
ヘッダにMPMusicPlayerController *musicPlayer;などとインスタンスをつくる文をかいておき、viewDidLoadなどのタイミングで、
[self setMusicPlayer:[MPMusicPlayerController iPodMusicPlayer]];
としておけば、musicPlayerがiPodのライブラリなどとのやりとりをやってくれます。お手軽。
再生と停止
IBActionで受け取った先に、
[musicPlayer play]
[musicPlayer pause]
[musicPlayer stop]
とするだけ。なんて簡単なのでしょう。
いま再生している曲の情報を取り出す
[musicPlayer nowPlayingItem]
でいま再生している曲をつかまえるので、そこから次のようにして欲しい情報を取り出します。
[[musicPlayer nowPlayingItem] valueForProperty:MPMediaItemPropertyTitle];
この例は曲名を取り出す場合。MPMediaItemProperty〜の部分を変えると取り出せるものが変わります。詳しくはデベロッパドキュメントを参照ください。アートワークもとれるよ。
再生している曲がかわったら、曲名表示も書き換えたい
コードのなかで"書き換えろ!"と書かない限り、UILabelなんかに映している曲名は曲がかわってもずっと同じままです。曲がかわったことにアプリが気づく→曲の情報を取り直す という手順で、自動的に書き換えることができるようになります。
じゃあどうやって曲が変わったことに気がつけばいいのか。そこでNSNotificationクラスの力を借ります。このクラス自体の詳しい仕組みは他のサイトにまかせますので、ここではどんな流れになっているのかを書いておきます。
- NSNotificationCenterに、曲がかわったときに動かしてほしいメソッドと、プレイヤのインスタンスを登録する。
- プレイヤのインスタンスに、曲が替わったらNSNotificationCenterに知らせるよう伝える。
- 曲が替わったらNSNotificationCenterにプレイヤから連絡が出て、メソッドを実行する。
といった流れ。これをコードに直すとこうなります。
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
selector:@selector(updatePlayingMusicInfo:)
name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object:musicPlayer];
[musicPlayer beginGeneratingPlaybackNotifications];
まずNSNotificationCenterをつくっておくところから。そのCenterにselectorとしてメソッド名を、nameにメソッドを実行するタイミングを、objectにプレイヤをそれぞれ登録する。Centerに伝えるよう仕向けるのはそのあとのbeginGeneratingPlaybackNotificationsで。これで曲の切り替わりと同時に情報を書き換えてくれるようになります。
nameに指定するフラグも、デベロッパドキュメントにはもっといろんなタイミングでできるとあります。そちらを参照ください。