您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
3. 完成OpenSLES混音器CreateOutputMix初始化~1
发布时间:2021-06-04 15:43:48编辑:雪饮阅读()
上一步創建了OpenSLES下的SLEngineItf引擎,接下來第二步就是創建混音器。
cpp/native-lib.cpp:
#include <jni.h>
#include <string>
#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>
#include <android/log.h>
#define LOGD(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"ywl5320",FORMAT,##__VA_ARGS__);
/*
* SLObjectItf:OpenSL ES中最重要的接口類
* */
static SLObjectItf engineSL = NULL;
/*
* SLEngineItf:OpenSL ES中具体的引擎(接口類)
* */
SLEngineItf CreateSL()
{
/*SLresult:返回結果
* 下面三個方法:
* slCreateEngine、Realize、GetInterface
* 返回結果都是SLresult類型,所以這裏統一定義一個返回結果類型
* */
SLresult re;
SLEngineItf en;
/*
* slCreateEngine方法用於创建一个引擎接口对象,這裏一般只關注第一個參數,其餘5個參數一般設置為0即可
* */
re = slCreateEngine(&engineSL,0,0,0,0,0);
if(re != SL_RESULT_SUCCESS) return NULL;
//创建好引擎接口对象后,需要用SLObjectItf的Realize方法来实现engineObject,Realize方法的第二個參數async表示是否異步,這裏使用同步
re = (*engineSL)->Realize(engineSL,SL_BOOLEAN_FALSE);
if(re != SL_RESULT_SUCCESS) return NULL;
//GetInterface方法来初始化SLEngnineItf对象实例,GetInterface的第二個參數是一個SL接口id,這裏一般用常量SL_IID_ENGINE
re = (*engineSL)->GetInterface(engineSL,SL_IID_ENGINE,&en);
if(re != SL_RESULT_SUCCESS) return NULL;
return en;
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_audio_1opensles_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
//1 创建引擎
SLEngineItf eng = CreateSL();
if(eng)
{
LOGD("CreateSL success! ");
}
else
{
LOGD("CreateSL failed! ");
}
//2 创建混音器
SLObjectItf mix = NULL;
SLresult re = 0;
//CreateOutputMix函數用於創建輸出混音器
re = (*eng)->CreateOutputMix(eng,&mix,0,0,0);
if(re !=SL_RESULT_SUCCESS )
{
LOGD("SL_RESULT_SUCCESS failed!");
}
re = (*mix)->Realize(mix,SL_BOOLEAN_FALSE);
if(re !=SL_RESULT_SUCCESS )
{
LOGD("(*mix)->Realize failed!");
}
//配置混音器 : 将 mix 混音器对象装载入 SLDataLocator_OutputMix 结构体中
SLDataLocator_OutputMix outmix = {SL_DATALOCATOR_OUTPUTMIX,mix};
//将 SLDataLocator_OutputMix 结构体装载到 SLDataSink 中
SLDataSink audioSink= {&outmix,0};
return env->NewStringUTF(hello.c_str());
}
#include <string>
#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>
#include <android/log.h>
#define LOGD(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"ywl5320",FORMAT,##__VA_ARGS__);
/*
* SLObjectItf:OpenSL ES中最重要的接口類
* */
static SLObjectItf engineSL = NULL;
/*
* SLEngineItf:OpenSL ES中具体的引擎(接口類)
* */
SLEngineItf CreateSL()
{
/*SLresult:返回結果
* 下面三個方法:
* slCreateEngine、Realize、GetInterface
* 返回結果都是SLresult類型,所以這裏統一定義一個返回結果類型
* */
SLresult re;
SLEngineItf en;
/*
* slCreateEngine方法用於创建一个引擎接口对象,這裏一般只關注第一個參數,其餘5個參數一般設置為0即可
* */
re = slCreateEngine(&engineSL,0,0,0,0,0);
if(re != SL_RESULT_SUCCESS) return NULL;
//创建好引擎接口对象后,需要用SLObjectItf的Realize方法来实现engineObject,Realize方法的第二個參數async表示是否異步,這裏使用同步
re = (*engineSL)->Realize(engineSL,SL_BOOLEAN_FALSE);
if(re != SL_RESULT_SUCCESS) return NULL;
//GetInterface方法来初始化SLEngnineItf对象实例,GetInterface的第二個參數是一個SL接口id,這裏一般用常量SL_IID_ENGINE
re = (*engineSL)->GetInterface(engineSL,SL_IID_ENGINE,&en);
if(re != SL_RESULT_SUCCESS) return NULL;
return en;
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_audio_1opensles_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
//1 创建引擎
SLEngineItf eng = CreateSL();
if(eng)
{
LOGD("CreateSL success! ");
}
else
{
LOGD("CreateSL failed! ");
}
//2 创建混音器
SLObjectItf mix = NULL;
SLresult re = 0;
//CreateOutputMix函數用於創建輸出混音器
re = (*eng)->CreateOutputMix(eng,&mix,0,0,0);
if(re !=SL_RESULT_SUCCESS )
{
LOGD("SL_RESULT_SUCCESS failed!");
}
re = (*mix)->Realize(mix,SL_BOOLEAN_FALSE);
if(re !=SL_RESULT_SUCCESS )
{
LOGD("(*mix)->Realize failed!");
}
//配置混音器 : 将 mix 混音器对象装载入 SLDataLocator_OutputMix 结构体中
SLDataLocator_OutputMix outmix = {SL_DATALOCATOR_OUTPUTMIX,mix};
//将 SLDataLocator_OutputMix 结构体装载到 SLDataSink 中
SLDataSink audioSink= {&outmix,0};
return env->NewStringUTF(hello.c_str());
}
編譯並運行在雷電4上面沒有出現這兩個錯誤,則就創建混音器成功了。
关键字词:CreateOutputMix,OpenSLES