One path can be the basis for multiple ports. Having just a single port pointer in pa_alsa_path doesn't make sense, and I'll remove that pointer once I have converted the users of that pointer to use this new ports array. --- src/modules/alsa/alsa-mixer.c | 7 +++++++ src/modules/alsa/alsa-mixer.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c index f4661f6..e7d137a 100644 --- a/src/modules/alsa/alsa-mixer.c +++ b/src/modules/alsa/alsa-mixer.c @@ -523,6 +523,10 @@ void pa_alsa_path_free(pa_alsa_path *p) { pa_proplist_free(p->proplist); pa_xfree(p->name); pa_xfree(p->description); + + if (p->ports) + pa_dynarray_free(p->ports); + pa_xfree(p); } @@ -2423,6 +2427,7 @@ pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa pa_assert(fname); p = pa_xnew0(pa_alsa_path, 1); + p->ports = pa_dynarray_new(NULL); n = pa_path_get_filename(fname); p->name = pa_xstrndup(n, strcspn(n, ".")); p->proplist = pa_proplist_new(); @@ -2465,6 +2470,7 @@ pa_alsa_path *pa_alsa_path_synthesize(const char *element, pa_alsa_direction_t d pa_assert(element); p = pa_xnew0(pa_alsa_path, 1); + p->ports = pa_dynarray_new(NULL); p->name = pa_xstrdup(element); p->direction = direction; @@ -4513,6 +4519,7 @@ static pa_device_port* device_port_alsa_init(pa_hashmap *ports, /* card ports */ data->path = path; data->setting = setting; path->port = p; + pa_dynarray_append(path->ports, p); } if (cp) diff --git a/src/modules/alsa/alsa-mixer.h b/src/modules/alsa/alsa-mixer.h index d964927..a557664 100644 --- a/src/modules/alsa/alsa-mixer.h +++ b/src/modules/alsa/alsa-mixer.h @@ -30,6 +30,7 @@ #include <pulse/channelmap.h> #include <pulse/volume.h> +#include <pulsecore/dynarray.h> #include <pulsecore/llist.h> #include <pulsecore/rtpoll.h> @@ -178,6 +179,7 @@ struct pa_alsa_jack { struct pa_alsa_path { pa_alsa_direction_t direction; pa_device_port* port; + pa_dynarray *ports; char *name; char *description_key; -- 1.8.3.1