【iOS】iPod Library Accessの使い方(1)曲情報を取得するの続き
再生・停止・曲送り、曲戻し、アーティスト/タイトル/ジャケット写真の表示、ができる簡易な音楽プレイヤーを作りました。
NSNotificationCenterって便利ね。
コード
JPlayerViewController.h
// // JPlayerViewController.h // JPlayer // // Created by jonki on 12/12/26. // Copyright (c) 2012年 jonki. All rights reserved. // #import <UIKit/UIKit.h> #import <MediaPlayer/MediaPlayer.h> @interface JPlayerViewController : UIViewController @property BOOL isPlaying; @property MPMusicPlayerController *player; @property NSNotificationCenter *ncenter; // 各ウィジェットとそれに紐付くIBAction @property (strong, nonatomic) IBOutlet UIButton *nextButton; - (IBAction)pushedNextButton:(id)sender; @property (strong, nonatomic) IBOutlet UIButton *playOrStopButton; - (IBAction)pushedPlayOrStopBUtton:(id)sender; @property (strong, nonatomic) IBOutlet UIButton *prevButton; - (IBAction)pushedPrevButton:(id)sender; @property (strong, nonatomic) IBOutlet UILabel *songInfoLabel; @property (strong, nonatomic) IBOutlet UILabel *artistInfoLabel; @property (strong, nonatomic) IBOutlet UIImageView *artworkImage; @end
JPlayerViewController.m
// // JPlayerViewController.m // JPlayer // // Created by jonki on 12/12/26. // Copyright (c) 2012年 jonki. All rights reserved. // #import "JPlayerViewController.h" @interface JPlayerViewController () @end @implementation JPlayerViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // とりあえず起動時に全曲シャッフルして再生キューにぶっこむ _player = [MPMusicPlayerController applicationMusicPlayer]; [_player setQueueWithQuery:[MPMediaQuery songsQuery]]; [_player setShuffleMode:MPMusicShuffleModeSongs]; [_player play]; _isPlaying = YES; [_playOrStopButton setTitle:@"Ⅱ" forState:UIControlStateNormal]; // Notificationの設定 _ncenter = [NSNotificationCenter defaultCenter]; [_ncenter addObserver:self selector: @selector(handle_PlaybackStateChanged) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:_player]; [_ncenter addObserver:self selector:@selector(handle_NowPlayingItemChanged) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:_player]; [_ncenter addObserver:self selector:@selector(handle_VolumeChanged) name:MPMusicPlayerControllerVolumeDidChangeNotification object:_player]; [_player beginGeneratingPlaybackNotifications]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)viewDidUnload { // Notificationの解除 [_ncenter removeObserver:self]; [_player endGeneratingPlaybackNotifications]; [self setNextButton:nil]; [self setPrevButton:nil]; [self setPlayOrStopButton:nil]; [self setSongInfoLabel:nil]; [self setArtistInfoLabel:nil]; [self setArtworkImage:nil]; [super viewDidUnload]; } #pragma mark 音楽ののNotificationハンドラ - (void)handle_PlaybackStateChanged { NSLog(@"PlaybackSattechanged"); } - (void)handle_NowPlayingItemChanged { NSLog(@"NowPlayingItemChanged"); MPMediaItem *nowPlayingItem = [_player nowPlayingItem]; NSString *artist = [nowPlayingItem valueForProperty:MPMediaItemPropertyArtist]; NSString *title = [nowPlayingItem valueForProperty:MPMediaItemPropertyTitle]; _songInfoLabel.text = title; _artistInfoLabel.text = artist; MPMediaItemArtwork *artwork = [nowPlayingItem valueForProperty:MPMediaItemPropertyArtwork]; UIImage *image = [artwork imageWithSize:CGSizeMake(140.0f, 140.0f)]; [_artworkImage setImage:image]; } - (void)handle_VolumeChanged { NSLog(@"VolumeChanged"); } #pragma mark 音楽の操作 - (IBAction)pushedNextButton:(id)sender { [_player skipToNextItem]; } - (IBAction)pushedPlayOrStopBUtton:(id)sender { if( _isPlaying ) { [_player pause]; [_playOrStopButton setTitle:@"再生" forState:UIControlStateNormal]; //再生マークは機種依存でhatenaに投稿できないので漢字で _isPlaying = NO; } else { [_player play]; [_playOrStopButton setTitle:@"Ⅱ" forState:UIControlStateNormal]; _isPlaying = YES; } } - (IBAction)pushedPrevButton:(id)sender { [_player skipToPreviousItem]; } #pragma mark デバッグプリント用に残してある - (void)showNowPlayingSongInfo { NSLog(@"現在再生中の曲情報を表示する"); MPMediaItem *nowPlayingItem = [_player nowPlayingItem]; NSLog(@"Genre = %@", [nowPlayingItem valueForProperty:MPMediaItemPropertyGenre]); NSLog(@"Album Title = %@", [nowPlayingItem valueForProperty:MPMediaItemPropertyAlbumTitle]); NSLog(@"Artist = %@", [nowPlayingItem valueForProperty:MPMediaItemPropertyArtist]); NSLog(@"Title = %@", [nowPlayingItem valueForProperty:MPMediaItemPropertyTitle]); } - (void)showSongInfoWithSongQuery { NSLog(@"曲名でソートして、全曲リストを表示する"); MPMediaQuery *query = [MPMediaQuery songsQuery]; int counter = 0; for( MPMediaItem *item in [query items]) { NSLog(@"%@", [item valueForProperty:MPMediaItemPropertyTitle]); ++counter; if(counter > 4) break; // 全部出すと多いのでこの辺でbreak } } - (void)showSongInfoWithArtistQuery { NSLog(@"アーティスト名でソートして、全曲リストを表示する"); MPMediaQuery *query = [MPMediaQuery artistsQuery]; int counter = 0; for( MPMediaItem *item in [query items]) { NSLog(@"%@", [item valueForProperty:MPMediaItemPropertyArtist]); ++counter; if(counter > 4) break; // 全部出すと多いのでこの辺でbreak } } - (void)showPlaylistInfo { NSLog(@"プレイリストを表示する"); MPMediaQuery *query = [MPMediaQuery playlistsQuery]; for( MPMediaPlaylist *plist in [query collections] ) { NSLog(@"%@", [plist valueForProperty:MPMediaPlaylistPropertyName]); } } @end