Perché pulseaudio gestisce la connessione di qualità audio a un dispositivo BT?


11

Sono nuovo di Linux e anche di script Bluetooth. Quello che ho scoperto finora è il seguente:

  1. Bluez è lo stack BT predefinito.
  2. BluezTools è un insieme di utilità che è possibile utilizzare per interagire più facilmente con Bluez
  3. DBus è l'interfaccia a cui Bluez si connette mentre interagisce direttamente con l'hardware.
  4. PulseAudio è il sottosistema responsabile della produzione audio sul sistema.

Questo ha senso. Quindi diciamo che ho un set di cuffie BlueTooth, quello che mi aspetterei (tutto dopo l'associazione e la fiducia), per essere in grado di emettere un comando che può connettersi direttamente a un determinato profilo sulle cuffie BT.

Il percorso tecnico che ho in mente sarebbe qualcosa del tipo:

  1. Accendi le cuffie.
  2. Emettere un comando BluezTools - come bt-audio -c
  3. Attendi che il dispositivo si connetta al servizio che sto cercando
  4. PulseAudio dovrebbe ora prelevare un nuovo dispositivo di output
  5. Emettere un altro comando per cambiare l'audio da quello che era alla nuova uscita audio (le cuffie BT).
  6. Goditi un'esperienza di ascolto senza interruzioni.

Tutto questo sembra logico, ma l'implementazione effettiva non è così, e sto cercando il PERCHÉ, quindi posso capire meglio il problema e provare a risolverlo.

Questo è ciò che realmente accade:

  1. Accendi le cuffie.
  2. Emettere un comando BluezTools - come bt-audio -c
  3. Attendi che il dispositivo si connetta al servizio che sto cercando
  4. PulseAudio dovrebbe ora prelevare un nuovo dispositivo di output
  5. Emettere un comando PulseAudio per modificare il profilo audio dalla qualità del telefono all'alta fedeltà.

Lasciami espandere un po 'su questo. Le cuffie bluetooth offrono 2 modalità di qualità (telefono e alta fedeltà). Solo 1 è davvero adatto per l'ascolto di musica.

Mi aspetto che le cuffie BT espongano ogni modalità di qualità come servizio, giusto? Questa ipotesi potrebbe essere sbagliata, ma mi aspetterei qualcosa di simile

bt-audio -c highFidelityProfile

o

bt-audio -changeProfile highFidelityProfile

Invece sembra che Bluez gestisca semplicemente la connessione RAW al dispositivo e da lì è necessario emettere un: pacmd set-card-profile $ INDEX a2dp

Questo sembra fondamentalmente sbagliato. Perché il controllo di qualità nel sottosistema audio richiede quindi un'implementazione diversa per pulse o alsa o qualsiasi altro sottosistema audio disponibile?

Cosa mi sto perdendo? Perché non è possibile connettersi direttamente a un determinato profilo utilizzando Bluez / BluezTools ecc.?

Risposte:


2

Una connessione bluetooth ha una latenza significativa rispetto alle semplici cuffie o altoparlanti cablati. Inoltre, la latenza della connessione può variare, a seconda delle proprietà del ricevitore bluetooth e forse anche dell'intensità del segnale radio mentre l'utente si sposta.

L'interfaccia tra un'applicazione e PulseAudio può essere semplice come "ecco alcuni dati audio PCM; riproduci questo". Ma può anche essere più complicato; qualcosa come "Ecco alcuni dati audio PCM; riproduci questo e dimmi ogni 50 ms quanto lontano hai, in modo che io possa dirti di saltare avanti se sembra che stai cadendo dalla sincronizzazione labiale con il flusso video Sto giocando. Oh, e anche tu dovrai ricampionarlo, dato che i dati hanno una frequenza di campionamento che il tuo hardware non supporterà direttamente. " In quest'ultimo caso, PulseAudio deve essere in grado di fornire all'applicazione un feedback dal dispositivo audio per determinare correttamente fino a che punto i dati audio vengono effettivamente riprodotti in un determinato momento.

Di conseguenza, ha senso che PulseAudio sia abbastanza profondamente coinvolto nell'elaborazione audio Bluetooth: più sono gli strati intermedi, maggiori sono le possibilità di bufferizzare i dati senza mantenere un feedback accurato, facendo perdere la sincronizzazione labiale.

In effetti, prima dell'esistenza di PulseAudio, esisteva un backend ALSA per l'audio Bluetooth, ma era obsoleto. Penso che il problema fosse che le interfacce ALSA a quel tempo erano progettate principalmente per le schede audio tradizionali e che era difficile gestire una latenza audio potenzialmente variabile del Bluetooth.

Le interfacce di PulseAudio sono state progettate da zero per gestire vari dispositivi audio e persino commutare flussi audio tra di loro mentre il flusso è in riproduzione, quindi mi sembra che abbia un concetto piuttosto avanzato di latenza audio integrata.

Sì, avrebbe potuto essere implementato in BlueZ piuttosto che come modulo PulseAudio; ma poi BlueZ avrebbe dovuto presentare un'interfaccia audio per le applicazioni. E poiché PulseAudio vuole gestire "tutto" l'audio su un sistema (per poter trasferire l'audio che stai riproducendo dagli altoparlanti al Bluetooth o viceversa al volo), dovrebbe interfacciarsi con PulseAudio in qualche modo comunque.


2

Penso di aver finalmente trovato una soluzione (testata su due sistemi Linux Mint) anche se non ho idea del motivo per cui devo seguire questi esatti passaggi:

Passi iniziali:

  1. Installa blueman: sudo apt-get install blueman
  2. Modifica il file Bluetooth: sudo nano /etc/bluetooth/main.conf e aggiungi questa riga alla fine: Disable = Headset

Per ogni corsa:

  1. Riavvia servizio bluetooth: riavvia il servizio bluetooth sudo
  2. Apri Dispositivi da blueman nella barra delle applicazioni o digita blueman-manager nel terminale
  3. Cerca il tuo dispositivo audio bluetooth
  4. Fare clic con il tasto destro del mouse sul dispositivo e connettersi come auricolare
  5. Vai al suono dalle impostazioni di sistema
  6. Seleziona il tuo dispositivo facendo clic su di esso una volta
  7. Ora di nuovo vai al manager blueman
  8. Fare clic con il tasto destro del mouse sul dispositivo Bluetooth e impostare il profilo audio su Riproduzione ad alta fedeltà (lavandino A2DP)

Se perdi uno dei passaggi, vai al passaggio 1 e riprova. Fammi sapere se funziona.

Modifica : in Linux Mint 19, il gestore bluetooth predefinito funziona perfettamente con la riproduzione ad alta fedeltà, nessuna configurazione richiesta !!


0

Mentre può variare della tua configurazione, qui ci sono alcuni comandi ben testati.

È necessario impostare il dispositivo come affidabile. Può essere fatto tramite la GUI.

sdptool browse fornirà molti dettagli sui protocolli e sui canali disponibili sul dispositivo di destinazione.

È più facile impostare un sink audio bluetooth a2p quando si usano uscite audio simultanee, per configurarlo, vedere lo strumento paprefs .

sudo apt install bluetooth 
sudo apt install bluez bluez-tools
sudo apt install rfkill rfcomm

Avvia il dispositivo, dovrebbe essere comunque hci0:

sudo hciconfig hci0 up

Elenco dei dispositivi remoti:

sudo rfkill list

Elenco delle reti bluetooth:

hcitool scan

Sfoglia i protocolli disponibili:

sdptool browse 43:23:00:02:23:A7

Connetti un dispositivo:

sudo rfcomm connect hci0 43:23:00:02:23:A7

Invia un file:

sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png

Ricevi un file:

sudo bt-obex -s /

Scansiona / attendi i dati su un canale (qui canale 19) e scrivi i dati su un file chiamato dump, nella cartella home:

sudo apt install bluez-hcidump

hcidump -i hci0 -O 19 -w ~/dump

Alternativa: a volte utile per l'abbinamento:

sudo apt install bluetoothctl

bluetoothctl
power on
connect 43:23:00:02:23:A7
trust 43:23:00:02:23:A7
info 43:23:00:02:23:A7

[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on
[bluetooth]# pair 43:23:00:02:23:A7
[agent]PIN code: ####
[bluetooth]# trust 43:23:00:02:23:A7
[bluetooth]# connect 43:23:00:02:23:A7
[bluetooth]# info 43:23:00:02:23:A7
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.