有没有人能够在IOS9 Beta上循环播放MIDI文件?一旦我尝试通过在MusicTrackLoopInfo中将numberOfLoops设置为0来循环,它会通过向播放器发送随机MIDI来锁定应用程序.我已经报道了,但我想知道是否有人找到了解决方法.所有其他iOS版本的代码完全相同.
MusicTrackLoopInfo loopInfo;
loopInfo.loopDuration = loopLength;
loopInfo.numberOfLoops = 0;
Run Code Online (Sandbox Code Playgroud)
好吧,我刚刚听说 iOS9 将会附带这个错误。糟糕的。
这是一个解决方法。
根本不设置 numberOfLoops,或者设置 numberOfLoops = 1;// 表示循环一次 现在创建一个变量(即 myVariableToKeepTrackOfAddedCopies)来跟踪您实际执行以下操作的次数:
在 MIDIReadProc 中,在曲目播放完毕之前的某个时刻,执行以下操作:
// Copy the track to itself - effectively doubling the length
MusicTrack theTrack=nil;
MusicTrackGetProperty(theTrack, kSequenceTrackProperty_TrackLength, &trackLen, &trackLenLen);
trackLen = 4.0; //<-- this is your real track length
MusicTrackCopyInsert(theTrack, 0, trackLen, theTrack, 0);
myVariableToKeepTrackOfAddedCopies++;
Run Code Online (Sandbox Code Playgroud)
因此,现在您的曲目在结束之前的长度是原来的两倍,并且曲目将继续。这与循环的工作方式相同,只是您会占用更多内存,因为每次迭代后都会使轨道长度更长。
当您停止序列/轨道时,将轨道剪切回原始大小。
MusicTrackCut(theTrack, 4.0, 4.0 + (4.0*myVariableToKeepTrackOfAddedCopies));
MusicTrackGetProperty(theTrack, kSequenceTrackProperty_TrackLength, &trackLen, &trackLenLen);
Run Code Online (Sandbox Code Playgroud)
令人恼火,但它有效。我刚刚在 iOS9 beta 5 上进行了验证。希望它有帮助。