AVAudioPlayer вешает все приложение - PullRequest
0 голосов
/ 22 апреля 2009

Я использую AVAudioPlayer для воспроизведения звуковых эффектов в игре для iPhone. Это часть моего кода:

AVAudioPlayer *player = [dict objectForKey:@"Player"];
if (player.playing) {
    player.currentTime = 0;
} else {
    [player play];
}

Один звук, который можно воспроизводить многократно и очень часто, поскольку он воспроизводится на основе взаимодействия с пользователем. Когда пользователь двигает пальцем, я несколько раз вызываю этот фрагмент кода.

Если вы это сделаете, приложение зависнет, и это ошибка, которую я получаю в журнале сбоев:

0   libSystem.B.dylib               0x3146bb18 semaphore_timedwait_signal_trap + 8
1   libSystem.B.dylib               0x3146297c semaphore_timedwait_signal + 8
2   libSystem.B.dylib               0x3145f0fe _pthread_cond_wait + 898
3   libSystem.B.dylib               0x3145f25a pthread_cond_timedwait_relative_np + 10
4   AudioToolbox                    0x348ddd50 CAGuard::WaitFor(unsigned long long) + 116
5   AudioToolbox                    0x3491b94c ClientAudioQueue::ServicePendingCallbacks() + 232
6   AudioToolbox                    0x3491ba60 AudioQueueReset + 44
7   AVFoundation                    0x34d16668 -[AVAudioPlayer setCurrentTime:] + 444

Это выглядит как проблема с блокировкой внутри AVAudioPlayer, и я не смог ее решить. Я пробовал с разными звуковыми форматами (CAFF и IMA4), и оба не сработали одинаково.

Есть указатель? Я действительно хотел бы придерживаться AVAudioPlayer, поскольку его гораздо проще использовать, чем Audio Queues, но мне нужны звуки для воспроизведения, а не для сбоя приложения.

Ответы [ 2 ]

0 голосов
/ 28 октября 2009

Вы пробовали вызвать stop до сброса currentTime, а затем вызвать play? Редактирование вашего примера:

if (player.playing) {
    [player stop];
    player.currentTime = 0;
    [player play];
} else {
    [player play];
}

Я понятия не имею, так ли это, но, возможно, сброс currentTime во время воспроизведения звука может вызвать проблемы с блокировкой. Документы, конечно, не предупреждают ни об этом, ни о чем.

0 голосов
/ 09 сентября 2009

Я не смог найти способ решить эту проблему. Я решил эту проблему, используя вместо этого OpenAL для своих нужд звука.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...