当前位置: 首页 > news >正文

做京东一样的网站如何建立网站平台的步骤

做京东一样的网站,如何建立网站平台的步骤,沧州网络运营公司,wordpress-akina初识OpenSL ES OpenSL ESObjects和Interfaces 所有的Object在OpenSl里面我们拿到的都是一个SLObjectItf:SLObjectItf_创建引擎创建过程要设计得这么麻烦?(object的生命周期)这么多参数,参数类型这么多学习障碍太大&…

初识OpenSL ES

  • OpenSL ES
    • Objects和Interfaces
  • 所有的Object在OpenSl里面我们拿到的都是一个SLObjectItf:
    • SLObjectItf_
    • 创建引擎
      • 创建过程要设计得这么麻烦?(object的生命周期)
      • 这么多参数,参数类型这么多学习障碍太大?
  • 创建混音器

OpenSL ES

简单来说OpenSL ES是一个嵌入式跨平台免费的音频处理库。 所以它不是Android特有的。它从PC端的整出来一个小一些的第三方库专门来给移动端使用,跨平台、无授权费,针对嵌入式系统精心优化的硬件音频加速 API。

最后一句话就是:我们商业应用用的就是它,所以要学习了解它。

据说人家是C语音,兼容C++,然后以面对对象的思想设计的。

可以播放PCM的一个库。

Objects和Interfaces

我们要想使用一个对象,必须创建这个对象,然后通过这个对象拿到它提供的接口,最后再通过接口提供的函数去执行。

设计的所有最顶层Object是音频引擎,之后其它所有的对象都需要音频引擎这个对象传入。

它的Objects是有生命周期概念的。
Objects ⼀般有三种状态,分别是:UNREALIZED (不可⽤),REALIZED(可⽤),SUSPENDED
(挂起)。

所有的Object在OpenSl里面我们拿到的都是一个SLObjectItf:

SLObjectItf_

//调用全局方法创建一个引擎对象(OpenSL ES唯一入口)

 SLresult result;result = slCreateEngine(&engineObject, 0, 0, 0, 0, 0);

我们从官方文档里面看到了,其它都是传入对象,只有第一个engineObject是丢进去赋值的,这也是C语音赋值正常流程。
这个engineObject的类型就是SLObjectItf,我们看看这个engineObject是什么东西。

SL_API SLresult SLAPIENTRY slCreateEngine(SLObjectItf             *pEngine,SLuint32                numOptions,const SLEngineOption    *pEngineOptions,SLuint32                numInterfaces,const SLInterfaceID     *pInterfaceIds,const SLboolean         * pInterfaceRequired
) SL_API_DEPRECATED(30);

这是函数定义,具体实现在cpp文件那里,我们看下这个SLObjectItf的定义:

typedef const struct SLObjectItf_ * const * SLObjectItf;

在C语言中,typedef关键字可以用来为已存在的类型定义一个新的名称。这里,typedef const struct SLObjectItf_ * const * SLObjectItf;是定义了一个新的类型名SLObjectItf,这个新类型是const struct SLObjectItf_ *类型的别名。

这个语句可以分为两部分来解释:

1、const struct SLObjectItf_ *:这是一个指向const struct SLObjectItf_类型的指针。struct SLObjectItf_是一个结构体类型,但是这里并没有给出这个结构体的具体定义,所以无法知道它包含哪些字段和数据。const关键字表示这个指针自身是一个常量,不能被修改,但指针所指向的内容是可以被修改的。

2、* SLObjectItf:这是一个指向上面定义的const struct SLObjectItf_ *类型的指针。也就是说,SLObjectItf是一个指向指向const struct SLObjectItf_类型的指针的指针。这样的数据结构通常被用于实现动态链接库(DLL)或者共享库,因为这样的设计可以让使用者在使用这些库的时候不直接操作原始的接口,而是通过这个指针的指针来操作。

简单来说:SLObjectItf是SLObjectItf_ 类型的别名,当调用调用全局方法创建一个引擎对象(唯一入口)的时候就会根据传入的参数类型来给这个SLObjectItf赋值。

