device-manager: Misc fixes.

* Fix a s/sink/source/ copy paste issue when dumping the database.
 * Only show priority list when routing is enabled (as the list is not updated if not)
 * Fix a memory access issue when finding the highest priority sinks/sources
 * key name->device name efficiency fix.
 * Silence noisy debug on reorder - it seems to work :)
 * Reroute after reordering.
 * Initialise preferred lists to PA_INVALID_INDEX
This commit is contained in:
Colin Guthrie 2009-10-01 21:30:24 +01:00
parent b8a6436d4b
commit 3a20cf0b9f

View file

@ -202,7 +202,7 @@ static void dump_database_helper(struct userdata *u, uint32_t role_index, const
pa_log_debug(" %s No sink specified", human); pa_log_debug(" %s No sink specified", human);
} else { } else {
pa_source *s; pa_source *s;
if (PA_INVALID_INDEX != u->preferred_sinks[role_index] && (s = pa_idxset_get_by_index(u->core->sinks, u->preferred_sinks[role_index]))) if (PA_INVALID_INDEX != u->preferred_sources[role_index] && (s = pa_idxset_get_by_index(u->core->sources, u->preferred_sources[role_index])))
pa_log_debug(" %s %s (%s)", human, pa_strnull(pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION)), s->name); pa_log_debug(" %s %s (%s)", human, pa_strnull(pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION)), s->name);
else else
pa_log_debug(" %s No source specified", human); pa_log_debug(" %s No source specified", human);
@ -243,26 +243,28 @@ static void dump_database(struct userdata *u) {
key = next_key; key = next_key;
} }
pa_log_debug(" Highest priority devices per-role:"); if (u->do_routing) {
pa_log_debug(" Highest priority devices per-role:");
pa_log_debug(" Sinks:"); pa_log_debug(" Sinks:");
for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) { for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) {
char name[13]; char name[13];
uint32_t len = PA_MIN(12u, strlen(role_names[role])); uint32_t len = PA_MIN(12u, strlen(role_names[role]));
strncpy(name, role_names[role], len); strncpy(name, role_names[role], len);
for (int i = len+1; i < 12; ++i) name[i] = ' '; for (int i = len+1; i < 12; ++i) name[i] = ' ';
name[len] = ':'; name[0] -= 32; name[12] = '\0'; name[len] = ':'; name[0] -= 32; name[12] = '\0';
dump_database_helper(u, role, name, TRUE); dump_database_helper(u, role, name, TRUE);
} }
pa_log_debug(" Sources:"); pa_log_debug(" Sources:");
for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) { for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) {
char name[13]; char name[13];
uint32_t len = PA_MIN(12u, strlen(role_names[role])); uint32_t len = PA_MIN(12u, strlen(role_names[role]));
strncpy(name, role_names[role], len); strncpy(name, role_names[role], len);
for (int i = len+1; i < 12; ++i) name[i] = ' '; for (int i = len+1; i < 12; ++i) name[i] = ' ';
name[len] = ':'; name[0] -= 32; name[12] = '\0'; name[len] = ':'; name[0] -= 32; name[12] = '\0';
dump_database_helper(u, role, name, FALSE); dump_database_helper(u, role, name, FALSE);
}
} }
pa_log_debug("Completed database dump"); pa_log_debug("Completed database dump");
@ -427,7 +429,7 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
indexes = &u->preferred_sources; indexes = &u->preferred_sources;
for (uint32_t i = 0; i < NUM_ROLES; ++i) { for (uint32_t i = 0; i < NUM_ROLES; ++i) {
*indexes[i] = PA_INVALID_INDEX; (*indexes)[i] = PA_INVALID_INDEX;
} }
pa_zero(highest_priority_available); pa_zero(highest_priority_available);
@ -440,19 +442,19 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
done = !pa_database_next(u->database, &key, &next_key, NULL); done = !pa_database_next(u->database, &key, &next_key, NULL);
if (key.size > strlen(prefix) && strncmp(key.data, prefix, strlen(prefix)) == 0) { if (key.size > strlen(prefix) && strncmp(key.data, prefix, strlen(prefix)) == 0) {
char *name; char *name, *device_name;
struct entry *e; struct entry *e;
name = pa_xstrndup(key.data, key.size); name = pa_xstrndup(key.data, key.size);
device_name = get_name(name, prefix);
if ((e = read_entry(u, name))) { if ((e = read_entry(u, name)) && ENTRY_VERSION == e->version) {
for (uint32_t i = 0; i < NUM_ROLES; ++i) { for (uint32_t i = 0; i < NUM_ROLES; ++i) {
if (highest_priority_available[i] && e->priority[i] < highest_priority_available[i]) { if (!highest_priority_available[i] || e->priority[i] < highest_priority_available[i]) {
/* We've found a device with a higher priority than that we've currently got, /* We've found a device with a higher priority than that we've currently got,
so see if it is currently available or not and update our list */ so see if it is currently available or not and update our list */
uint32_t idx; uint32_t idx;
pa_bool_t found = FALSE; pa_bool_t found = FALSE;
char *device_name = get_name(name, prefix);
if (sink_mode) { if (sink_mode) {
pa_sink *sink; pa_sink *sink;
@ -481,10 +483,9 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
} }
if (found) { if (found) {
highest_priority_available[i] = e->priority[i]; highest_priority_available[i] = e->priority[i];
*indexes[i] = idx; (*indexes)[i] = idx;
} }
pa_xfree(device_name);
} }
} }
@ -492,6 +493,7 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
} }
pa_xfree(name); pa_xfree(name);
pa_xfree(device_name);
} }
pa_datum_free(&key); pa_datum_free(&key);
@ -1132,7 +1134,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
struct device_t **devices; struct device_t **devices;
uint32_t i, idx, offset; uint32_t i, idx, offset;
pa_hashmap *h; pa_hashmap *h;
void *state; /*void *state;*/
pa_bool_t first; pa_bool_t first;
if (pa_tagstruct_gets(t, &role) < 0 || if (pa_tagstruct_gets(t, &role) < 0 ||
@ -1201,10 +1203,10 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
} }
} }
pa_log_debug("Hashmap contents (received from client)"); /*pa_log_debug("Hashmap contents (received from client)");
PA_HASHMAP_FOREACH(device, h, state) { PA_HASHMAP_FOREACH(device, h, state) {
pa_log_debug(" - %s (%d)", device->device, device->prio); pa_log_debug(" - %s (%d)", device->device, device->prio);
} }*/
/* Now cycle through our list and add all the devices. /* Now cycle through our list and add all the devices.
This has the effect of addign in any in our DB, This has the effect of addign in any in our DB,
@ -1245,10 +1247,10 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
key = next_key; key = next_key;
} }
pa_log_debug("Hashmap contents (combined with database)"); /*pa_log_debug("Hashmap contents (combined with database)");
PA_HASHMAP_FOREACH(device, h, state) { PA_HASHMAP_FOREACH(device, h, state) {
pa_log_debug(" - %s (%d)", device->device, device->prio); pa_log_debug(" - %s (%d)", device->device, device->prio);
} }*/
/* Now we put all the entries in a simple list for sorting it. */ /* Now we put all the entries in a simple list for sorting it. */
n_devices = pa_hashmap_size(h); n_devices = pa_hashmap_size(h);
@ -1271,10 +1273,10 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
} }
} }
pa_log_debug("Sorted device list"); /*pa_log_debug("Sorted device list");
for (i = 0; i < n_devices; ++i) { for (i = 0; i < n_devices; ++i) {
pa_log_debug(" - %s (%d)", devices[i]->device, devices[i]->prio); pa_log_debug(" - %s (%d)", devices[i]->device, devices[i]->prio);
} }*/
/* Go through in order and write the new entry and cleanup our own list */ /* Go through in order and write the new entry and cleanup our own list */
idx = 1; idx = 1;
@ -1292,9 +1294,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
data.data = e; data.data = e;
data.size = sizeof(*e); data.size = sizeof(*e);
pa_log_debug("Attempting to write record: %d. %s", e->priority[role_index], e->description);
if (pa_database_set(u->database, &key, &data, TRUE) == 0) { if (pa_database_set(u->database, &key, &data, TRUE) == 0) {
pa_log_debug("..... write successfull");
first = FALSE; first = FALSE;
idx++; idx++;
} }
@ -1306,9 +1306,15 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
pa_xfree(devices[i]); pa_xfree(devices[i]);
} }
if (!first) if (!first) {
trigger_save(u); trigger_save(u);
if (sink_mode)
route_sink_inputs(u, NULL);
else
route_source_outputs(u, NULL);
}
break; break;
} }
@ -1431,6 +1437,10 @@ int pa__init(pa_module*m) {
subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW, source->index, u); subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW, source->index, u);
/* Perform the routing (if it's enabled) which will update our priority list cache too */ /* Perform the routing (if it's enabled) which will update our priority list cache too */
for (uint32_t i = 0; i < NUM_ROLES; ++i) {
u->preferred_sinks[i] = u->preferred_sources[i] = PA_INVALID_INDEX;
}
route_sink_inputs(u, NULL); route_sink_inputs(u, NULL);
route_source_outputs(u, NULL); route_source_outputs(u, NULL);