Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了cocos2dx 音频模块分析(1)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。


cocos2dx音效的实现分析:


上面那个图是cocos2dx音效部分的实现结构图,总体的思想是:
使用同一个SimpleAudioENGIne.h头文件,然后在不同平台下对应不同
的实现文件,不同平台编译不同的实现文件,这就要求这个类的函数定义
成员在各个平台下统一。其实这也可以理解为一种跨平台的实现方式。


这里分析android部分:

1、预加载背景音乐
void SimpleAudioENGIne::preloadBACkgroundMusic(@R_944_2600@ pszFilePath)
{
    std::string fullPath = getFullPathWithoutAssetsPrefix(pszFilePath);
    preloadBACkgroundMusicJNI(fullPath.c_str());
}

-->>
//得到音乐文件的路径,如果是包里的文件,则去掉assets/前缀
static std::string getFullPathWithoutAssetsPrefix(@R_944_2600@ pszFileName)
{
    // Changing file path to full path
    //获取文件的路径,以后有时间会分析下CCFileUtils这个类的实现
    std::string fullPath = CCFileUtils::sharedFileUtils()->fullPathForFilename(pszFileName);
    // Removing `assets` since it isn't needed for the API of playing sound.
    size_t pos = fullPath.find("assets/");
    if (pos == 0)
    {
        fullPath = fullPath.substr(strlen("assets/"));
    }
    return fullPath;
}

-->>
preloadBACkgroundMusicJNI:
//这里其实就是调用jni的方法:
void preloadBACkgroundMusicJNI(const char *path)
    {
        // void playBACkgroundMusic(String,Boolean)
        JniMethodInfo methodInfo;
        
        if (! getStaticMethodInfo(methodInfo,"preloadBACkgroundMusic","(Ljava/lang/String;)V"))
        {            
            return;
        }
        
        jString StringArg = methodInfo.env->NewStringUTF(path);
        methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID,StringArg);
        methodInfo.env->deleteLocalRef(StringArg);
        methodInfo.env->deleteLocalRef(methodInfo.classID);
    }
-->>java端的代码:
public static void preloadBACkgroundMusic(final String pPath) {
		Cocos2dxHelper.sCocos2dMusic.preloadBACkgroundMusic(pPath);
	}
-->>
public void preloadBACkgroundMusic(final String pPath) {
		if ((this.mCurrentPath == null) || (!this.mCurrentPath.equals(pPath))) {
			// preload new BACkground music

			// release old resource and create a new one
			if (this.mBACkgroundMediaPlayer != null) {
				this.mBACkgroundMediaPlayer.release();
			}

			this.mBACkgroundMediaPlayer = this.createMediaplayer(pPath);

			// record the path
			this.mCurrentPath = pPath;
		}
	}
-->>
	private MediaPlayer createMediaplayer(final String pPath) {
	//其实就是创建了一个android下的MediaPlayer媒体播放实例,后面的播放,暂停之类
	//的,都是这个实例去控制。
		MediaPlayer mediaPlayer = new MediaPlayer(); 

		try {
			if (pPath.startsWith("/")) {
				final FileInputStream fis = new FileInputStream(pPath);
				mediaPlayer.setDatasource(fis.getFD());
				fis.close();
			} else {
				final AssetFileDescriptor assetFileDescritor = this.mContext.getAssets().openFd(pPath);
				mediaPlayer.setDatasource(assetFileDescritor.getFileDescriptor(),assetFileDescritor.getStartOffset(),assetFileDescritor.getLength());
			}

			mediaPlayer.prepare();

			mediaPlayer.setVolume(this.mLeftVolume,this.mRightVolumE);
		} catch (final Exception E) {
			mediaPlayer = null;
			Log.e(Cocos2dxMusic.TAG,"error: " + e.getmessage(),E);
		}

		return mediaPlayer;
	}

-->>播放背景音乐,这里可以不用预先加载,就直接播放。
void SimpleAudioENGIne::playBACkgroundMusic(@R_944_2600@ pszFilePath,bool bLoop)
{
    std::string fullPath = getFullPathWithoutAssetsPrefix(pszFilePath);
    playBACkgroundMusicJNI(fullPath.c_str(),bLoop);
}

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。