AVAudioPlayer comenzó desde llamadas de retorno de C ++ llamadas audioPlayerDidFinish Jugando de algún modo tarde

¿Podrías darme algún consejo sobre dónde podría ser el problema? Soy muy nuevo en ObjC, así que me quedé atrapado.

Utilizo una biblioteca construida en C ++ que genera varios sonidos y me gustaría reproducir estos sonidos usando AVAudioPlayer. Sin embargo, observo algún tipo de comportamiento sorprendente de audioPlayerDidFinishPlaying. Lo ilustraré en el siguiente ejemplo.

Este es mi file .h (con el material irrelevante omitido):

#import <AVFoundation/AVFoundation.h> @interface mytest_appViewController : UIViewController <AVAudioPlayerDelegate> { AVAudioPlayer *player; .... } void HaveSoundCallback(const short *psSamples, long lSamplesNum, void *pOwner); .... @property (nonatomic, retain) AVAudioPlayer *player; @end 

Y esta es una parte de la implementación:

 .... #import "MyCplusplusSoundGeneratingLibrary.h" .... - (IBAction)GoButtonTouched:(UIButton *)sender{ // calling the C++ made GenerateSound and passing it the callback int ret=GenerateSound(couple_of_parameters, HaveSoundCallback, self); } 

En general, no sé cuántos sonidos generará la function GenerateSound (por cada llamada), pero siempre que produce uno, llama a HaveSoundCallback que se supone que debe cuidarlo (también envía "self" como "propietario" de El sonido).

Ahora esta es la implementación de callbacks (está en el mismo .mm pero fuera de @implementation … @ end):

 void HaveSoundCallback(const short *psSamples, long lSamplesNum, void *pOwner){ NSString *OutWave; NSLog(@"Entenetworking the callback function"); OutWave=[pOwner getDocumentFile:@"out.wav"]; [pOwner SaveSoundData:OutWave pcm:psSamples len:lSamplesNum]; [pOwner PlaySound:OutWave]; [OutWave release]; } 

Significa que la function de callback guarda los datos de sonido en un wav (llamando a SaveSoundData) y luego llama a PlaySound para reproducirlos. La implementación PlaySound y audioPlayerDidFinishPlaying están nuevamente en la class mytest_appViewController:

 - (void)PlaySound:(NSString *)WaveFile{ NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:WaveFile]; NSLog(@"Playing started"); self.player =[[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; self.player.delegate = self; [self.player play]; while (self.player.playing) { sleep(0.01); } [fileURL release]; NSLog(@"Playing finished"); } - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)p successfully:(BOOL)flag { NSLog(@"hi from audioPlayerDidFinishPlaying"); } 

Espero intencionalmente aquí en el bucle while para evitar que el jugador reproduzca todos los posibles sonidos que vuelven al mismo time; otra callback ocurre después de que el reproductor deja de reproducir el sonido actual. Pero me gustaría activar el juego terminado por player.delegate. Entonces, para mis propósitos experimentales (y ObjC "autodidacta") implementé el delegado de audioPlayerDidFinishPlaying.

Y ahora la situación de testing: digamos que GenerateSound produce 3 sonidos (con breves demoras entre ellos). Espero que la console de salida sea algo como:

 Entenetworking the callback function Playing started hi from audioPlayerDidFinishPlaying Playing finished Entenetworking the callback function Playing started hi from audioPlayerDidFinishPlaying Playing finished Entenetworking the callback function Playing started hi from audioPlayerDidFinishPlaying Playing finished 

Pero en lugar de esto, el audioPlayerDidFinishPlaying se llama al final 3 veces, es decir:

 Entenetworking the callback function Playing started Playing finished Entenetworking the callback function Playing started Playing finished Entenetworking the callback function Playing started Playing finished hi from audioPlayerDidFinishPlaying hi from audioPlayerDidFinishPlaying hi from audioPlayerDidFinishPlaying 

¿Qué hago mal? ¿Por qué no se ejecuta el audioPlayerDidFinishPlaying inmediatamente cuando la reproducción realmente finaliza y, en cambio, se astack en algún lugar y se ejecuta 3 veces al final?

¿Tiene algo que ver con el hecho de que el progtwig está realmente todo el time dentro de la function de biblioteca de C ++ GenerateSound y, por lo tanto, el audioPlayerDidFinishPlaying se ejecuta tan pronto como se deja GenerateSound? Y si es así, ¿hay alguna manera mejor de implementar la funcionalidad que me gustaría get?

Muchas gracias de antemano por cualquier ayuda!