web-dev-qa-db-fra.com

Comment garder le profil audio à A2DP tout en utilisant un micro avec casque 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 le profil Lecture haute fidélité (récepteur A2DP) .

Lorsque je souhaite basculer l'entrée audio vers le microphone du casque, le profil de sortie passe automatiquement à Unité principale pour casque (HFS/HFP) et la qualité est médiocre - comme son 8bit ou quelque chose. Lorsque je le repasse en A2DP, l'entrée est de nouveau au micro de bureau.

J'ai lu quelques autres questions et il semble que A2DP ne devrait pas prendre en charge la saisie, non? Mais la partie HFP dans HFS/HFP est la lecture haute fidélité, je suppose? Cela ressemble à un casque et ne ressemble toujours pas au téléphone des années 1950.

Comment simplifier le passage d'un profil à l'autre: HFS/HFP lorsque je parle et A2DP lorsque j'écoute? , par exemple. comme un push-to-talk.

Ubuntu 17.10, aucune personnalisation sonore IIRC, toutes les dernières nouvelles.
https://www.kabelmanie.cz/cel-tec-f5a-active-noise-bluetooth-stereo-sluchatka-s-mikrofonem/

Ma sortie:

$ 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'elle est activée.

2
Ondra Žižka

J'étais sur le point de retourner le casque et d'attendre le casque Bluetooth 5.0, mais j'ai ensuite réalisé que c'était la meilleure fonctionnalité que je puisse obtenir avec mon ordinateur portable BT 4.0. Alors je les ai gardés.

Néanmoins, écouter un Français en audio 16 bits à 8000 Hz n’était pas vraiment la bonne façon d’organiser 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 très ennuyant, comme vous pouvez l'imaginer.

J'ai donc écrit ce script en utilisant pacmd qui bascule entre les 2 modes:

  • Audio de merde, microphone allumé
  • Qualité audio proche du CD, microphone désactivé

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

#!/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 ça aide quelqu'un :)

1
Ondra Žižka

D'après cet article Je crains que Bluetooth ne me procure le plaisir d'entendre un son de qualité et de parler en même temps avec le casque. : /

N'acceptant pas cette réponse cependant, j'espère toujours que quelqu'un trouvera un moyen de le faire.

0
Ondra Žižka