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

高端企业网站建设注意问题企业网站维护外包

高端企业网站建设注意问题,企业网站维护外包,自己怎么建立网站,网站页面建设上一篇介绍了蓝牙音频的播放通路和编解码器#xff0c;接下来介绍Source和Sink如何选择编解码器以及编解码流程。 编解码器选择 连接蓝牙后想要播放音乐#xff0c;需要协商使用哪种编码器#xff0c;还需要协商编码器使用什么配置#xff0c;前面介绍了如何协商编码器的…上一篇介绍了蓝牙音频的播放通路和编解码器接下来介绍Source和Sink如何选择编解码器以及编解码流程。 编解码器选择 连接蓝牙后想要播放音乐需要协商使用哪种编码器还需要协商编码器使用什么配置前面介绍了如何协商编码器的配置这里将介绍如何选择编码器从spec可以知道SBC codec是a2dp必须支持的codec因此Source和Sink至少有一个codec是相同的当然也可能有多个相同的codec。因此在A2DP中将codec抽象成SEP一个codec对应一个SEP在fluoride中SEP通过BtaAvCoSep描述设备通过BtaAvCoPeer描述核心成员如下 class BtaAvCoSep {public:uint8_t sep_info_idx; // 对端设备SEP在本地的indexbta中uint8_t seid; // 对端SEP的index(对端设备中)uint8_t codec_caps[AVDT_CODEC_SIZE]; // 对端SEP index对应codec的能力 };class BtaAvCoPeer {public:RawAddress addr; // 对端设备地址BtaAvCoSep sinks[BTAV_A2DP_CODEC_INDEX_MAX]; // 支持的sink sepBtaAvCoSep sources[BTAV_A2DP_CODEC_INDEX_MAX]; // 支持的source sepuint8_t num_sinks; // 对端sink的数量uint8_t num_sources; // 对端source的数量uint8_t num_rx_sinks; // 收到对端sink的数量uint8_t num_rx_sources; // 收到对端source的数量uint8_t num_sup_sinks; // 收到且支持的对端sink的数量uint8_t num_sup_sources; // 收到且支持的对端source的数量const BtaAvCoSep* p_sink; // 当前选择的的sink sepconst BtaAvCoSep* p_source; // 当前选择的source sepuint8_t codec_config[AVDT_CODEC_SIZE]; // 当前的codec 配置bool acceptor; // true表示连接接受方反之表示发起方private:tBTA_AV_HNDL bta_av_handle_; // BTA AV handle to useA2dpCodecs* codecs_; // 本地支持的codec };获取SEP数量 发起连接的设备通过AVDTP协议发现对端设备支持的SEP数量发现的结果通过bta_av_co_audio_disc_res回调通知给btif结果中包含对端设备地址、sink SEP数量、source SEP数量、总的SEP数量根据设备bta生成的bta_av_handle找到对应的peer并将这些信息存放在peer中。 void BtaAvCo::ProcessDiscoveryResult(tBTA_AV_HNDL bta_av_handle,const RawAddress peer_address,uint8_t num_seps, uint8_t num_sinks,uint8_t num_sources, uint16_t uuid_local) {// Find the peerBtaAvCoPeer* p_peer FindPeerAndUpdate(bta_av_handle, peer_address);.../* Copy the discovery results */p_peer-addr peer_address;p_peer-num_sinks num_sinks;p_peer-num_sources num_sources;p_peer-num_seps num_seps;... }获取SEP配置信息 通过AVDTP协议获取每个SEP的能力(codec类型、codec 能力)获取到的结果通过bta_av_co_audio_getconfig回调通知给btif结果包括SEP的codec信息、对端sep在本地的index、对端sep index等btif会将这些信息保存在peer中ProcessSinkGetConfig和ProcessSourceGetConfig当对端所有sep的信息都获取完成后进行codec的选择。 tA2DP_STATUS BtaAvCo::ProcessSourceGetConfig(tBTA_AV_HNDL bta_av_handle, const RawAddress peer_address,uint8_t* p_codec_info, uint8_t* p_sep_info_idx, uint8_t seid,uint8_t* p_num_protect, uint8_t* p_protect_info) {...p_peer-num_rx_sinks;// Check the peers Sink codecif (A2DP_IsPeerSinkCodecValid(p_codec_info)) {// If there is room for a new oneif (p_peer-num_sup_sinks BTA_AV_CO_NUM_ELEMENTS(p_peer-sinks)) {BtaAvCoSep* p_sink p_peer-sinks[p_peer-num_sup_sinks];// 保存sep信息memcpy(p_sink-codec_caps, p_codec_info, AVDT_CODEC_SIZE);p_sink-sep_info_idx *p_sep_info_idx;p_sink-seid seid;p_sink-num_protect *p_num_protect;memcpy(p_sink-protect_info, p_protect_info, AVDT_CP_INFO_LEN);}...}// 判断所有SEP信息是否获取完if ((p_peer-num_rx_sinks ! p_peer-num_sinks) (p_peer-num_sup_sinks ! BTA_AV_CO_NUM_ELEMENTS(p_peer-sinks))) {return A2DP_FAIL;}// Select the Source codec... } 选择codec 以对端设备是Sink为例选择codec的具体实现为SelectSourceCodecSource为SelectSinkCodec逻辑相同后续不再赘述按优先级排序从高到低获取每个codec并判断是否在对端的SEP中若在则结合对端SEP的codec信息codec_caps调用A2dpCodecs::setCodecConfig参考上一篇文章判断该codec配置是否双方都支持如果支持则codec选择完成同时调用ReportSourceCodecState将配置信息上报到JNI如果不支持继续判断下一个codec。除了连接时会选择codec当用户修改编码器配置时也会触发codec选择如果选择的codec有变化或配置有变化还会触发AVDTP reconfig动作其调用路径如下 btav_source_interface_t::codec_config()- codec_config_src() - BtifAvSource::UpdateCodecConfig()- btif_a2dp_source_encoder_user_config_update_req()- bta_av_co_set_codec_user_config()- btif_a2dp_source_encoder_user_config_update_event()- bta_av_co_set_codec_user_config()- BtaAvCo::SetCodecUserConfig()- A2dpCodecs::setCodecUserConfig()- SelectSourceCodec()SelectSourceCodec代码实现如下 const BtaAvCoSep* BtaAvCo::SelectSourceCodec(BtaAvCoPeer* p_peer) {const BtaAvCoSep* p_sink nullptr;...// Select the codecfor (const auto iter : p_peer-GetCodecs()-orderedSourceCodecs()) {p_sink AttemptSourceCodecSelection(*iter, p_peer);if (p_sink ! nullptr)break;}return p_sink; } const BtaAvCoSep* BtaAvCo::AttemptSourceCodecSelection(const A2dpCodecConfig codec_config, BtaAvCoPeer* p_peer) {...if (!p_peer-GetCodecs()-setCodecConfig(p_sink-codec_caps, true /* is_capability */, new_codec_config,true /* select_current_codec */)) {APPL_TRACE_DEBUG(%s: cannot set source codec %s, __func__,codec_config.name().c_str());return nullptr;}...return p_sink; }codec的选择流程如下 执行完codec选择之后AVDTP的音频流传输通路就建立完成了此时会回调bta_av_co_audio_open进入opened状态p_peer-opened true。进入opened状态后就可以进行音频播放了在btif层音频播放主要是音频编码、解码。 音频编码Source 在BtifAvSource::Init中调用btif_a2dp_source_init进行Source编码相关的初始化主要是开启一个编码线程btif_a2dp_source_thread然后在A2DP连接成功后会设置action设备调用BtifAvSource::SetActivePeer在这个函数中会进行Audio相关的设置调用btif_a2dp_source_restart_session 即编码前音箱相关的设置如音频参数、音频通路选择等编码器获取与初始化等当有音频需要播放时调用btif_a2dp_source_start_audio_req 启动编码器开始编码音频数据并将编码后的数据放入队列总bta根据需要中队列中获取数据包然后通过AVDTP发送到对端设备不要播放音频时调用btif_a2dp_source_stop_audio_req停止编码连接断开后调用btif_a2dp_source_end_session取消音频通路选择等。运行过程中数据流向和函数触发关系如下 开始播放时启动定时器定时器定时触发(send_frames)编码器编码数据编码器从音频模块中读取btif_a2dp_source_read_callbackPCM数据编码完成后将编码后的数据缓存btif_a2dp_source_enqueue_callback在队列中tx_audio_queue同时BTA在从队列中获取btif_a2dp_source_audio_readbuf编码后的数据包进行发送结束播放时停止定时器并清除各个阶段缓存的音频数据。 音频解码Sink 在BtifAvSink::Init中调用btif_a2dp_sink_init进行Sink解码相关的初始化包括开启解码线程、创建音频缓存的队列等当需要播放Source端发送的音频时首先会通过BTA_AvRegister注册的回调bta_av_sink_media_callback上报BTA_AV_SINK_MEDIA_CFG_EVT事件收到该时间后调用btif_a2dp_sink_update_decoder初始化解码器和音频播放通路(BtifAvrcpAudioTrackCreate)当A2DP状态切换到Start状态后调用btif_a2dp_sink_on_start启动解码器然后在收到bta_av_sink_media_callback回调的BTA_AV_SINK_MEDIA_DATA_EVT事件收到音频数据时将数据存放在队列中同时启动定时器定时器定时从队列中获取音频数据解码解码成功后播放BtifAvrcpAudioTrackWriteData停止播放时停止定时器和解码器并清除各个阶段的缓存数据流向如下 到此btif层关于音频播放相关的内容就以介绍完毕其中codec的实现在stack/a2dp中。
http://www.zqtcl.cn/news/303608/

