¿Por qué pulseaudio maneja la conexión de calidad de sonido a un dispositivo BT?

11

Soy nuevo en Linux y nuevo en las secuencias de comandos de Bluetooth también. Lo que he descubierto hasta ahora es lo siguiente:

  1. Bluez es la pila BT predeterminada.
  2. BluezTools es un conjunto de utilidades que puedes usar para interactuar más fácilmente con Bluez
  3. DBus es la interfaz a la que se conecta Bluez mientras interactúa directamente con el hardware.
  4. PulseAudio es el subsistema responsable de producir audio en el sistema.

Esto tiene sentido. Entonces, supongamos que tengo un conjunto de auriculares BlueTooth, lo que esperaría es (todo después de emparejar y confiar), para poder emitir un comando que se pueda conectar directamente a un cierto perfil en los auriculares BT.

La ruta técnica que tengo en mente sería algo así como:

  1. Enciende los auriculares.
  2. Emita un comando de BluezTools, como bt-audio -c
  3. Espere a que el dispositivo se conecte al servicio que busco
  4. PulseAudio ahora debería recoger un nuevo dispositivo de salida
  5. Emita otro comando para cambiar el audio de lo que era al nuevo audio de salida (los auriculares BT).
  6. Disfruta de una experiencia auditiva perfecta.

Todo esto parece lógico, pero la implementación real no es así, y estoy buscando el POR QUÉ, así puedo entender mejor el problema e intentar solucionarlo.

Esto es lo que realmente sucede:

  1. Enciende los auriculares.
  2. Emita un comando de BluezTools, como bt-audio -c
  3. Espere a que el dispositivo se conecte al servicio que busco
  4. PulseAudio ahora debería recoger un nuevo dispositivo de salida
  5. Emita un comando PulseAudio para cambiar el perfil de audio de la calidad del teléfono a alta fidelidad.

Permítanme ampliar esto un poco. El auricular bluetooth ofrece 2 modos de calidad (teléfono y alta fidelidad). Solo 1 es realmente adecuado para escuchar música.

Esperaría que los auriculares BT expongan cada modo de calidad como un servicio, ¿es así? Esta suposición podría estar equivocada, pero esperaría algo como

bt-audio -c highFidelityProfile

o

bt-audio -changeProfile highFidelityProfile

En cambio, parece que Bluez solo maneja la conexión RAW al dispositivo, y desde allí debe emitir un: pacmd set-card-profile $ INDEX a2dp

Esto simplemente parece fundamentalmente incorrecto. ¿Por qué el control de calidad en el subsistema de audio requiere una implementación diferente para pulse o alsa, o cualquier otro subsistema de sonido?

¿Qué me estoy perdiendo? ¿Por qué no es posible conectarse directamente a un perfil determinado usando Bluez / BluezTools, etc.?

JL
fuente

Respuestas:

2

Una conexión bluetooth tiene una latencia significativa en comparación con los auriculares o altavoces con cable simples. Además, la latencia de la conexión puede variar, dependiendo de las propiedades del receptor bluetooth e incluso de la intensidad de la señal de radio a medida que el usuario se mueve.

La interfaz entre una aplicación y PulseAudio puede ser tan simple como "aquí hay algunos datos de audio PCM; reproduzca esto". Pero también puede ser más complicado; algo así como "Aquí hay algunos datos de audio PCM; reproduzca esto y dígame cada 50 ms qué tan lejos ha llegado, para que pueda decirle que salte adelante si parece que no está sincronizando los labios con la transmisión de video Estoy jugando. Ah, y también necesitarás volver a muestrearlo, ya que los datos tienen una frecuencia de muestreo que tu hardware no admitirá directamente ". En el último caso, PulseAudio necesita poder dar a la aplicación algunos comentarios del dispositivo de audio para determinar correctamente qué tan lejos se reproducen realmente los datos de audio en un momento dado.

Como resultado, tiene sentido que PulseAudio se involucre bastante profundamente en el procesamiento de audio Bluetooth: cuantas más capas intervenidas existan, más posibilidades hay de que los datos se almacenen sin mantener una respuesta precisa, lo que hace que se pierda la sincronización de labios.

De hecho, antes de que existiera PulseAudio, solía haber un backend ALSA para audio Bluetooth, pero fue desaprobado. Creo que el problema era que las interfaces de ALSA en ese momento estaban diseñadas principalmente para tarjetas de sonido tradicionales, y era difícil lidiar con una latencia de audio potencialmente variable de Bluetooth.

Las interfaces de PulseAudio fueron diseñadas desde cero para manejar varios dispositivos de sonido e incluso cambiar las transmisiones de audio entre ellas mientras se reproduce, por lo que me parece que también tiene un concepto bastante avanzado de latencia de audio incorporado.

Sí, podría haberse implementado en BlueZ en lugar de como un módulo PulseAudio; pero luego, BlueZ habría tenido que presentar una interfaz de audio para las aplicaciones. Y dado que PulseAudio quiere manejar "todo" el audio en un sistema (para poder transferir el audio que está reproduciendo actualmente desde los altavoces a Bluetooth o viceversa), tendría que interactuar con PulseAudio de alguna manera de todos modos.

telcoM
fuente
2

Creo que finalmente encontré una solución (probada en dos sistemas Linux Mint) aunque no tengo idea de por qué necesito seguir estos pasos exactos:

Pasos iniciales :

  1. Instalar blueman: sudo apt-get install blueman
  2. Edite el archivo Bluetooth: sudo nano /etc/bluetooth/main.conf y agregue esta línea al final: Disable = Headset

Para cada carrera:

  1. Reiniciar el servicio bluetooth: reinicio del servicio sudo bluetooth
  2. Abra Dispositivos desde blueman en la bandeja del sistema o escriba blueman-manager en la terminal
  3. Busque su dispositivo de audio bluetooth
  4. Haga clic derecho en su dispositivo y conéctese como auriculares
  5. Ir al sonido desde la configuración del sistema
  6. Seleccione su dispositivo haciendo clic en él una vez
  7. Ahora de nuevo ve a blueman-manager
  8. Haga clic con el botón derecho en su dispositivo bluetooth y configure el Perfil de audio en Reproducción de alta fidelidad (Fregadero A2DP)

Si omite alguno de los pasos, vaya al paso 1 e intente nuevamente. Hazme saber si esto funciona.

Editar : en Linux Mint 19, el administrador de bluetooth predeterminado funciona perfectamente con la reproducción de alta fidelidad, ¡no se requiere ninguna configuración!

Aditya Pal
fuente
0

Si bien puede variar de su configuración, aquí hay algunos comandos bien probados.

Debe configurar el dispositivo como confiable. Se puede hacer a través de la interfaz gráfica de usuario.

La exploración de sdptool proporcionará muchos detalles sobre los protocolos y canales disponibles en el dispositivo de destino.

Es más fácil configurar un receptor de audio a2p bluetooth cuando se utilizan salidas de audio simultáneas, para configurarlo, vea la herramienta paprefs .

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

Inicie el dispositivo, debería ser hci0 de todos modos:

sudo hciconfig hci0 up

Lista de dispositivos remotos:

sudo rfkill list

Lista de redes bluetooth:

hcitool scan

Examinar los protocolos disponibles:

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

Conecta un dispositivo:

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

Enviar un archivo:

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

Recibir un archivo:

sudo bt-obex -s /

Escanee / espere datos en un canal (aquí canal 19) y escriba datos en un archivo llamado dump, en la carpeta de inicio:

sudo apt install bluez-hcidump

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

Alternativa: a veces útil para emparejar:

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
NVRM
fuente