一、Stream,sink,source,transform
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的更多相关文章
- flink with rabbitmq,sink source mysql redis es
flink-dockerhttps://github.com/melentye/flink-docker https://shekharsingh.com/blog/2016/11/12/apache ...
- 八、RFCOMM
1. RFCOMM 先来看看RFCOMM在协议栈层次体系中的位置.从下图可以看出RFCOMM处于传输层.与AVCTP,TCS-BIN处于同一层次.处于其上层的会话层中的OBEX,SPP等大部 ...
- Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
在大数据程序流行的今天,许多程序都面临着共同的难题:程序输入数据趋于无限大,抵达时间又不确定.一般的解决方法是采用回调函数(callback-function)来实现的,但这样的解决方案很容易造成“回 ...
- SpringCloud Stream使用案例
官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架. 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互 ...
- 谈谈stream的运行原理
害,别误会,我这里说的stream不是流式编程,不是大数据处理框架.我这里说的是stream指的是jdk中的一个开发工具包stream. 该工具包在jdk8中出现,可以说已经是冷饭了,为何还要你说?只 ...
- Scalaz(49)- scalaz-stream: 深入了解-Sink/Channel
一个完整的scalaz-stream有以下几个部分组成:Source -> Transducer -> Sink,用直白文字来描述就是:“输入 -> 传换 -> 输出”.我们已 ...
- Android Bluetooth Stack: Bluedroid(五岁以下儿童):The analysis of A2DP Source
1. A2DP Introduction The Advanced Audio Distribution Profile (A2DP) defines the protocols and proced ...
- Akka(19): Stream:组合数据流,组合共用-Graph modular composition
akka-stream的Graph是一种运算方案,它可能代表某种简单的线性数据流图如:Source/Flow/Sink,也可能是由更基础的流图组合而成相对复杂点的某种复合流图,而这个复合流图本身又可以 ...
- Akka(22): Stream:实时操控:动态管道连接-MergeHub,BroadcastHub and PartitionHub
在现实中我们会经常遇到这样的场景:有一个固定的数据源Source,我们希望按照程序运行状态来接驳任意数量的下游接收方subscriber.又或者我需要在程序运行时(runtime)把多个数据流向某个固 ...
随机推荐
- log4net入门
简介 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题. 经验表明,日志 ...
- Linux 2.6 源码学习-内存管理-buddy算法
核心数据结构 linux 2.6 的内存管理支持NUMA(Non Uniform Memory Access Achitecture),即非一致内存访问体系,在该体系中存在多个CPU,并且拥有分离的存 ...
- Java虚拟机12:Java内存模型
什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致 ...
- js只需5分钟创建一个跨三大平台纯原生APP
DeviceOne之前介绍过了,现在来介绍一下DeviceOne快速开发到什么程度 使用js只需要5分钟就可以打出垮Android.ios.windows三大平台的纯原生UI的安装包. 只需要6个小时 ...
- Android获取View对应的Bitmap
我的应用里面有一个需求,将一个画面分享出去,这个画面底层是一个View,所以首先要把这个View转换成Bitmap,然后在分享这个bitmap即可.话不多说,直接上代码. 有个地方需要注意一下:就是/ ...
- 大叔也说Xamarin~Android篇~日志的记录
回到目录 无论哪个平台,开始哪种应用程序,日志总是少不了的,大家在Lind.DDD里也可以看到大叔的日志组件,而在xamarin进行移动开发时,为了更好的调试,记录运行的情况,日志也是必须的,这讲主要 ...
- Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth
Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1 Python 3_x 新特性1 python3.4新特性1 python3.5新特性1 值得关注的新特性1 ...
- java 线程协作 join()
在实际开发中我们往往会遇到这样的情况一个线程的执行需要依赖另一个线程执行后的结果.即主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他 ...
- Python下划线与命名规范
Python下划线与命名规范 先看结论,节省只想知道答案你的宝贵时间: _xxx 不能用于from module import * 以单下划线开头的表示的是protected类型的变量.即保护类型只能 ...
- Liferay7 BPM门户开发之40: Form表单的Action到Render的数据传递
在Form提交后的变量,很多情况是要展现在jsp页面中,这时Action到Render的变量传递就非常有用. 例如,您在数据库中添加了学生的详细信息. 为了实现这一需求,先创建Form表单(学生的细节 ...