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

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

Soy nuevo en Linux y también en las secuencias de comandos Bluetooth. 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 utilizar 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, digamos que tengo un par de auriculares BlueTooth, lo que esperaría es (todo después de emparejar y confiar) poder emitir un comando que pueda conectarse directamente a un determinado perfil en los auriculares BT.

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

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

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

Esto es lo que realmente sucede:

  1. Enciende los auriculares.
  2. Emita un comando de BluezTools, como por ejemplobt-audio -c
  3. Espere a que el dispositivo se conecte al servicio que busco
  4. PulseAudio ahora debería elegir un nuevo dispositivo de salida
  5. Emita un comando PulseAudio para cambiar el perfil de audio de calidad telefónica a alta fidelidad.

Permítanme ampliar esto un poco. Los auriculares bluetooth ofrecen 2 modos de calidad (teléfono y alta fidelidad). Sólo 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 ser errónea, pero esperaría algo como

bt-audio -c perfil de alta fidelidad

o

bt-audio -changeProfile perfil de alta fidelidad

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

Esto parece fundamentalmente incorrecto. ¿Por qué el control de calidad está en el subsistema de audio y, por lo tanto, requiere una implementación diferente para Pulse o Alsa, o cualquier otro subsistema de sonido que exista?

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

Respuesta1

Una conexión bluetooth tiene una latencia significativa en comparación con unos simples auriculares o altavoces con cable. Es más, la latencia de la conexión puede variar, dependiendo de las propiedades del receptor bluetooth y tal vez 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 resultar más complicado; algo como "Aquí hay algunos datos de audio PCM; reproduzca esto y dígame cada 50 ms qué tan lejos ha llegado, para que pueda indicarle que avance si parece que no está sincronizando los labios con la transmisión de video". Estoy jugando. Ah, y tendrás que volver a muestrearlos también, ya que los datos tienen una frecuencia de muestreo que tu hardware no admite directamente". En el último caso, PulseAudio debe poder brindarle a la aplicación información del dispositivo de audio para determinar correctamente hasta qué punto se han reproducido realmente los datos de audio en un momento dado.

Como resultado, tiene sentido que PulseAudio esté bastante involucrado en el procesamiento de audio Bluetooth: cuantas más capas intermedias haya, más posibilidades habrá de que los datos se almacenen en el búfer sin mantener una retroalimentación precisa, lo que provocará 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 quedó obsoleto. 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 transmisiones de audio entre ellos mientras se reproduce la transmisión, por lo que me parece que también tiene incorporado un concepto bastante avanzado de latencia de audio.

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

Respuesta2

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

Pasos iniciales :

  1. Instalar blueman:sudo apt-get instalar blueman
  2. Editar archivo Bluetooth:sudo nano /etc/bluetooth/main.confy agrega esta línea al final:Desactivar=Auriculares

Para cada ejecución:

  1. Reinicie el servicio bluetooth:reinicio del bluetooth del servicio sudo
  2. Abra Dispositivos de blueman en la bandeja del sistemaotipogerente-bluemanen la terminal
  3. Buscarpara su dispositivo de audio bluetooth
  4. Haga clic derecho en su dispositivo y conéctese comoauriculares
  5. Ir asonidodesde la configuración del sistema
  6. Seleccione su dispositivo haciendo clic en él una vez
  7. Ahora de nuevo ve agerente-blueman
  8. Haga clic derecho en su dispositivo bluetooth y configure el perfil de audio enReproducción de alta fidelidad (sumidero A2DP)

Si omite alguno de los pasos, vaya al paso 1 y vuelva a intentarlo. Hazme saber si esto funciona.

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

Respuesta3

Si bien puede variar según 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.

navegación sdptoolbrindará muchos detalles sobre los protocolos y canales disponibles en el dispositivo de destino.

Es más fácil configurar un disipador de audio bluetooth a2p cuando se usan salidas de audio simultáneas, para configurarlo, consulte la herramientapaprefs.

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

Listar dispositivos remotos:

sudo rfkill list

Lista de redes bluetooth:

hcitool scan

Explorar protocolos disponibles:

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

Conecte 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í el canal 19) y escriba los datos en un archivo llamado volcado, 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

información relacionada