4 #include "sample-util.h"
6 struct pa_sample_spec default_sample_spec
= {
7 .format
= PA_SAMPLE_S16NE
,
12 struct memblock
*silence_memblock(struct memblock
* b
, struct pa_sample_spec
*spec
) {
13 assert(b
&& b
->data
&& spec
);
14 memblock_assert_exclusive(b
);
15 silence_memory(b
->data
, b
->length
, spec
);
19 void silence_memchunk(struct memchunk
*c
, struct pa_sample_spec
*spec
) {
20 assert(c
&& c
->memblock
&& c
->memblock
->data
&& spec
&& c
->length
);
21 memblock_assert_exclusive(c
->memblock
);
22 silence_memory(c
->memblock
->data
+c
->index
, c
->length
, spec
);
25 void silence_memory(void *p
, size_t length
, struct pa_sample_spec
*spec
) {
27 assert(p
&& length
&& spec
);
29 switch (spec
->format
) {
35 case PA_SAMPLE_FLOAT32
:
49 size_t mix_chunks(struct mix_info channels
[], unsigned nchannels
, void *data
, size_t length
, struct pa_sample_spec
*spec
, uint8_t volume
) {
51 assert(channels
&& data
&& length
&& spec
);
52 assert(spec
->format
== PA_SAMPLE_S16NE
);
54 for (d
= 0;; d
+= sizeof(int16_t)) {
60 for (c
= 0; c
< nchannels
; c
++) {
62 uint8_t volume
= channels
[c
].volume
;
64 if (d
>= channels
[c
].chunk
.length
)
70 v
= *((int16_t*) (channels
[c
].chunk
.memblock
->data
+ channels
[c
].chunk
.index
+ d
));
81 else if (volume
!= 0xFF)
82 sum
= sum
*volume
/0xFF;
84 if (sum
< -0x8000) sum
= -0x8000;
85 if (sum
> 0x7FFF) sum
= 0x7FFF;
87 *((int16_t*) data
) = sum
;
88 data
+= sizeof(int16_t);