Да, хорошо иметь много экземпляров AVAudioPlayer
.Я не знаю, сколько лимитов, но это определенно больше дюжины.
Вот некоторые ошибки:
AVAudioPlayer
не делает микширование уровней, так что если ваши звукибольшой объем, они могут в конечном итоге конструктивно мешать друг другу и вызывать искажение формы волны.Я установил максимальный уровень громкости 0,8, чтобы попытаться обойти это, но это ненадежно.
Если вы попытаетесь запустить их все одновременно, использование метода play
может привести к их запуску изсинхронизации.Вместо этого достаточно быстро определить время, которое пользователь не заметит, но достаточно далеко, чтобы дать вашему коду время для выхода и AVFoundation
время для подготовки.Затем используйте [player playAtTime:soon]
.
Вот код, который работает для меня сейчас.YMMV:
-(void)play
{
BOOL success;
AVAudioPlayer *player = self.player;
player.numberOfLoops = -1;
player.currentTime = 0;
player.volume = _volume;
// NSLog(@"deviceCurrentTime=%f", player.deviceCurrentTime);
static double soon = 0;
if (soon < player.deviceCurrentTime) {
soon = player.deviceCurrentTime + 0.5; // why so flakey???
}
success = [player playAtTime:soon]; // too flakey for now
if (!success) {
NSLog(@"player %@ FAILED", player);
} else {
NSLog(@"player %@ %@ playing at: %f", player, [[player.url relativePath] lastPathComponent], soon);
}
}
(я не уверен, что мой вар "soon
" является поточно-ориентированным, и вы должны отрегулировать наклон до тех пор, пока он не будет работать для вас ... 0.1
был слишком быстрымдля меня в тот или иной момент, поэтому я поднял его до 0.5
.)