如何使用 OS X MusicPlayer 知道 MIDI 文件何时完成

Posted

技术标签:

【中文标题】如何使用 OS X MusicPlayer 知道 MIDI 文件何时完成【英文标题】:How to know when MIDI file has finished with OS X MusicPlayer 【发布时间】:2018-04-14 21:22:04 【问题描述】:

我希望能够播放作为资源包含在我的应用程序中的 MIDI 文件。给定资源的名称(减去 .MID)文件扩展名,我有一个非常简单的函数来执行此操作:

MusicPlayer  musicPlayer;
MusicSequence  sequence;
int MusicPlaying=0;

void PlayMusic(char *fname)

    OSStatus    res=noErr;

    res = NewMusicPlayer(&musicPlayer);
    res = NewMusicSequence(&sequence);
    strcpy(TmpPath, "MUSIC/");
    strcat(TmpPath, fname);
    strcat(TmpPath, ".MID");
    NSString *iName = [NSString stringWithUTF8String:TmpPath];
    NSURL   *url = [[NSBundle mainBundle] URLForResource:iName withExtension:nil];

    res = MusicSequenceFileLoad (sequence, (__bridge CFURLRef _Nonnull)(url), 0, kMusicSequenceLoadSMF_ChannelsToTracks);
    res = MusicPlayerSetSequence(musicPlayer, sequence);
    res = MusicPlayerStart(musicPlayer);

    if( res==noErr ) MusicPlaying = 1;

这一切都很好,花花公子,只需要很少的代码......问题是我不知道如何知道 MIDI 文件何时完成播放。我已经尝试过 MusicPlayerIsPlaying() (它总是在文件完成后很长时间返回 true)。我试过检查 MusicPlayerGetTime(),但 MIDI 完成后时间计数仍在继续。我找不到任何方法可以通过这种方式或任何其他方式获得通知,以确定实际的 MIDI 数据是否已完成播放。

有什么想法吗?

【问题讨论】:

【参考方案1】:

Apple 的 PlaySequence example 展示了如何做到这一点:

你必须通过获取每个音轨的长度来确定序列的长度:

MusicSequenceGetTrackCount(sequence, &ntracks);
for (UInt32 i = 0; i < ntracks; ++i) 
    result = MusicSequenceGetIndTrack(sequence, i, &track);
    result = MusicTrackGetProperty(track, kSequenceTrackProperty_TrackLength,
                    &trackLength, &propsize);
    if (trackLength > sequenceLength)
        sequenceLength = trackLength;

然后等到你到达那个时间:

while (1) 
    usleep (2 * 1000 * 1000);
    result = MusicPlayerGetTime(player, &time);
    if (time >= sequenceLength)
        break;

【讨论】:

谢谢,CL!这让我“度过了难关”。

以上是关于如何使用 OS X MusicPlayer 知道 MIDI 文件何时完成的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS X Terminal 101:终端使用初级教程

AudioToolbox MusicPlayer 改程序没有效果

播放多乐器 MIDI 文件

如何运行使用 xCode 构建的 OS X 应用程序以查看依赖项是不是有效

ubuntu 如何我刚刚安装好 现在连一些基本的东西都不知道 希望大家能告诉我它怎么美化成 mac os x那样

在 Mac OS X 中卸载软件包