如何让 AudioToolbox MusicTrack 在 iOS 9.0 中循环播放?
Posted
技术标签:
【中文标题】如何让 AudioToolbox MusicTrack 在 iOS 9.0 中循环播放?【英文标题】:how to get the AudioToolbox MusicTrack to loop in iOS 9.0? 【发布时间】:2015-09-18 05:26:14 【问题描述】:此代码适用于在 ios 8.4 中循环 MusicTrack,但在 iOS 9.0 下使用 MusicPlayerSetSequence 设置序列时会停止应用程序
var loopInfo = MusicTrackLoopInfo(loopDuration: 1.0,numberOfLoops: 0)
MusicTrackSetProperty(track, UInt32(kSequenceTrackProperty_LoopInfo), &loopInfo, UInt32(sizeofValue(loopInfo)))
还有其他方法可以让曲目在 iOS 9 中循环播放吗?
【问题讨论】:
【参考方案1】:其他人也有类似的问题:https://forums.developer.apple.com/thread/9940 当前解决方法的总体思路是,一旦播放标记到达轨道的末尾,就将其设置回 0。
例如,在您用来启动音乐播放器的方法中使用它:
MusicTrack track = NULL;
MusicTimeStamp trackLen = 0;
UInt32 trackLenLen = sizeof(trackLen);
//Get main track
MusicSequenceGetIndTrack(musicSequence, 0, &track);
//Get length of track
MusicTrackGetProperty(track, kSequenceTrackProperty_TrackLength, &trackLen, &trackLenLen);
//Create UserData for User Event with any data
static MusicEventUserData userData = 1, 0x09;
//Put new user event at the end of the track
MusicTrackNewUserEvent(track, trackLen, &userData);
//Set a callback for when User Events occur
MusicSequenceSetUserCallback(musicSequence, sequenceUserCallback, musicPlayer);
然后你可以有一个回调函数:
static void sequenceUserCallback(void *inClientData,
MusicSequence inSequence,
MusicTrack inTrack,
MusicTimeStamp inEventTime,
const MusicEventUserData *inEventData,
MusicTimeStamp inStartSliceBeat,
MusicTimeStamp inEndSliceBeat)
[[NSOperationQueue mainQueue] addOperationWithBlock:^
MusicPlayerSetTime((MusicPlayer) inClientData, 0.0);
];
这将使玩家回到零。
【讨论】:
谢谢,我也在关注那个帖子。不过,您建议的解决方法对我没有帮助。我在我的应用程序中使用循环来计时节拍器 - 所以没有循环就没有计时。 我现在正在寻找一个工作回合,所以如果我找到了一些有用的东西,我会发布它,我们会看看它是否对你也有帮助 我已经添加了对我有用的东西,如果它也对你有用,请告诉我。以上是关于如何让 AudioToolbox MusicTrack 在 iOS 9.0 中循环播放?的主要内容,如果未能解决你的问题,请参考以下文章
如何制作 SystemSoundID 数组?使用 AudioToolbox 框架