return 0;
}
-pa_alsa_path* pa_alsa_path_new(const char *fname, pa_alsa_direction_t direction) {
+static const char *get_default_paths_dir(void) {
+ if (pa_run_from_build_tree())
+ return PA_BUILDDIR "/modules/alsa/mixer/paths/";
+ else
+ return PA_ALSA_PATHS_DIR;
+}
+
+pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa_direction_t direction) {
pa_alsa_path *p;
char *fn;
int r;
items[1].data = &p->description;
items[2].data = &p->name;
- fn = pa_maybe_prefix_path(fname,
- pa_run_from_build_tree() ? PA_BUILDDIR "/modules/alsa/mixer/paths/" :
- PA_ALSA_PATHS_DIR);
+ if (!paths_dir)
+ paths_dir = get_default_paths_dir();
+
+ fn = pa_maybe_prefix_path(fname, paths_dir);
r = pa_config_parse(fn, NULL, items, p);
pa_xfree(fn);
pa_alsa_path_set_callback(p, m, cb, userdata);
}
-pa_alsa_path_set *pa_alsa_path_set_new(pa_alsa_mapping *m, pa_alsa_direction_t direction) {
+pa_alsa_path_set *pa_alsa_path_set_new(pa_alsa_mapping *m, pa_alsa_direction_t direction, const char *paths_dir) {
pa_alsa_path_set *ps;
char **pn = NULL, **en = NULL, **ie;
pa_alsa_decibel_fix *db_fix;
fn = pa_sprintf_malloc("%s.conf", *in);
- if ((p = pa_alsa_path_new(fn, direction))) {
+ if ((p = pa_alsa_path_new(paths_dir, fn, direction))) {
p->path_set = ps;
PA_LLIST_INSERT_AFTER(pa_alsa_path, ps->paths, ps->last_path, p);
ps->last_path = p;
void pa_alsa_element_dump(pa_alsa_element *e);
-pa_alsa_path *pa_alsa_path_new(const char *fname, pa_alsa_direction_t direction);
+pa_alsa_path *pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa_direction_t direction);
pa_alsa_path *pa_alsa_path_synthesize(const char *element, pa_alsa_direction_t direction);
int pa_alsa_path_probe(pa_alsa_path *p, snd_mixer_t *m, pa_bool_t ignore_dB);
void pa_alsa_path_dump(pa_alsa_path *p);
void pa_alsa_path_set_callback(pa_alsa_path *p, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata);
void pa_alsa_path_free(pa_alsa_path *p);
-pa_alsa_path_set *pa_alsa_path_set_new(pa_alsa_mapping *m, pa_alsa_direction_t direction);
+pa_alsa_path_set *pa_alsa_path_set_new(pa_alsa_mapping *m, pa_alsa_direction_t direction, const char *paths_dir);
void pa_alsa_path_set_probe(pa_alsa_path_set *s, snd_mixer_t *m, pa_bool_t ignore_dB);
void pa_alsa_path_set_dump(pa_alsa_path_set *s);
void pa_alsa_path_set_set_callback(pa_alsa_path_set *ps, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata);
snd_pcm_t *pcm_handle;
+ char *paths_dir;
pa_alsa_fdlist *mixer_fdl;
pa_alsa_mixer_pdata *mixer_pd;
snd_mixer_t *mixer_handle;
pa_alsa_path_dump(u->mixer_path);
} else {
- if (!(u->mixer_path_set = pa_alsa_path_set_new(mapping, PA_ALSA_DIRECTION_OUTPUT)))
+ if (!(u->mixer_path_set = pa_alsa_path_set_new(mapping, PA_ALSA_DIRECTION_OUTPUT, u->paths_dir)))
goto fail;
pa_alsa_path_set_probe(u->mixer_path_set, u->mixer_handle, ignore_dB);
ma, "device_id",
pa_modargs_get_value(ma, "device", DEFAULT_DEVICE));
+ u->paths_dir = pa_xstrdup(pa_modargs_get_value(ma, "paths_dir", NULL));
+
if (reserve_init(u, dev_id) < 0)
goto fail;
pa_xfree(u->device_name);
pa_xfree(u->control_device);
+ pa_xfree(u->paths_dir);
pa_xfree(u);
}
snd_pcm_t *pcm_handle;
+ char *paths_dir;
pa_alsa_fdlist *mixer_fdl;
pa_alsa_mixer_pdata *mixer_pd;
snd_mixer_t *mixer_handle;
pa_alsa_path_dump(u->mixer_path);
} else {
- if (!(u->mixer_path_set = pa_alsa_path_set_new(mapping, PA_ALSA_DIRECTION_INPUT)))
+ if (!(u->mixer_path_set = pa_alsa_path_set_new(mapping, PA_ALSA_DIRECTION_INPUT, u->paths_dir)))
goto fail;
pa_alsa_path_set_probe(u->mixer_path_set, u->mixer_handle, ignore_dB);
ma, "device_id",
pa_modargs_get_value(ma, "device", DEFAULT_DEVICE));
+ u->paths_dir = pa_xstrdup(pa_modargs_get_value(ma, "paths_dir", NULL));
+
if (reserve_init(u, dev_id) < 0)
goto fail;
pa_xfree(u->device_name);
pa_xfree(u->control_device);
+ pa_xfree(u->paths_dir);
pa_xfree(u);
}
"profile=<profile name> "
"ignore_dB=<ignore dB information from the device?> "
"deferred_volume=<Synchronize software and hardware volume changes to avoid momentary jumps?> "
- "profile_set=<profile set configuration file> ");
+ "profile_set=<profile set configuration file> "
+ "paths_dir=<directory containing the path configuration files> "
+);
static const char* const valid_modargs[] = {
"name",
"ignore_dB",
"deferred_volume",
"profile_set",
+ "paths_dir",
NULL
};