1. 蓝牙核心概述

2.Stream,sink,source,transform

在ADK的blueCore里面,Stream作为一个逻辑结构用来描述一个数据终点(data Endpoint)。通常,一个流描述一个sink或者source,比如一个UART口,既可以接受数据,也可以发送数据,因此UART-stream包含一个sourse和一个sink。

Data can be written to a sink and read from a source. An application may:

§ Read data from a source and interpret it directly ;

§ Generate data and write it to a sink ;

§ Read data from a source, process it, then write it to a sink  or

§ Connect a source and sink together, so that data arriving at one is automatically transferred to the other.

Sink有点类似于发送数据缓冲区,Source类比于接收数据缓冲区,它们的特别之处在于:

1、缓冲区驻存于VM内核区,在使用的时候需要映射(sinkMap/sourceMap)到VM用户区才能进行操作。

2、因为是驻存在VM内核去,因此缓冲区数据发生变化(如sink有更多空间可以写入,source有更多数据达到等)时,VM内核可以向已注册的task发送消息。

3、sink与source通常是成对出现的。无论是直接连接还是managed connection,通过连接后,sink与source绑定在一起,通过sink可以查询到对应的source实体,同理,通过source可以找到关联的sink实体。因此部分API只提供sink版本,通常这类API是针对整个连接的,且同一时间,某个sink或者source只能建立一个连接,因此以sink作为入参即可。如:MessageSinkTask(Sink sink, Task task)和MessageSinkGetTask(Sink sink)。

蓝牙例程里面,数据主要以流的形式从一个模块传递到另外一个模块,流封装了(或者说屏蔽了)硬件接口,将物理或者逻辑输入输出模块封装成了流。主要流有:audio(adc,dac,mic等),uart,Rfcomm,Kalimba,File等,一切源于流,一切终于流,跟unix里面一切皆文件有异曲同工之妙。

Streams provide an efficient method of transferring data in BlueLab applications. They can be used to transfer data across the air between connected Bluetooth devices, along a wire between processors in the device or internally on the chip.

通常,每个流都与一个源节点 (source)和一个终节点(sink)关联,所有数据都是产生于源点,终结于sink节点,数据在不同模块之间流动前,需要建立一条逻辑连接(如直接连接StreamConnect(source, sink)),当source节点与sink节点建立连接后,两者绑定在一起,通过一方都可以找到另一方句柄。(有点类似socket建立连接之后,通过getpeername获取对方地址);

例如,将从uart获取的数据,通过RF发送出去,典型流处理流程如下:

Source = StreamUartSource();

Sink  = StreamRfcommSink();

StreamConnect(Source,  Sink);    /*(直接)连接建立后,数据自动开始从source传递到sink*/

数据从源节点流向终结点前,这两者必须建立连接,BlueLab提供两种不同的方式来建立连接:

1.Direct connection.直接连接,无需提供控制数据,数据直接从source发送到sink,无需用户干预(对用户透明)。

2.managed connection.用户通过一系列的系统调用建立该类连接,该种连接模式下,用户可以自由控制数据流动,便于拥塞控制等。

L2CAP,RFCOMM,SCO连接请求成功后都会返回一个sink实体,通过该实体可以所以唯一地访问L2CAP,RFCOMM,SCO链路,这主要是通过sink例程:

uint16 SinkGetScoHandle(Sink sink);

uint16 SinkGetRfcommConnId(Sink sink);

uint16 SinkGetL2capCid(Sink sink)

这些例程实现sink到handler,connid,cid的映射。因此在释放某条链路时的接口:

ConnectionL2capDisconnectRequest(Task theAppTask, Sink sink),入参之一是sink,而不是CID。

更多信息请参考CSR官方文档:CS-207483-UG-ImplementingStreamsinBlueCoreApplicationsUse Guide.pdf

1.1       音频流

音频主要来源有:PCM,I2S,SPDIF,MIC_L,MIC_R,FM模块,其中PCM,I2S,SPDIF三者由于硬件上共用引脚,因此需要互斥使用。音频数据输出到:PCM,I2S,SPDIF,SPK_L,SPK_R,FM模块。AUDIO_HARDWARE_CODEC是何方神圣呢????

audio_hardware

audio_instance

物理模块

audio_channel

通道号

AUDIO_HARDWARE_PCM

_INSTANCE_0/1

PCM

_CHANNEL_SLOT_x

0,1,2,3

AUDIO_HARDWARE_I2S

_INSTANCE_0/1

I2S

_CHANNEL_SLOT_x

0

AUDIO_HARDWARE_SPDIF

_INSTANCE_0/1

SPDIF

_CHANNEL_SLOT_x

0

AUDIO_HARDWARE_CODEC

_INSTANCE_0/1

SPK_L/R

_CHANNEL_A/B/AB

AUDIO_HARDWARE_DIG_MIC

