Here is how my two views are laid out:
Essentially my goal is to have VC2
start 'fresh' every time, with everything new, including a MPMusicPlayerController
. I was under the impression that an unwindsegue
removed the instance of the new view as well as it's resources but the music player is not being stopped.
Before VC2
ends, it runs a function that deregisters all the media player notifications and sets the music player itself = nil. However I can still hear the music playing when it returns back to VC1
and when I create a new instance of VC2
my 'new' music player controller doesn't work (no notifications are registered).
Some code:
Music player is instantiated (VC2
):
- (void)viewDidLoad
{
[super viewDidLoad];
musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
[self registerMediaPlayerNotifications];
}
Register notifications:
- (void) registerMediaPlayerNotifications
{
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver: self
selector: @selector (handle_NowPlayingItemChanged:)
name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object: musicPlayer];
[notificationCenter addObserver: self
selector: @selector (handle_PlaybackStateChanged:)
name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
object: musicPlayer];
[notificationCenter addObserver: self
selector: @selector (handle_VolumeChanged:)
name: MPMusicPlayerControllerVolumeDidChangeNotification
object: musicPlayer];
[musicPlayer beginGeneratingPlaybackNotifications];
}
Snippet from getNextSong
MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:test forProperty:MPMediaEntityPropertyPersistentID];
MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate: predicate];
NSArray *queryResults = [query items];
for (MPMediaItem *song in queryResults) {
[musicPlayer setQueueWithQuery:query];
[musicPlayer play];
}
Code that is executed before VC2
is 'unwound':
- (IBAction)reset:(id)sender {
[[NSNotificationCenter defaultCenter] removeObserver: self
name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object: musicPlayer];
[[NSNotificationCenter defaultCenter] removeObserver: self
name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
object: musicPlayer];
[[NSNotificationCenter defaultCenter] removeObserver: self
name: MPMusicPlayerControllerVolumeDidChangeNotification
object: musicPlayer];
[musicPlayer endGeneratingPlaybackNotifications];
[musicPlayer stops];
musicPlayer = nil;
[self performSegueWithIdentifier:@"resetRoom" sender:self];
}
Even though im setting it to nil
, the music continues to play, which tells me its not actually being destroyed.
EDIT: To be more specific, the second time I instantiate a new copy of VC2
the following if
statement is not executing:
- (void) handle_PlaybackStateChanged: (id) notification
{
MPMusicPlaybackState playbackState = [musicPlayer playbackState];
if(playbackState == MPMusicPlaybackStateStopped)
[self getNextSong];
[self playbackButton];
}
I have verified with the debugger that the playbackState
is 0
both times I instantiate. However the second time, the if
statement never happens.