藍牙學習-A2DP

A2DP - Advanced Audio Distribution Profile

A2DP提供通過藍牙連接傳輸音頻流的能力十艾,比如手機播放音樂,藍牙耳機通過藍牙連接聽歌梯浪。在上面的例子中,手機扮演A2DP源(Source)的角色,藍牙耳機扮演A2DP接收器(Sink)的角色灼捂。因此A2DP服務是單項傳輸,無論是單聲道(mono)還是雙聲道(stereo)换团。A2DP主要實現(xiàn)SDC(sub band codec纵东,默認的a2dp編解碼方式),AAC啥寇,F(xiàn)DK偎球, LDAC,APTX等簡單codec辑甜。


A2DP的服務能力

A2DP服務是需要和AVRCP服務一起使用的衰絮。AVRCP控制器用來獲取A2DP源的數(shù)據(jù)信息,如title(曲名)磷醋,artist(演唱者)猫牡,album(專輯)及控制命令(play,stop邓线,repeat等)淌友。

1,A2DP接收器(Sink)

需要注冊的回調:

1骇陈,hci_packet_handler (注冊回調處理接收到的包震庭,比如發(fā)現(xiàn)包,配對包你雌,數(shù)據(jù)包等等)

2器联,a2dp_sink_packet_handler(注冊回調處理連接事件,如established/released婿崭,并執(zhí)行對應的配置工作拨拓,如codec配置;處理播放狀態(tài)如opened氓栈,paused渣磷,stopped,并執(zhí)行對應的動作授瘦;

3醋界,handle_l2cap_media_data_packet(注冊回調處理音頻流數(shù)據(jù)祟身,支持存儲和播放,默認是SBC編碼格式物独,可以解碼成PCM進行播放)

4袜硫,avrcp_packet_handler(注冊回調處理avrcp的命令回調,如connect挡篓,disconnect等)

5婉陷,avrcp_controller_packet_handler(注冊回調處理avrcp命令和消息通知,如poschanged官研,statuschanged等)

6秽澳,stdin_process,用戶控制的回調

A2DP和AVRCP服務配置

應用層需要創(chuàng)建A2DP和AVRCP的SDP記錄戏羽,然后注冊在SDP服務里

// Initialize SDP ? ?
sdp_init();? ?
// Create A2DP Sink service record and register it with SDP? ?
memset(sdp_avdtp_sink_service_buffer, 0, sizeof(sdp_avdtp_sink_service_buffer));? ?
a2dp_sink_create_sdp_record(sdp_avdtp_sink_service_buffer, 0x10001, AVDTP_SINK_FEATURE_MASK_HEADPHONE, NULL, NULL);? ?
sdp_register_service(sdp_avdtp_sink_service_buffer);

所以整個服務啟動流程如下:

1担神,l2cap_init();? //初始化藍牙鏈路
2,sm_init(); //初始化security manager始花,BLE也就是藍牙4.0后需要妄讯;
3,a2dp_sink_init();? //初始化a2dp和回調
a2dp_sink_register_packet_handler(&a2dp_sink_packet_handler);? ? a2dp_sink_register_media_handler(&handle_l2cap_media_data_packet);
4酷宵,local_stream_endpoint = a2dp_sink_create_stream_endpoint(...); //初始化音頻流終端亥贸,并進行對應的配置如codec,大小等浇垦,可視作處理音頻流的具體對象)
5炕置,avrcp_init();? ? //初始化avrcp并注冊回調
avrcp_register_packet_handler(&avrcp_packet_handler);
// Initialize AVRCP Controller? ?
avrcp_controller_init();? ?
avrcp_controller_register_packet_handler(&avrcp_controller_packet_handler);? ? ? ??
// Initialize AVRCP Target? ?
avrcp_target_init();? ?
avrcp_target_register_packet_handler(&avrcp_target_packet_handler);
6,sdp_init(); //初始化sdp男韧,其他設備可以發(fā)現(xiàn)a2dp和avrcp服務
?// Create A2DP Sink service record and register it with SDP? ?
memset(sdp_avdtp_sink_service_buffer, 0, sizeof(sdp_avdtp_sink_service_buffer));? ? // 150字節(jié)內(nèi)存
a2dp_sink_create_sdp_record(sdp_avdtp_sink_service_buffer, 0x10001, AVDTP_SINK_FEATURE_MASK_HEADPHONE, NULL, NULL);? ?
sdp_register_service(sdp_avdtp_sink_service_buffer);
avrcp_controller_create_sdp_record(sdp_avrcp_controller_service_buffer, 0x10002, controller_supported_features, NULL, NULL);? ?
sdp_register_service(sdp_avrcp_controller_service_buffer);? ? ? ?
// Create AVRCP Target service record and register it with SDP. We receive Category 2 commands from the media player, e.g. volume up/down? ?
memset(sdp_avrcp_target_service_buffer, 0, sizeof(sdp_avrcp_target_service_buffer));? ?
uint16_t target_supported_features = AVRCP_FEATURE_MASK_CATEGORY_MONITOR_OR_AMPLIFIER;? ?
avrcp_target_create_sdp_record(sdp_avrcp_target_service_buffer, 0x10003, target_supported_features, NULL, NULL);? ?
sdp_register_service(sdp_avrcp_target_service_buffer);
// Create Device ID (PnP) service record and register it with SDP? ?
memset(device_id_sdp_service_buffer, 0, sizeof(device_id_sdp_service_buffer));? ?
device_id_create_sdp_record(device_id_sdp_service_buffer, 0x10004, DEVICE_ID_VENDOR_ID_SOURCE_BLUETOOTH, BLUETOOTH_COMPANY_ID_BLUEKITCHEN_GMBH, 1, 1);? ?
sdp_register_service(device_id_sdp_service_buffer);
7朴摊,gap_set_local_name("A2DP Sink Demo 00:00:00:00:00:00");? ? //設置設備名稱和address(mac地址)
gap_discoverable_control(1);? ? //可被發(fā)現(xiàn)
gap_set_class_of_device(0x200408); //設置device class
8,hci_event_callback_registration.callback = &hci_packet_handler;? ? // Register for HCI events?
hci_add_event_handler(&hci_event_callback_registration);

總結:從底到頂?shù)呐渲眠^程就是:初始化l2cap, sm(如果要支持ble)-> 注冊hci回調->配置gap(名稱此虑,地址甚纲,設備類型,并確認可被發(fā)現(xiàn))-> 配置SDP(設備id寡壮,產(chǎn)品id贩疙,avrcp和a2dp的服務配置)-> 初始化avrcp, avrcp target, avrcp controller及a2dp sink(source)讹弯,stream endpoint并注冊對應的回調

2况既,A2DP源(Source)

成為A2DP源需要應用的藍牙協(xié)議棧和Sink大致一樣。區(qū)別主要在以下內(nèi)容:

1组民,A2DP源在經(jīng)典藍牙協(xié)議框架里是作為master設備存在棒仍,不是外設,所以需要配置hci:hci_set_master_slave_policy(0)臭胜,0是master莫其,1是讓連接設備確認癞尚;
2,不同于A2DP Sink乱陡,A2DP初始化源的過程相對簡單浇揩,只需要a2dp_source_init()和a2dp_source_register_packet_handler就可,此handle為處理音頻流的handle憨颠;
3胳徽,stream_endpoint和avrcp初始化和Sink一樣,同理SDP爽彤,GAP都一樣
4养盗,配置音頻流,如采樣率等

總結:大致和A2DP接收器一樣适篙,只是具體角色和handle不一樣

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末往核,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嚷节,更是在濱河造成了極大的恐慌聂儒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硫痰,死亡現(xiàn)場離奇詭異薄货,居然都是意外死亡,警方通過查閱死者的電腦和手機碍论,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門谅猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鳍悠,你說我怎么就攤上這事税娜。” “怎么了藏研?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵敬矩,是天一觀的道長。 經(jīng)常有香客問我蠢挡,道長弧岳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任业踏,我火速辦了婚禮禽炬,結果婚禮上,老公的妹妹穿的比我還像新娘勤家。我一直安慰自己腹尖,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布伐脖。 她就那樣靜靜地躺著热幔,像睡著了一般乐设。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绎巨,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天近尚,我揣著相機與錄音,去河邊找鬼场勤。 笑死肿男,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的却嗡。 我是一名探鬼主播舶沛,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窗价!你這毒婦竟也來了如庭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤撼港,失蹤者是張志新(化名)和其女友劉穎坪它,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帝牡,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡往毡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了靶溜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片开瞭。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖罩息,靈堂內(nèi)的尸體忽然破棺而出嗤详,到底是詐尸還是另有隱情,我是刑警寧澤瓷炮,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布葱色,位于F島的核電站,受9級特大地震影響娘香,放射性物質發(fā)生泄漏苍狰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一烘绽、第九天 我趴在偏房一處隱蔽的房頂上張望淋昭。 院中可真熱鬧,春花似錦诀姚、人聲如沸响牛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呀打。三九已至,卻和暖如春糯笙,著一層夾襖步出監(jiān)牢的瞬間贬丛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工给涕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留豺憔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓够庙,卻偏偏與公主長得像恭应,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耘眨,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • Android之藍牙驅動開發(fā)總結 一[http://blog.csdn.net/manshq163com/arti...
    Wood木木閱讀 840評論 0 1
  • AVRCP - Audio/Video Remote Control Profile AVRCP提供藍牙設備如何遠...
    集韻增廣閱讀 2,324評論 0 0
  • 自適應調頻技術是建立在自動信道質量分析基礎上的一種頻率自使用和功率自適應控制相結合的技術昼榛,他能使調頻通信過程中自動...
    sgy1993閱讀 1,728評論 0 0
  • HW層:藍牙芯片層 RF(RADIO):射頻層,本地藍牙數(shù)據(jù)通過射頻信號發(fā)送給空中設備剔难,并通過射頻接收來自空中的藍...
    集韻增廣閱讀 6,251評論 0 13
  • 參考:https://bluekitchen-gmbh.com/btstack/#protocols/#sdp-s...
    集韻增廣閱讀 843評論 0 1