![]()
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
@interface ViewController : UIViewController<MPMediaPickerControllerDelegate, UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UILabel *infoLabel;
@property (weak, nonatomic) IBOutlet UISlider *volumeSlider;
@property (weak, nonatomic) IBOutlet UIButton *playButton;
@property (weak, nonatomic) IBOutlet UITextField *artistTextField;
@property (strong, nonatomic) MPMediaItemCollection *myCollection;
@property (strong, nonatomic) MPMusicPlayerController *player;
- (IBAction)addItems:(id)sender;
- (IBAction)prevTapped:(id)sender;
- (IBAction)playTapped:(id)sender;
- (IBAction)nextTapped:(id)sender;
- (IBAction)updateVolume:(id)sender;
- (IBAction)queueMusicByArtist:(id)sender;
@end
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize infoLabel;
@synthesize volumeSlider;
@synthesize playButton;
@synthesize artistTextField;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.infoLabel.text = @"...";
self.player = [MPMusicPlayerController applicationMusicPlayer];
[self setNotifications];
[self.player beginGeneratingPlaybackNotifications];
[self.player setShuffleMode:MPMusicShuffleModeOff];
self.player.repeatMode = MPMusicRepeatModeNone;
self.volumeSlider.value = self.player.volume;
self.artistTextField.delegate = self;
self.artistTextField.enablesReturnKeyAutomatically = YES;
}
-(void)setNotifications
{
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter
addObserver: self
selector: @selector(handleNowPlayingItemChanged:)
name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object: self.player];
[notificationCenter
addObserver: self
selector: @selector(handlePlaybackStateChanged:)
name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
object: self.player];
[notificationCenter
addObserver: self
selector: @selector(handleVolumeChangedFromHardware:)
name: @"AVSystemController_SystemVolumeDidChangeNotification"
object: nil];
}
-(void)handleVolumeChangedFromHardware:(id)sender
{
[self.volumeSlider setValue:self.player.volume animated:YES];
}
- (void) handlePlaybackStateChanged: (id) notification
{
MPMusicPlaybackState playbackState = [self.player playbackState];
if (playbackState == MPMusicPlaybackStateStopped)
{
[self.playButton setTitle:@"Play" forState:UIControlStateNormal];
}
else if (playbackState == MPMusicPlaybackStatePaused)
{
[self.playButton setTitle:@"Play" forState:UIControlStateNormal];
}
else if (playbackState == MPMusicPlaybackStatePlaying)
{
[self.playButton setTitle:@"Pause" forState:UIControlStateNormal];
}
}
- (void) handleNowPlayingItemChanged: (id) notification
{
MPMediaItem *currentItemPlaying = [self.player nowPlayingItem];
if (currentItemPlaying)
{
NSString *info = [NSString stringWithFormat:@"%@ - %@", [currentItemPlaying valueForProperty:MPMediaItemPropertyTitle], [currentItemPlaying valueForProperty:MPMediaItemPropertyArtist]];
self.infoLabel.text = info;
}
else
{
self.infoLabel.text = @"...";
}
}
-(void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
{
[self dismissViewControllerAnimated:YES completion:NULL];
}
-(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
[self updateQueueWithMediaItemCollection:mediaItemCollection];
[self dismissViewControllerAnimated:YES completion:NULL];
}
-(void)updateQueueWithMediaItemCollection:(MPMediaItemCollection *)collection
{
if (collection)
{
if (self.myCollection == nil)
{
self.myCollection = collection;
[self.player setQueueWithItemCollection: self.myCollection];
[self.player play];
}
else
{
BOOL wasPlaying = NO;
if (self.player.playbackState == MPMusicPlaybackStatePlaying)
{
wasPlaying = YES;
}
MPMediaItem *nowPlayingItem = self.player.nowPlayingItem;
NSTimeInterval currentPlaybackTime = self.player.currentPlaybackTime;
NSMutableArray *combinedMediaItems =
[[self.myCollection items] mutableCopy];
NSArray *newMediaItems = [collection items];
[combinedMediaItems addObjectsFromArray: newMediaItems];
self.myCollection = [MPMediaItemCollection collectionWithItems:combinedMediaItems];
[self.player setQueueWithItemCollection:self.myCollection];
self.player.nowPlayingItem = nowPlayingItem;
self.player.currentPlaybackTime = currentPlaybackTime;
if (wasPlaying)
{
[self.player play];
}
}
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)addItems:(id)sender
{
MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
picker.delegate = self;
picker.allowsPickingMultipleItems = YES;
picker.prompt =
NSLocalizedString (@"Add songs to play",
"Prompt in media item picker");
[self presentViewController:picker animated:YES completion:NULL];
}
- (IBAction)prevTapped:(id)sender
{
if ([self.player currentPlaybackTime] > 5.0)
{
[self.player skipToBeginning];
}
else
{
[self.player skipToPreviousItem];
}
}
- (IBAction)playTapped:(id)sender
{
if ((self.myCollection != nil) && (self.player.playbackState != MPMusicPlaybackStatePlaying))
{
[self.player play];
[self.playButton setTitle:@"Pause" forState:UIControlStateNormal];
}
else if (self.player.playbackState == MPMusicPlaybackStatePlaying)
{
[self.player pause];
[self.playButton setTitle:@"Play" forState:UIControlStateNormal];
}
}
- (IBAction)nextTapped:(id)sender
{
[self.player skipToNextItem];
}
- (IBAction)updateVolume:(id)sender
{
self.player.volume = self.volumeSlider.value;
}
- (IBAction)queueMusicByArtist:(id)sender
{
NSString *artist = self.artistTextField.text;
if (artist != nil && artist != @"")
{
MPMediaPropertyPredicate *artistPredicate = [MPMediaPropertyPredicate predicateWithValue:artist forProperty:MPMediaItemPropertyArtist comparisonType:MPMediaPredicateComparisonContains];
MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate:artistPredicate];
NSArray *result = [query items];
if ([result count] > 0)
{
[self updateQueueWithMediaItemCollection:[MPMediaItemCollection collectionWithItems:result]];
}
else
self.infoLabel.text = @"Artist Not Found.";
}
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
[self queueMusicByArtist:self];
return NO;
}