ทำไม pulseaudio จัดการการเชื่อมต่อคุณภาพเสียงกับอุปกรณ์ BT


11

ฉันยังใหม่กับ Linux และใหม่กับสคริปต์บลูทู ธ สิ่งที่ฉันค้นพบจนถึงตอนนี้คือ:

  1. Bluez เป็นสแต็ก BT เริ่มต้น
  2. BluezTools เป็นชุดของสาธารณูปโภคที่คุณสามารถใช้เพื่อโต้ตอบกับ Bluez ได้ง่ายขึ้น
  3. DBus เป็นอินเทอร์เฟซ Bluez ที่เชื่อมต่อกับขณะที่โต้ตอบโดยตรงกับฮาร์ดแวร์
  4. PulseAudio เป็นระบบย่อยที่รับผิดชอบในการผลิตเสียงบนระบบ

มันสมเหตุสมผลแล้ว สมมติว่าฉันมีชุดหูฟังบลูทู ธ สิ่งที่ฉันคาดหวังคือ (ทั้งหมดหลังจากจับคู่และไว้วางใจ) เพื่อให้สามารถออกคำสั่งที่สามารถเชื่อมต่อกับโปรไฟล์บางอย่างบนหูฟัง BT ได้โดยตรง

เส้นทางทางเทคนิคที่ฉันมีอยู่ในใจจะเป็นเช่น:

  1. เปิดหูฟัง
  2. ออกคำสั่ง BluezTools - เช่นbt-audio -c
  3. รอให้อุปกรณ์เชื่อมต่อกับบริการที่ฉันใช้อยู่
  4. PulseAudio ควรรับอุปกรณ์เอาต์พุตใหม่
  5. ออกคำสั่งอื่นเพื่อเปลี่ยนเสียงจากที่เคยเป็นเสียงออกใหม่ (หูฟัง BT)
  6. เพลิดเพลินไปกับประสบการณ์การฟังที่ไร้รอยต่อ

ทั้งหมดนี้ดูเหมือนว่ามีเหตุผล แต่การใช้งานจริงไม่เป็นเช่นนี้และฉันกำลังมองหา WHY ดังนั้นฉันจึงสามารถเข้าใจปัญหาได้ดีขึ้นและลองแก้ไข

นี่คือสิ่งที่เกิดขึ้นจริง:

  1. เปิดหูฟัง
  2. ออกคำสั่ง BluezTools - เช่นbt-audio -c
  3. รอให้อุปกรณ์เชื่อมต่อกับบริการที่ฉันใช้อยู่
  4. PulseAudio ควรรับอุปกรณ์เอาต์พุตใหม่
  5. ออกคำสั่ง PulseAudio เพื่อเปลี่ยนโปรไฟล์เสียงจากคุณภาพโทรศัพท์เป็นความแม่นยำสูง

ขอผมขยายเรื่องนี้หน่อย ชุดหูฟังบลูทู ธ มีโหมดคุณภาพ 2 โหมด (โทรศัพท์และความเที่ยงตรงสูง) มีเพียง 1 เดียวเท่านั้นที่เหมาะสำหรับการฟังเพลง

ฉันคาดหวังว่าหูฟัง BT จะเปิดเผยแต่ละโหมดคุณภาพเป็นบริการใช่ไหม สมมติฐานนี้อาจผิด แต่ฉันคาดว่าจะเป็นเช่นนั้น

bt-audio -c highFidelityProfile

หรือ

bt-audio -changeProfile highFidelityProfile

ดูเหมือนว่า Bluez จะจัดการการเชื่อมต่อ RAW กับอุปกรณ์และจากที่นั่นคุณจำเป็นต้องออก a: pacmd set-card-profile $ INDEX a2dp

สิ่งนี้ดูเหมือนผิดปกติ ทำไมการควบคุมคุณภาพในระบบย่อยเสียงจึงต้องมีการใช้งานที่แตกต่างกันสำหรับพัลส์หรืออัลซาหรือระบบย่อยเสียงอื่น ๆ

