80 votes

Comment conserver le profil audio A2DP tout en utilisant un micro avec une oreillette Bluetooth ? (Push-to-talk)

J'ai un casque CEL-TEC F5A. La spécification dit :

Bluetooth 4.0, profils : Casque, Mains libres, A2DP, AVRCP/HSP/HFP

Il joue bien avec Lecture haute fidélité (puits A2DP) profil.

Lorsque je veux basculer l'entrée audio vers le microphone de l'oreillette, le profil de sortie change automatiquement en Unité de tête du casque (HFS/HFP) et la qualité est terrible - comme un son 8bit ou quelque chose comme ça. Lorsque je repasse en mode A2DP, l'entrée est de nouveau sur le micro du bureau.

J'ai lu quelques autres questions et il semble que A2DP soit censé ne pas prendre en charge l'entrée, n'est-ce pas ? Mais la partie HFP dans HFS/HFP est High Fidelity Playback je suppose ? Cela semble pouvoir fonctionner comme un casque et ne pas ressembler à un téléphone des années 1950.

Comment pourrais-je simplifier le passage d'un profil à l'autre de manière à ce que ce soit HFS/HFP lorsque je parle et A2DP lorsque j'écoute ? Par exemple, comme un "push-to-talk".

Ubuntu 17.10, pas de personnalisation du son IIRC, tout est à jour.
https://www.kabelmanie.cz/cel-tec-f5a-active-noise-bluetooth-stereo-sluchatka-s-mikrofonem/

Mon résultat :

$ pactl list cards
Card #0
        Name: alsa_card.pci-0000_00_03.0
...

Card #4
        Name: bluez_card.00_19_5D_25_6F_6C
        Driver: module-bluez5-device.c
        Owner Module: 30
        Properties:
                device.description = "F5A"
                device.string = "00:19:5D:25:6F:6C"
                device.api = "bluez"
                device.class = "sound"
                device.bus = "bluetooth"
                device.form_factor = "headset"
                bluez.path = "/org/bluez/hci0/dev_00_19_5D_25_6F_6C"
                bluez.class = "0x240404"
                bluez.alias = "F5A"
                device.icon_name = "audio-headset-bluetooth"
                device.intended_roles = "phone"
        Profiles:
                a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 10, available: yes)
                headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 20, available: yes)
                off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
        Active Profile: a2dp_sink
        Ports:
                headset-output: Headset (priority: 0, latency offset: 0 usec, available)
                        Part of profile(s): a2dp_sink, headset_head_unit
                headset-input: Headset (priority: 0, latency offset: 0 usec)
                        Part of profile(s): headset_head_unit

Le problème ici n'est pas que le microphone ne fonctionne pas, mais plutôt que la qualité audio se dégrade lorsqu'il est activé.

39voto

akostadinov Points 619

Ondra, il y a une très longue discussion sur la demande de fusion de l'audio pulsé qui contient la plupart des informations.

tl;dr ; pour que les choses fonctionnent pulse audio, bluez et le noyau doivent être mis à jour (pas trivialement). De même, un démon séparé hsphfpd est nécessaire.

Les mises à jour du noyau ne progressent pas et la contribution des utilisateurs aux mainteneurs serait utile pour faire avancer les choses. Pensez à en fournir. Voir aquí .

Sans les correctifs du noyau, l'utilisation du micro du casque entraîne une qualité audio terrible (mode de fonctionnement HSP/HFP).

Mais il est possible que seuls les patchs Pulse (et le support de vos écouteurs) puissent activer l'audio bidirectionnel A2DP, ce qui devrait être suffisant pour la plupart des besoins.

Et ce patch progresse bien en ce moment. Un retour d'information supplémentaire ne peut pas faire de mal.

Mise à jour : Les choses dans la demande de pull mentionnée ci-dessus se sont intensifiées très rapidement et il semble que PulseAudio pourrait ne jamais mettre en œuvre un support Bluetooth correct. Espérons que Fil de tuyauterie qui comporte déjà quelques correctifs.

22voto

Ondra Žižka Points 3118

J'étais sur le point de renvoyer l'oreillette et d'attendre une oreillette Bluetooth 5.0, mais j'ai ensuite réalisé que c'était la meilleure fonctionnalité que je pouvais obtenir avec mon ordinateur portable BT 4.0. Je les ai donc gardés.

Pourtant, écouter un Français en audio 16 bits 8000 Hz n'était pas vraiment la bonne façon d'avoir une réunion. Pendant quelques jours, j'ai basculé entre les deux modes en utilisant la boîte de dialogue des paramètres sonores d'Ubuntu, mais c'est vraiment, vraiment ennuyeux comme vous pouvez l'imaginer.

J'ai donc écrit ce script en tirant parti de pacmd qui permet de basculer entre les 2 modes :

  • Mauvais son, microphone activé
  • Qualité audio proche de celle d'un CD, microphone désactivé

Il n'est pas poli, comporte du code mort, et j'utilise mes propres identifiants de téléphones, mais il peut être une inspiration pour votre propre script. Dernière version aquí .

#!/bin/bash

####  Restart Bluetooth
if [ "$1" == "resetBT" ] ; then
  sudo rfkill block bluetooth && sleep 0.1 && sudo rfkill unblock bluetooth;
  exit;
fi;

