diff options
author | Flavio Ceolin <flavio.ceolin@profusion.mobi> | 2012-10-24 17:29:45 -0200 |
---|---|---|
committer | Tanu Kaskinen <tanuk@iki.fi> | 2012-10-25 12:42:26 +0300 |
commit | dd31d6521758c2d39457aab4e91d5c7644732052 (patch) | |
tree | 65eaae15a32e7b8af5ba0facc825557c0e31b683 | |
parent | fe0ba245e54bdc729d1e96ca503f6a0d3de22b3d (diff) |
utils: Adding a function to get volume from string
The allowed volume formats are dB, % or integer.
For example: 10% or 10db or 10.
-rw-r--r-- | src/pulsecore/core-util.c | 42 | ||||
-rw-r--r-- | src/pulsecore/core-util.h | 3 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c index 710c9dc49..d8d44a7ce 100644 --- a/src/pulsecore/core-util.c +++ b/src/pulsecore/core-util.c @@ -960,6 +960,48 @@ 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); + pa_assert(volume); + + len = strlen(v); + + if (len >= 64) + return -1; + + memcpy(str, v, len + 1); + + if (str[len - 1] == '%') { + str[len - 1] = '\0'; + if (pa_atou(str, &i) == 0) { + *volume = PA_CLAMP_VOLUME((uint64_t) PA_VOLUME_NORM * i / 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_atou(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 b181266b9..9d59383cd 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"; } |