Por que o pulseaudio lida com a conexão de qualidade de som com um dispositivo BT?


11

Também sou novo no Linux e também no script Bluetooth. O que eu descobri até agora é o seguinte:

  1. Bluez é a pilha BT padrão.
  2. BluezTools é um conjunto de utilitários que você pode usar para interagir mais facilmente com o Bluez
  3. DBus é a interface à qual o Bluez se conecta enquanto interage diretamente com o hardware.
  4. PulseAudio é o subsistema responsável pela produção de áudio no sistema.

Isso faz sentido. Então, digamos que eu tenho um conjunto de fones de ouvido BlueTooth, o que eu esperaria é (tudo depois de emparelhar e confiar), para poder emitir um comando que possa se conectar diretamente a um determinado perfil nos fones de ouvido BT.

O caminho técnico que tenho em mente seria algo como:

  1. Ligue os fones de ouvido.
  2. Emita um comando BluezTools - como bt-audio -c
  3. Aguarde o dispositivo se conectar ao serviço que estou procurando
  4. PulseAudio agora deve pegar um novo dispositivo de saída
  5. Emita outro comando para alterar o áudio do que era para o novo áudio de saída (os fones de ouvido BT).
  6. Desfrute de uma experiência auditiva contínua.

Tudo isso parece lógico, mas a implementação real não é assim, e estou procurando o PORQUE, para entender melhor o problema e tentar corrigi-lo.

Isto é o que realmente acontece:

  1. Ligue os fones de ouvido.
  2. Emita um comando BluezTools - como bt-audio -c
  3. Aguarde o dispositivo se conectar ao serviço que estou procurando
  4. PulseAudio agora deve pegar um novo dispositivo de saída
  5. Emita um comando PulseAudio para alterar o perfil de áudio da qualidade do telefone para alta fidelidade.

Deixe-me expandir um pouco isso. O fone de ouvido bluetooth oferece 2 modos de qualidade (telefone e alta fidelidade). Apenas 1 é realmente adequado para ouvir música.

Eu esperaria que os fones de ouvido da BT expusessem cada modo de qualidade como um serviço, está certo? Essa suposição pode estar errada, mas eu esperaria algo como

bt-audio -c highFidelityProfile

ou

bt-audio -changeProfile highFidelityProfile

Em vez disso, parece que o Bluez apenas lida com a conexão RAW com o dispositivo e, a partir daí, é necessário emitir um: pacmd set-card-profile $ INDEX a2dp

Isso parece fundamentalmente errado. Por que o controle de qualidade no subsistema de áudio exige uma implementação diferente para pulse ou alsa ou qualquer outro subsistema de som existente?

o que estou perdendo? Por que não é possível conectar-se diretamente a um determinado perfil usando o Bluez / BluezTools etc?

Respostas:


2

Uma conexão bluetooth possui latência significativa em comparação com fones de ouvido ou alto-falantes com fio simples. Além disso, a latência da conexão pode variar, dependendo das propriedades do receptor bluetooth e talvez até da intensidade do sinal de rádio enquanto o usuário se move.

A interface entre um aplicativo e o PulseAudio pode ser tão simples quanto "aqui estão alguns dados de áudio do PCM; toque isso". Mas também pode ser mais complicado; algo como "Aqui estão alguns dados de áudio do PCM; reproduza isso e me diga a cada 50 ms a distância que você alcançou, para que eu possa avisar se você parecer que está perdendo a sincronização labial com o fluxo de vídeo Estou jogando. Ah, e você também precisará alterá-la novamente, já que os dados têm uma taxa de amostragem que seu hardware não suporta diretamente ". Neste último caso, o PulseAudio precisa fornecer ao aplicativo algum feedback do dispositivo de áudio para determinar corretamente até que ponto os dados de áudio são realmente reproduzidos a qualquer momento.

Como resultado, faz sentido que o PulseAudio esteja profundamente envolvido no processamento de áudio Bluetooth: quanto mais camadas houver, maior a possibilidade de os dados serem armazenados em buffer sem manter feedback preciso, causando a perda da sincronização labial.

De fato, antes da existência do PulseAudio, costumava haver um back-end da ALSA para áudio Bluetooth, mas foi preterido. Acho que o problema era que as interfaces da ALSA naquela época eram projetadas principalmente para placas de som tradicionais, e lidar com uma latência de áudio potencialmente variável do Bluetooth era difícil.

As interfaces do PulseAudio foram projetadas desde o início para lidar com vários dispositivos de som e até alternar fluxos de áudio entre eles enquanto o fluxo está sendo reproduzido, então parece-me que ele também possui um conceito bastante avançado de latência de áudio.

Sim, poderia ter sido implementado no BlueZ, e não como um módulo PulseAudio; mas então, o BlueZ teria que apresentar uma interface de áudio para os aplicativos. E como o PulseAudio deseja manipular "todo" o áudio em um sistema (para poder transferir o áudio que você está reproduzindo atualmente dos alto-falantes para o Bluetooth ou vice-versa on-the-fly), ele teria que interagir com o PulseAudio de alguma forma de qualquer maneira.


2

Acho que finalmente encontrei uma solução (testada em dois sistemas Linux Mint), embora não tenha idéia de por que preciso seguir estas etapas exatas:

Etapas iniciais:

  1. Instale o blueman: sudo apt-get install blueman
  2. Edite o arquivo Bluetooth: sudo nano /etc/bluetooth/main.conf e adicione esta linha no final: Disable = Headset

Para cada execução:

  1. Reinicie o serviço bluetooth: sudo service bluetooth restart
  2. Abra Dispositivos da blueman na bandeja do sistema ou digite blueman-manager no terminal
  3. Procure seu dispositivo de áudio bluetooth
  4. Clique com o botão direito do mouse no seu dispositivo e conecte como fone de ouvido
  5. Ir para o som nas configurações do sistema
  6. Selecione seu dispositivo clicando nele uma vez
  7. Agora, novamente, vá para o blueman-manager
  8. Clique com o botão direito do mouse no seu dispositivo bluetooth e defina o perfil de áudio como Reprodução de alta fidelidade (dissipador A2DP)

Se você perder alguma das etapas, vá para a etapa 1 e tente novamente. Deixe-me saber se isso funciona.

Edit : No Linux Mint 19, o gerenciador padrão do bluetooth funciona perfeitamente com a reprodução de alta fidelidade, nenhuma configuração necessária !!


0

Embora possa variar de sua configuração, aqui estão alguns comandos bem testados.

Você precisa definir o dispositivo como confiável. Isso pode ser feito via GUI.

O sdptool browse fornecerá muitos detalhes sobre protocolos e canais disponíveis no dispositivo de destino.

É mais fácil definir um coletor de áudio bluetooth a2p ao usar saídas de áudio simultâneas. Para configurá-lo, consulte os paprefs da ferramenta .

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

Inicie o dispositivo, ele deve ser hci0 de qualquer maneira:

sudo hciconfig hci0 up

Listar dispositivos remotos:

sudo rfkill list

Listar redes bluetooth:

hcitool scan

Navegue pelos protocolos disponíveis:

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

Conecte um dispositivo:

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

Envie um arquivo:

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

Receba um arquivo:

sudo bt-obex -s /

Examine / aguarde os dados em um canal (aqui canal 19) e grave os dados em um arquivo chamado dump, na pasta inicial:

sudo apt install bluez-hcidump

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

Alternativa: algumas vezes útil para emparelhar:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.