如何知道 MIDI 文件何时完成 OS X MusicPlayer
How to know when MIDI file has finished with OS X MusicPlayer
我希望能够播放作为资源包含在我的应用程序中的 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() (它总是 returns true,文件完成后很长时间)。我试过检查 MusicPlayerGetTime(),但在 MIDI 完成后时间计数仍在继续。我无法找到任何方式从这个或任何其他方式获得通知以确定实际 MIDI 数据已播放完毕。
有什么想法吗?
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;
}
我希望能够播放作为资源包含在我的应用程序中的 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() (它总是 returns true,文件完成后很长时间)。我试过检查 MusicPlayerGetTime(),但在 MIDI 完成后时间计数仍在继续。我无法找到任何方式从这个或任何其他方式获得通知以确定实际 MIDI 数据已播放完毕。
有什么想法吗?
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; }