MusicPlayer代表,音乐播放器结束播放文件通知或警告

时间:2013-12-30 17:47:56

标签: ios objective-c xcode midi coremidi

我正在编写一个应用程序,它将从已解析的URL播放MIDI文件。目前,我的代码会下载该文件,然后使用 MusicPlayer 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;
    });

});

我正在寻找的是文件到达时的通知,类似于AVPlayer:

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

这可能吗?我一直在浏览Apple的文档,但找不到任何东西。

文档:MusicSequence ReferenceMusicPlayer Reference

2 个答案:

答案 0 :(得分:0)

我不记得有任何内置的方法可以做到这一点,但您可以通过自己轮询播放状态轻松实现它。 CADisplayLink是一个内置的计时器,如果您正在更新进度条或进行其他屏幕绘制(或者像我一样懒惰),您可能想要使用它。

答案 1 :(得分:-1)

面对同样的问题并四处搜寻,我认为没有办法做到这一点。