On 04.07.2018 13:25, Tanu Kaskinen wrote: > Having a single level macro for stringizing LADSPA_PATH doesn't work, > because the '#' preprocessor operator doesn't expand any macros in its > parameter. As a result, we used the string "LADSPA_PATH" as the search > path, and obviously no plugins were ever found. > > This adds a two-level macro in macro.h and uses that to expand and > stringize LADSPA_PATH. > > Bug link: https://bugs.freedesktop.org/show_bug.cgi?id=107078 > --- > src/modules/module-ladspa-sink.c | 14 ++++++-------- > src/pulsecore/macro.h | 6 ++++++ > 2 files changed, 12 insertions(+), 8 deletions(-) > > diff --git a/src/modules/module-ladspa-sink.c b/src/modules/module-ladspa-sink.c > index c654530a3..0bde922bf 100644 > --- a/src/modules/module-ladspa-sink.c > +++ b/src/modules/module-ladspa-sink.c > @@ -1054,15 +1054,13 @@ int pa__init(pa_module*m) { > u->output = NULL; > u->ss = ss; > > - /* If the LADSPA_PATH environment variable is not set, we use the > - * LADSPA_PATH preprocessor macro instead. The macro can contain characters > - * that need to be escaped (especially on Windows backslashes are common). > - * The "#" preprocessor operator helpfully adds the required escaping while > - * turning the LADSPA_PATH macro into a string. */ > -#define QUOTE_MACRO(x) #x > if (!(e = getenv("LADSPA_PATH"))) > - e = QUOTE_MACRO(LADSPA_PATH); > -#undef QUOTE_MACRO > + /* The LADSPA_PATH preprocessor macro isn't a string literal (i.e. it > + * doesn't contain quotes), because otherwise the build system would > + * have an extra burden of getting the escaping right (Windows paths > + * are especially tricky). PA_EXPAND_AND_STRINGIZE does the necessary > + * escaping. */ > + e = PA_EXPAND_AND_STRINGIZE(LADSPA_PATH); > > /* FIXME: This is not exactly thread safe */ > t = pa_xstrdup(lt_dlgetsearchpath()); > diff --git a/src/pulsecore/macro.h b/src/pulsecore/macro.h > index dbce5cd06..bb15b7f01 100644 > --- a/src/pulsecore/macro.h > +++ b/src/pulsecore/macro.h > @@ -298,6 +298,12 @@ static inline size_t PA_ALIGN(size_t l) { > ? (-1 - PA_INT_TYPE_MAX(type)) \ > : (type) 0)) > > +/* The '#' preprocessor operator doesn't expand any macros that are in the > + * parameter, which is why we need a separate macro for those cases where the > + * parameter contains a macro that needs expanding. */ > +#define PA_STRINGIZE(x) #x > +#define PA_EXPAND_AND_STRINGIZE(x) PA_STRINGIZE(x) > + > /* We include this at the very last place */ > #include <pulsecore/log.h> > LGTM