java输出和opensl,OpenSL的使用

#include

#include

#include

#include

#include

#define LOGD(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"ywl5320",FORMAT,##__VA_ARGS__);

//1 创建引擎

static SLObjectItf  engineSL = NULL;

SLEngineItf CreateSL()

{

SLresult re;

SLEngineItf en;

re = slCreateEngine(&engineSL,0,0,0,0,0);

if(re != SL_RESULT_SUCCESS) return NULL;

re = (*engineSL)->Realize(engineSL,SL_BOOLEAN_FALSE);

if(re != SL_RESULT_SUCCESS) return NULL;

re = (*engineSL)->GetInterface(engineSL,SL_IID_ENGINE,&en);

if(re != SL_RESULT_SUCCESS) return NULL;

return en;

}

void PcmCall(SLAndroidSimpleBufferQueueItf bf,void *contex)

{

LOGD("PcmCall");

static FILE *fp = NULL;

static char *buf = NULL;

if(!buf)

{

buf = new char[1024*1024];

}

if(!fp)

{

fp = fopen("/sdcard/test.pcm","rb");

}

if(!fp)return;

if(feof(fp) == 0)

{

int len = fread(buf,1,1024,fp);

if(len > 0)

(*bf)->Enqueue(bf,buf,len);

}

}

extern "C"

JNIEXPORT jstring

JNICALL

Java_aplay_testopensl_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;

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!");

}

SLDataLocator_OutputMix outmix = {SL_DATALOCATOR_OUTPUTMIX,mix};

SLDataSink audioSink= {&outmix,0};

//3 配置音频信息

//缓冲队列

SLDataLocator_AndroidSimpleBufferQueue que = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE,10};

//音频格式

SLDataFormat_PCM pcm = {

SL_DATAFORMAT_PCM,

2,//    声道数

SL_SAMPLINGRATE_44_1,

SL_PCMSAMPLEFORMAT_FIXED_16,

SL_PCMSAMPLEFORMAT_FIXED_16,

SL_SPEAKER_FRONT_LEFT|SL_SPEAKER_FRONT_RIGHT,

SL_BYTEORDER_LITTLEENDIAN //字节序,小端

};

SLDataSource ds = {&que,&pcm};

//4 创建播放器

SLObjectItf player = NULL;

SLPlayItf iplayer = NULL;

SLAndroidSimpleBufferQueueItf pcmQue = NULL;

const SLInterfaceID ids[] = {SL_IID_BUFFERQUEUE};

const SLboolean req[] = {SL_BOOLEAN_TRUE};

re = (*eng)->CreateAudioPlayer(eng,&player,&ds,&audioSink,sizeof(ids)/sizeof(SLInterfaceID),ids,req);

if(re !=SL_RESULT_SUCCESS )

{

LOGD("CreateAudioPlayer failed!");

} else{

LOGD("CreateAudioPlayer success!");

}

(*player)->Realize(player,SL_BOOLEAN_FALSE);

//获取player接口

re = (*player)->GetInterface(player,SL_IID_PLAY,&iplayer);

if(re !=SL_RESULT_SUCCESS )

{

LOGD("GetInterface SL_IID_PLAY failed!");

}

re = (*player)->GetInterface(player,SL_IID_BUFFERQUEUE,&pcmQue);

if(re !=SL_RESULT_SUCCESS )

{

LOGD("GetInterface SL_IID_BUFFERQUEUE failed!");

}

//设置回调函数,播放队列空调用

(*pcmQue)->RegisterCallback(pcmQue,PcmCall,0);

//设置为播放状态

(*iplayer)->SetPlayState(iplayer,SL_PLAYSTATE_PLAYING);

//启动队列回调

(*pcmQue)->Enqueue(pcmQue,"",1);

return env->NewStringUTF(hello.c_str());

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值