#### Toggle listen/speak
if [ "$1" == "" -o "$1" == "toggle" ] ; then
  LINE=`pacmd list-sinks  | grep '\(name:\|alias\)' | grep -B1 F5A  | head -1`
  if [ "$LINE" == "" ] ; then echo "F5A headset not found"; exit; fi

  SINK_NAME="bluez_sink.00_19_5D_25_6F_6C.a2dp_sink"
  if $(echo "$LINE" | grep $SINK_NAME &> /dev/null) ; then
    echo "Detected quality sound output, that means we can't speak; switch that."
    $0 speak;
  else
    echo "Quality sound not found, switch to the good sound."
    $0 listen;
  fi
fi

#### Change the output to F5A
if [ "$1" == "listen" ] ; then
  LINE=`pacmd list-sinks  | grep '\(name:\|alias\)' | grep -B1 F5A  | head -1`
  if [ "$LINE" == "" ] ; then echo "F5A phones not found"; exit; fi
  #        name: <bluez_sink.00_19_5D_25_6F_6C.headset_head_unit>

  ## Get what's between <...>
  SINK_NAME=`echo "$LINE" | tr '>' '<' | cut -d'<' -f2`;

  ## The above gives an ID according to the active profile.
  ## To set manually:
  #SINK_NAME="bluez_sink.00_19_5D_25_6F_6C.headset_head_unit"
  #SINK_NAME="bluez_sink.00_19_5D_25_6F_6C.a2dp_sink"

  ## Switch the output to that.
  echo "Switching audio output to $SINK_NAME";
  pacmd set-default-sink "$SINK_NAME"

  #### Change profile to quality output + no mic. From `pacmd list-cards`:
  CARD="bluez_card.00_19_5D_25_6F_6C"
  PROFILE="a2dp_sink"   
  echo "Switching audio profile to $PROFILE";
  pacmd set-card-profile $CARD $PROFILE
  exit;
fi;

#### Input
if [ "$1" == "speak" ] ; then
  ## Change profile to crappy output + mic. From `pacmd list-cards`:
  CARD="bluez_card.00_19_5D_25_6F_6C"
  pacmd set-card-profile $CARD headset_head_unit

  LINE=`pacmd list-sources | grep '\(name:\|alias\)' | grep -B1 F5A  | head -1`
  if [ "$LINE" == "" ] ; then echo "F5A mic not found"; exit; fi
  SOURCE_NAME=`echo "$LINE" | tr '>' '<' | cut -d'<' -f2`;
  #SOURCE_NAME="bluez_source.00_19_5D_25_6F_6C.headset_head_unit"
  #SOURCE_NAME="bluez_sink.00_19_5D_25_6F_6C.a2dp_sink.monitor"
  echo "Switching audio input to $SOURCE_NAME";
  pacmd set-default-source "$SOURCE_NAME" || echo 'Try `pacmd list-sources`.';
fi;

####  Resources:

##  Why this is needed
# https://jimshaver.net/2015/03/31/going-a2dp-only-on-linux/

##  My original question
# https://askubuntu.com/questions/1004712/audio-profile-changes-automatically-to-hsp-bad-quality-when-i-change-input-to/1009156#1009156

##  Script to monitor plugged earphones and switch when unplugged (Ubuntu does that, but nice script):
# https://github.com/freundTech/linux-helper-scripts/blob/master/padevswitch/padevswitch

J'espère que cela aidera quelqu'un :)

6voto

Ondra Žižka Points 3118

Sur la base de cet article J'ai peur que le Bluetooth ne me donne pas le plaisir d'entendre un son de qualité et de parler en même temps dans l'oreillette. :/

Sans accepter cette réponse, j'espère toujours que quelqu'un trouvera un moyen de le faire.

3voto

Je suggère l'utilisation d'un simple script pour un bouton de basculement. https://gist.github.com/weslleyspereira/e8feeb9f1b7008ae1ffad2777e39d0dd ainsi que celle d'Ondra Žižka :

#! /usr/bin/python

''' switchHeadphones.py
Tkinter toggle button to switch microphone On/Off using a script 

Modification of the solution proposed in
    https://www.daniweb.com/posts/jump/1909448
for the Mic On/Off script from
    https://gist.github.com/OndraZizka/2724d353f695dacd73a50883dfdf0fc6
'''

# Define the path for the script below, e.g.,
script = "./switchHeadphones.sh"

try:
    # Python2
    import Tkinter as tk
except ImportError:
    # Python3
    import tkinter as tk
import os

__author__ = "Weslley S Pereira"
__email__ = "weslley.spereira@gmail.com"

def toggle(tog=[0]):
    '''
    a list default argument has a fixed address
    '''
    tog[0] = not tog[0]
    if tog[0]:
        os.system(script+' speak')
        t_btn.config(text='Switch Mic Off')
    else:
        os.system(script+' listen')
        t_btn.config(text='Switch Mic On')

root = tk.Tk()
root.title('Headphone  ')

t_btn = tk.Button(text='Switch Mic On', width=15, command=toggle)
t_btn.pack(pady=5)

root.mainloop()

2voto

La fonction que vous recherchez est disponible dans PipeWire (un remplacement de PulseAudio) lors de l'utilisation de l'application pipewire-media-session o wireplumber comme gestionnaire de session. Le premier est celui par défaut et l'activation du changement automatique de profil se fait en définissant les paramètres suivants

bluez5.autoswitch-profile = true

sur ~/.config/pipewire/media-session.d/bluez-monitor.conf

Après le redémarrage pipewire-media-session le profil A2DP est utilisé par défaut. Ce n'est que lorsqu'une entrée sonore est détectée que Pipewire passe en HSP/HFP et revient en A2DP lorsqu'elle se termine.

Ceci est expliqué dans le Arch Wiki ainsi que cet article de blog .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X