Enable=Source
Reboot, w pobliżu urządzenia powinny teraz rozpoznaje urządzenie jako A2DP sink
.
Teraz będziesz musiał nawiązać kontakt z BlueZ, aby odpowiednio zareagować, gdy urządzenie źródłowe A2DP rozpocznie przesyłanie dźwięku do telefonu.
Android i BlueZ rozmawiają ze sobą przez D-BUS
. W rzeczywistości Android łączy się z kanałem DBUS_SYSTEM i słucha każdej reklamy BlueZ, takiej jak zdarzenia, deskryptory plików ...
Pamiętam, że udało mi się powiązać moje własne przy użyciu natywnej aplikacji z tym kanałem D-Bus i uzyskać dostęp do różne wydarzenia, które opublikował BlueZ. Jest to stosunkowo łatwe do osiągnięcia przy użyciu jako odniesienia, dostępny interfejs API BlueZ here.Jeśli pójdziesz tą drogą, będziesz musiał zbudować natywną aplikację (C/C++) i skompilować ją dla swojej platformy. Musisz to zrobić, używając Android NDK
.
Jeśli korzystanie z D-BUS
jest utrudnione, możesz wypróbować tę bibliotekę Java, którą właśnie znalazłem i która obsługuje komunikację z D-BUS: http://jbluez.sourceforge.net/. Nigdy go nie używałem, ale warto spróbować w mojej opinii.
To, co naprawdę musisz zrobić, to dowiedzieć się, kiedy urządzenie źródłowe A2DP jest sparowane z telefonem i kiedy zaczyna odtwarzać muzykę. Możesz pobrać te zdarzenia przez D-BUS. Gdy ktoś spróbuje przesyłać strumieniowo muzykę, musisz powiedzieć BlueZ, że Twoja aplikacja natywna sobie z tym poradzi. Istnieje całkiem niezły dokument wyjaśniający przebieg zdarzeń, które należy wykonać, aby to zrobić. Ten dokument jest dostępny pod numerem here. Część, która Cię interesuje, znajduje się na stronie 7. Aplikacja zlewozmywakowa w tym przykładzie to PulseAudio
, ale może to być również twoja aplikacja.
BlueZ przekaże ci gniazdo UNIX, gdy zadzwonisz na metodę org.bluez.MediaTransport.Acquire
. Odczyt w tym gnieździe daje dane, które są aktualnie przesyłane strumieniowo przez urządzenie zdalne. Ale pamiętam, że ktoś, kto pracował na stosie BlueZ, powiedział, że dane odczytane z tego gniazda nie są czystym dźwiękiem PCM, lecz zakodowaną treścią audio. Dane są ogólnie kodowane w formacie zwanym SBC
(kodowanie podpasma o niskiej złożoności).
Dekodowanie SBC nie jest trudne, można znaleźć dekoder right here.
Ostatecznym krokiem byłoby przekazanie dźwięku PCM do głośników.
Aby zapobiec utknięciu i łatwiej przetestować aplikację, można użyć pliku binarnego d-bus
, który powinien być dostępny w systemie Android. Znajduje się w /system/bin.
Szybkie testy można zrobić zanim cokolwiek z powyższych może być:
Get listy urządzeń:
dbus-send --system --dest = org.bluez --print -reply/ org.bluez.Manager.GetProperties
Powoduje wyświetlenie tablicy adapterów z ich ścieżkami. Po uzyskaniu tych ścieżek możesz pobrać listę wszystkich urządzeń bluetooth sparowanych z twoimi adapterami.
Get sparowane:
dbus-send --system --print-odpowiedź --dest = org.bluez /org/bluez/{pid}/hci0 org.bluez.Adapter .GetProperties
Daje to listę sparowanych urządzeń, które znajdują się w polu Tablica urządzeń.
Po zestawieniu urządzeń sparowanych z adapterem Bluetooth można sprawdzić, czy jest on podłączony do interfejsu AudioSource.
Get urządzenia podłączone do interfejsu AudioSource:
dbus-send --system --print-odpowiedź --dest = org.bluez /org/bluez/{pid}/hci0/dev_XX_XX_XX_XX_XX_XX org.bluez.AudioSource.GetProperties org.bluez.Manager.GetProperties
nadzieję, że to pomaga.
Hey Johnny, wszelkiego postępu tak daleko? ;) – Nippey
Hej! Jakiś postęp? – dpaksoni