2013-09-16 3 views
4

У меня есть серия коротких (1 секунд) звуковых клипов, которые мне нужно играть последовательно. Для этой цели разрабатывается класс. Я использую следующий код:iOS AVAudioPlayer Странное поведение

- (void) playClip: (NSData *)clipToPlay 
{ 
    NSError *error = nil; 
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData: clipToPlay error:&error]; 
    audioPlayer.numberOfLoops = 0; 
    audioPlayer.volume = 1.0f; 
    [audioPlayer prepareToPlay]; 

    if (audioPlayer == nil) 
     NSLog(@"%@", [error description]); 
    else 
     [audioPlayer play]; 
} 

Как можно видеть, clipToPlay содержит звуковой клип как NSData. Поведение этого кода странно. Если я бегу в отладчике и установить точку останова в следующей строке:

[audioPlayer play]; 

клип играет, как и ожидалось - отладчик останавливается на линии, когда вы шаг через линию, клип отлично играет , Если, однако, я беру точку останова, она вообще не играет.

Сначала я попытался скопировать NSData в файл с нуля, с точно таким же результатом. Я также скопировал clipToPlay в другую переменную (используя копию, а не просто назначение указателя) с одинаковыми результатами (я думал, что, возможно, ClipToPlay куда-то клонился). Я не получаю сообщение об ошибке.

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

ответ

5

Хорошо, я нашел эту проблему, поэтому я отвечу на свой вопрос, так что, возможно, это спасет кого-то еще некоторое время по дороге.

Проблема заключалась в том, что AVAudioPlayer освобождался, прежде чем у него была возможность воспроизвести звук. Когда он остановился в точке останова, была очевидная возможность воспроизвести звук до того, как он был освобожден.

В этом случае, поскольку он был в своем собственном подклассе, я сделал audioPlayer ivar И я сделал переменную, содержащую ссылку на подкласс ivar в контроллере вызывающего вида. Это предотвратило освобождение, пока звук не был воспроизведен.

В подклассе я NIL указатель аудиоплеера в методе делегата:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 

я не уверен, что окончательная форма этого устройства будет, но это по крайней мере, объяснил, что причиной проблемы. Экземпляр AVAudioPlayer должен находиться в своем объеме до тех пор, пока звук не закончится, или ARC не освободит его.

+1

Благодарим вас за отправку решения! это помогло мне сегодня. –

Смежные вопросы