相关文章:

  • 洛阳免费网站建设自己做网站最新视频教程
  • 网站备案查询 美橙网开发app需要的技术
  • 软件产品如何做网站推广昆山外贸网站建设推广
  • 景德镇市城市建设规划网站wordpress用不了了
  • 网站及新媒体建设宣传片wordpress 无法编辑主题
  • 东莞设计网站重庆做腋臭骑士网站
  • 什么软件可以搜索关键词精准网站信息优化的方式
  • 购物网站排名前十名山东泰安建筑工程集团有限公司
  • 源码下载站用vs网站开发
  • 自己做网站seo彩票的网站怎么做
  • 如何在网站后台找到死链接网站内页权重查询
  • 专业做国际网站网站开发的编程软件
  • 如何运营垂直网站网页工具大全
  • 如何让自己做的网站可以播放歌曲做培训网站
  • 做网站的毕业设计网站没备案怎么做淘宝客
  • 百度申诉网站建设银行住房租赁代表品牌是什么
  • 网站初期推广方案虚拟服务器搭建wordpress
  • jeecms可以做网站卖吗山西网络推广专业
  • 2017 如何做网站优化育儿哪个网站做的好
  • 网站制作容易吗青岛网站建设公司报价
  • 淘宝建设网站的好处网站制作结构
  • 网站开发网站建设公司临沂网站建设找谁
  • 咋么做网站在电脑上潍坊免费模板建站
  • 苏州网站建设推广咨询平台做网站的公司图
  • 北京企业网站怎么建设免费给我推广
  • 网站制作价钱多少专业的咨询行业网站制作
  • 做百度网站每年的费用多少交换友情链接时需要注意的事项
  • 怎么在百度网站上做自己的网站百度开户渠道
  • php技术的网站建设实录方案做二手手机的网站有哪些
  • 做网站店铺装修的软件怎么做淘课网站