]> code.delx.au - pulseaudio/commitdiff
idxset: Allow deep copying with pa_idxset_copy()
authorTanu Kaskinen <tanu.kaskinen@linux.intel.com>
Sun, 17 Nov 2013 20:47:59 +0000 (22:47 +0200)
committerTanu Kaskinen <tanu.kaskinen@linux.intel.com>
Fri, 29 Nov 2013 05:14:39 +0000 (07:14 +0200)
src/modules/alsa/alsa-mixer.c
src/modules/alsa/alsa-sink.c
src/pulsecore/idxset.c
src/pulsecore/idxset.h

index 95c7628db400ac98664d7f206bc023e03bd9fbfc..2b90a6e4118acf77188dc0e3bc5871ded097ff08 100644 (file)
@@ -2574,7 +2574,7 @@ static bool element_create_settings(pa_alsa_element *e, pa_alsa_setting *templat
 
         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])
index e10e14e12ae6ae820db8b1ca9b78b736f9617d14..ccf1137b32ddc041663ee08e32ee3137a36fd70c 100644 (file)
@@ -1534,17 +1534,10 @@ static void sink_update_requested_latency_cb(pa_sink *s) {
 
 static pa_idxset* sink_get_formats(pa_sink *s) {
     struct userdata *u = s->userdata;
-    pa_idxset *ret = pa_idxset_new(NULL, NULL);
-    pa_format_info *f;
-    uint32_t idx;
 
     pa_assert(u);
 
-    PA_IDXSET_FOREACH(f, u->formats, idx) {
-        pa_idxset_put(ret, pa_format_info_copy(f), NULL);
-    }
-
-    return ret;
+    return pa_idxset_copy(u->formats, (pa_copy_func_t) pa_format_info_copy);
 }
 
 static bool sink_set_formats(pa_sink *s, pa_idxset *formats) {
index 3d2dbbeffddd6e38b8fc76e14f540fb8e6baf430..eec73c6ee01e28d4d8f98b43fa5b5b62a1876276 100644 (file)
@@ -458,7 +458,7 @@ bool pa_idxset_isempty(pa_idxset *s) {
     return s->n_entries == 0;
 }
 
-pa_idxset *pa_idxset_copy(pa_idxset *s) {
+pa_idxset *pa_idxset_copy(pa_idxset *s, pa_copy_func_t copy_func) {
     pa_idxset *copy;
     struct idxset_entry *i;
 
@@ -467,7 +467,7 @@ pa_idxset *pa_idxset_copy(pa_idxset *s) {
     copy = pa_idxset_new(s->hash_func, s->compare_func);
 
     for (i = s->iterate_list_head; i; i = i->iterate_next)
-        pa_idxset_put(copy, i->data, NULL);
+        pa_idxset_put(copy, copy_func ? copy_func(i->data) : i->data, NULL);
 
     return copy;
 }
index 849253c47c00960d1a4cd4670f250a1227d0a80f..53ac402810a7e7f2b8ac527a1bc8e213229b2f57 100644 (file)
@@ -49,6 +49,7 @@ int pa_idxset_string_compare_func(const void *a, const void *b);
 
 typedef unsigned (*pa_hash_func_t)(const void *p);
 typedef int (*pa_compare_func_t)(const void *a, const void *b);
+typedef void *(*pa_copy_func_t)(const void *p);
 
 typedef struct pa_idxset pa_idxset;
 
@@ -105,8 +106,10 @@ unsigned pa_idxset_size(pa_idxset*s);
 /* Return true of the idxset is empty */
 bool pa_idxset_isempty(pa_idxset *s);
 
-/* Duplicate the idxset. This will not copy the actual indexes */
-pa_idxset *pa_idxset_copy(pa_idxset *s);
+/* Duplicate the idxset. This will not copy the actual indexes. If copy_func is
+ * set, each entry is copied using the provided function, otherwise a shallow
+ * copy will be made. */
+pa_idxset *pa_idxset_copy(pa_idxset *s, pa_copy_func_t copy_func);
 
 /* A macro to ease iteration through all entries */
 #define PA_IDXSET_FOREACH(e, s, idx) \