Как сохранить профиль звука на уровне A2DP при использовании микрофона с гарнитурой Bluetooth? (Push-to-talk)

У меня есть гарнитура CEL-TEC F5A. В спецификации сказано:

Bluetooth 4.0, профили: гарнитура, громкая связь, A2DP, AVRCP / HSP / HFP

Он хорошо работает с профилем High Fidelity Playback (приемник A2DP) .

Когда я хочу переключить аудиовход на микрофон гарнитуры, выходной профиль автоматически меняется на Головное устройство гарнитуры (HFS / HFP) , а качество ужасное - например, 8-битный звук или что-то в этом роде. Когда я снова переключаю его на A2DP, вход возвращается к настольному микрофону.

Я прочитал несколько других вопросов и кажется, что A2DP не будет поддерживать ввод, верно? Но я полагаю, что часть HFP в HFS / HFP - это воспроизведение с высокой точностью воспроизведения? Похоже, он мог работать как гарнитура и все же не звучать как телефон 1950-х годов.

Как я могу упростить переключение между профилями, чтобы использовать HFS / HFP, когда я говорю, и A2DP, когда я слушаю? Например. как push-to-talk.

Ubuntu 17.10, без настройки звука IIRC, все самое новое.
https://www.kabelmanie.cz/cel-tec-f5a-active-noise-bluetooth-stereo-sluchatka-s-mikrofonem/

Мой вывод:

$ 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

Проблема не в том, что микрофон не работает, а наоборот, качество звука ухудшается при его включении.

67
задан 25 February 2018 в 00:37

5 ответов

Я собирался вернуть гарнитуру и дождаться гарнитуры Bluetooth 5.0, но потом понял, что это лучшая функциональность, которую я могу получить с моим ноутбуком BT 4.0. Так что я оставил их.

Тем не менее, слушать французского парня с 16-битным звуком 8000 Гц было не совсем правильным способом для встречи. В течение нескольких дней я переключался между двумя режимами с помощью диалогового окна настроек звука Ubuntu, но это действительно очень раздражало, как вы можете себе представить.

Итак, я написал этот скрипт, используя pacmd , который переключает между двумя режимами. :

  • Дрянный звук, микрофон включен
  • Звук качества, близкий к компакт-диску, микрофон выключен

Он не отполирован, имеет неработающий код, и я использую свои собственные идентификаторы телефонов, но это может быть источником вдохновения для ваших сценарий. Последняя версия здесь .

#!/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

Надеюсь, это кому-то поможет :)

17
ответ дан 2 December 2019 в 04:45

На основании этой статьи я опасаюсь, что Bluetooth не доставит мне удовольствия одновременно слышать качественный звук и разговаривать через гарнитуру. : /

Не принимая этот ответ, я все еще надеюсь, что кто-то найдет способ сделать это.

4
ответ дан 2 December 2019 в 04:45

Предлагаю использовать простой скрипт для кнопки переключения https://gist.github.com/weslleyspereira/e8feeb9f1b7008ae1ffad2777e39d0dd вместе с скриптом Ондры Жижки :

#! /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()
2
ответ дан 5 January 2021 в 22:14

Я пришел сюда с той же проблемой с моим Poly Voyager Focus UC. Жаль, что поддержки в стеке bluetooth нет (пока). Voyager Focus также поставляется с USB-ключом, который можно использовать для его подключения. С ключом Linux видит гарнитуру как звуковую карту, поэтому стек Linux BT не задействован, и качество двунаправленного звука хорошее. Единственная небольшая проблема заключается в том, что если я выключу гарнитуру, Linux этого не увидит и не переключит воспроизведение звука обратно на динамики, поэтому мне нужно выбрать устройство вывода звука вручную.

В другом месте в Интернете я читал люди также добились успеха с таким обходным путем, используя сторонний аудиоадаптер USB Bluetooth и подключив к нему свою гарнитуру вместо системного Bluetooth. Судя по тому, что я смог найти, для того, чтобы это работало, и гарнитура, и аудиоадаптер Bluetooth должны поддерживать «широкополосную речь» в их HSP (профиль гарнитуры), что является необязательным. Широкополосная речь составляет всего 16 кГц / 16 бит, но это все равно большое улучшение по сравнению со стандартным каналом HSP 8 кГц. Стек Linux bluetooth пока не поддерживает широкополосный звук. Я не знаю, использует ли мой ключ Voyager Focus стандартный Bluetooth с широкополосной речью или какое-то собственное расширение беспроводного протокола.

1
ответ дан 5 January 2021 в 22:14

Ондра, есть обсуждение запроса слияния звука с очень длинными импульсами , которое содержит большую часть информации.

tl; dr; Чтобы все работало, Pulse Audio, bluez и ядро ​​должны быть обновлены (нетривиально). Также необходим отдельный демон hsphfpd .

Обновления ядра не продвигаются, и пользовательский ввод для сопровождающих может помочь продвинуться вперед. Подумайте о предоставлении таких. См. здесь .

Без патчей ядра использование микрофона в наушниках приводит к ужасному качеству звука (режим работы HSP / HFP).

Но есть вероятность, что только патчи Pulse (и поддержка от в наушниках) можно включить двунаправленный звук A2DP, что должно подойти для большинства целей.

И этот патч в настоящее время успешно развивается. Дополнительные отзывы об этом не должны повредить.

Обновление: Вещи в вышеупомянутом запросе на вытягивание обострились очень быстро, и похоже, что PulseAudio никогда не сможет реализовать надлежащую поддержку Bluetooth. Будем надеяться на Pipewire , в котором уже есть некоторые исправления.

18
ответ дан 5 January 2021 в 22:14

Другие вопросы по тегам:

Похожие вопросы: