เสียง (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 0x0002 | Intel | |
| Version 0x0b | BT 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:XXscan && pairในบรรทัดเดียว = กัน temporary device หมดอายุ (เหมือน ARP cache)- ปิดลำโพงที่ T440p ก่อน (ลำโพง trust ทั้งสองเครื่อง รับได้ทีละเครื่อง)
UUID ที่ลำโพงประกาศ (เหมือน port number):
| UUID | โปรไฟล์ |
|---|---|
| 0000110b | Audio Sink (A2DP) — รับเพลง |
| 0000110e | AVRCP — ปุ่มควบคุม |
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.16. เครื่องมือเสริม
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' |
คำถามชวนคิด
- ทำไมการเปลี่ยนแค่ Pairable แล้วผลเปลี่ยน จึงเป็นหลักฐานที่แข็งกว่าการอ่านคู่มือว่า Pairable ทำอะไร
- ถ้าใช้ GEMAUDIO กับสองเครื่องสลับกันบ่อย คุณจะออกแบบอย่างไรไม่ให้เครื่องแย่งกันต่อ (เบาะแส: trust, connect, power off)
- จากการสแกน BT ในพื้นที่หนึ่ง คุณได้ MAC, ชื่อ, UUID ข้อมูลไหนช่วยระบุ “ชนิดอุปกรณ์” และข้อมูลไหนช่วย “ติดตามตัวบุคคล” ได้