cocos2dx 音频模块分析(3): 背景音乐部分

发表于2015-12-02
评论0 1k浏览
  1. 我在(2)已经分析了背景音乐文件的预加载preloadBackgroundMusic和播放playBackgroundMusic两个函数,  
  2. 这里接着分析,还是基于android平台:  
  3. 1、  
  4. //暂停函数,用于音乐的暂停  
  5. void SimpleAudioEngine::pauseBackgroundMusic()  
  6. {  
  7.     //在SimpleAudioEngineJni.cpp源文件中定义  
  8.     pauseBackgroundMusicJNI();  
  9. }  
  10. //--pauseBackgroundMusicJNI--->>>  
  11. void pauseBackgroundMusicJNI()  
  12.     {  
  13.         // void pauseBackgroundMusic()  
  14.           
  15.         JniMethodInfo methodInfo;  
  16.           
  17.         if (! getStaticMethodInfo(methodInfo, "pauseBackgroundMusic""()V"))  
  18.         {  
  19.             return;  
  20.         }  
  21.         //通过jni调用java端的函数,调用的是Cocos2dxHelper类中的  
  22.     /* 
  23.     public static void pauseBackgroundMusic() { 
  24.         Cocos2dxHelper.sCocos2dMusic.pauseBackgroundMusic(); 
  25.     } 
  26.     */  
  27.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);  
  28.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  29.     }  
  30.   
  31.     最终调用的是Cocos2dxMusic类中的  
  32.     public void pauseBackgroundMusic() {  
  33.                 //mBackgroundMediaPlayer在(2)中有分析过,创建的MediaPlayer实例  
  34.         if (this.mBackgroundMediaPlayer != null && this.mBackgroundMediaPlayer.isPlaying()) {  
  35.             this.mBackgroundMediaPlayer.pause();  
  36.             this.mPaused = true;  //是否暂停标志  
  37.         }  
  38.     }  
  39.   
  40. 2、  
  41. 恢复播放  
  42. void SimpleAudioEngine::resumeBackgroundMusic()  
  43. {  
  44.     resumeBackgroundMusicJNI();  
  45. }  
  46. 其实和上面暂停的调用过程是一样的,就不分析了,直接进入java端看最终调用的函数,  
  47. public void resumeBackgroundMusic() {  
  48.                 //这里只有处于暂停状态时即mPaused变量为true时,才会接着  
  49.         //上次播放的位置开始播放  
  50.         if (this.mBackgroundMediaPlayer != null && this.mPaused) {  
  51.             this.mBackgroundMediaPlayer.start();  
  52.             this.mPaused = false//把暂停标志位设置false  
  53.         }  
  54.     }  
  55.   
  56. 3、  
  57. 从头开始播放音乐文件  
  58. void rewindBackgroundMusicJNI()  
  59.     {  
  60.         // void rewindBackgroundMusic()  
  61.           
  62.         JniMethodInfo methodInfo;  
  63.           
  64.         if (! getStaticMethodInfo(methodInfo, "rewindBackgroundMusic""()V"))  
  65.         {  
  66.             return;  
  67.         }  
  68.           
  69.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);  
  70.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  71.     }  
  72.     --->>//java端函数  
  73.     //这个函数最终也是会调用playBackgroundMusic函数,但是和playBackgroundMusic有一点不同,  
  74.     //playBackgroundMusic需要传入音乐文件名,可以播放和上一次一样的音乐也可以和是上一次不一样的  
  75.     //音乐,但是rewindBackgroundMusic函数只有在mBackgroundMediaPlayer不为null时才执行,  
  76.     //也就是必须播放过音乐,且播放的是上次播放的音乐,只不过这次是从头开始播放  
  77.     public void rewindBackgroundMusic() {  
  78.         if (this.mBackgroundMediaPlayer != null) {  
  79.             playBackgroundMusic(mCurrentPath, mIsLoop);  
  80.         }  
  81.     }  
  82.   
  83. 4、停止播放音乐文件  
  84. void stopBackgroundMusicJNI()  
  85.     {  
  86.         // void stopBackgroundMusic()  
  87.           
  88.         JniMethodInfo methodInfo;  
  89.           
  90.         if (! getStaticMethodInfo(methodInfo, "stopBackgroundMusic""()V"))  
  91.         {  
  92.             return;  
  93.         }  
  94.           
  95.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);  
  96.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  97.     }  
  98.   
  99.     --->>>//java端函数:  
  100.     public void stopBackgroundMusic() {  
  101.         if (this.mBackgroundMediaPlayer != null) {  
  102.             mBackgroundMediaPlayer.release();  
  103.             //不太明白这里为什么有从新创建了MediaPlayer实例  
  104.             //可能是一些特殊情况下会出现问题?  
  105.             mBackgroundMediaPlayer = createMediaplayer(mCurrentPath);  
  106.   
  107.             // should set the state, if not, the following sequence will be error  
  108.             // play -> pause -> stop -> resume  
  109.             //为什么设置mPaused标志,直接看上面的英文注释  
  110.             this.mPaused = false;  
  111.         }  
  112.     }  
  113. 5、  
  114. 返回是否处于播放状态  
  115.  bool isBackgroundMusicPlayingJNI()  
  116.     {  
  117.         // boolean rewindBackgroundMusic()  
  118.           
  119.         JniMethodInfo methodInfo;  
  120.         jboolean ret = false;  
  121.           
  122.         if (! getStaticMethodInfo(methodInfo, "isBackgroundMusicPlaying""()Z"))  
  123.         {  
  124.             return ret;  
  125.         }  
  126.           
  127.         ret = methodInfo.env->CallStaticBooleanMethod(methodInfo.classID, methodInfo.methodID);  
  128.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  129.           
  130.         return ret;  
  131.     }  
  132.     --->>>//java端函数,没什么东西  
  133.         public boolean isBackgroundMusicPlaying() {  
  134.         boolean ret = false;  
  135.   
  136.         if (this.mBackgroundMediaPlayer == null) {  
  137.             ret = false;  
  138.         } else {  
  139.             ret = this.mBackgroundMediaPlayer.isPlaying();  
  140.         }  
  141.   
  142.         return ret;  
  143.     }  
  144. 6、获取播放声音音量值  
  145.     float getBackgroundMusicVolumeJNI()  
  146.     {  
  147.         // float getBackgroundMusicVolume()  
  148.           
  149.         JniMethodInfo methodInfo;  
  150.         jfloat ret = -1.0;  
  151.           
  152.         if (! getStaticMethodInfo(methodInfo, "getBackgroundMusicVolume""()F"))  
  153.         {  
  154.             return ret;  
  155.         }  
  156.           
  157.         ret = methodInfo.env->CallStaticFloatMethod(methodInfo.classID, methodInfo.methodID);  
  158.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  159.           
  160.         return ret;  
  161.     }  
  162. ------->>>//java  
  163.         public float getBackgroundVolume() {  
  164.         if (this.mBackgroundMediaPlayer != null) {  
  165.             return (this.mLeftVolume   this.mRightVolume) / 2;  
  166.         } else {  
  167.             return 0.0f;  
  168.         }  
  169.     }  
  170.   
  171.  7、设置声音音量值  
  172.     void setBackgroundMusicVolumeJNI(float volume)  
  173.     {  
  174.         // void setBackgroundMusicVolume()  
  175.           
  176.         JniMethodInfo methodInfo;  
  177.           
  178.         if (! getStaticMethodInfo(methodInfo, "setBackgroundMusicVolume""(F)V"))  
  179.         {  
  180.             return ;  
  181.         }  
  182.           
  183.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, volume);  
  184.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  185.     }  
  186.    ---->>>java  
  187.    public void setBackgroundVolume(float pVolume) {  
  188.         if (pVolume < 0.0f) {  
  189.             pVolume = 0.0f;  
  190.         }  
  191.   
  192.         if (pVolume > 1.0f) {  
  193.             pVolume = 1.0f;  
  194.         }  
  195.   
  196.         this.mLeftVolume = this.mRightVolume = pVolume;  
  197.         if (this.mBackgroundMediaPlayer != null) {  
  198.             this.mBackgroundMediaPlayer.setVolume(this.mLeftVolume, this.mRightVolume);  
  199.         }  
  200.     }  
  201.   
  202. 8、  
  203. end函数,这个一般在退出游戏是调用,关掉所有的音乐和音效。  
  204.  void endJNI()  
  205.     {  
  206.         // void end()  
  207.           
  208.         JniMethodInfo methodInfo;  
  209.           
  210.         if (! getStaticMethodInfo(methodInfo, "end""()V"))  
  211.         {  
  212.             return ;  
  213.         }  
  214.           
  215.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);  
  216.         methodInfo.env->DeleteLocalRef(methodInfo.classID);  
  217.     }  
  218.     --->>>//java端函数  
  219.     public static void end() {  
  220.         Cocos2dxHelper.sCocos2dMusic.end(); //背景音乐文件的处理  
  221.         Cocos2dxHelper.sCocos2dSound.end();  
  222.     }  
  223.   
  224.     ---->>>>/////背景音乐文件的处理  
  225.     public void end() {  
  226.         if (this.mBackgroundMediaPlayer != null) {  
  227.             this.mBackgroundMediaPlayer.release();  
  228.         }  
  229.                 //把所有的变量恢复初始值  
  230.         /* 
  231.         private void initData() { 
  232.         this.mLeftVolume = 0.5f; 
  233.         this.mRightVolume = 0.5f; 
  234.         this.mBackgroundMediaPlayer = null; 
  235.         this.mPaused = false; 
  236.         this.mCurrentPath = null; 
  237.         } 
  238.          
  239.         */  
  240.         this.initData();  
  241.     }  
  242.       

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

标签: