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

我在(2)已经分析了背景音乐文件的预加载preloadBackgroundMusic和播放playBackgroundMusic两个函数,
这里接着分析,还是基于android平台:
1、
//暂停函数,用于音乐的暂停
void SimpleAudioEngine::pauseBackgroundMusic()
{
    //在SimpleAudioEngineJni.cpp源文件中定义
    pauseBackgroundMusicJNI();
}
//--pauseBackgroundMusicJNI--->>>
void pauseBackgroundMusicJNI()
    {
        // void pauseBackgroundMusic()
        
        JniMethodInfo methodInfo;
        
        if (! getStaticmethodInfo(methodInfo,"pauseBackgroundMusic","()V"))
        {
            return;
        }
        //通过jni调用java端的函数,调用的是Cocos2dxHelper类中的
	/*
	public static void pauseBackgroundMusic() {
		Cocos2dxHelper.sCocos2dMusic.pauseBackgroundMusic();
	}
	*/
        methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID);
        methodInfo.env->DeleteLocalRef(methodInfo.classID);
    }

    最终调用的是Cocos2dxMusic类中的
    public void pauseBackgroundMusic() {
                //mBackgroundMediaPlayer在(2)中有分析过,创建的MediaPlayer实例
		if (this.mBackgroundMediaPlayer != null && this.mBackgroundMediaPlayer.isPlaying()) {
			this.mBackgroundMediaPlayer.pause();
			this.mPaused = true;  //是否暂停标志
		}
	}

2、
恢复播放
void SimpleAudioEngine::resumeBackgroundMusic()
{
    resumeBackgroundMusicJNI();
}
其实和上面暂停的调用过程是一样的,就不分析了,直接进入java端看最终调用的函数,public void resumeBackgroundMusic() {
                //这里只有处于暂停状态时即mPaused变量为true时,才会接着
		//上次播放的位置开始播放
		if (this.mBackgroundMediaPlayer != null && this.mPaused) {
			this.mBackgroundMediaPlayer.start();
			this.mPaused = false; //把暂停标志位设置false
		}
	}

3、
从头开始播放音乐文件
void rewindBackgroundMusicJNI()
    {
        // void rewindBackgroundMusic()
        
        JniMethodInfo methodInfo;
        
        if (! getStaticmethodInfo(methodInfo,"rewindBackgroundMusic","()V"))
        {
            return;
        }
        
        methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID);
        methodInfo.env->DeleteLocalRef(methodInfo.classID);
    }
    --->>//java端函数
    //这个函数最终也是会调用playBackgroundMusic函数,但是和playBackgroundMusic有一点不同,
    //playBackgroundMusic需要传入音乐文件名,可以播放和上一次一样的音乐也可以和是上一次不一样的
    //音乐,但是rewindBackgroundMusic函数只有在mBackgroundMediaPlayer不为null时才执行,
    //也就是必须播放过音乐,且播放的是上次播放的音乐,只不过这次是从头开始播放
    public void rewindBackgroundMusic() {
		if (this.mBackgroundMediaPlayer != null) {
			playBackgroundMusic(mCurrentPath,mIsLoop);
		}
	}

4、停止播放音乐文件
void stopBackgroundMusicJNI()
    {
        // void stopBackgroundMusic()
        
        JniMethodInfo methodInfo;
        
        if (! getStaticmethodInfo(methodInfo,"stopBackgroundMusic",methodInfo.methodID);
        methodInfo.env->DeleteLocalRef(methodInfo.classID);
    }

    --->>>//java端函数:
    public void stopBackgroundMusic() {
		if (this.mBackgroundMediaPlayer != null) {
			mBackgroundMediaPlayer.release();
			//不太明白这里为什么有从新创建了MediaPlayer实例
			//可能是一些特殊情况下会出现问题?
        	mBackgroundMediaPlayer = createMediaplayer(mCurrentPath);

			// should set the state,if not,the following sequence will be error
			// play -> pause -> stop -> resume
			//为什么设置mPaused标志,直接看上面的英文注释
			this.mPaused = false;
		}
	}
5、
返回是否处于播放状态
 bool isBackgroundMusicPlayingJNI()
    {
        // boolean rewindBackgroundMusic()
        
        JniMethodInfo methodInfo;
        jboolean ret = false;
        
        if (! getStaticmethodInfo(methodInfo,"isBackgroundMusicPlaying","()Z"))
        {
            return ret;
        }
        
        ret = methodInfo.env->CallStaticBooleanMethod(methodInfo.classID,methodInfo.methodID);
        methodInfo.env->DeleteLocalRef(methodInfo.classID);
        
        return ret;
    }
    --->>>//java端函数,没什么东西
    	public boolean isBackgroundMusicPlaying() {
		boolean ret = false;

		if (this.mBackgroundMediaPlayer == null) {
			ret = false;
		} else {
			ret = this.mBackgroundMediaPlayer.isPlaying();
		}

		return ret;
	}
6、获取播放声音音量值
    float getBackgroundMusicVolumeJNI()
    {
        // float getBackgroundMusicVolume()
        
        JniMethodInfo methodInfo;
        jfloat ret = -1.0;
        
        if (! getStaticmethodInfo(methodInfo,"getBackgroundMusicVolume","()F"))
        {
            return ret;
        }
        
        ret = methodInfo.env->CallStaticFloatMethod(methodInfo.classID,methodInfo.methodID);
        methodInfo.env->DeleteLocalRef(methodInfo.classID);
        
        return ret;
    }
------->>>//java
    	public float getBackgroundVolume() {
		if (this.mBackgroundMediaPlayer != null) {
			return (this.mLeftVolume + this.mRightVolume) / 2;
		} else {
			return 0.0f;
		}
	}

 7、设置声音音量值
    void setBackgroundMusicVolumeJNI(float volume)
    {
        // void setBackgroundMusicVolume()
        
        JniMethodInfo methodInfo;
        
        if (! getStaticmethodInfo(methodInfo,"setBackgroundMusicVolume","(F)V"))
        {
            return ;
        }
        
        methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID,volume);
        methodInfo.env->DeleteLocalRef(methodInfo.classID);
    }
   ---->>>java
   public void setBackgroundVolume(float pVolume) {
		if (pVolume < 0.0f) {
			pVolume = 0.0f;
		}

		if (pVolume > 1.0f) {
			pVolume = 1.0f;
		}

		this.mLeftVolume = this.mRightVolume = pVolume;
		if (this.mBackgroundMediaPlayer != null) {
			this.mBackgroundMediaPlayer.setVolume(this.mLeftVolume,this.mRightVolume);
		}
	}

