zoukankan      html  css  js  c++  java
  • OpenSL的代码编写

    #include <jni.h>
    #include <string>
    #include <SLES/OpenSLES.h>
    #include <SLES/OpenSLES_Android.h>


    //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/shape.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_com_example_user_player_Play_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);




    错误的代码:

    //1.创建引擎
    SLEngineItf eng = CreateSL();


    //2.创建输出设备
    SLObjectItf mix = NULL;
    (*eng)->CreateOutputMix(eng , &mix ,0 ,0 ,0);
    //实例化mix
    (*mix)->Realize(mix , SL_BOOLEAN_FALSE);
    //配置输出设备
    SLDataLocator_OutputMix outMix = {SL_DATALOCATOR_OUTPUTMIX , mix};
    SLDataSink audioSink = {&outMix , 0};
    //配置PCM格式信息
    //缓冲格式
    SLDataLocator_AndroidSimpleBufferQueue queue = {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_RIGHT | SL_SPEAKER_FRONT_LEFT, //SL_SPEAKER_BACK_RIGHT,
    SL_BYTEORDER_LITTLEENDIAN //字节序,小断------还有大段

    };

    SLDataSource ds = {&queue , &pcm};



    //创建播放器
    SLObjectItf player = NULL;
    SLPlayItf iplayer = NULL ;
    const SLInterfaceID ids[] = {SL_IID_BUFFERQUEUE};
    const SLboolean req[] = {SL_BOOLEAN_TRUE};
    (*eng)->CreateAudioPlayer(eng,&player,&ds,&audioSink,sizeof(ids)/sizeof(SLInterfaceID),ids,req); //如果只用player接口就不用传其他
    //实例化播放器 //参数,因为调用到内部类的接口,
    (*player)->Realize(player ,SL_BOOLEAN_FALSE); //所以必须传入其他参数
    //获取接口
    (*player)->GetInterface(player, SL_IID_PLAY, &iplayer);


    //获取队列的接口
    SLAndroidSimpleBufferQueueItf pcmQue = NULL;
    (*player)->GetInterface(player, SL_IID_BUFFERQUEUE, &pcmQue);

    //设置回调函数
    (*pcmQue)->RegisterCallback(pcmQue, PcmCall, 0);

    //设置播放状态
    (*iplayer)->SetPlayState(iplayer , SL_PLAYSTATE_PLAYING);

    //启动队列回调
    (*pcmQue)->Enqueue(pcmQue , " ",1);
    
    
  • 相关阅读:
    股票交易接口
    股票自动买卖
    安信证券接口的demo做得不好。
    MEF bug? 无法加载外部的DLL
    如何移植行情软件的指标到千发股票自动交易软件?
    股票策略交易
    博客园自动关注病毒 只活了一小会儿。
    Float 运算的怪异性
    文件大小和占用空间为何不一样
    做最好的自己
  • 原文地址:https://www.cnblogs.com/liunx1109/p/9281766.html
Copyright © 2011-2022 走看看