http://www.cocos2d-iphone.org/api-ref/0.99.0/interface_c_d_sound_engine.html
use CDAudioEngine. It has the method you want. By the way, SimpleAudioEngine uses CDAudioEngine to play sounds.
EDIT
When your button is pressed for the first time - play the sound and save the interval of the sound signal for some of your lava variable. Then, in the next click, use this variable to determine the "sufficient interval". Or just use some maximum.
EDIT 2 If you look at the implementation of SimpleAudioEngine, you will notice that it uses CDSoundEngine to play sounds. Here is an example of the SimpleAudioEngine method:
static SimpleAudioEngine *sharedEngine = nil; static CDSoundEngine* soundEngine = nil; static CDAudioManager *am = nil; static CDBufferManager *bufferManager = nil; -(id) init { if((self=[super init])) { am = [CDAudioManager sharedManager]; soundEngine = am.soundEngine; bufferManager = [[CDBufferManager alloc] initWithEngine:soundEngine]; mute_ = NO; enabled_ = YES; } return self; }
Thus, we can also access CDSoundEngine:
CDSoundEngine *engine = [CDAudioManager sharedManager].soundEngine;
When calling the playEffect method on SimpleAudioEngine (by pressing a button), save the returned sound identifier.
ALuint soundId = [[SimpleAudioEngine sharedEngine] playEffect:...];
Now we can get the interval using our CDSoundEngine:
float seconds = [engine bufferDurationInSeconds:soundId];
This is the answer!
By the way, you can also stop the sound using CDSoundEngine, if you know the sound identifier.
From CocosDenshion.h
@class CDSoundSource; @interface CDSoundEngine : NSObject <CDAudioInterruptProtocol> { bufferInfo *_buffers; sourceInfo *_sources; sourceGroup *_sourceGroups; ALCcontext *context; int _sourceGroupTotal; UInt32 _audioSessionCategory; BOOL _handleAudioSession; BOOL mute_; BOOL enabled_; ALfloat _preMuteGain; ALenum lastErrorCode_; BOOL functioning_; float asynchLoadProgress_; BOOL getGainWorks_;
I am using cocos2D 0.99.5
implementation:
-(float) bufferDurationInSeconds:(int) soundId { if ([self validateBufferId:soundId]) { float factor = 0.0f; switch (_buffers[soundId].format) { case AL_FORMAT_MONO8: factor = 1.0f; break; case AL_FORMAT_MONO16: factor = 0.5f; break; case AL_FORMAT_STEREO8: factor = 0.5f; break; case AL_FORMAT_STEREO16: factor = 0.25f; break; } return (float)_buffers[soundId].sizeInBytes/(float)_buffers[soundId].frequencyInHertz * factor; } else { return -1.0f; } }