When a phone is paired, use PA_BT_FORM_FACTOR_PHONE to properly specify
its form factor.
}
pa_bt_form_factor_t pa_bluetooth_get_form_factor(uint32_t class) {
}
pa_bt_form_factor_t pa_bluetooth_get_form_factor(uint32_t class) {
pa_bt_form_factor_t r;
static const pa_bt_form_factor_t table[] = {
pa_bt_form_factor_t r;
static const pa_bt_form_factor_t table[] = {
[10] = PA_BT_FORM_FACTOR_HIFI
};
[10] = PA_BT_FORM_FACTOR_HIFI
};
- if (((class >> 8) & 31) != 4)
- return PA_BT_FORM_FACTOR_UNKNOWN;
+ /*
+ * See Bluetooth Assigned Numbers:
+ * https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm
+ */
+ major = (class >> 8) & 0x1F;
+ minor = (class >> 2) & 0x3F;
+
+ switch (major) {
+ case 2:
+ return PA_BT_FORM_FACTOR_PHONE;
+ case 4:
+ break;
+ default:
+ pa_log_debug("Unknown Bluetooth major device class %u", major);
+ return PA_BT_FORM_FACTOR_UNKNOWN;
+ }
- if ((i = (class >> 2) & 63) >= PA_ELEMENTSOF(table))
- r = PA_BT_FORM_FACTOR_UNKNOWN;
- else
- r = table[i];
+ r = minor < PA_ELEMENTSOF(table) ? table[minor] : PA_BT_FORM_FACTOR_UNKNOWN;
- pa_log_debug("Unknown Bluetooth minor device class %u", i);
+ pa_log_debug("Unknown Bluetooth minor device class %u", minor);
return "car";
case PA_BT_FORM_FACTOR_HIFI:
return "hifi";
return "car";
case PA_BT_FORM_FACTOR_HIFI:
return "hifi";
+ case PA_BT_FORM_FACTOR_PHONE:
+ return "phone";
}
pa_assert_not_reached();
}
pa_assert_not_reached();
PA_BT_FORM_FACTOR_PORTABLE,
PA_BT_FORM_FACTOR_CAR,
PA_BT_FORM_FACTOR_HIFI,
PA_BT_FORM_FACTOR_PORTABLE,
PA_BT_FORM_FACTOR_CAR,
PA_BT_FORM_FACTOR_HIFI,
+ PA_BT_FORM_FACTOR_PHONE,
} pa_bt_form_factor_t;
pa_bt_form_factor_t pa_bluetooth_get_form_factor(uint32_t class);
} pa_bt_form_factor_t;
pa_bt_form_factor_t pa_bluetooth_get_form_factor(uint32_t class);