ฉันกำลังคิดถึงอะไร เหตุใดจึงไม่สามารถเชื่อมต่อโดยตรงไปยังโปรไฟล์ที่กำหนดโดยใช้ Bluez / BluezTools เป็นต้น

คำตอบ:


3

การเชื่อมต่อบลูทู ธ มีความหน่วงแฝงที่สำคัญเมื่อเทียบกับหูฟังแบบมีสายหรือลำโพงที่เรียบง่าย ยิ่งไปกว่านั้นเวลาแฝงการเชื่อมต่ออาจแตกต่างกันไปขึ้นอยู่กับคุณสมบัติของตัวรับสัญญาณบลูทู ธ และแม้กระทั่งความแรงของสัญญาณวิทยุในขณะที่ผู้ใช้เคลื่อนที่

อินเทอร์เฟซระหว่างแอปพลิเคชันและ PulseAudio สามารถทำได้ง่ายเหมือนกับ "นี่คือข้อมูลเสียง PCM บางส่วนเล่นสิ่งนี้" แต่มันอาจซับซ้อนกว่านี้อีก บางอย่างเช่น "นี่คือข้อมูลเสียง PCM บางส่วนเล่นสิ่งนี้และบอกฉันทุก ๆ 50 มิลลิวินาทีว่าคุณมีมานานแค่ไหนเพื่อที่ฉันจะได้บอกให้คุณข้ามไปข้างหน้าถ้าดูเหมือนว่าคุณกำลังหลุดออกจากปากกับซิงก์วิดีโอ ฉันกำลังเล่นโอ้และคุณจะต้องลองใหม่อีกครั้งเนื่องจากข้อมูลมีอัตราตัวอย่างที่ฮาร์ดแวร์ของคุณไม่สนับสนุนโดยตรง " ในกรณีหลัง PulseAudio จะต้องสามารถให้แอปพลิเคชั่นบางอย่างจากอุปกรณ์เสียงเพื่อตรวจสอบอย่างถูกต้องว่าข้อมูลเสียงถูกเล่นจริงในเวลาใดก็ตาม

ดังนั้นจึงเป็นเรื่องที่สมควรที่ PulseAudio มีส่วนเกี่ยวข้องอย่างลึกซึ้งในการประมวลผลเสียงบลูทู ธ ยิ่งมีเลเยอร์แทรกแซงมากเท่าไหร่ก็ยิ่งมีความเป็นไปได้มากขึ้นที่ข้อมูลจะถูกบัฟเฟอร์โดยไม่ต้องรักษาความคิดเห็นที่ถูกต้อง

ในความเป็นจริงก่อนที่ PulseAudio จะมีอยู่ก็เคยเป็นแบ็กเอนด์ ALSA สำหรับเสียงบลูทู ธ แต่มันเลิกใช้แล้ว ฉันคิดว่าปัญหาคือว่าอินเตอร์เฟสของ ALSA ในเวลานั้นได้รับการออกแบบมาสำหรับการ์ดเสียงแบบดั้งเดิมและการจัดการกับความล่าช้าของสัญญาณเสียงที่อาจเกิดขึ้นของบลูทู ธ นั้นเป็นเรื่องยาก

อินเทอร์เฟซของ PulseAudio ได้รับการออกแบบมาจากพื้นดินขึ้นเพื่อรองรับอุปกรณ์เสียงต่าง ๆ และแม้กระทั่งสลับกระแสเสียงระหว่างที่กระแสกำลังเล่นอยู่ดังนั้นสำหรับฉันแล้วมันมีแนวคิดขั้นสูงของการแฝงเสียงในตัว

