У меня есть приложение, которое интенсивно использует аудио. Я использую AVAudioPlayers, чтобы упростить задачу.
Время от времени я замечал сбои при использовании плееров, обычно когда я звоню [player play]. Трассировка стека выглядит примерно так:
EXC_BAD_ACCESS
#0 0x32d531e6 in memmove$VARIANT$CortexA8 ()
#1 0x351056dc in Cached_DataSource::ReadFromHeaderCache ()
#2 0x351052a4 in Cached_DataSource::ReadBytes ()
#3 0x350ba47c in AudioFileObject::ReadBytes ()
#4 0x35104562 in AudioFileObject::ReadPacketDataVBR ()
#5 0x35102c70 in AudioFileObject::ReadPacketData ()
#6 0x351020b2 in AudioFileReadPacketData ()
#7 0x36bad1b8 in AudioPlayerAQOutputCallbackCore ()
#8 0x36bad7a4 in prepareToPlayQueue ()
#9 0x36bad954 in playQueue ()
#10 0x36bac27e in -[AVAudioPlayer play] ()
У меня установлены точки останова при каждом вызове dealloc, поэтому я знаю, что не случайно освобождаю игрока, делегата или подобное.
Игроки иногда останавливаются до того, как они воспроизводят свой полный звук, поэтому я всегда делаю вызов [player setCurrentTime: 0] перед игрой. Я не уверен, может ли это вызвать негативные побочные эффекты.
Очевидно, аудио-очередь пытается получить доступ к недопустимой памяти, но судя по тому, что память живет в коде файлового кэша, находится далеко внизу, поэтому я не вижу, как что-то, что я делаю, повлияет на это. Все файлы, которые я играю, включены в основной комплект как ресурсы.
Я создал репродукцию, которая надежно воспроизводит ее в симуляторе 4.1 и на моем устройстве 5.0.1. Это может занять некоторое время и сотни вызовов setCurrentTime, воспроизвести и остановить до его сбоя.
Мне нужно докопаться до сути. Я могу начать переносить весь свой код для использования аудио-очередей или чего-то еще, если это необходимо, но я хочу убедиться, что я не пропускаю что-то или что я могу сделать иначе, чтобы сделать это более стабильным.