pa_proplist_free(p->proplist);
pa_xfree(p->name);
pa_xfree(p->description);
+ pa_xfree(p->description_key);
pa_xfree(p);
}
if (template) {
s = pa_xnewdup(pa_alsa_setting, template, 1);
- s->options = pa_idxset_copy(template->options);
+ s->options = pa_idxset_copy(template->options, NULL);
s->name = pa_sprintf_malloc("%s+%s", template->name, o->name);
s->description =
(template->description[0] && o->description[0])
}
static void mapping_paths_probe(pa_alsa_mapping *m, pa_alsa_profile *profile,
- pa_alsa_direction_t direction) {
+ pa_alsa_direction_t direction, pa_hashmap *used_paths) {
pa_alsa_path *p;
void *state;
pa_assert(pcm_handle);
mixer_handle = pa_alsa_open_mixer_for_pcm(pcm_handle, NULL, &hctl_handle);
- if (!mixer_handle || !hctl_handle) {
- /* Cannot open mixer, remove all entries */
+ if (!mixer_handle) {
+ /* Cannot open mixer, remove all entries */
pa_hashmap_remove_all(ps->paths);
return;
}
if (mixer_handle)
snd_mixer_close(mixer_handle);
+ PA_HASHMAP_FOREACH(p, ps->paths, state)
+ pa_hashmap_put(used_paths, p, p);
+
pa_log_debug("Available mixer paths (after tidying):");
pa_alsa_path_set_dump(ps);
}
&try_buffer_size, 0, NULL, NULL, true);
}
-static void paths_drop_unsupported(pa_hashmap* h) {
+static void paths_drop_unused(pa_hashmap* h, pa_hashmap *keep) {
void* state = NULL;
const void* key;
pa_alsa_path* p;
pa_assert(h);
+ pa_assert(keep);
+
p = pa_hashmap_iterate(h, &state, &key);
while (p) {
- if (p->supported <= 0) {
- pa_hashmap_remove(h, key);
- pa_alsa_path_free(p);
- }
+ if (pa_hashmap_get(keep, p) == NULL)
+ pa_hashmap_remove_and_free(h, key);
p = pa_hashmap_iterate(h, &state, &key);
}
}
void *state;
pa_alsa_profile *p, *last = NULL;
pa_alsa_mapping *m;
- pa_hashmap *broken_inputs, *broken_outputs;
+ pa_hashmap *broken_inputs, *broken_outputs, *used_paths;
pa_assert(ps);
pa_assert(dev_id);
broken_inputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
broken_outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+ used_paths = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
PA_HASHMAP_FOREACH(p, ps->profiles, state) {
uint32_t idx;
if (p->output_mappings)
PA_IDXSET_FOREACH(m, p->output_mappings, idx)
if (m->output_pcm)
- mapping_paths_probe(m, p, PA_ALSA_DIRECTION_OUTPUT);
+ mapping_paths_probe(m, p, PA_ALSA_DIRECTION_OUTPUT, used_paths);
if (p->input_mappings)
PA_IDXSET_FOREACH(m, p->input_mappings, idx)
if (m->input_pcm)
- mapping_paths_probe(m, p, PA_ALSA_DIRECTION_INPUT);
+ mapping_paths_probe(m, p, PA_ALSA_DIRECTION_INPUT, used_paths);
}
/* Clean up */
pa_alsa_profile_set_drop_unsupported(ps);
- paths_drop_unsupported(ps->input_paths);
- paths_drop_unsupported(ps->output_paths);
+ paths_drop_unused(ps->input_paths, used_paths);
+ paths_drop_unused(ps->output_paths, used_paths);
pa_hashmap_free(broken_inputs);
pa_hashmap_free(broken_outputs);
+ pa_hashmap_free(used_paths);
ps->probed = true;
}
void *state;
PA_HASHMAP_FOREACH(p, ps->profiles, state) {
- if (!p->supported) {
- pa_hashmap_remove(ps->profiles, p->name);
- profile_free(p);
- }
+ if (!p->supported)
+ pa_hashmap_remove_and_free(ps->profiles, p->name);
}
PA_HASHMAP_FOREACH(m, ps->mappings, state) {
- if (m->supported <= 0) {
- pa_hashmap_remove(ps->mappings, m->name);
- mapping_free(m);
- }
+ if (m->supported <= 0)
+ pa_hashmap_remove_and_free(ps->mappings, m->name);
}
}