_INSTANCE_0/1/2

MIC_L/R

_CHANNEL_A/B/AB

AUDIO_HARDWARE_FM

_INSTANCE_0

FM

_CHANNEL_A/B

音频流专有操作接口主要以下三个:

StreamAudioSource();

StreamAudioSink() ;

CodecSetIirFilter() ;

一、Stream,sink,source,transform的更多相关文章

  1. flink with rabbitmq,sink source mysql redis es

    flink-dockerhttps://github.com/melentye/flink-docker https://shekharsingh.com/blog/2016/11/12/apache ...

  2. 八、RFCOMM

    1.      RFCOMM 先来看看RFCOMM在协议栈层次体系中的位置.从下图可以看出RFCOMM处于传输层.与AVCTP,TCS-BIN处于同一层次.处于其上层的会话层中的OBEX,SPP等大部 ...

  3. Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介

    在大数据程序流行的今天,许多程序都面临着共同的难题:程序输入数据趋于无限大,抵达时间又不确定.一般的解决方法是采用回调函数(callback-function)来实现的,但这样的解决方案很容易造成“回 ...

  4. SpringCloud Stream使用案例

    官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架. 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互 ...

  5. 谈谈stream的运行原理

    害,别误会,我这里说的stream不是流式编程,不是大数据处理框架.我这里说的是stream指的是jdk中的一个开发工具包stream. 该工具包在jdk8中出现,可以说已经是冷饭了,为何还要你说?只 ...

  6. Scalaz(49)- scalaz-stream: 深入了解-Sink/Channel

    一个完整的scalaz-stream有以下几个部分组成:Source -> Transducer -> Sink,用直白文字来描述就是:“输入 -> 传换 -> 输出”.我们已 ...

  7. Android Bluetooth Stack: Bluedroid(五岁以下儿童):The analysis of A2DP Source

    1. A2DP Introduction The Advanced Audio Distribution Profile (A2DP) defines the protocols and proced ...

  8. Akka(19): Stream:组合数据流,组合共用-Graph modular composition

    akka-stream的Graph是一种运算方案,它可能代表某种简单的线性数据流图如:Source/Flow/Sink,也可能是由更基础的流图组合而成相对复杂点的某种复合流图,而这个复合流图本身又可以 ...

  9. Akka(22): Stream:实时操控:动态管道连接-MergeHub,BroadcastHub and PartitionHub

    在现实中我们会经常遇到这样的场景:有一个固定的数据源Source,我们希望按照程序运行状态来接驳任意数量的下游接收方subscriber.又或者我需要在程序运行时(runtime)把多个数据流向某个固 ...

随机推荐

  1. Windows Azure Service Bus Notification Hub推送通知

    前言 随着Windows Azure 在中国的正式落地,相信越来越多的人会体验到Windows Azure带来的强大和便利.在上一篇文章中, 我们介绍了如何利用Windows Azure中的Servi ...

  2. java提高篇(十六)-----异常(一)

         Java的基本理念是“结构不佳的代码不能运行”!!!!! 大成若缺,其用不弊. 大盈若冲,其用不穷. 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因 ...

  3. JavaScript 误区

    接触JavaScript两年多遇到过各种错误,其中有一些让人防不胜防,原来对JavaScript的误会如此之深,仅以此文总结一下常见的各种想当然的误区 String replace string的re ...

  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明

    上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>介绍了如何通过通用接口获取AccessToken,有了AccessToken,我们就可以来操作 ...

  5. C++ inline函数

    本文主要记录了C++中的inline函数,也就是内联函数,主要记录了以下几个问题: C++为什么引入inline函数? 为什么inline能很好的取代表达式形式的预定义? inline函数的使用场合 ...

  6. RSS与公众号

    这次怀念下曾经火热的RSS.RSS是我很喜欢的一种看信息学习的方式,但是这项技术随着谷歌reader产品的停止已经陨落了.之后再无给力的客户端,无法让人愉悦的使用.我也曾尝试用鲜果,有道等国内产品,由 ...

  7. 暂停JS的深入学习

    对于JS的掌握程度,已经满足中级前端工程师的需要了,现在需要入门一下后端的基础知识,如nginx服务器一类的知识,方便今后快速开发. 先来nginx,文章.

  8. Apache Commons CLI命令行启动

    今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式--比如可以从命令行启动,也可以从web端启动.今天就看看如何设计命令行启动... Apache Commons CLI Apac ...

  9. 用VC编译lua源码,生成lua语言的解释器和编译器

    用VC编译lua源码,生成lua语言的解释器和编译器 1.去网址下载源码 http://www.lua.org/download.html 2.装一个VC++,我用的是VC6.0 3.接下来我们开始编 ...

  10. Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结

    Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结 软件项目中的非法模块非法功能非法分子与人类中的非法分子很是相似,必须要建议不同的的约束管理标准化... 软 ...