diff options
author | Simon Wilson | 2013-06-24 17:40:34 -0500 |
---|---|---|
committer | Simon Wilson | 2013-06-24 17:40:34 -0500 |
commit | 8813fe8c9c7bfe5722932166d379bc79e9dedf1d (patch) | |
tree | aebfdec0c3856952e14cdb62fa0edf51e051532c | |
parent | 9673f5717d824137d64320d0bc98a6461a9383a8 (diff) | |
download | platform-external-tinyalsa-8813fe8c9c7bfe5722932166d379bc79e9dedf1d.tar.gz platform-external-tinyalsa-8813fe8c9c7bfe5722932166d379bc79e9dedf1d.tar.xz platform-external-tinyalsa-8813fe8c9c7bfe5722932166d379bc79e9dedf1d.zip |
Update to latest tinyalsa
38f87f3 mixer: add get/set_array API
Change-Id: Ib44636dcb92412e2a537928bae28add2627180e4
-rw-r--r-- | include/tinyalsa/asoundlib.h | 4 | ||||
-rw-r--r-- | mixer.c | 50 |
2 files changed, 44 insertions, 10 deletions
diff --git a/include/tinyalsa/asoundlib.h b/include/tinyalsa/asoundlib.h index bb4005a..2e16392 100644 --- a/include/tinyalsa/asoundlib.h +++ b/include/tinyalsa/asoundlib.h | |||
@@ -230,9 +230,9 @@ int mixer_ctl_get_percent(struct mixer_ctl *ctl, unsigned int id); | |||
230 | int mixer_ctl_set_percent(struct mixer_ctl *ctl, unsigned int id, int percent); | 230 | int mixer_ctl_set_percent(struct mixer_ctl *ctl, unsigned int id, int percent); |
231 | 231 | ||
232 | int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id); | 232 | int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id); |
233 | int mixer_ctl_get_bytes(struct mixer_ctl *ctl, void *data, size_t len); | 233 | int mixer_ctl_get_array(struct mixer_ctl *ctl, void *array, size_t count); |
234 | int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value); | 234 | int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value); |
235 | int mixer_ctl_set_bytes(struct mixer_ctl *ctl, const void *data, size_t len); | 235 | int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count); |
236 | int mixer_ctl_set_enum_by_string(struct mixer_ctl *ctl, const char *string); | 236 | int mixer_ctl_set_enum_by_string(struct mixer_ctl *ctl, const char *string); |
237 | 237 | ||
238 | /* Determe range of integer mixer controls */ | 238 | /* Determe range of integer mixer controls */ |
@@ -317,13 +317,14 @@ int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id) | |||
317 | return 0; | 317 | return 0; |
318 | } | 318 | } |
319 | 319 | ||
320 | int mixer_ctl_get_bytes(struct mixer_ctl *ctl, void *data, size_t len) | 320 | int mixer_ctl_get_array(struct mixer_ctl *ctl, void *array, size_t count) |
321 | { | 321 | { |
322 | struct snd_ctl_elem_value ev; | 322 | struct snd_ctl_elem_value ev; |
323 | int ret; | 323 | int ret; |
324 | size_t size; | ||
325 | void *source; | ||
324 | 326 | ||
325 | if (!ctl || (len > ctl->info->count) || !len || !data || | 327 | if (!ctl || (count > ctl->info->count) || !count || !array) |
326 | (ctl->info->type != SNDRV_CTL_ELEM_TYPE_BYTES)) | ||
327 | return -EINVAL; | 328 | return -EINVAL; |
328 | 329 | ||
329 | memset(&ev, 0, sizeof(ev)); | 330 | memset(&ev, 0, sizeof(ev)); |
@@ -333,7 +334,23 @@ int mixer_ctl_get_bytes(struct mixer_ctl *ctl, void *data, size_t len) | |||
333 | if (ret < 0) | 334 | if (ret < 0) |
334 | return ret; | 335 | return ret; |
335 | 336 | ||
336 | memcpy(data, ev.value.bytes.data, len); | 337 | switch (ctl->info->type) { |
338 | case SNDRV_CTL_ELEM_TYPE_BOOLEAN: | ||
339 | case SNDRV_CTL_ELEM_TYPE_INTEGER: | ||
340 | size = sizeof(ev.value.integer.value[0]); | ||
341 | source = ev.value.integer.value; | ||
342 | break; | ||
343 | |||
344 | case SNDRV_CTL_ELEM_TYPE_BYTES: | ||
345 | size = sizeof(ev.value.bytes.data[0]); | ||
346 | source = ev.value.bytes.data; | ||
347 | break; | ||
348 | |||
349 | default: | ||
350 | return -EINVAL; | ||
351 | } | ||
352 | |||
353 | memcpy(array, source, size * count); | ||
337 | 354 | ||
338 | return 0; | 355 | return 0; |
339 | } | 356 | } |
@@ -372,18 +389,35 @@ int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value) | |||
372 | return ioctl(ctl->mixer->fd, SNDRV_CTL_IOCTL_ELEM_WRITE, &ev); | 389 | return ioctl(ctl->mixer->fd, SNDRV_CTL_IOCTL_ELEM_WRITE, &ev); |
373 | } | 390 | } |
374 | 391 | ||
375 | int mixer_ctl_set_bytes(struct mixer_ctl *ctl, const void *data, size_t len) | 392 | int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count) |
376 | { | 393 | { |
377 | struct snd_ctl_elem_value ev; | 394 | struct snd_ctl_elem_value ev; |
395 | size_t size; | ||
396 | void *dest; | ||
378 | 397 | ||
379 | if (!ctl || (len > ctl->info->count) || !len || !data || | 398 | if (!ctl || (count > ctl->info->count) || !count || !array) |
380 | (ctl->info->type != SNDRV_CTL_ELEM_TYPE_BYTES)) | ||
381 | return -EINVAL; | 399 | return -EINVAL; |
382 | 400 | ||
383 | memset(&ev, 0, sizeof(ev)); | 401 | memset(&ev, 0, sizeof(ev)); |
384 | ev.id.numid = ctl->info->id.numid; | 402 | ev.id.numid = ctl->info->id.numid; |
385 | 403 | ||
386 | memcpy(ev.value.bytes.data, data, len); | 404 | switch (ctl->info->type) { |
405 | case SNDRV_CTL_ELEM_TYPE_BOOLEAN: | ||
406 | case SNDRV_CTL_ELEM_TYPE_INTEGER: | ||
407 | size = sizeof(ev.value.integer.value[0]); | ||
408 | dest = ev.value.integer.value; | ||
409 | break; | ||
410 | |||
411 | case SNDRV_CTL_ELEM_TYPE_BYTES: | ||
412 | size = sizeof(ev.value.bytes.data[0]); | ||
413 | dest = ev.value.bytes.data; | ||
414 | break; | ||
415 | |||
416 | default: | ||
417 | return -EINVAL; | ||
418 | } | ||
419 | |||
420 | memcpy(dest, array, size * count); | ||
387 | 421 | ||
388 | return ioctl(ctl->mixer->fd, SNDRV_CTL_IOCTL_ELEM_WRITE, &ev); | 422 | return ioctl(ctl->mixer->fd, SNDRV_CTL_IOCTL_ELEM_WRITE, &ev); |
389 | } | 423 | } |