diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c index dc6809ce5..87796fb92 100644 --- a/src/modules/bluetooth/module-bluez5-device.c +++ b/src/modules/bluetooth/module-bluez5-device.c @@ -181,6 +181,7 @@ typedef enum pa_bluetooth_form_factor { PA_BLUETOOTH_FORM_FACTOR_CAR, PA_BLUETOOTH_FORM_FACTOR_HIFI, PA_BLUETOOTH_FORM_FACTOR_PHONE, + PA_BLUETOOTH_FORM_FACTOR_COMPUTER, } pa_bluetooth_form_factor_t; /* Run from main thread */ @@ -207,6 +208,8 @@ static pa_bluetooth_form_factor_t form_factor_from_class(uint32_t class_of_devic minor = (class_of_device >> 2) & 0x3F; switch (major) { + case 1: + return PA_BLUETOOTH_FORM_FACTOR_COMPUTER; case 2: return PA_BLUETOOTH_FORM_FACTOR_PHONE; case 4: @@ -247,6 +250,8 @@ static const char *form_factor_to_string(pa_bluetooth_form_factor_t ff) { return "hifi"; case PA_BLUETOOTH_FORM_FACTOR_PHONE: return "phone"; + case PA_BLUETOOTH_FORM_FACTOR_COMPUTER: + return "computer"; } pa_assert_not_reached(); @@ -2030,6 +2035,11 @@ static void create_card_ports(struct userdata *u, pa_hashmap *ports) { input_type = output_type = PA_DEVICE_PORT_TYPE_PHONE; break; + case PA_BLUETOOTH_FORM_FACTOR_COMPUTER: + name_prefix = "computer"; + input_description = output_description = _("Computer"); + break; + case PA_BLUETOOTH_FORM_FACTOR_UNKNOWN: break; } diff --git a/src/modules/module-switch-on-connect.c b/src/modules/module-switch-on-connect.c index edbab078a..5f6192fcc 100644 --- a/src/modules/module-switch-on-connect.c +++ b/src/modules/module-switch-on-connect.c @@ -92,6 +92,16 @@ static pa_hook_result_t sink_put_hook_callback(pa_core *c, pa_sink *sink, void* return PA_HOOK_OK; } + /* Don't switch to computers implementing Bluetooth audio profiles */ + s = pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_BUS); + if (pa_safe_streq(s, "bluetooth")) { + s = pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_FORM_FACTOR); + if (pa_safe_streq(s, "computer")) { + pa_log_debug("Refusing to switch to Bluetooth sink on a computer"); + return PA_HOOK_OK; + } + } + /* Ignore virtual sinks if not configured otherwise on the command line */ if (u->ignore_virtual && !(sink->flags & PA_SINK_HARDWARE)) { pa_log_debug("Refusing to switch to virtual sink"); @@ -152,6 +162,16 @@ static pa_hook_result_t source_put_hook_callback(pa_core *c, pa_source *source, return PA_HOOK_OK; } + /* Don't switch to computers implementing Bluetooth audio profiles */ + s = pa_proplist_gets(source->proplist, PA_PROP_DEVICE_BUS); + if (pa_safe_streq(s, "bluetooth")) { + s = pa_proplist_gets(source->proplist, PA_PROP_DEVICE_FORM_FACTOR); + if (pa_safe_streq(s, "computer")) { + pa_log_debug("Refusing to switch to Bluetooth source on a computer"); + return PA_HOOK_OK; + } + } + /* Ignore virtual sources if not configured otherwise on the command line */ if (u->ignore_virtual && !(source->flags & PA_SOURCE_HARDWARE)) { pa_log_debug("Refusing to switch to virtual source"); diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index 0f0dc56fc..9e90d9d73 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -3678,6 +3678,12 @@ unsigned pa_device_init_priority(pa_proplist *p) { priority += 500; else if (pa_streq(s, "portable")) priority += 450; + else if (pa_streq(s, "computer")) + /* computers get a lower-than-base priority */ + priority += 0; + else + /* default base priority */ + priority += 100; } if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_BUS))) {