在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
音頻主要來源有: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() ;