9

SimpleAudioEngineを使用していて、続行する前に効果音の再生が終了したかどうかを検出しようとしています。

任意のメソッドを探していますが、実装しようとしているメソッドが機能しません。

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

float seconds = [engine bufferDurationInSeconds:soundId];

bufferDurationInSecondsを使用するたびに、可変秒に-1のfloat値が返されます。実装を確認したところ、IDが無効な場合は-1が返されますが、IDは100%有効です。

誰かがこの問題について私を助けてくれますか、または効果音の終わりを検出する別の方法を私に提案できますか?

4

1 に答える 1

9

ビオラ!CDSoundSourceを取得し、そこからsoundIdを取得すると機能します。

(2行目はオプションで、サウンドを再生するだけです)。

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];

そして、最後のメソッドは何かを実装します。

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

これは-1の結果には影響しませんが、soundId変数がコード内の2つの異なる種類として同じ行に2回表示されるため、問題が発生することを指摘する必要があります。でも心配はいりません、私は上記の私の方法を成功裏にテストしました。

ALuint **soundId** = [[SimpleAudioEngine sharedEngine] playEffect:**soundId**];
于 2013-03-30T09:50:36.167 に答える