Enable=Source
Reboot, dispositivi nelle vicinanze dovrebbero ora riconoscere il dispositivo come A2DP sink
.
Ora sarà necessario interagire con BlueZ per reagire in modo appropriato quando un dispositivo sorgente A2DP inizierà a trasmettere l'audio al telefono.
Android e BlueZ stanno parlando tra loro tramite D-BUS
. Infatti, Android si connette al canale DBUS_SYSTEM e ascolta ogni annuncio BlueZ, ad esempio eventi, descrittori di file ...
Mi ricordo di aver legato con successo me stesso utilizzando un'applicazione nativa a questo canale d-bus e ottenuto l'accesso a i vari eventi che BlueZ stava postando. Questo è relativamente facile da utilizzare come riferimento, l'API BlueZ disponibile here.Se andate in questo modo, dovrete creare un'applicazione nativa (C/C++) e compilarla per la vostra piattaforma. Devi essere in grado di farlo utilizzando Android NDK
.
Se hai difficoltà a utilizzare D-BUS
, puoi provare questa libreria Java che ho appena trovato che gestisce la comunicazione con D-BUS per te: http://jbluez.sourceforge.net/. Non l'ho mai usato ma vale la pena provare secondo me.
Quello che dovete veramente fare è scoprire quando un dispositivo sorgente A2DP è accoppiato al telefono e quando inizia a trasmettere musica. Puoi recuperare questi eventi tramite D-BUS. Una volta che qualcuno proverà a trasmettere musica, devi dire a BlueZ che la tua applicazione nativa lo gestirà. C'è un documento piuttosto buono che spiega il flusso di eventi che dovresti gestire per farlo. Questo documento è accessibile here. La parte che ti interessa arriva a pagina 7. L'applicazione sink nell'esempio fornito è PulseAudio
ma potrebbe essere anche la tua applicazione.
BlueZ ti inoltrerà un socket UNIX quando chiamerai il metodo org.bluez.MediaTransport.Acquire
. Leggendo su questo socket fornirai i dati attualmente in streaming dal dispositivo remoto. Ma ricordo che un ragazzo che lavorava allo stack BlueZ mi aveva detto che i dati letti su questo socket non erano audio puro PCM, ma contenuti audio codificati. I dati sono generalmente codificati in un formato chiamato SBC
(codifica di bassa complessità di banda).
Decodifica SBC non è molto difficile, è possibile trovare un decoder right here.
Il passaggio finale sarebbe l'inoltro dell'audio PCM ai diffusori.
Per evitare di rimanere bloccati e per testare l'applicazione in modo più semplice, è possibile utilizzare il binario d-bus
che dovrebbe essere disponibile sul proprio sistema Android. Si trova in /system/bin.
test rapidi si può fare prima di fare qualsiasi cosa di cui sopra potrebbe essere:
Get nell'elenco Dispositivi:
dbus-send --system --dest = org.bluez --print per Reply/ org.bluez.Manager.GetProperties
Questa restituisce un array di adattatori con loro percorsi. Una volta individuati questi percorsi, è possibile recuperare l'elenco di tutti i dispositivi Bluetooth associati al/ai proprio/i adattatore/i.
dispositivi Ricevi un accoppiati:
dbus-send --system --print-risposta --dest = org.bluez /org/bluez/{pid}/hci0 org.bluez.Adapter .GetProperties
Fornisce l'elenco dei dispositivi associati nel campo Array dispositivi.
Una volta ottenuto l'elenco dei dispositivi associati al proprio adattatore Bluetooth, è possibile sapere se è collegato all'interfaccia AudioSource.
I dispositivi collegati all'interfaccia AudioSource:
dbus-send --system --print-risposta --dest = org.bluez /org/bluez/{pid}/hci0/dev_XX_XX_XX_XX_XX_XX org.bluez.AudioSource.GetProperties org.bluez.Manager.GetProperties
Spero che questo aiuti.
Hey Johnny, alcun progresso fino ad ora? ;) – Nippey
Ehi! Qualche progresso? – dpaksoni