Странное поведение с AVAudioPlayer на iPhone - PullRequest
0 голосов
/ 19 декабря 2009

Я пытаюсь воспроизвести звук с помощью AVAudioPlayer. Должно быть просто, но я вижу некоторые странные результаты.

Код:

NSString *path = [[NSBundle mainBundle] pathForResource:@"pop" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
AVAudioPlayer *sound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[sound play];
[sound release];

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

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

Я не создаю никаких новых потоков или циклов выполнения в моем приложении, поэтому все это должно выполняться в основном потоке, по крайней мере, [NSThread isMainThread] возвращает true.

У кого-нибудь есть идеи относительно того, что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 19 декабря 2009

AVAudioPlayer play метод является асинхронным, поэтому вы начинаете воспроизводить звук, а затем сразу же его отпускаете! Вот почему это работает, когда вы проходите через него в отладчике - вы даете ему время поиграть, прежде чем убить его. То, что вы хотите сделать, это реализовать метод AVAudioPlayerDelegate - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag и освободить там аудиоплеер после завершения воспроизведения звука.

0 голосов
/ 19 декабря 2009

Пападжон прав, вы должны сделать это так

Имейте переменную уровня класса аудиоплеера как

AVAudioPlayer *classLevelPlayer;

синтезировать этот объект. и в методе вызова игрока

-(void)playTheSong{

if(classLevelPlayer!=nil){
[classLevelPlayer stop];
[self setClassLevelPlayer:nil];
}

NSString *path = [[NSBundle mainBundle] pathForResource:@"pop" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];

AVAudioPlayer *sound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

if(sound){
[self setClassLevelPlayer:sound];
[classLevelPlayer play];
}
[sound release];
}

и

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
 [self setClassLevelPlayer:nil];
}

Надеюсь, это поможет.

...