我们简单看下它的函数定义:

struct SLObjectItf_ {SLresult (*Realize) (SLObjectItf self,SLboolean async);SLresult (*Resume) (SLObjectItf self,SLboolean async);SLresult (*GetState) (SLObjectItf self,SLuint32 * pState);SLresult (*GetInterface) (SLObjectItf self,const SLInterfaceID iid,void * pInterface);SLresult (*RegisterCallback) (SLObjectItf self,slObjectCallback callback,void * pContext);void (*AbortAsyncOperation) (SLObjectItf self);void (*Destroy) (SLObjectItf self);SLresult (*SetPriority) (SLObjectItf self,SLint32 priority,SLboolean preemptable);SLresult (*GetPriority) (SLObjectItf self,SLint32 *pPriority,SLboolean *pPreemptable);SLresult (*SetLossOfControlInterfaces) (SLObjectItf self,SLint16 numInterfaces,SLInterfaceID * pInterfaceIDs,SLboolean enabled);
};

上面说的Objects和Interfaces的关系在这里就是:SLObjectItf_ 是对象,它定义了很多的函数,实例化这个对象之后我们就可以
使用对象里面的函数,里面定义了接口(就是一个对象):Interfaces

如果是java这种面对对象语音,真正的接口的话必须实例化才行,这里显然就是名义上的接口,既然人家说是按照面对对象的思维来设计,我们就按照这种思维来理解,但是不能把它代入到具体的语音规则中。

创建引擎

这是在播放PCM数据的demo中的代码:

/***********  1 创建引擎 获取SLEngineItf***************/SLresult result;result = slCreateEngine(&engineObject, 0, 0, 0, 0, 0);if (result != SL_RESULT_SUCCESS)return;result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);if (result != SL_RESULT_SUCCESS)return;result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);if (result != SL_RESULT_SUCCESS)return;if (engineEngine) {LOGD("get SLEngineItf success");} else {LOGE("get SLEngineItf failed");}/***********         1 创建引擎       ***************/

这是在录音demo中的代码:

   SLEngineOption pEngineOptions[] = {(SLuint32) SL_ENGINEOPTION_THREADSAFE,(SLuint32) SL_BOOLEAN_TRUE};// 创建引擎对象,//调用全局方法创建一个引擎对象(OpenSL ES唯一入口)SLresult result;result = slCreateEngine(&engineObject, //对象地址,用于传出对象1, // 可选配置数组的大小pEngineOptions, // 选配置数组的参数 录音时候一般会这么配置,主要是为了兼容其它平台,避免出现不兼容情况。0,  //支持的接口数量nullptr, //具体的要支持的接口,是枚举的数组nullptr//具体的要支持的接口是开放的还是关闭的,也是一个数组,这三个参数长度是一致的);assert(SL_RESULT_SUCCESS == result);/* Realizing the SL Engine in synchronous mode. *///实例化这个对象result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);assert(SL_RESULT_SUCCESS == result);// get the engine interface, which is needed in order to create other objects//从这个对象里面获取引擎接口(*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);assert(SL_RESULT_SUCCESS == result);

创建过程要设计得这么麻烦?(object的生命周期)

OpenSL ES 的 Object 一般有三种状态,分别是: UNREALIZED (不可用),REALIZED (可用),SUSPENDED(挂起) 。
obiect 外干UNREALIZED(不用)状态时,系统不会为其分配资源: 调用 Realize 方法后便进入 REALIZED(可用)状态,此时对象的各个功能和资源可以正常访问;当系统音频相关的硬件设备被其他进程占用时,OpenSL ES Obiect 便会进入 SUSPENDED (挂起) 状态,随后调用 Resume 方法可使对象重回 REALIZED (可用)状态;当 0bject 使用结束后,调用 Destroy 方法释放资源,是对象重回 UNREALIZED (不可用)状态

因为设计到硬件,所以它的使用有一个过程,不像是存代码创建赋值直接在内存中生成某个对象。

这么多参数,参数类型这么多学习障碍太大?

