]> code.delx.au - pulseaudio/blob - src/sample.c
add alsa sink
[pulseaudio] / src / sample.c
1 #include <stdio.h>
2 #include <assert.h>
3
4 #include "sample.h"
5
6 size_t pa_sample_size(const struct pa_sample_spec *spec) {
7 assert(spec);
8 size_t b = 1;
9
10 switch (spec->format) {
11 case PA_SAMPLE_U8:
12 case PA_SAMPLE_ULAW:
13 case PA_SAMPLE_ALAW:
14 b = 1;
15 break;
16 case PA_SAMPLE_S16LE:
17 case PA_SAMPLE_S16BE:
18 b = 2;
19 break;
20 case PA_SAMPLE_FLOAT32:
21 b = 4;
22 break;
23 default:
24 assert(0);
25 }
26
27 return b * spec->channels;
28 }
29
30 size_t pa_bytes_per_second(const struct pa_sample_spec *spec) {
31 assert(spec);
32 return spec->rate*pa_sample_size(spec);
33 }
34
35
36 uint32_t pa_samples_usec(size_t length, const struct pa_sample_spec *spec) {
37 assert(spec);
38
39 return (uint32_t) (((double) length /pa_sample_size(spec))/spec->rate*1000000);
40 }
41
42 int pa_sample_spec_valid(const struct pa_sample_spec *spec) {
43 assert(spec);
44
45 if (!spec->rate || !spec->channels)
46 return 0;
47
48 if (spec->format >= PA_SAMPLE_MAX)
49 return 0;
50
51 return 1;
52 }
53
54 int pa_sample_spec_equal(const struct pa_sample_spec*a, const struct pa_sample_spec*b) {
55 assert(a && b);
56
57 return (a->format == b->format) && (a->rate == b->rate) && (a->channels == b->channels);
58 }
59
60 void pa_sample_snprint(char *s, size_t l, const struct pa_sample_spec *spec) {
61 static const char* const table[]= {
62 [PA_SAMPLE_U8] = "U8",
63 [PA_SAMPLE_ALAW] = "ALAW",
64 [PA_SAMPLE_ULAW] = "ULAW",
65 [PA_SAMPLE_S16LE] = "S16LE",
66 [PA_SAMPLE_S16BE] = "S16BE",
67 [PA_SAMPLE_FLOAT32] = "FLOAT32",
68 };
69
70 assert(pa_sample_spec_valid(spec));
71 snprintf(s, l, "%s %uch %uHz", table[spec->format], spec->channels, spec->rate);
72 }