Skip to content

เสียง (PipeWire) + Bluetooth ไป GEMAUDIO

PipeWire ตั้งแต่ต้น + จับคู่ BT ให้ “บันทึกถาวร” จริง
PipeWire from day one, and the Pairable → Bonded lesson

ใช้ทำอะไร (Purpose)

mpv ──► PipeWire (pipewire-pulse) ──► BT plugin (pipewire-audio) ──► bluez ──► Intel BT 5.2 ──► GEMAUDIO

ไล่ debug จากล่างขึ้นบน ชั้นไหนขาด ชั้นบนใช้ไม่ได้

1. PipeWire ตั้งแต่ครั้งแรก

pactl info | grep "Server Name"     # PulseAudio (on PipeWire 1.6.9)

เพราะตัด pulseaudio ออกจากรายการและใส่ชุด PipeWire เอง → ไม่มี process ผี / conflict แบบ T440p

2. Bluetooth

sudo systemctl enable --now bluetooth.service    # ติดตั้งใหม่ = ยังไม่เปิด
bluetoothctl show | grep -E 'Manufacturer|Version|Powered|Discoverable|Pairable'
ค่าผลอ่านว่า
Manufacturer 0x0002Intel
Version 0x0bBT 5.2(0x06 = 4.0 ของ T440p)
Discoverable no / Timeout 180ค่าเริ่มต้นจริงบน T440p เป็น Timeout 0 = มีคนตั้งค้างไว้
Pairable no⚠️ดูข้อ 3

3. บทเรียนใหญ่: Paired ≠ Bonded

สถานะความหมาย
Pairedแลก key ครั้งนี้
Bondedบันทึก key ลงดิสก์ ใช้ครั้งต่อไป
Trustedอนุญาตให้ต่อเองโดยไม่ถาม

รอบแรก Pairable: no → Pairing successful แต่ ไม่มี Bonded → link ตัด → bluez ลืมลำโพง (Device ... not available)

การทดลองเปลี่ยนตัวแปรเดียว: เปิด Pairable → pair ใหม่ → เห็น Bonded: yes

bluetoothctl pairable on
bluetoothctl --timeout 10 scan on && bluetoothctl pair XX:XX:XX:XX:XX:XX
bluetoothctl info XX:XX:XX:XX:XX:XX | grep -E 'Paired|Bonded|Trusted|Connected'
bluetoothctl trust XX:XX:XX:XX:XX:XX
bluetoothctl pairable off            # ปิดกลับ bond ที่บันทึกแล้วไม่หาย (เหมือนปิดลงทะเบียน 802.1X ใหม่)
bluetoothctl connect XX:XX:XX:XX:XX:XX
  • scan && pair ในบรรทัดเดียว = กัน temporary device หมดอายุ (เหมือน ARP cache)
  • ปิดลำโพงที่ T440p ก่อน (ลำโพง trust ทั้งสองเครื่อง รับได้ทีละเครื่อง)

UUID ที่ลำโพงประกาศ (เหมือน port number):

UUIDโปรไฟล์
0000110bAudio Sink (A2DP) — รับเพลง
0000110eAVRCP — ปุ่มควบคุม

4. ตรวจและทดสอบ

pactl list short sinks; pactl get-default-sink
mpv "av://lavfi:sine=frequency=440:duration=3"
wpctl status                         # ภาพรวมทั้งระบบ: sinks, default (*), stream ไปไหน

5. เมื่อเสียงหาย: แยกครึ่งเส้นทาง

mpv ✅ ──► PipeWire ✅ ──► sink [active] ✅ ──► BT link ❓ ──► บอร์ด ❓
  • wpctl status เห็น stream [active] ไป GEMAUDIO แต่ไม่มีเสียง → ปัญหาอยู่หลัง PipeWire
  • ทดสอบย้ายไปลำโพงในเครื่อง: มีเสียง = ในเครื่องปกติ
  • connect แล้วเห็น [CHG] Connected: yes = ก่อนหน้านั้น link หลุดอยู่

ย้ายกลับด้วย ชื่อ ไม่ใช่เลข ID (ID เปลี่ยนทุกครั้งที่ต่อใหม่ เหมือน ifindex):

pactl set-default-sink bluez_output.XX_XX_XX_XX_XX_XX.1

6. เครื่องมือเสริม

sudo pacman -S pavucontrol rtkit
  • i3status-rust ตั้งคลิกซ้าย = pavucontrol ไว้แล้วใน config แต่ไม่มีโปรแกรม → คลิกไม่เกิดอะไร
  • rtkit = ให้ PipeWire ได้ลำดับความสำคัญ realtime (ลดเสียงกระตุกตอน CPU เต็ม)

ปัญหาที่เคยเจอ & สิ่งที่ทายผิด (Troubleshooting)

เหตุการณ์บทเรียน
Pairing successful แต่ลำโพงหายไปจากรายการตรวจ Bonded: yes ทุกครั้ง — แก้ข้อสรุปเดิมจาก T440p
grep info ไม่มีผลเลยข้อความ not available ถูกกรองทิ้ง → ผลแปลก ดูข้อมูลดิบ
ทายว่า sink ในเครื่องเป็น SOFเป็น HDA ธรรมดา (analog-stereo)
สงสัยว่าต้อง restart WirePlumberไม่ต้อง WirePlumber เฝ้า bluez ผ่าน D-Bus เอง
BT หลุดเองระหว่างเล่นยังไม่รู้สาเหตุ (T440p แย่ง? บอร์ดประหยัดไฟ?) เก็บ log ตอนเกิด: journalctl --user -b --since "5 min ago" | grep -iE 'bluez|bluetooth|disconnect'

คำถามชวนคิด

  1. ทำไมการเปลี่ยนแค่ Pairable แล้วผลเปลี่ยน จึงเป็นหลักฐานที่แข็งกว่าการอ่านคู่มือว่า Pairable ทำอะไร
  2. ถ้าใช้ GEMAUDIO กับสองเครื่องสลับกันบ่อย คุณจะออกแบบอย่างไรไม่ให้เครื่องแย่งกันต่อ (เบาะแส: trust, connect, power off)
  3. จากการสแกน BT ในพื้นที่หนึ่ง คุณได้ MAC, ชื่อ, UUID ข้อมูลไหนช่วยระบุ “ชนิดอุปกรณ์” และข้อมูลไหนช่วย “ติดตามตัวบุคคล” ได้