8、
end函数,这个一般在退出游戏是调用,关掉所有的音乐和音效。
 void endJNI()
    {
        // void end()
        
        JniMethodInfo methodInfo;
        
        if (! getStaticmethodInfo(methodInfo,"end","()V"))
        {
            return ;
        }
        
        methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID);
        methodInfo.env->DeleteLocalRef(methodInfo.classID);
    }
    --->>>//java端函数
    public static void end() {
		Cocos2dxHelper.sCocos2dMusic.end(); //背景音乐文件的处理
		Cocos2dxHelper.sCocos2dSound.end();
	}

    ---->>>>/////背景音乐文件的处理
	public void end() {
		if (this.mBackgroundMediaPlayer != null) {
			this.mBackgroundMediaPlayer.release();
		}
                //把所有的变量恢复初始值
		/*
		private void initData() {
		this.mLeftVolume = 0.5f;
		this.mRightVolume = 0.5f;
		this.mBackgroundMediaPlayer = null;
		this.mPaused = false;
		this.mCurrentPath = null;
		}
		
		*/
		this.initData();
	}
    

cocos2dx 音频模块分析(3): 背景音乐部分的更多相关文章

  1. ios – 仅在异步函数完成执行后运行代码

    所以,例如:如果问题是你不知道要调用什么函数,你可以配置你周围的函数/对象,这样有人可以给你一个函数,然后你在我上面说“调用函数”的地方调用你的函数.例如:

  2. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  3. iOS 7,用于断开调用的私有API CTCallDisconnect不起作用

    谢谢!

  4. ios – 监控CBPeripheral状态变化

    我在CoreBluetooth库中找不到任何暴露的东西,我想在CBperipheralstate发生变化时调用一个函数.现在我只有一个switch语句来检查外设状态,但它总是只返回连接或断开连接.我如何进入连接/断开连接的情况?

  5. 当使用AVPLayer播放视频时,它会停止背景音乐ios

    我正在使用AVPlayer播放视频,它会阻止iPhone的背景音乐.请帮我解决解决方法我的电影是为了动画;他们没有声音.为了让其他声音继续播放,在Swift:感谢marcusAdams的原始答案.

  6. ios – Xcode游乐场不执行功能

    我创建了一个新的游乐场,我添加了简单的功能,但该功能从未被调用过:你们中的任何人都知道为什么函数没有被调用?我真的很感谢你的帮助解决方法因为你没有调用该函数.只需称呼它:

  7. ios – Swift中没有输入参数的通用函数?

    我有一个通用的Swift函数,如下所示:编译器没有错误,但我不知道如何调用此函数.我试过了:但它不起作用.如何在没有输入参数的情况下在Swift中调用Generic函数?解决方法你需要通过一些调用上下文告诉Swift返回类型是什么:注意,在后一种情况下,只有当someCall采用类似于Any的模糊类型作为其参数时,才需要这样做.相反,someCall被指定为[Int]作为参数,函数本身提供上下文,你可以只写someCall事实上,有时可以非常推断出背景!

  8. 如何在ios中恢复音频?

    我正在使用Audioplayer播放5-10秒的音频文件.我的应用程序允许其他应用程序的背景音乐.在播放我的音频时,我正在停用其他音乐完成我的音频后,我想播放停用的音乐.在AVAudioPlayer&AVAudioSession?还是哪个框架支持这个恢复功能?解决方法播放声音后,请取消激活您的AVAudioSession

  9. ios模拟器 – 是否可以在模拟器上测试iOS4多任务/背景音乐?

    我已经在Info.plist中添加了uibackgroundmodes属性以具有“audio”的数组条目,并添加了调用以设置音频会话:[sessionsetCategory:AVAudioSessionCategoryPlaybackerror:&error];.但是,我唯一的测试设备是不支持多任务的iPodTouch2G.我尝试过模拟器,但当我切换到Safari时,音乐停止播放.但是当我切换回我

  10. ios – UISearch栏没有调用searchBarTextDidBeginEditing

    EDITING2:真奇怪的行为:将IBAction函数设置为UITextfield的TouchDown事件可以很好地工作,但将IBAction函数设置为EditingDidBegin永远不会被触发…

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部