Я делаю счетную игру для детей. В начале ребенка просят найти несколько предметов, например: «Можете ли вы найти пять велосипедов». Все это случайным образом собрано из отдельных массивов звуков с частями предложения: «Вы можете найти« + »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 рано, хотя звук еще не финиширован. Я пробовал не автореализовать, а явно выделял функцию делегата. Но проблема в том, что звук не всегда добирается до конца (когда ребенок находит новый элемент до того, как голос закончит чтение) ...
Может ли кто-нибудь из вас пролить свет на это. Я буду очень признателен!