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

  • 相关阅读:
    验证码处理函数
    Apache2.2下载及安装
    centos6.4、6.5、7.0环境下载及安装
    数据库实务 实务隔离级别
    InnoDB 锁
    索引常见问题处理
    数据库索引 B-Tree索引 hash索引
    JVM学习-(2)
    jvm学习-(1)
    linux杂记
  • 原文地址:https://www.cnblogs.com/fbli/p/5930354.html
Copyright © 2020-2023  润新知