ใช่มันสามารถนำมาใช้ใน BlueZ แทนที่จะเป็นโมดูล PulseAudio แต่จากนั้น BlueZ จะต้องนำเสนออินเตอร์เฟซเสียงสำหรับแอปพลิเคชัน และเนื่องจาก PulseAudio ต้องการจัดการเสียง "ทั้งหมด" ในระบบ (เพื่อให้สามารถถ่ายโอนเสียงที่คุณกำลังเล่นจากลำโพงไปยังบลูทู ธ หรือในทางกลับกันได้) มันจะต้องเชื่อมต่อกับ PulseAudio ยังไงก็เถอะ


2

ฉันคิดว่าในที่สุดฉันก็พบวิธีแก้ปัญหา (ทดสอบบนระบบ Linux Mint สองระบบ) แต่ฉันก็ไม่รู้ว่าทำไมฉันต้องทำตามขั้นตอนเหล่านี้:

ขั้นตอนเริ่มต้น:

  1. ติดตั้ง blueman: sudo apt-get install blueman
  2. แก้ไขไฟล์บลูทู ธ : sudo nano /etc/bluetooth/main.confและเพิ่มบรรทัดนี้ในตอนท้าย: ปิดใช้งาน = ชุดหูฟัง

สำหรับการวิ่งแต่ละครั้ง:

  1. เริ่มบริการบลูทู ธ ใหม่: บริการ sudo บลูทู ธ รีสตาร์ท
  2. เปิดอุปกรณ์จาก blueman ในถาดระบบหรือพิมพ์blueman-managerในเทอร์มินัล
  3. ค้นหาอุปกรณ์เสียงบลูทู ธ ของคุณ
  4. คลิกขวาที่อุปกรณ์ของคุณและเชื่อมต่อเป็นชุดหูฟัง
  5. ไปที่เสียงจากการตั้งค่าระบบ
  6. เลือกอุปกรณ์ของคุณโดยคลิกที่มันหนึ่งครั้ง
  7. ตอนนี้ไปที่blueman-managerอีกครั้ง
  8. คลิกขวาที่อุปกรณ์บลูทู ธ ของคุณและตั้งค่าโปรไฟล์เสียงเป็นHigh Fidelity Playback (A2DP Sink)

หากคุณพลาดขั้นตอนใดไปที่ขั้นตอนที่ 1 และลองอีกครั้ง แจ้งให้เราทราบหากใช้งานได้

แก้ไข : ใน Linux Mint 19 ตัวจัดการบลูทู ธ ที่เป็นค่าเริ่มต้นทำงานได้อย่างสมบูรณ์แบบด้วย High Fidelity Playback โดยไม่ต้องมีการกำหนดค่าใด ๆ !!


0

ในขณะที่มันสามารถเปลี่ยนแปลงการกำหนดค่าของคุณนี่คือคำสั่งทดสอบ

คุณต้องตั้งค่าอุปกรณ์ให้น่าเชื่อถือ มันสามารถทำได้ผ่านกุย

การเรียกดู sdptoolจะให้รายละเอียดมากมายเกี่ยวกับโปรโตคอลและช่องทางที่มีอยู่บนอุปกรณ์เป้าหมาย

มันง่ายที่จะตั้งค่าบลูทู ธ a2p อ่างเสียงเมื่อใช้เอาต์พุตเสียงพร้อมกันที่จะติดตั้งให้ดูเครื่องมือpaprefs

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

เริ่มอุปกรณ์มันควรจะเป็น hci0 อยู่ดี:

sudo hciconfig hci0 up

รายการอุปกรณ์ระยะไกล:

sudo rfkill list

รายการเครือข่ายบลูทู ธ :

hcitool scan

เรียกดูโปรโตคอลที่ใช้ได้:

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

เชื่อมต่ออุปกรณ์:

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

ส่งไฟล์:

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

รับไฟล์:

sudo bt-obex -s /

สแกน / รอข้อมูลบนช่องสัญญาณ (ที่นี่ช่องที่ 19) และเขียนข้อมูลลงในไฟล์ที่ชื่อว่า dump ในโฟลเดอร์โฮม:

sudo apt install bluez-hcidump

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

ทางเลือก: บางครั้งมีประโยชน์สำหรับการจับคู่:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.