Mengapa pulseaudio menangani koneksi kualitas suara ke perangkat BT?

11

Saya baru mengenal Linux dan juga baru dalam skrip Bluetooth. Apa yang saya temukan sejauh ini adalah sebagai berikut:

  1. Bluez adalah tumpukan BT default.
  2. BluezTools adalah seperangkat utilitas yang dapat Anda gunakan untuk lebih mudah berinteraksi dengan Bluez
  3. DBus adalah antarmuka yang disambungkan Bluez sambil berinteraksi langsung dengan perangkat keras.
  4. PulseAudio adalah subsistem yang bertanggung jawab untuk memproduksi audio pada sistem.

Ini masuk akal. Jadi katakanlah saya memiliki satu set headphone BlueTooth, apa yang saya harapkan adalah (semua setelah memasangkan dan mempercayai), untuk dapat mengeluarkan perintah yang dapat terhubung langsung ke profil tertentu pada headphone BT.

Jalur teknis yang ada dalam pikiran saya akan menjadi seperti:

  1. Hidupkan headphone.
  2. Keluarkan perintah BluezTools - seperti bt-audio -c
  3. Tunggu perangkat terhubung ke layanan yang saya cari
  4. PulseAudio sekarang harus mengambil perangkat output baru
  5. Keluarkan perintah lain untuk mengubah audio dari apa itu menjadi audio output baru (headphone BT).
  6. Nikmati pengalaman mendengarkan yang lancar.

Ini semua tampak logis, tetapi implementasi sebenarnya tidak seperti ini, dan saya mencari MENGAPA, jadi saya bisa lebih memahami masalah dan mencoba dan memperbaikinya.

Inilah yang sebenarnya terjadi:

  1. Hidupkan headphone.
  2. Keluarkan perintah BluezTools - seperti bt-audio -c
  3. Tunggu perangkat terhubung ke layanan yang saya cari
  4. PulseAudio sekarang harus mengambil perangkat output baru
  5. Keluarkan perintah PulseAudio untuk mengubah profil audio dari kualitas telepon ke kesetiaan tinggi.

Biarkan saya sedikit memperluas ini. Headset bluetooth menawarkan 2 mode kualitas (telepon dan kesetiaan tinggi). Hanya 1 yang benar-benar cocok untuk mendengarkan musik.

Saya berharap bahwa headphone BT mengekspos setiap mode kualitas sebagai layanan, apakah ini benar? Asumsi ini bisa saja salah, tetapi saya akan mengharapkan sesuatu seperti

bt-audio -c highFidelityProfile

atau

bt-audio -changeProfile highFidelityProfile

Sebaliknya tampaknya Bluez hanya menangani koneksi RAW ke perangkat, dan dari sana Anda perlu mengeluarkan: pacmd set-card-profile $ INDEX a2dp

Ini sepertinya salah secara fundamental. Mengapa kontrol kualitas dalam subsistem audio, karenanya memerlukan implementasi yang berbeda untuk pulsa atau alsa, atau sub sistem suara lainnya di luar sana?

Apa yang saya lewatkan? Mengapa tidak mungkin untuk terhubung langsung ke profil tertentu menggunakan Bluez / BluezTools dll?

JL.
sumber

Jawaban:

2

Koneksi bluetooth memiliki latensi yang signifikan dibandingkan dengan headphone atau speaker berkabel sederhana. Terlebih lagi, latensi koneksi dapat bervariasi, tergantung pada sifat-sifat penerima bluetooth dan bahkan kekuatan sinyal radio saat pengguna bergerak.

Antarmuka antara aplikasi dan PulseAudio dapat sesederhana "inilah beberapa data audio PCM; mainkan ini." Tetapi bisa juga lebih rumit; sesuatu seperti "Ini beberapa data audio PCM; mainkan ini dan beri tahu saya setiap 50 ms seberapa jauh yang Anda miliki, sehingga saya dapat memberitahu Anda untuk melompat ke depan jika sepertinya Anda tidak selaras dengan aliran video Saya sedang bermain. Oh, dan Anda harus melakukan resample juga, karena data memiliki sample rate yang tidak akan didukung oleh perangkat keras Anda secara langsung. " Dalam kasus terakhir, PulseAudio harus dapat memberikan aplikasi umpan balik dari perangkat audio untuk menentukan dengan benar seberapa jauh data audio sebenarnya diputar pada waktu tertentu.

