2010-08-27 2 views
3

Я делаю счетную игру для детей. В начале ребенка просят найти несколько предметов, например: «Можете ли вы найти пять велосипедов». Все это случайным образом собрано из отдельных массивов звуков с частями предложения: «Вы можете найти« + »5« + »bikes» = три отдельных mp3. Когда ребенок начинает нажимать на предметы, они исчезают и голос подсчитывается. «1», «2», «3», «4», «5» и, в конце концов, «велосипеды».Проблема с AVAudioplayer или делегатом, полученным досрочно

Я использую метод audioPlayerDidFinishPlaying: delegate для объединения звуков, и это отлично работает ... в большинстве случаев. Но иногда приложение вылетает с ошибкой «bad_access». После использования NSZombie я получил: - [AVAudioPlayer performSelector: withObject:]: сообщение отправлено на освобожденный экземпляр

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

Я всегда использую эту функцию для воспроизведения звуков:

-(void)spillVoice:(NSString*) filnavn{ 
NSString *audioFilePath=[[NSBundle mainBundle] pathForResource:filnavn ofType:@"mp3"]; 
NSURL *audioFileURL=[NSURL fileURLWithPath:audioFilePath]; 
self.voicespiller=[[[AVAudioPlayer alloc] initWithContentsOfURL:audioFileURL error:nil] autorelease]; 
self.voicespiller.delegate=self; 
[self.voicespiller prepareToPlay]; 
[self.voicespiller play]; 
NSLog(@"spiller lyden"); 

}

А вот делегат (он выполняет различные действия в зависимости от того, что звук finnished):

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)which_player successfully:(BOOL)the_flag{ 
NSLog(@"ny lyd?"); 
[self.jenteBilde stopAnimating]; 
if([email protected]"ingenting"){ 
    NSLog(@"ingenting");  
} 
else if([email protected]"lesobjekt"){ 
    NSLog(@"lesobjekt"); 
    [email protected]"ros"; 
    [self spillVoice:[self.objektNedArray objectAtIndex: [self.objektnr intValue]]]; 
    [self.jenteBilde startAnimating]; 
} 
else if([email protected]"introtall"){ 
    NSLog(@"introtall"); 
    [email protected]"introobjekt"; 
    [self spillVoice:[self.telleOppArray objectAtIndex: [self.tilfeldig intValue]]]; 
    [self.jenteBilde startAnimating]; 
} 
else if([email protected]"introobjekt"){ 
    NSLog(@"introobjekt"); 
    [email protected]"ingenting"; 
    [self spillVoice:[self.objektOppArray objectAtIndex: [self.objektnr intValue]]]; 
    [self.jenteBilde startAnimating]; 
} 
else if([email protected]"ros"){ 
    NSLog(@"ros"); 
    NSMutableArray *rosArray=[[NSMutableArray alloc] initWithObjects:@"TT_flott",@"TT_bravo",@"TT_fint",@"TT_du_er_kjempeflink",@"TT_hurra",@"TT_helt_riktig",nil]; 
    int result=(arc4random() % (rosArray.count)); 
    [email protected]"ingenting"; 
    [self spillVoice:[rosArray objectAtIndex: result]]; 
    [self.jenteBilde startAnimating]; 
} 

}

Мне кажется, что автореферат AVaudioplayers попадает в t рано, хотя звук еще не финиширован. Я пробовал не автореализовать, а явно выделял функцию делегата. Но проблема в том, что звук не всегда добирается до конца (когда ребенок находит новый элемент до того, как голос закончит чтение) ...

Может ли кто-нибудь из вас пролить свет на это. Я буду очень признателен!

ответ

0

Вам необходимо сохранить AVAudioPlayer, пока вы не закончите с ним. Самый простой способ сделать это было бы, чтобы сделать ваше voicespiller имущества удерживаемой собственности и изменить реализацию на следующее:

-(void)spillVoice:(NSString*)filnavn { 
    // stop any previous player 
    [self.voicespiller stop]; 

    NSString *audioFilePath=[[NSBundle mainBundle] pathForResource:filnavn ofType:@"mp3"]; 
    NSURL *audioFileURL=[NSURL fileURLWithPath:audioFilePath]; 

    [self setVoicespiller:[[AVAudioPlayer alloc] initWithContentsOfURL:audioFileURL error:nil] autorelease]; 
    self.voicespiller.delegate=self; 
    [self.voicespiller prepareToPlay]; 
    [self.voicespiller play]; 
    NSLog(@"spiller lyden"); 
} 

При вызове мутатора отеля ([self setVoicespiller:...]), предыдущий игрок будет освобожден и новый будет установлен. Затем просто позвоните по телефону [voicespiller release] в свой метод dealloc.

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