mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
bluetooth: Make use of getsockopt() to determine MTU configurable
A recent patch changed the MTU size from the default value of 48 to the value returned by getsockopt(). This breaks HSP for some setups. To circumvent the problem, this patch introduces a boolean parameter "autodetect_mtu" for module-bluetooth-discover, module-bluez5-discover and module-bluez5-device to make this use of getsockopt() configurable.
This commit is contained in:
parent
ca6c3f80f5
commit
1c80af147d
5 changed files with 38 additions and 13 deletions
|
|
@ -103,7 +103,6 @@ static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_backend *backend, D
|
|||
static int bluez5_sco_acquire_cb(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu) {
|
||||
pa_bluetooth_device *d = t->device;
|
||||
struct sockaddr_sco addr;
|
||||
struct sco_options sco_opt;
|
||||
socklen_t len;
|
||||
int err, i;
|
||||
int sock;
|
||||
|
|
@ -147,18 +146,21 @@ static int bluez5_sco_acquire_cb(pa_bluetooth_transport *t, bool optional, size_
|
|||
goto fail_close;
|
||||
}
|
||||
|
||||
len = sizeof(sco_opt);
|
||||
memset(&sco_opt, 0, len);
|
||||
if (imtu) *imtu = 48;
|
||||
if (omtu) *omtu = 48;
|
||||
|
||||
if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
|
||||
pa_log_warn("getsockopt(SCO_OPTIONS) failed, loading defaults");
|
||||
if (t->device->autodetect_mtu) {
|
||||
struct sco_options sco_opt;
|
||||
|
||||
/* Setting defaults in case of error */
|
||||
if (imtu) *imtu = 48;
|
||||
if (omtu) *omtu = 48;
|
||||
} else {
|
||||
if (imtu) *imtu = sco_opt.mtu;
|
||||
if (omtu) *omtu = sco_opt.mtu;
|
||||
len = sizeof(sco_opt);
|
||||
memset(&sco_opt, 0, len);
|
||||
|
||||
if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0)
|
||||
pa_log_warn("getsockopt(SCO_OPTIONS) failed, loading defaults");
|
||||
else {
|
||||
if (imtu) *imtu = sco_opt.mtu;
|
||||
if (omtu) *omtu = sco_opt.mtu;
|
||||
}
|
||||
}
|
||||
|
||||
return sock;
|
||||
|
|
|
|||
|
|
@ -95,6 +95,7 @@ struct pa_bluetooth_device {
|
|||
bool properties_received;
|
||||
bool tried_to_link_with_adapter;
|
||||
bool valid;
|
||||
bool autodetect_mtu;
|
||||
|
||||
/* Device information */
|
||||
char *path;
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ PA_MODULE_VERSION(PACKAGE_VERSION);
|
|||
PA_MODULE_LOAD_ONCE(true);
|
||||
PA_MODULE_USAGE(
|
||||
"headset=ofono|native|auto (bluez 5 only)"
|
||||
"autodetect_mtu=<boolean> (bluez 5 only)"
|
||||
);
|
||||
|
||||
struct userdata {
|
||||
|
|
|
|||
|
|
@ -54,7 +54,8 @@ PA_MODULE_AUTHOR("João Paulo Rechi Vita");
|
|||
PA_MODULE_DESCRIPTION("BlueZ 5 Bluetooth audio sink and source");
|
||||
PA_MODULE_VERSION(PACKAGE_VERSION);
|
||||
PA_MODULE_LOAD_ONCE(false);
|
||||
PA_MODULE_USAGE("path=<device object path>");
|
||||
PA_MODULE_USAGE("path=<device object path>"
|
||||
"autodetect_mtu=<boolean>");
|
||||
|
||||
#define MAX_PLAYBACK_CATCH_UP_USEC (100 * PA_USEC_PER_MSEC)
|
||||
#define FIXED_LATENCY_PLAYBACK_A2DP (25 * PA_USEC_PER_MSEC)
|
||||
|
|
@ -68,6 +69,7 @@ PA_MODULE_USAGE("path=<device object path>");
|
|||
|
||||
static const char* const valid_modargs[] = {
|
||||
"path",
|
||||
"autodetect_mtu",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
@ -2158,6 +2160,7 @@ int pa__init(pa_module* m) {
|
|||
struct userdata *u;
|
||||
const char *path;
|
||||
pa_modargs *ma;
|
||||
bool autodetect_mtu;
|
||||
|
||||
pa_assert(m);
|
||||
|
||||
|
|
@ -2187,6 +2190,14 @@ int pa__init(pa_module* m) {
|
|||
goto fail_free_modargs;
|
||||
}
|
||||
|
||||
autodetect_mtu = true;
|
||||
if (pa_modargs_get_value_boolean(ma, "autodetect_mtu", &autodetect_mtu) < 0) {
|
||||
pa_log("Invalid boolean value for autodetect_mtu parameter");
|
||||
goto fail_free_modargs;
|
||||
}
|
||||
|
||||
u->device->autodetect_mtu = autodetect_mtu;
|
||||
|
||||
pa_modargs_free(ma);
|
||||
|
||||
u->device_connection_changed_slot =
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ PA_MODULE_USAGE(
|
|||
|
||||
static const char* const valid_modargs[] = {
|
||||
"headset",
|
||||
"autodetect_mtu",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
@ -51,6 +52,7 @@ struct userdata {
|
|||
pa_hashmap *loaded_device_paths;
|
||||
pa_hook_slot *device_connection_changed_slot;
|
||||
pa_bluetooth_discovery *discovery;
|
||||
bool autodetect_mtu;
|
||||
};
|
||||
|
||||
static pa_hook_result_t device_connection_changed_cb(pa_bluetooth_discovery *y, const pa_bluetooth_device *d, struct userdata *u) {
|
||||
|
|
@ -71,7 +73,7 @@ static pa_hook_result_t device_connection_changed_cb(pa_bluetooth_discovery *y,
|
|||
if (!module_loaded && pa_bluetooth_device_any_transport_connected(d)) {
|
||||
/* a new device has been connected */
|
||||
pa_module *m;
|
||||
char *args = pa_sprintf_malloc("path=%s", d->path);
|
||||
char *args = pa_sprintf_malloc("path=%s autodetect_mtu=%i", d->path, (int)u->autodetect_mtu);
|
||||
|
||||
pa_log_debug("Loading module-bluez5-device %s", args);
|
||||
m = pa_module_load(u->module->core, "module-bluez5-device", args);
|
||||
|
|
@ -101,6 +103,7 @@ int pa__init(pa_module *m) {
|
|||
pa_modargs *ma;
|
||||
const char *headset_str;
|
||||
int headset_backend;
|
||||
bool autodetect_mtu;
|
||||
|
||||
pa_assert(m);
|
||||
|
||||
|
|
@ -121,9 +124,16 @@ int pa__init(pa_module *m) {
|
|||
goto fail;
|
||||
}
|
||||
|
||||
autodetect_mtu = true;
|
||||
if (pa_modargs_get_value_boolean(ma, "autodetect_mtu", &autodetect_mtu) < 0) {
|
||||
pa_log("Invalid boolean value for autodetect_mtu parameter");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
m->userdata = u = pa_xnew0(struct userdata, 1);
|
||||
u->module = m;
|
||||
u->core = m->core;
|
||||
u->autodetect_mtu = autodetect_mtu;
|
||||
u->loaded_device_paths = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
|
||||
|
||||
if (!(u->discovery = pa_bluetooth_discovery_get(u->core, headset_backend)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue