summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Ceolin <flavio.ceolin@profusion.mobi>2012-10-24 17:29:45 -0200
committerTanu Kaskinen <tanuk@iki.fi>2012-10-25 12:42:26 +0300
commitdd31d6521758c2d39457aab4e91d5c7644732052 (patch)
tree65eaae15a32e7b8af5ba0facc825557c0e31b683
parentfe0ba245e54bdc729d1e96ca503f6a0d3de22b3d (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.c42
-rw-r--r--src/pulsecore/core-util.h3
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";
}