aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Wilson2013-06-24 17:40:34 -0500
committerSimon Wilson2013-06-24 17:40:34 -0500
commit8813fe8c9c7bfe5722932166d379bc79e9dedf1d (patch)
treeaebfdec0c3856952e14cdb62fa0edf51e051532c
parent9673f5717d824137d64320d0bc98a6461a9383a8 (diff)
downloadplatform-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.h4
-rw-r--r--mixer.c50
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);
230int mixer_ctl_set_percent(struct mixer_ctl *ctl, unsigned int id, int percent); 230int mixer_ctl_set_percent(struct mixer_ctl *ctl, unsigned int id, int percent);
231 231
232int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id); 232int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id);
233int mixer_ctl_get_bytes(struct mixer_ctl *ctl, void *data, size_t len); 233int mixer_ctl_get_array(struct mixer_ctl *ctl, void *array, size_t count);
234int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value); 234int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value);
235int mixer_ctl_set_bytes(struct mixer_ctl *ctl, const void *data, size_t len); 235int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count);
236int mixer_ctl_set_enum_by_string(struct mixer_ctl *ctl, const char *string); 236int 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 */
diff --git a/mixer.c b/mixer.c
index f52bca9..7419d3f 100644
--- a/mixer.c
+++ b/mixer.c
@@ -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
320int mixer_ctl_get_bytes(struct mixer_ctl *ctl, void *data, size_t len) 320int 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
375int mixer_ctl_set_bytes(struct mixer_ctl *ctl, const void *data, size_t len) 392int 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}