tinymix: Support more that 512 bytes in byte control
The set/get byte control support more than 512 bytes.
This is utilized by tlv type controls.
Signed-off-by: Samreen Nilofer <[email protected]>
Signed-off-by: Vinod Koul <[email protected]>
(cherry picked from commit 7cab1ef96b60a7b16120cad230afb279329a01a1)
Bug: 27834022
Change-Id: I847328f05bca19cb083962f1e756c387a8e5fa43
diff --git a/tinymix.c b/tinymix.c
index 68f9495..af18475 100644
--- a/tinymix.c
+++ b/tinymix.c
@@ -129,7 +129,7 @@
unsigned int i;
int min, max;
int ret;
- char buf[512] = { 0 };
+ char *buf = NULL;
size_t len;
if (isdigit(control[0]))
@@ -146,14 +146,18 @@
num_values = mixer_ctl_get_num_values(ctl);
if (type == MIXER_CTL_TYPE_BYTE) {
- len = num_values;
- if (len > sizeof(buf)) {
- fprintf(stderr, "Truncating get to %zu bytes\n", sizeof(buf));
- len = sizeof(buf);
+
+ buf = calloc(1, num_values);
+ if (buf == NULL) {
+ fprintf(stderr, "Failed to alloc mem for bytes %d\n", num_values);
+ return;
}
+
+ len = num_values;
ret = mixer_ctl_get_array(ctl, buf, len);
if (ret < 0) {
fprintf(stderr, "Failed to mixer_ctl_get_array\n");
+ free(buf);
return;
}
}
@@ -189,6 +193,9 @@
printf(" (range %d->%d)", min, max);
}
}
+
+ free(buf);
+
printf("\n");
}
@@ -196,14 +203,15 @@
char **values, unsigned int num_values)
{
int ret;
- char buf[512] = { 0 };
+ char *buf;
char *end;
- int i;
+ unsigned int i;
long n;
- if (num_values > sizeof(buf)) {
- fprintf(stderr, "Truncating set to %zu bytes\n", sizeof(buf));
- num_values = sizeof(buf);
+ buf = calloc(1, num_values);
+ if (buf == NULL) {
+ fprintf(stderr, "set_byte_ctl: Failed to alloc mem for bytes %d\n", num_values);
+ exit(EXIT_FAILURE);
}
for (i = 0; i < num_values; i++) {
@@ -211,17 +219,17 @@
n = strtol(values[i], &end, 0);
if (*end) {
fprintf(stderr, "%s not an integer\n", values[i]);
- exit(EXIT_FAILURE);
+ goto fail;
}
if (errno) {
fprintf(stderr, "strtol: %s: %s\n", values[i],
strerror(errno));
- exit(EXIT_FAILURE);
+ goto fail;
}
if (n < 0 || n > 0xff) {
fprintf(stderr, "%s should be between [0, 0xff]\n",
values[i]);
- exit(EXIT_FAILURE);
+ goto fail;
}
buf[i] = n;
}
@@ -229,8 +237,15 @@
ret = mixer_ctl_set_array(ctl, buf, num_values);
if (ret < 0) {
fprintf(stderr, "Failed to set binary control\n");
- exit(EXIT_FAILURE);
+ goto fail;
}
+
+ free(buf);
+ return;
+
+fail:
+ free(buf);
+ exit(EXIT_FAILURE);
}
static void tinymix_set_value(struct mixer *mixer, const char *control,