aboutsummaryrefslogtreecommitdiffstats
path: root/pcm.c
diff options
context:
space:
mode:
authorSimon Wilson2012-12-03 13:18:57 -0600
committerSimon Wilson2012-12-03 13:19:34 -0600
commit42fc2d393c868d5db609e39551d64f1e60fefa0e (patch)
tree8242041a2037ac2acdb40591493097f5d65f5bcc /pcm.c
parentda39e0b09eb0a1b559a96e2108160d1d8dccf314 (diff)
downloadplatform-external-tinyalsa-42fc2d393c868d5db609e39551d64f1e60fefa0e.tar.gz
platform-external-tinyalsa-42fc2d393c868d5db609e39551d64f1e60fefa0e.tar.xz
platform-external-tinyalsa-42fc2d393c868d5db609e39551d64f1e60fefa0e.zip
Update to latest tinyalsa
f7f35cc Add tinypcminfo utility 4354488 pcm: add pcm_get_params API Change-Id: I50e196bc299734b6e020bdcededa4f903ee5c5c2
Diffstat (limited to 'pcm.c')
-rw-r--r--pcm.c144
1 files changed, 144 insertions, 0 deletions
diff --git a/pcm.c b/pcm.c
index d841bd9..4b31c4d 100644
--- a/pcm.c
+++ b/pcm.c
@@ -93,6 +93,24 @@ static void param_set_min(struct snd_pcm_hw_params *p, int n, unsigned int val)
93 } 93 }
94} 94}
95 95
96static unsigned int param_get_min(struct snd_pcm_hw_params *p, int n)
97{
98 if (param_is_interval(n)) {
99 struct snd_interval *i = param_to_interval(p, n);
100 return i->min;
101 }
102 return 0;
103}
104
105static unsigned int param_get_max(struct snd_pcm_hw_params *p, int n)
106{
107 if (param_is_interval(n)) {
108 struct snd_interval *i = param_to_interval(p, n);
109 return i->max;
110 }
111 return 0;
112}
113
96static void param_set_int(struct snd_pcm_hw_params *p, int n, unsigned int val) 114static void param_set_int(struct snd_pcm_hw_params *p, int n, unsigned int val)
97{ 115{
98 if (param_is_interval(n)) { 116 if (param_is_interval(n)) {
@@ -130,6 +148,9 @@ static void param_init(struct snd_pcm_hw_params *p)
130 i->min = 0; 148 i->min = 0;
131 i->max = ~0; 149 i->max = ~0;
132 } 150 }
151 p->rmask = ~0U;
152 p->cmask = 0;
153 p->info = ~0U;
133} 154}
134 155
135#define PCM_ERROR_MAX 128 156#define PCM_ERROR_MAX 128
@@ -433,6 +454,129 @@ static struct pcm bad_pcm = {
433 .fd = -1, 454 .fd = -1,
434}; 455};
435 456
457struct pcm_params *pcm_params_get(unsigned int card, unsigned int device,
458 unsigned int flags)
459{
460 struct snd_pcm_hw_params *params;
461 char fn[256];
462 int fd;
463
464 snprintf(fn, sizeof(fn), "/dev/snd/pcmC%uD%u%c", card, device,
465 flags & PCM_IN ? 'c' : 'p');
466
467 fd = open(fn, O_RDWR);
468 if (fd < 0) {
469 fprintf(stderr, "cannot open device '%s'\n", fn);
470 goto err_open;
471 }
472
473 params = calloc(1, sizeof(struct snd_pcm_hw_params));
474 if (!params)
475 goto err_calloc;
476
477 param_init(params);
478 if (ioctl(fd, SNDRV_PCM_IOCTL_HW_REFINE, params)) {
479 fprintf(stderr, "SNDRV_PCM_IOCTL_HW_REFINE error (%d)\n", errno);
480 goto err_hw_refine;
481 }
482
483 close(fd);
484
485 return (struct pcm_params *)params;
486
487err_hw_refine:
488 free(params);
489err_calloc:
490 close(fd);
491err_open:
492 return NULL;
493}
494
495void pcm_params_free(struct pcm_params *pcm_params)
496{
497 struct snd_pcm_hw_params *params = (struct snd_pcm_hw_params *)pcm_params;
498
499 if (params)
500 free(params);
501}
502
503static int pcm_param_to_alsa(enum pcm_param param)
504{
505 switch (param) {
506 case PCM_PARAM_SAMPLE_BITS:
507 return SNDRV_PCM_HW_PARAM_SAMPLE_BITS;
508 break;
509 case PCM_PARAM_FRAME_BITS:
510 return SNDRV_PCM_HW_PARAM_FRAME_BITS;
511 break;
512 case PCM_PARAM_CHANNELS:
513 return SNDRV_PCM_HW_PARAM_CHANNELS;
514 break;
515 case PCM_PARAM_RATE:
516 return SNDRV_PCM_HW_PARAM_RATE;
517 break;
518 case PCM_PARAM_PERIOD_TIME:
519 return SNDRV_PCM_HW_PARAM_PERIOD_TIME;
520 break;
521 case PCM_PARAM_PERIOD_SIZE:
522 return SNDRV_PCM_HW_PARAM_PERIOD_SIZE;
523 break;
524 case PCM_PARAM_PERIOD_BYTES:
525 return SNDRV_PCM_HW_PARAM_PERIOD_BYTES;
526 break;
527 case PCM_PARAM_PERIODS:
528 return SNDRV_PCM_HW_PARAM_PERIODS;
529 break;
530 case PCM_PARAM_BUFFER_TIME:
531 return SNDRV_PCM_HW_PARAM_BUFFER_TIME;
532 break;
533 case PCM_PARAM_BUFFER_SIZE:
534 return SNDRV_PCM_HW_PARAM_BUFFER_SIZE;
535 break;
536 case PCM_PARAM_BUFFER_BYTES:
537 return SNDRV_PCM_HW_PARAM_BUFFER_BYTES;
538 break;
539 case PCM_PARAM_TICK_TIME:
540 return SNDRV_PCM_HW_PARAM_TICK_TIME;
541 break;
542
543 default:
544 return -1;
545 }
546}
547
548unsigned int pcm_params_get_min(struct pcm_params *pcm_params,
549 enum pcm_param param)
550{
551 struct snd_pcm_hw_params *params = (struct snd_pcm_hw_params *)pcm_params;
552 int p;
553
554 if (!params)
555 return 0;
556
557 p = pcm_param_to_alsa(param);
558 if (p < 0)
559 return 0;
560
561 return param_get_min(params, p);
562}
563
564unsigned int pcm_params_get_max(struct pcm_params *pcm_params,
565 enum pcm_param param)
566{
567 struct snd_pcm_hw_params *params = (struct snd_pcm_hw_params *)pcm_params;
568 int p;
569
570 if (!params)
571 return 0;
572
573 p = pcm_param_to_alsa(param);
574 if (p < 0)
575 return 0;
576
577 return param_get_max(params, p);
578}
579
436int pcm_close(struct pcm *pcm) 580int pcm_close(struct pcm *pcm)
437{ 581{
438 if (pcm == &bad_pcm) 582 if (pcm == &bad_pcm)