How to wait to finish the current sound to play the next sound?

I work with cocos2d. How to wait to finish the current sound to play the next sound? I cannot do this with SimpleAudioEngine.

+4
source share
2 answers

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_; //For managing dynamic allocation of sources and buffers int sourceTotal_; int bufferTotal; } @property (readwrite, nonatomic) ALfloat masterGain; @property (readonly) ALenum lastErrorCode;//Last OpenAL error code that was generated @property (readonly) BOOL functioning;//Is the sound engine functioning @property (readwrite) float asynchLoadProgress; @property (readonly) BOOL getGainWorks;//Does getting the gain for a source work /** Total number of sources available */ @property (readonly) int sourceTotal; /** Total number of source groups that have been defined */ @property (readonly) int sourceGroupTotal; /** Sets the sample rate for the audio mixer. For best performance this should match the sample rate of your audio content */ +(void) setMixerSampleRate:(Float32) sampleRate; /** Initializes the engine with a group definition and a total number of groups */ -(id)init; /** Plays a sound in a channel group with a pitch, pan and gain. The sound could played looped or not */ -(ALuint) playSound:(int) soundId sourceGroupId:(int)sourceGroupId pitch:(float) pitch pan:(float) pan gain:(float) gain loop:(BOOL) loop; /** Creates and returns a sound source object for the specified sound within the specified source group. */ -(CDSoundSource *) soundSourceForSound:(int) soundId sourceGroupId:(int) sourceGroupId; /** Stops playing a sound */ - (void) stopSound:(ALuint) sourceId; /** Stops playing a source group */ - (void) stopSourceGroup:(int) sourceGroupId; /** Stops all playing sounds */ -(void) stopAllSounds; -(void) defineSourceGroups:(NSArray*) sourceGroupDefinitions; -(void) defineSourceGroups:(int[]) sourceGroupDefinitions total:(int) total; -(void) setSourceGroupNonInterruptible:(int) sourceGroupId isNonInterruptible:(BOOL) isNonInterruptible; -(void) setSourceGroupEnabled:(int) sourceGroupId enabled:(BOOL) enabled; -(BOOL) sourceGroupEnabled:(int) sourceGroupId; -(BOOL) loadBufferFromData:(int) soundId soundData:(ALvoid*) soundData format:(ALenum) format size:(ALsizei) size freq:(ALsizei) freq; -(BOOL) loadBuffer:(int) soundId filePath:(NSString*) filePath; -(void) loadBuffersAsynchronously:(NSArray *) loadRequests; -(BOOL) unloadBuffer:(int) soundId; -(ALCcontext *) openALContext; /** Returns the duration of the buffer in seconds or a negative value if the buffer id is invalid */ -(float) bufferDurationInSeconds:(int) soundId; /** Returns the size of the buffer in bytes or a negative value if the buffer id is invalid */ -(ALsizei) bufferSizeInBytes:(int) soundId; /** Returns the sampling frequency of the buffer in hertz or a negative value if the buffer id is invalid */ -(ALsizei) bufferFrequencyInHertz:(int) soundId; /** Used internally, never call unless you know what you are doing */ -(void) _soundSourcePreRelease:(CDSoundSource *) soundSource; @end 

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; } } 
+3
source

// Play the sound Aluint soundID = [[SimpleAudioEngine sharedEngine] playEffect: @ "sound.mp3"];

// to stop the sound you need to use the same sound when you play it [[SimpleAudioEngine sharedEngine] stopEffect: soundID];

0
source

Source: https://habr.com/ru/post/1342094/


All Articles