Sebagai akibatnya, masuk akal bagi PulseAudio untuk cukup terlibat dalam pemrosesan audio Bluetooth: semakin banyak lapisan yang ada, semakin banyak kemungkinan data akan disangga tanpa menjaga umpan balik yang akurat, menyebabkan lip-synch hilang.

Sebenarnya, sebelum PulseAudio ada, dulu ada backend ALSA untuk audio Bluetooth, tetapi sudah usang. Saya pikir masalahnya adalah antarmuka ALSA pada waktu itu dirancang terutama untuk kartu suara tradisional, dan berurusan dengan latensi audio yang berpotensi variabel Bluetooth sulit.

Antarmuka PulseAudio dirancang dari bawah ke atas untuk menangani berbagai perangkat suara dan bahkan mengalihkan aliran audio di antara keduanya saat streaming diputar, jadi bagi saya ini memiliki konsep latensi audio bawaan yang cukup canggih.

Ya, itu bisa diterapkan di BlueZ daripada sebagai modul PulseAudio; tapi kemudian, BlueZ harus menyajikan antarmuka audio untuk aplikasi. Dan karena PulseAudio ingin menangani "semua" audio pada suatu sistem (agar dapat mentransfer audio yang saat ini Anda putar dari pengeras suara ke Bluetooth atau sebaliknya saat itu juga), itu harus berhubungan dengan PulseAudio bagaimanapun juga.

telcoM
sumber
2

Saya pikir saya akhirnya menemukan solusi (diuji pada dua sistem Linux Mint) meskipun saya tidak tahu mengapa saya harus mengikuti langkah-langkah tepat ini:

Langkah awal:

  1. Instal blueman: sudo apt-get install blueman
  2. Edit file Bluetooth: sudo nano /etc/bluetooth/main.conf dan tambahkan baris ini di akhir: Disable = Headset

Untuk setiap proses:

  1. Restart layanan bluetooth: sudo service bluetooth restart
  2. Buka Perangkat dari blueman di baki sistem atau ketik blueman-manager di terminal
  3. Cari perangkat audio bluetooth Anda
  4. Klik kanan perangkat Anda dan sambungkan sebagai headset
  5. Masuk ke suara dari pengaturan sistem
  6. Pilih perangkat Anda dengan mengkliknya sekali
  7. Sekarang kembali ke manajer blueman
  8. Klik kanan perangkat bluetooth Anda dan atur profil Audio ke Playback Fidelity Tinggi (Sink A2DP)

Jika Anda melewatkan salah satu langkah, lanjutkan ke langkah 1 dan coba lagi. Beri tahu saya jika ini berhasil.

Sunting : Di Linux Mint 19, manajer bluetooth default berfungsi dengan baik dengan Playback Fidelity Tinggi, tidak diperlukan konfigurasi sama sekali !!

Aditya Pal
sumber
0

Meskipun konfigurasi Anda dapat bervariasi, berikut adalah beberapa perintah yang teruji dengan baik.

Anda perlu mengatur perangkat sebagai dapat dipercaya. Itu bisa dilakukan melalui gui.

browse sdptool akan memberikan banyak detail tentang protokol dan saluran yang tersedia pada perangkat target.

Lebih mudah untuk mengatur wastafel audio bluetooth a2p saat menggunakan output audio secara bersamaan, untuk mengaturnya, lihat alat paprefs .

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

Mulai perangkat, bagaimanapun juga harus hci0:

sudo hciconfig hci0 up

Daftar perangkat jarak jauh:

sudo rfkill list

Daftar jaringan bluetooth:

hcitool scan

Jelajahi protokol yang tersedia:

sdptool browse 43:23:00:02:23:A7

Hubungkan perangkat:

sudo rfcomm connect hci0 43:23:00:02:23:A7

Kirim file:

sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png

Terima file:

sudo bt-obex -s /

Pindai / tunggu data di saluran (di sini saluran 19), dan tulis data di file bernama dump, di folder rumah:

sudo apt install bluez-hcidump

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

Alternatif: terkadang berguna untuk memasangkan:

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
NVRM
sumber