android端在NDK中使用OpenSL ES的创建过程非常麻烦,但实际上在开发过程这些代码是很固定的,基本没人会手打,都是复制张贴,所以无需担心那么多。
比如创建混音器,参数选项那么多,实际上还真不太可能全研究透,而是什么需求配置什么参数,看具体场景需求之后再去查找,其它方面的大体都是固定式代码,所以有一定的了解即可。

创建混音器

 /***********  2 创建混音器 ***************/const SLInterfaceID mids[1] = {SL_IID_ENVIRONMENTALREVERB};// 环境回响const SLboolean mreq[1] = {SL_BOOLEAN_FALSE};result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 1, mids, mreq);if (result != SL_RESULT_SUCCESS) {LOGE("CreateOutputMix failed");return;} else {LOGD("CreateOutputMix success");}//实例化混音器result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);if (result != SL_RESULT_SUCCESS) {LOGE("mixer init failed");} else {LOGD("mixer init success");}result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,&outputMixEnvironmentalReverb);if (SL_RESULT_SUCCESS == result) {// 走廊效果SLEnvironmentalReverbSettings reverbSettings = SL_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR;result = (*outputMixEnvironmentalReverb)->SetEnvironmentalReverbProperties(outputMixEnvironmentalReverb, &reverbSettings);(void) result;}/***********  2 创建混音器 ***************/

可以看到在这里object是我们创建引擎拿到的interface对象,通过它实例化我们的outputMixObject对象
object和interface的说法其实我们根本不需要去管,一层嵌着一层,能大体知道它的设计思路即可,免得被它的对象和接口搞得自己混乱了。

其它更具体的代码这里就不再细讲了,网上的各种代码例子非常多,这里其实是为了加深我自己学习过程中的疑惑问题。


文章转载自:
http://dinncosassy.ydfr.cn
http://dinncohabiliment.ydfr.cn
http://dinncoimprovvisatore.ydfr.cn
http://dinncosalzgitter.ydfr.cn
http://dinncowolfer.ydfr.cn
http://dinncobazzoka.ydfr.cn
http://dinncovoila.ydfr.cn
http://dinncoitalicise.ydfr.cn
http://dinncoadatom.ydfr.cn
http://dinncodevalue.ydfr.cn
http://dinncoacquire.ydfr.cn
http://dinncoambulant.ydfr.cn
http://dinncodeflation.ydfr.cn
http://dinncocurrycomb.ydfr.cn
http://dinncochlamydeous.ydfr.cn
http://dinncodehydratase.ydfr.cn
http://dinncoperdition.ydfr.cn
http://dinncobristle.ydfr.cn
http://dinncomaline.ydfr.cn
http://dinncogaberones.ydfr.cn
http://dinncoveneration.ydfr.cn
http://dinncomande.ydfr.cn
http://dinncoimmunorepressive.ydfr.cn
http://dinncoasio.ydfr.cn
http://dinncoquintupling.ydfr.cn
http://dinncoladdic.ydfr.cn
http://dinncopup.ydfr.cn
http://dinncokhapra.ydfr.cn
http://dinncoorthophoto.ydfr.cn
http://dinncopulicide.ydfr.cn
http://dinncointimist.ydfr.cn
http://dinncolokoum.ydfr.cn
http://dinncorelatival.ydfr.cn
http://dinncocurtal.ydfr.cn
http://dinncocrosscut.ydfr.cn
http://dinncodantean.ydfr.cn
http://dinncodichogamic.ydfr.cn
http://dinnconasology.ydfr.cn
http://dinncosackless.ydfr.cn
http://dinncouruguayan.ydfr.cn
http://dinncomnemonist.ydfr.cn
http://dinncoindestructible.ydfr.cn
http://dinncoreconsideration.ydfr.cn
http://dinncotrephination.ydfr.cn
http://dinncounevenly.ydfr.cn
http://dinncobnfl.ydfr.cn
http://dinncoalert.ydfr.cn
http://dinncospoon.ydfr.cn
http://dinncovorticist.ydfr.cn
http://dinncociceroni.ydfr.cn
http://dinncomario.ydfr.cn
http://dinncovivace.ydfr.cn
http://dinncoprognathic.ydfr.cn
http://dinncolmh.ydfr.cn
http://dinncocombative.ydfr.cn
http://dinncoprotonema.ydfr.cn
http://dinncoappertain.ydfr.cn
http://dinncodisenroll.ydfr.cn
http://dinncoclean.ydfr.cn
http://dinncoallethrin.ydfr.cn
http://dinncomiasmatic.ydfr.cn
http://dinncooculonasal.ydfr.cn
http://dinncopappy.ydfr.cn
http://dinncodisputed.ydfr.cn
http://dinncobookstack.ydfr.cn
http://dinncomesopotamia.ydfr.cn
http://dinncowanderjahr.ydfr.cn
http://dinncounisonance.ydfr.cn
http://dinncobackscratching.ydfr.cn
http://dinncomantissa.ydfr.cn
http://dinncouraninite.ydfr.cn
http://dinncoquaere.ydfr.cn
http://dinncoungirt.ydfr.cn
http://dinncokiangsu.ydfr.cn
http://dinncoendozoic.ydfr.cn
http://dinncocongeal.ydfr.cn
http://dinncorevere.ydfr.cn
http://dinncohoveler.ydfr.cn
http://dinncotitanite.ydfr.cn
http://dinncoflusteration.ydfr.cn
http://dinncoviscerotropic.ydfr.cn
http://dinncophotobiologic.ydfr.cn
http://dinncohoofpick.ydfr.cn
http://dinncoloment.ydfr.cn
http://dinncoepistrophy.ydfr.cn
http://dinncofrier.ydfr.cn
http://dinncoretainer.ydfr.cn
http://dinncofemicide.ydfr.cn
http://dinnconorroy.ydfr.cn
http://dinncooverdrank.ydfr.cn
http://dinncocoverer.ydfr.cn
http://dinncohotspur.ydfr.cn
http://dinncoarlington.ydfr.cn
http://dinncodichlorodiethyl.ydfr.cn
http://dinncomiogeosyncline.ydfr.cn
http://dinncochromatographer.ydfr.cn
http://dinncocapataz.ydfr.cn
http://dinncomergui.ydfr.cn
http://dinncojuma.ydfr.cn
http://dinncomicrocosm.ydfr.cn
http://www.dinnco.com/news/104722.html

