arkq / bluez-alsa

Bluetooth Audio ALSA Backend
MIT License
842 stars 188 forks source link

Distorted recording with certain mic (but not in pulseaudio) #720

Open lowlyocean opened 1 month ago

lowlyocean commented 1 month ago

Setup

There are two bluetooth devices:

  1. Bluetooth headset (with plain mic)
  2. Bluetooth speakerphone (with echo-cancelling mic)

That I've been pairing to two machines:

  1. Raspberry Pi OS 64 bit running BlueAlsa (SCO profile for both capture and playback) a. I tried both built-in BT chip, and a USB adapter (both show identical behavior)
  2. Desktop PC running Ubuntu Jammy and PulseAudio

Problem

I have an issue when I pair Device 2 (speakerphone) with Machine 1 (Blue Alsa): there is distortion and pitch-shift during recording from the microphone. It sounds demonic.

I can confirm that playback of hcidump -A output.raw contains the distortion, so I suspect the speakerphone's echo cancellation somehow doesn't work well with bluealsa. The same device works paired on the separate PulseAudio machine.. but the separate pair of headphones records on this machine without distortion

Additional context

Configuration of Raspberry Pi with BlueAlsa:

bluealsa -p a2dp-source -p a2dp-sink -p hfp-hf -p hsp-hs -p hfp-ag -p hsp-ag

        UUID: Serial Port               (00001101-0000-1000-8000-00805f9b34fb)
        UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
        UUID: Advanced Audio Distribu.. (0000110d-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
        UUID: Handsfree                 (0000111e-0000-1000-8000-00805f9b34fb)
        UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
        UUID: Vendor specific           (fe010000-1234-5678-abcd-00805f9b34fb)

pcm.!default { type asym playback.pcm { type plug slave.pcm { type bluealsa device "12:34:56:78:AB:CD" profile "sco" } } capture.pcm { type plug slave.pcm { type bluealsa device "12:34:56:78:AB:CD" profile "sco" } } }

ctl.!default { type bluealsa }

Ubuntu machine with PulseAudio:

sinks

sources

pulseaudio

borine commented 1 month ago

Please can you state:

I don't have any echo-cancelling devices to try this for myself, but if I am given enough information to reproduce the rest of your set-up I may be able to track down some possible causes.

lowlyocean commented 1 month ago

Sure, not built from source - pasting relevant distro-provided packages:

> ii  bluez                                            5.66-1+rpt1+deb12u1                       arm64        Bluetooth tools and daemons
> ii  bluez-alsa-utils                                 4.0.0-2                                   arm64        Bluetooth Audio ALSA Backend (utils)
> ii  bluez-firmware                                   1.2-9+rpt3                                all          Firmware for Bluetooth devices
> ii  bluez-hcidump                                    5.66-1+rpt1+deb12u1                       arm64        Analyses Bluetooth HCI packets
> ii  libasound2-plugin-bluez:arm64                    4.0.0-2                                   arm64        Bluetooth Audio ALSA Backend (plugins)

Sample rate & format for speakerphone with bluealsa: arecord -vvv -f S16_LE -r 8000 -c1 <file.wav>. Logs indicated codec was CVSD

For pulseaudio I run systemctl mask bluealsa.service followed by rm /etc/asound.conf, and reboot; then after bluetoothctl connect <address> and pactl set-card-profile bluez_card.<address> handsfree_head_unit, I run the same arecord command

borine commented 1 month ago

arecord -vvv ...

The output from that should show the setup of each ALSA plugin used. Please could you post that section of the output so that we can see which plugins are used, and what the setup of each is? It is possible that the pitch-shift may be caused by a plugin; but it is also possible that dropped SCO frames may result in a raised pitch, combined with frequent underruns. (In this case playing from the hcidump file would also result in the raised pitch, but without the underruns).