diff options
Diffstat (limited to 'audio/manager.c')
-rw-r--r-- | audio/manager.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/audio/manager.c b/audio/manager.c index ae63b997..4441b90f 100644 --- a/audio/manager.c +++ b/audio/manager.c @@ -97,6 +97,7 @@ struct audio_adapter { GIOChannel *hsp_hs_server; }; +static int max_connected_headsets = 1; static DBusConnection *connection = NULL; static GKeyFile *config = NULL; static GSList *adapters = NULL; @@ -452,6 +453,9 @@ static void ag_io_cb(GIOChannel *chan, int err, const bdaddr_t *src, if (!device) goto drop; + if (!manager_allow_headset_connection(&device->src)) + goto drop; + if (!device->headset) btd_device_add_uuid(device->btd_dev, remote_uuid); @@ -919,6 +923,16 @@ int audio_manager_init(DBusConnection *conn, GKeyFile *conf) } else enabled.hfp = b; + err = NULL; + i = g_key_file_get_integer(config, "Headset", "MaxConnected", + &err); + if (err) { + debug("audio.conf: %s", err->message); + g_error_free(err); + err = NULL; + } else + max_connected_headsets = i; + proceed: if (enabled.headset) { telephony_init(); @@ -1062,3 +1076,28 @@ struct audio_device *manager_get_device(const bdaddr_t *src, return dev; } + +gboolean manager_allow_headset_connection(bdaddr_t *src) +{ + GSList *l; + int connected = 0; + + for (l = devices; l != NULL; l = l->next) { + struct audio_device *dev = l->data; + struct headset *hs = dev->headset; + + if (bacmp(&dev->src, src)) + continue; + + if (!hs) + continue; + + if (headset_get_state(dev) > HEADSET_STATE_DISCONNECTED) + connected++; + + if (connected > max_connected_headsets) + return FALSE; + } + + return TRUE; +} |