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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM