2013-03-22 16 views
9

Używam SimpleAudioEngine i próbuję wykryć, czy efekt dźwiękowy zostanie zakończony przed kontynuowaniem.Jak wykrywać, kiedy kończy się odtwarzanie dźwięku?

Szukam jakiejkolwiek metody, ale ta, którą próbuję zaimplementować, nie działa!

CDSoundEngine *engine = [CDAudioManager sharedManager].soundEngine;  
ALuint soundId = [[SimpleAudioEngine sharedEngine] playEffect:soundId]; 

float seconds = [engine bufferDurationInSeconds:soundId]; 

Za każdym razem, gdy używam metody bufferDurationInSeconds, zwraca ona wartość zmiennoprzecinkową -1 do zmiennych sekund. Sprawdziłem implementację i zwraca -1, gdy identyfikator jest nieprawidłowy, ale w 100% identyfikator jest ważny!

Czy ktoś może mi pomóc w tym problemie lub zaproponować mi inny sposób wykrywania końca efektu dźwiękowego?

+0

[To] (http://www.cocos2d-iphone.org/forum/topic/13178) może poprowadzić Cię w dobrym kierunku. – jverrijt

Odpowiedz

9

Violà! Uzyskiwanie CDSoundSource, a następnie SoundId z tego działa.

(Druga linia jest opcjonalna, po prostu odtwarza dźwięk).

CDSoundEngine *engine = [CDAudioManager sharedManager].soundEngine; 
[[SimpleAudioEngine sharedEngine] playEffect:@"soundeffect.m4a"]; 
CDSoundSource *aSound =[[SimpleAudioEngine sharedEngine] soundSourceForFile:@"soundeffect.m4a"]; 
float seconds = [engine bufferDurationInSeconds:aSound.soundId]; 

Aby uruchomić metodę zaraz po zakończeniu gry, użyłbym NSTimer, który używa sekundy.

[NSTimer scheduledTimerWithTimeInterval:seconds target:self selector:@selector(aMethod) userInfo:nil repeats:NO]; 

A potem ostatnia metoda implementuje coś.

-(void)aMethod 
{ 
NSLog(@"finished playing"); 
} 

Mimo to nie ma wpływu na wynik -1, muszę podkreślić, że zmienna soundId pojawia się dwa razy w dwóch różnych rodzajach w kodzie, w tej samej linii, co spowoduje problemy. Nie martwię się jednak, przetestowałem powyższą metodę z powodzeniem.

ALuint **soundId** = [[SimpleAudioEngine sharedEngine] playEffect:**soundId**]; 
+0

ładne obejście –

+0

Genialne! Próbowałem znaleźć odpowiedź na to pytanie. – Hahnemann

Powiązane problemy