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

11

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

  1. O Bluez é a pilha BT padrão.
  2. O BluezTools é um conjunto de utilitários que você pode usar para interagir mais facilmente com o Bluez
  3. O DBus é a interface à qual o Bluez se conecta enquanto interage diretamente com o hardware.
  4. O 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 após o emparelhamento e confiança), para poder emitir um comando que pode se conectar diretamente a um determinado perfil nos fones de ouvido BT.

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

  1. Ative os fones de ouvido.
  2. Emita um comando do BluezTools - como bt-audio -c
  3. Aguarde que o dispositivo se conecte ao serviço após
  4. O 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 de audição perfeita.

Isso tudo parece lógico, mas a implementação real não é assim, e estou procurando o POR QUE, para que eu possa entender melhor o problema e tentar corrigi-lo.

Isso é o que realmente acontece:

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

Deixe-me expandir isso um pouco. O fone de ouvido bluetooth oferece dois 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, não é mesmo? Esta suposição pode estar errada, mas eu esperaria algo como

bt-audio -c highFidelityProfile

ou

bt-audio -changeProfile Perfil de alta fidelidade

Em vez disso, parece que o Bluez apenas lida com a conexão RAW ao dispositivo, e a partir daí você precisa emitir um: pacmd set-card-profile $ INDEX a2dp

Isso parece fundamentalmente errado. Por que o controle de qualidade no subsistema de áudio requer uma implementação diferente para pulso ou alsa ou qualquer outro sub-sistema de som?

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

    
por JL. 18.09.2013 / 19:57

3 respostas

2

Uma conexão Bluetooth tem 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 à medida que o usuário se movimenta.

A interface entre um aplicativo e o PulseAudio pode ser tão simples quanto "aqui estão alguns dados de áudio do PCM; reproduzi-lo". Mas também pode ser mais complicado; algo como "Aqui estão alguns dados de áudio PCM, jogue isso e me diga a cada 50 ms até onde você chegou, para que eu possa dizer a você para pular para frente se parecer que você está caindo fora da sincronização labial com o fluxo de vídeo Eu estou jogando. Ah, e você também precisará refazê-lo, já que os dados têm uma taxa de amostragem que seu hardware não suportará diretamente. " No último caso, o PulseAudio precisa ser capaz de fornecer ao aplicativo algum feedback do dispositivo de áudio para determinar corretamente até que ponto os dados de áudio foram realmente reproduzidos a qualquer momento.

Como resultado, faz sentido que o PulseAudio esteja bastante envolvido no processamento de áudio Bluetooth: quanto mais camadas intervenientes houver, mais possibilidades os dados serão armazenados em buffer sem manter um feedback preciso, causando perda de sincronia.

Na verdade, antes da existência do PulseAudio, costumava haver um backend do ALSA para áudio Bluetooth, mas ele estava obsoleto. Eu 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 de Bluetooth era difícil.

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

Sim, poderia ter sido implementado no BlueZ em vez de ser um módulo PulseAudio; entretanto, o BlueZ teria que apresentar uma interface de áudio para os aplicativos. E como o PulseAudio quer manipular "todos" 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 precisaria interagir com o PulseAudio de alguma forma de qualquer maneira.

    
por 02.02.2018 / 01:36
1

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

Etapas iniciais:

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

Para cada execução:

  1. Reiniciar o serviço de bluetooth: reiniciar o serviço de rede do gerenciador de sudo
  2. Abra Dispositivos do blueman na bandeja do sistema ou digite blueman-manager no terminal
  3. Pesquisar para o seu dispositivo de áudio Bluetooth
  4. Clique com o botão direito do mouse em yoy = ur device e conecte-se como fone de ouvido
  5. Ir para o som das configurações do sistema
  6. Selecione seu dispositivo clicando nele uma vez
  7. Agora, novamente, vá para blueman-manager
  8. Clique com o botão direito do mouse no dispositivo Bluetooth e defina o perfil de áudio como Reprodução de alta fidelidade (A2DP Sink)

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

    
por 25.03.2018 / 08:58
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 através do gui.

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

É mais fácil configurar um coletor de áudio a2p do bluetooth ao usar saídas de áudio simultâneas, para configurá-lo, consulte a ferramenta paprefs .

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

Iniciar o dispositivo, deve ser hci0 de qualquer maneira:

sudo hciconfig hci0 up

Listar dispositivos remotos:

sudo rfkill list

Relacione as redes bluetooth:

hcitool scan

Procure os 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 /

Verifica / espera por dados em um canal (aqui, canal 19), e gravar dados em um arquivo chamado dump, na pasta home:

sudo apt install bluez-hcidump

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

Alternativa: por vezes útil para o emparelhamento:

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
    
por 24.04.2017 / 07:43