私はcocos2dを使用しています。次のオーディオを再生するために現在のオーディオが終了するのを待つ方法は?SimpleAudioEngineでは作成できません。
2 に答える
http://www.cocos2d-iphone.org/api-ref/0.99.0/interface_c_d_sound_engine.html
CDAudioEngineを使用します。それはあなたが望む方法を持っています。ちなみに、SimpleAudioEngineはCDAudioEngineを使用してサウンドを再生しています。
編集
ボタンが最初にクリックされたとき-サウンドを再生し、サウンドの間隔をlass変数の一部に保存します。次に、次のクリックでこの変数を使用して「十分な間隔」を決定します。または、最大値を使用します。
編集 2SimpleAudioEngineの実装を見ると、CDSoundEngineを使用してサウンドを再生していることがわかります。SimpleAudioEngineのinitメソッドは次のとおりです。
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;
}
したがって、CDSoundEngineにもアクセスできます。
CDSoundEngine *engine = [CDAudioManager sharedManager].soundEngine;
SimpleAudioEngineでplayEffectメソッドを呼び出すとき(ボタンがクリックされたとき)、返されたサウンドIDを保存します。
ALuint soundId = [[SimpleAudioEngine sharedEngine] playEffect:...];
これで、CDSoundEngineを使用して間隔を取得できます。
float seconds = [engine bufferDurationInSeconds:soundId];
それが答えです!
ちなみに、サウンドIDがわかっている場合は、CDSoundEngineを使用してサウンドを停止することもできます。
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
cocos2D0.99.5を使用しています
実装:
-(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;
}
}
//サウンドを再生するにはAluintsoundID= [[SimpleAudioEngine sharedEngine] playEffect:@ "sound.mp3"];
//サウンドを停止するには、再生時に同じsoundIDを使用する必要があります[[SimpleAudioEngine sharedEngine] stopEffect:soundID];