cocos2dx 音频模块分析(5): 音效部分

cocos2dx 音频模块分析(5): 音效部分,第1张

概述cocos2dx 音频模块分析(5): 音效部分 我们上一篇中分析的音效部分的预加载和播放函数,这一篇来分析下其他函数:1、暂停某个播放中的音效//注意这里的nSoundId不是java端的soundID,而是streamID//不要被参数的名字迷惑了。void SimpleAudioEngine::pauseEffect(unsigned int nSoundId){ pau

cocos2dx 音频模块分析(5): 音效部分

我们上一篇中分析的音效部分的预加载和播放函数,这一篇来分析下其他函数:1、暂停某个播放中的音效//注意这里的nSoundID不是java端的soundID,而是streamID//不要被参数的名字迷惑了。voID SimpleAudioEngine::pauseEffect(unsigned int nSoundID){    pauseEffectJNI(nSoundID);}-->> voID pauseEffectJNI(unsigned int nSoundID)    {        // voID pauseEffect(int)                JniMethodInfo methodInfo;                if (! getStaticmethodInfo(methodInfo,"pauseEffect","(I)V"))        {            return ;        }                methodInfo.env->CallStaticVoIDMethod(methodInfo.classID,methodInfo.methodID,(int)nSoundID);        methodInfo.env->DeleteLocalRef(methodInfo.classID);    }---->>//java端方法://pStreamID 这个参数,是调用unsigned int SimpleAudioEngine::playEffect()放回的StreamIDpublic voID pauseEffect(final int pStreamID) {	     /**	     * Pause a playback stream. 暂停一个播放流	     *	     * Pause the stream specifIEd by the streamID. This is the	     * value returned by the play() function. (这个值是play函数的返回值)If the stream is	     * playing,it will be paused. If the stream is not playing	     * (e.g. is stopped or was prevIoUsly paused),calling this	     * function will have no effect.(如果处于播放状态则暂停,如果不处于播放状态,则无效)	     *	     * @param streamID a streamID returned by the play() function	     */		this.mSoundPool.pause(pStreamID);	}2、 暂停所有音效 voID pauseAllEffectsJNI()    {        // voID pauseAllEffects()                JniMethodInfo methodInfo;                if (! getStaticmethodInfo(methodInfo,"pauseAllEffects","()V"))        {            return ;        }                methodInfo.env->CallStaticVoIDMethod(methodInfo.classID,methodInfo.methodID);        methodInfo.env->DeleteLocalRef(methodInfo.classID);    } --->>java端     public voID pauseAllEffects() {	  /**	     * Pause all active streams. //暂停所有正在播放的音效	     *	     * Pause all streams that are currently playing. This function	     * iterates through all the active streams and pauses any that	     * are playing. It also sets a flag so that any streams that	     * are playing can be resumed by calling autoResume().	     */	      this.mSoundPool.autopause();	}3、 恢复播放某个音效 voID resumeEffectJNI(unsigned int nSoundID)    {        // voID resumeEffect(int)                JniMethodInfo methodInfo;                if (! getStaticmethodInfo(methodInfo,"resumeEffect",(int)nSoundID);        methodInfo.env->DeleteLocalRef(methodInfo.classID);    }    --->>    public voID resumeEffect(final int pStreamID) {	    /**	     * Resume a playback stream.	     * 只有处于暂停状态的stream,才可以恢复播放。	     * Resume the stream specifIEd by the streamID. This	     * is the value returned by the play() function. If the stream	     * is paused,this will resume playback. If the stream was not	     * prevIoUsly paused,calling this function will have no effect.	     *	     * @param streamID a streamID returned by the play() function	     */		this.mSoundPool.resume(pStreamID);	}4、voID resumeAllEffectsJNI()    {        // voID resumeAllEffects()                JniMethodInfo methodInfo;                if (! getStaticmethodInfo(methodInfo,"resumeAllEffects",methodInfo.methodID);        methodInfo.env->DeleteLocalRef(methodInfo.classID);    }---->>>java端函数:	public voID resumeAllEffects() {		// can not only invoke SoundPool.autoResume() here,because		// it only resumes all effects paused by pauseAllEffects()		// 这里注释的很清楚		if (!this.mPathStreamIDsMap.isEmpty()) {			final Iterator<Entry<String,ArrayList<Integer>>> iter = this.mPathStreamIDsMap.entrySet().iterator();			while (iter.hasNext()) {				final Entry<String,ArrayList<Integer>> entry = iter.next();				for (final int pStreamID : entry.getValue()) {					this.mSoundPool.resume(pStreamID);				}			}		}	}5、停止播放某个音效,这里的nSoundID同样是pStreamID,停止播放的音效是不能通过resume恢复播放的。voID SimpleAudioEngine::stopEffect(unsigned int nSoundID){    stopEffectJNI(nSoundID);}--->>java端:public voID stopEffect(final int pStreamID) {                  /**		     * Stop a playback stream.		     *		     * Stop the stream specifIEd by the streamID. This		     * is the value returned by the play() function. If the stream		     * is playing,it will be stopped. It also releases any native		     * resources associated with this stream. (会释放对应的资源)If the stream is not		     * playing,it will have no effect.		     *		     * @param streamID a streamID returned by the play() function		     */		this.mSoundPool.stop(pStreamID);		// remove record		// 从记录列表中移除		for (final String pPath : this.mPathStreamIDsMap.keySet()) {			if (this.mPathStreamIDsMap.get(pPath).contains(pStreamID)) {				this.mPathStreamIDsMap.get(pPath).remove(this.mPathStreamIDsMap.get(pPath).indexOf(pStreamID));				break;			}		}	}6、voID stopAllEffectsJNI()    {        // voID stopAllEffects()                JniMethodInfo methodInfo;                if (! getStaticmethodInfo(methodInfo,"stopAllEffects",methodInfo.methodID);        methodInfo.env->DeleteLocalRef(methodInfo.classID);    }--->>>java端	@SuppressWarnings("unchecked")	public voID stopAllEffects() {		// stop effects,停止所有音效的播放		if (!this.mPathStreamIDsMap.isEmpty()) {			final Iterator<?> iter = this.mPathStreamIDsMap.entrySet().iterator();			while (iter.hasNext()) {				final Map.Entry<String,ArrayList<Integer>> entry = (Map.Entry<String,ArrayList<Integer>>) iter.next();				for (final int pStreamID : entry.getValue()) {					this.mSoundPool.stop(pStreamID);				}			}		}		// remove records,清空播放记录		this.mPathStreamIDsMap.clear();	}7、卸载加载的音效(重要)//pszfilePath:音效文件名voID SimpleAudioEngine::unloadEffect(const char* pszfilePath){    std::string fullPath = getFullPathWithoutAssetsPrefix(pszfilePath);    unloadEffectJNI(fullPath.c_str());}--->> voID unloadEffectJNI(const char* path)    {        // voID unloadEffect(String)                JniMethodInfo methodInfo;                if (! getStaticmethodInfo(methodInfo,"unloadEffect","(Ljava/lang/String;)V"))        {            return ;        }                Jstring stringArg = methodInfo.env->NewStringUTF(path);        methodInfo.env->CallStaticVoIDMethod(methodInfo.classID,stringArg);        methodInfo.env->DeleteLocalRef(stringArg);        methodInfo.env->DeleteLocalRef(methodInfo.classID);    }--->>>public voID unloadEffect(final String pPath) {		// stop effects		// 先停止		final ArrayList<Integer> streamIDs = this.mPathStreamIDsMap.get(pPath);		if (streamIDs != null) {			for (final Integer pStreamID : streamIDs) {				this.mSoundPool.stop(pStreamID);			}		}		this.mPathStreamIDsMap.remove(pPath);		// unload effect		final Integer soundID = this.mPathSoundIDMap.get(pPath);		if(soundID != null){			    /**			     * Unload a sound from a sound ID.			     *			     * Unloads the sound specifIEd by the soundID. This is the value			     * returned by the load() function. Returns true if the sound is			     * successfully unloaded,false if the sound was already unloaded.			     *			     * @param soundID a soundID returned by the load() function			     * @return true if just unloaded,false if prevIoUsly unloaded			     */			// 卸载音效			this.mSoundPool.unload(soundID);			// 从mPathSoundIDMap中移除			this.mPathSoundIDMap.remove(pPath);		}	}/************************************************总结:音效部分最重要的函数是preloadEffect,unloadEffect,playEffect,stopAllEffects其他的感觉不是很常用,java有两个比较重要的map,一个是:private final HashMap<String,Integer> mPathSoundIDMap = new HashMap<String,Integer>();这个是用来存放所有加载的音效文件路径和SoundID的map。一个是:	// sound path and stream IDs map cocos2dx原本注释	// a file may be played many times at the same time	// so there is an array map to a file pathprivate final HashMap<String,ArrayList<Integer>> mPathStreamIDsMap = new HashMap<String,ArrayList<Integer>>();用来存放所有播放的音效文件路径和StreamIDs的map。注意:这里的SoundID和StreamID不是一个概念,一个音效文件只对应一个SoundID,而却可以对应多个StreamID,因为一个音效文件可以播放多次(StreamID),但是只需要加载一次(SoundID).************************************************/
总结

以上是内存溢出为你收集整理的cocos2dx 音频模块分析(5): 音效部分全部内容,希望文章能够帮你解决cocos2dx 音频模块分析(5): 音效部分所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1058889.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存