MusicPlayer Delegate, Music Player Did End Playing File Notification or Warning

490 views Asked by At

I am writing an app that will play MIDI files from parsed URL's. Currently, my code downloads the file then plays it using MusicPlayer and MusicSequence.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                             (unsigned long)NULL), ^(void) {
    NSData *midData = [[NSData alloc] initWithContentsOfURL:playURL];
    NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];
    NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"part.mid"];

    [midData writeToFile:filePath atomically:YES];
    NSLog(@"Downloaded");

    dispatch_async(dispatch_get_main_queue(), ^{
        NSURL *url = [NSURL fileURLWithPath:filePath];
        MusicSequence s;
        NewMusicSequence(&s);
        MusicSequenceFileLoad(s, (__bridge CFURLRef)(url), 0, 0);
        NewMusicPlayer(&midPlayer);
        MusicPlayerSetSequence(midPlayer, s);
        MusicPlayerPreroll(midPlayer);

        MusicPlayerStart(midPlayer);

        MusicTrack t;
        MusicTimeStamp len;
        UInt32 sz = sizeof(MusicTimeStamp);
        MusicSequenceGetIndTrack(s, 1, &t);
        MusicTrackGetProperty(t, kSequenceTrackProperty_TrackLength, &len, &sz);
        midPlaying = YES;
    });

});

What I'm looking for is a notification when the file reached its end, similar to something like AVPlayer:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];

Is this possible? I've been looking through Apple's documentation and cannot find anything.

Documentation: MusicSequence Reference, MusicPlayer Reference

2

There are 2 answers

1
spring On

I don't recall ever seeing any built in way to do that but you can easily implement it through polling playback status on your own. CADisplayLink is a built in timer you might want to use if you are updating a progress bar or doing other screen drawing (or are just lazy like me).

0
Guillaume Laurent On

Being confronted to the same problem and having searched around, I don't think there's a way of doing that.