1、Stream,sink,source,transform

1. 蓝牙核心概述

2.Stream,sink,source,transform

在ADK的blueCore里面,Stream做为一个逻辑结构用来描述一个数据终点(data Endpoint)。一般,一个流描述一个sink或者source,好比一个UART口,既能够接受数据,也能够发送数据,所以UART-stream包含一个sourse和一个sink。app

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

§ Read data from a source and interpret it directly ;ide

§ Generate data and write it to a sink ;ui

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

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

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

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

二、由于是驻存在VM内核去,所以缓冲区数据发生变化(如sink有更多空间能够写入,source有更多数据达到等)时,VM内核能够向已注册的task发送消息。blog

三、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() ;

相关文章
相关标签/搜索