2013-03-22 2 views
9

SimpleAudioEngine을 사용하고 있으며 계속하기 전에 사운드 효과가 끝나면 감지하려고합니다.사운드 효과가 끝나는 시점을 감지하는 방법은 무엇입니까?

나는 어떤 방법을 찾고 있는데, 구현하려고하는 것이 작동하지 않습니다!

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

float seconds = [engine bufferDurationInSeconds:soundId]; 

bufferDurationInSeconds를 사용할 때마다 float 값 -1이 변수 seconds에 반환됩니다. 구현을 검사하고 ID가 유효하지 않은 경우 -1을 반환하지만 ID가 유효하면 100 %입니다.

이 문제에 대해 도움을 주실 수 있습니까? 아니면 사운드 효과의 끝을 감지하는 다른 방법을 제안 해 주실 수 있습니까?

+0

[This (http://www.cocos2d-iphone.org/forum/topic/13178)]가 올바른 방향으로 안내 할 수 있습니다. – jverrijt

답변

9

Violà! CDSoundSource를 얻고, 그 다음 soundId가 작동합니다.

(두 번째 줄은 선택 사항이며 소리 만 재생합니다.)

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

또한 재생이 끝났을 때 바로 메소드를 실행하려면 초 결과를 사용하는 NSTimer를 사용하십시오.

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

마지막 방법은 무엇인가를 구현합니다. 이 -1 결과에 영향을주지 않습니다,하지만

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

, 나는 soundId 변수가 문제를 일으킬 것 같은 줄의 코드에서 두 개의 서로 다른 종류의, 두 배 나타나는 것을 지적해야한다. 걱정하지 마라, 나는 위의 방법을 성공으로 테스트했다.

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

좋은 해결 방법 –

+0

Brilliant! 나는 이것에 대한 답을 찾기 위해 열심히 노력했다. – Hahnemann