The allowed volume formats are dB, % or integer. For example: 10% or 10db or 10. --- src/pulsecore/core-util.c | 39 +++++++++++++++++++++++++++++++++++++++ src/pulsecore/core-util.h | 3 +++ 2 files changed, 42 insertions(+) diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c index 710c9dc..874cccd 100644 --- a/src/pulsecore/core-util.c +++ b/src/pulsecore/core-util.c @@ -960,6 +960,45 @@ int pa_parse_boolean(const char *v) { return -1; } +/* Try to parse a volume string to pa_volume_t. The allowed formats are: + * db, % and unsigned integer */ +int pa_parse_volume(const char *v, pa_volume_t *volume) { + int len, ret = -1; + uint32_t i; + double d; + char str[64]; + pa_assert(v); + + len = strlen(v); + memcpy(str, v, PA_MIN(len, 64)); + + if (str[len - 1] == '%') { + str[len - 1] = '\0'; + if (pa_atoi(str, &i) == 0) { + /* using 64 bits integer to avoid overflow */ + uint64_t temp; + temp = PA_VOLUME_NORM * i; + *volume = PA_CLAMP_VOLUME(temp / 100); + ret = 0; + } + } else if (len > 2 && (str[len - 1] == 'b' || str[len - 1] == 'B') && + (str[len - 2] == 'd' || str[len - 2] == 'D')) { + str[len - 2] = '\0'; + if (pa_atod(str, &d) == 0) { + *volume = pa_sw_volume_from_dB(d); + ret = 0; + } + } else { + if (pa_atoi(v, &i) == 0) { + *volume= PA_CLAMP_VOLUME(i); + ret = 0; + } + + } + + return ret; +} + /* Split the specified string wherever one of the strings in delimiter * occurs. Each time it is called returns a newly allocated string * with pa_xmalloc(). The variable state points to, should be diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h index b181266..9d59383 100644 --- a/src/pulsecore/core-util.h +++ b/src/pulsecore/core-util.h @@ -34,6 +34,7 @@ #endif #include <pulse/gccmacro.h> +#include <pulse/volume.h> #include <pulsecore/macro.h> #include <pulsecore/socket.h> @@ -83,6 +84,8 @@ void pa_reset_priority(void); int pa_parse_boolean(const char *s) PA_GCC_PURE; +int pa_parse_volume(const char *s, pa_volume_t *volume); + static inline const char *pa_yes_no(pa_bool_t b) { return b ? "yes" : "no"; } -- 1.7.11.7