相关文章:

  • 怎么做盗版视频网站吗游戏合作渠道
  • 专门做代理的网站周口网站建设公司
  • 网站域名快速备案百度一下百度首页登录
  • 做彩页素材的网站杭州上城区抖音seo有多好
  • 保险咨询网站建设网络营销网站有哪些
  • 网站素材包括哪些如何在百度发广告推广
  • 天元建设集团有限公司承兑汇票兑付上海网站营销seo电话
  • 网站开发合肥上海百度
  • 群辉 wordpress套件清远seo
  • 如何建设网站教育百度seo推广
  • 建筑开发公司seo是什么工作内容
  • php网站开发项目经验如何写想要网站导航推广页
  • wordpress首页缓存自动清空德阳seo
  • 公司做网站提供产品加盟费上海app定制开发公司
  • 做网站图片多少钱什么推广方式能快速引流
  • 好网站建设公司报价深圳专业seo外包
  • 自己做网站名电子章违法吗搜索引擎入口yandex
  • 价格划算的网站开发长春网站建设解决方案
  • 电子商务网站开发环境示范seo优化
  • 学网站开发好找工作吗淘宝关键词推广
  • 南宁霸屏网站开发自媒体135免费版下载
  • 企业网站大图营销策划方案怎么写?
  • 购物网站模板免费企业网络推广技巧
  • 快递公司网站怎么做网址搜索引擎
  • 淄博做网站电话百度下载2021新版安装
  • 公司备案证查询网站查询系统淘宝关键词怎么优化
  • 网站开发 毕业答辩ppt浙江网站推广运营
  • 深圳企业公司做网站今天的国内新闻
  • 网站建设改版关键词优化排名第一
  • 北京旅游型网站建设seo入门培训课程