]> code.delx.au - pulseaudio/blob - src/sample.c
autoconf
[pulseaudio] / src / sample.c
1 #include <string.h>
2 #include <assert.h>
3
4 #include "sample.h"
5
6 struct sample_spec default_sample_spec = {
7 .format = SAMPLE_S16NE,
8 .rate = 44100,
9 .channels = 2
10 };
11
12 struct memblock *silence(struct memblock* b, struct sample_spec *spec) {
13 char c = 0;
14 assert(b && spec);
15 memblock_assert_exclusive(b);
16
17 switch (spec->format) {
18 case SAMPLE_U8:
19 c = 127;
20 break;
21 case SAMPLE_S16LE:
22 case SAMPLE_S16BE:
23 case SAMPLE_FLOAT32:
24 c = 0;
25 break;
26 case SAMPLE_ALAW:
27 case SAMPLE_ULAW:
28 c = 80;
29 break;
30 }
31
32 memset(b->data, c, b->length);
33 return b;
34 }
35
36 void add_clip(struct memchunk *target, struct memchunk *chunk, struct sample_spec *spec) {
37 int16_t *p, *d;
38 size_t i;
39 assert(target && target->memblock && chunk && chunk->memblock && spec);
40 assert(spec->format == SAMPLE_S16NE);
41 assert((target->length & 1) == 0);
42
43 d = target->memblock->data + target->index;
44 p = chunk->memblock->data + chunk->index;
45
46 for (i = 0; i < target->length && i < chunk->length; i++) {
47 int32_t r = (int32_t) *d + (int32_t) *p;
48 if (r < -0x8000) r = 0x8000;
49 if (r > 0x7FFF) r = 0x7FFF;
50 *d = (int16_t) r;
51 }
52 }
53
54 size_t sample_size(struct sample_spec *spec) {
55 assert(spec);
56 size_t b = 1;
57
58 switch (spec->format) {
59 case SAMPLE_U8:
60 case SAMPLE_ULAW:
61 case SAMPLE_ALAW:
62 b = 1;
63 break;
64 case SAMPLE_S16LE:
65 case SAMPLE_S16BE:
66 b = 2;
67 break;
68 case SAMPLE_FLOAT32:
69 b = 4;
70 break;
71 }
72
73 return b * spec->channels;
74 }
75
76 size_t bytes_per_second(struct sample_spec *spec) {
77 assert(spec);
78 return spec->rate*sample_size(spec);
79 }
80