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

发表于2015-12-02
评论0 2.7k浏览

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

  1. 我们上一篇中分析的音效部分的预加载和播放函数,这一篇来分析下其他函数:  
  2. 1、  
  3. 暂停某个播放中的音效  
  4. //注意这里的nSoundId不是java端的soundID,而是streamID  
  5. //不要被参数的名字迷惑了。  
  6. void SimpleAudioEngine::pauseEffect(unsigned int nSoundId)  
  7. {  
  8.     pauseEffectJNI(nSoundId);  
  9. }  
  10. -->>  
  11.  void pauseEffectJNI(unsigned int nSoundId)  
  12.     {  
  13.         // void pauseEffect(int)  
  14.           
  15.         JniMethodInfo methodInfo;  
  16.           
  17.         if (! getStaticMethodInfo(methodInfo, "pauseEffect""(I)V"))  
  18.         {  
  19.             return ;  
  20.         }  
  21.           
  22.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, (int)nSoundId);  
  23.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  24.     }  
  25. ---->>//java端方法:  
  26. //pStreamID 这个参数,是调用unsigned int SimpleAudioEngine::playEffect()放回的StreamID  
  27. public void pauseEffect(final int pStreamID) {  
  28.          /** 
  29.          * Pause a playback stream. 暂停一个播放流 
  30.          * 
  31.          * Pause the stream specified by the streamID. This is the 
  32.          * value returned by the play() function. (这个值是play函数的返回值)If the stream is 
  33.          * playing, it will be paused. If the stream is not playing 
  34.          * (e.g. is stopped or was previously paused), calling this 
  35.          * function will have no effect.(如果处于播放状态则暂停,如果不处于播放状态,则无效) 
  36.          * 
  37.          * @param streamID a streamID returned by the play() function 
  38.          */  
  39.         this.mSoundPool.pause(pStreamID);  
  40.     }  
  41. 2、  
  42.  暂停所有音效  
  43.  void pauseAllEffectsJNI()  
  44.     {  
  45.         // void pauseAllEffects()  
  46.           
  47.         JniMethodInfo methodInfo;  
  48.           
  49.         if (! getStaticMethodInfo(methodInfo, "pauseAllEffects""()V"))  
  50.         {  
  51.             return ;  
  52.         }  
  53.           
  54.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);  
  55.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  56.     }  
  57.  --->>java端  
  58.       
  59.  public void pauseAllEffects() {  
  60.       /** 
  61.          * Pause all active streams. //暂停所有正在播放的音效 
  62.          * 
  63.          * Pause all streams that are currently playing. This function 
  64.          * iterates through all the active streams and pauses any that 
  65.          * are playing. It also sets a flag so that any streams that 
  66.          * are playing can be resumed by calling autoResume(). 
  67.          */  
  68.           this.mSoundPool.autoPause();  
  69.     }  
  70.   
  71. 3、  
  72.  恢复播放某个音效  
  73.  void resumeEffectJNI(unsigned int nSoundId)  
  74.     {  
  75.         // void resumeEffect(int)  
  76.           
  77.         JniMethodInfo methodInfo;  
  78.           
  79.         if (! getStaticMethodInfo(methodInfo, "resumeEffect""(I)V"))  
  80.         {  
  81.             return ;  
  82.         }  
  83.           
  84.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, (int)nSoundId);  
  85.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  86.     }  
  87.     --->>  
  88.     public void resumeEffect(final int pStreamID) {  
  89.         /** 
  90.          * Resume a playback stream. 
  91.          * 只有处于暂停状态的stream,才可以恢复播放。 
  92.          * Resume the stream specified by the streamID. This 
  93.          * is the value returned by the play() function. If the stream 
  94.          * is paused, this will resume playback. If the stream was not 
  95.          * previously paused, calling this function will have no effect. 
  96.          * 
  97.          * @param streamID a streamID returned by the play() function 
  98.          */  
  99.         this.mSoundPool.resume(pStreamID);  
  100.     }  
  101. 4、  
  102. void resumeAllEffectsJNI()  
  103.     {  
  104.         // void resumeAllEffects()  
  105.           
  106.         JniMethodInfo methodInfo;  
  107.           
  108.         if (! getStaticMethodInfo(methodInfo, "resumeAllEffects""()V"))  
  109.         {  
  110.             return ;  
  111.         }  
  112.           
  113.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);  
  114.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  115.     }  
  116. ---->>>java端函数:  
  117.     public void resumeAllEffects() {  
  118.         // can not only invoke SoundPool.autoResume() here, because  
  119.         // it only resumes all effects paused by pauseAllEffects()  
  120.         // 这里注释的很清楚  
  121.         if (!this.mPathStreamIDsMap.isEmpty()) {  
  122.             final Iterator<entry<string, arraylist>> iter = this.mPathStreamIDsMap.entrySet().iterator();  </entry<string, arraylist
  123.             while (iter.hasNext()) {  
  124.                 final Entry<string, arraylist> entry = iter.next();  </string, arraylist
  125.                 for (final int pStreamID : entry.getValue()) {  
  126.                     this.mSoundPool.resume(pStreamID);  
  127.                 }  
  128.             }  
  129.         }  
  130.     }  
  131. 5、  
  132. 停止播放某个音效,这里的nSoundId同样是pStreamID,停止播放的音效是不能  
  133. 通过resume恢复播放的。  
  134. void SimpleAudioEngine::stopEffect(unsigned int nSoundId)  
  135. {  
  136.     stopEffectJNI(nSoundId);  
  137. }  
  138. --->>java端:  
  139. public void stopEffect(final int pStreamID) {  
  140.                   /** 
  141.              * Stop a playback stream. 
  142.              * 
  143.              * Stop the stream specified by the streamID. This 
  144.              * is the value returned by the play() function. If the stream 
  145.              * is playing, it will be stopped. It also releases any native 
  146.              * resources associated with this stream. (会释放对应的资源)If the stream is not 
  147.              * playing, it will have no effect. 
  148.              * 
  149.              * @param streamID a streamID returned by the play() function 
  150.              */  
  151.         this.mSoundPool.stop(pStreamID);  
  152.   
  153.         // remove record  
  154.         // 从记录列表中移除  
  155.         for (final String pPath : this.mPathStreamIDsMap.keySet()) {  
  156.             if (this.mPathStreamIDsMap.get(pPath).contains(pStreamID)) {  
  157.                 this.mPathStreamIDsMap.get(pPath).remove(this.mPathStreamIDsMap.get(pPath).indexOf(pStreamID));  
  158.                 break;  
  159.             }  
  160.         }  
  161.     }  
  162. 6、  
  163. void stopAllEffectsJNI()  
  164.     {  
  165.         // void stopAllEffects()  
  166.           
  167.         JniMethodInfo methodInfo;  
  168.           
  169.         if (! getStaticMethodInfo(methodInfo, "stopAllEffects""()V"))  
  170.         {  
  171.             return ;  
  172.         }  
  173.           
  174.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);  
  175.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  176.     }  
  177. --->>>java端  
  178.     @SuppressWarnings("unchecked")  
  179.     public void stopAllEffects() {  
  180.         // stop effects,停止所有音效的播放  
  181.         if (!this.mPathStreamIDsMap.isEmpty()) {  
  182.             final Iterator iter = this.mPathStreamIDsMap.entrySet().iterator();  
  183.             while (iter.hasNext()) {  
  184.                 final Map.Entry<string, arraylist> entry = (Map.Entry<string, arraylist>) iter.next();  </string, arraylist</string, arraylist
  185.                 for (final int pStreamID : entry.getValue()) {  
  186.                     this.mSoundPool.stop(pStreamID);  
  187.                 }  
  188.             }  
  189.         }  
  190.   
  191.         // remove records,清空播放记录  
  192.         this.mPathStreamIDsMap.clear();  
  193.     }  
  194.   
  195. 7、  
  196. 卸载加载的音效(重要)  
  197. //pszFilePath:音效文件名  
  198. void SimpleAudioEngine::unloadEffect(const char* pszFilePath)  
  199. {  
  200.     std::string fullPath = getFullPathWithoutAssetsPrefix(pszFilePath);  
  201.     unloadEffectJNI(fullPath.c_str());  
  202. }  
  203. --->>  
  204.  void unloadEffectJNI(const char* path)  
  205.     {  
  206.         // void unloadEffect(String)  
  207.           
  208.         JniMethodInfo methodInfo;  
  209.           
  210.         if (! getStaticMethodInfo(methodInfo, "unloadEffect""(Ljava/lang/String;)V"))  
  211.         {  
  212.             return ;  
  213.         }  
  214.           
  215.         jstring stringArg = methodInfo.env->NewStringUTF(path);  
  216.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg);  
  217.         methodInfo.env->DeleteLocalRef(stringArg);  
  218.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  219.     }  
  220. --->>>  
  221. public void unloadEffect(final String pPath) {  
  222.         // stop effects  
  223.         // 先停止  
  224.         final ArrayList streamIDs = this.mPathStreamIDsMap.get(pPath);  
  225.         if (streamIDs != null) {  
  226.             for (final Integer pStreamID : streamIDs) {  
  227.                 this.mSoundPool.stop(pStreamID);  
  228.             }  
  229.         }  
  230.         this.mPathStreamIDsMap.remove(pPath);  
  231.   
  232.         // unload effect  
  233.         final Integer soundID = this.mPathSoundIDMap.get(pPath);  
  234.         if(soundID != null){  
  235.   
  236.                 /** 
  237.                  * Unload a sound from a sound ID. 
  238.                  * 
  239.                  * Unloads the sound specified by the soundID. This is the value 
  240.                  * returned by the load() function. Returns true if the sound is 
  241.                  * successfully unloaded, false if the sound was already unloaded. 
  242.                  * 
  243.                  * @param soundID a soundID returned by the load() function 
  244.                  * @return true if just unloaded, false if previously unloaded 
  245.                  */  
  246.             // 卸载音效  
  247.             this.mSoundPool.unload(soundID);  
  248.             // 从mPathSoundIDMap中移除  
  249.             this.mPathSoundIDMap.remove(pPath);  
  250.         }  
  251.     }  
  252.   
  253. /************************************************ 
  254. 总结: 
  255. 音效部分最重要的函数是preloadEffect,unloadEffect,playEffect,stopAllEffects 
  256. 其他的感觉不是很常用,java有两个比较重要的map,一个是: 
  257. private final HashMap mPathSoundIDMap = new HashMap(); 
  258. 这个是用来存放所有加载的音效文件路径和SoundID的map。 
  259. 一个是: 
  260.     // sound path and stream ids map cocos2dx原本注释 
  261.     // a file may be played many times at the same time 
  262.     // so there is an array map to a file path 
  263. private final HashMap<string, arraylist> mPathStreamIDsMap = new HashMap<string, arraylist>();</string, arraylist</string, arraylist 
  264. 用来存放所有播放的音效文件路径和StreamIDs的map。 
  265. 注意:这里的SoundID和StreamID不是一个概念,一个音效文件只对应一个SoundID,而却可以对应多个StreamID,因为一个 
  266. 音效文件可以播放多次(StreamID),但是只需要加载一次(SoundID). 
  267.  
  268.  
  269. ************************************************/  

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: