2017-04-07 51 views
0

我在我的嵌入式設備中將Bluez 4.97更新爲5.35。爲什麼在Bluez 5.35中SBC編解碼器的功能在android/hal-audio-sbc.c中未初始化AVDTP.c中

對於A2DP連接,我們必須共享SBC編解碼器功能。在理想情況下,容量將如圖1 AVDTP packet with bluez 4.97所示。在Bluez 4.97代碼,我從AVDTP層獲得sbc_getcap_ind()函數的SBC編解碼器功能。在sbc_getcap_ind()中,sbc_codec_capavdtp_media_codec_capability被初始化。所以這個能力包我可以發回到手機。

In 5.35sbc_getcap_ind()函數不可用。 avdtp_media_codec_capability設置在endpoint_getcap_ind()功能在AVDTP層,這是根據我的預期。但是sbc_codec_cap未初始化。所以我得到像圖2 AVDTP corrupt packet with bluez 5.35 packect。

的bluez 5.35有自帶的新包的Android/HAL-AUDIO-sbc.c,在這個包SBC編碼功能設置。

我的嵌入式設備是基於RTOS的,我與android無關。 所以我有以下懷疑:

1)爲什麼在blueZ堆棧中有新的android包?這背後的發展理念是什麼?

2)爲什麼SBC功能將在的Android/HAL-AUDIO-sbc.c初始化,如何非Android設備將訪問SBC功能?

3)如何在我的嵌入式環境中,我可以使用Android的/HAL-AUDIO-sbc.c讓SBC功能?

我想我無法解決這個問題,因爲我錯過了對新的5.35架構的理解。並沒有足夠的文件來了解BlueZ架構。我希望通過得到這些問題的答案我能理解5.35 BlueZ包中android文件夾的意義。

回答

0

在回答您的問題之前,我想分享幾個網址。

  1. Porting guide
  2. Management interface

即將爲您的問題,

  1. 現在的BlueZ同時支持Android和Linux平臺。目錄「android」只包含與android平臺相關的源碼,不能用於Linux環境。這背後的想法是分享Linux和android之間的通用開發代碼,並分別開發通用功能(通常在「src」,「gdbus」和「profile」目錄下)。
  2. 作爲BlueZ 4到BlueZ 5遷移或主要開發的一部分,所有與音頻相關的實現都從BlueZ移出。現在,音頻應用程序的責任是自行實施全部內容並在BlueZ(doc/profile-api.txt ==> RegisterProfile() method)上註冊。 BlueZ只會充當應用程序和設備之間的中介。就Linux而言,BlueZ內部沒有音頻實現。我不確定在BlueZ下的Android目錄。所以非android平臺需要自行實現。
  3. 如前所述,您需要爲BlueZ實現我們自己的音頻相關配置文件。我們有一個工作軟件,它是pulseaudio。您可以在pulseaudio(pactl)中加載module-bluez-discover,並且Pulse音頻負責處理音頻。

另外還有一個開源的解決方案,bluealsa,目前正在開發中。使用後,我可以看到很多音頻延遲和質量下降。如果您想要完美的解決方案,請自行實施或使用pulseaudio(沒有太多實時)。

簡而言之,將BlueZ 4.x移植到BlueZ 5.x並不容易!

+0

在BlueZ 4.x中,A2DP共享SBC/MPEG CODEC規範,而連接配置爲SOURCE/SINK。一旦建立了A2DP連接,SBC/MPEG音頻數據包將通過HCI層發送到L2CAP層。我發送的這個SBC/MPEG包親自開發了SBC/MPEG解碼器。在Bluez 5.x中,SBC/MPEG CODEC規範,而A2DP連接不可用,因爲A2DP連接本身發生故障。因此,對於解決方案,我購買了4.97 SBC get_capablity代碼到5.35,並且A2DP正在連接並獲取SBC數據包到L2CAP層。 你認爲它是一種可靠的實時方案嗎? – Hari

+0

對於PulseAudio應用程序,BlueZ將開始與PulseAudio進行通信? PulseAudio是否會在HCI層或傳輸層或L2CAP層從BlueZ獲取音頻數據包? – Hari

+0

@HarishSingh在pulseaudio中,模塊藍牙實現了編解碼器,並在模塊初始化期間使用RegisterEndpoint調用向BlueZ註冊自己。從那裏開始,每當BlueZ連接到具有A2DP配置文件的新設備時,它將通過profile-manager界面在NewConnection呼叫請求後在pulseaudio模塊中調用「SelectConfig *,SetConfig *」調用。因此,pulseaudio中的藍牙模塊有責任獲取FD並從fd讀取音頻數據。 –

相關問題