6 struct sample_spec default_sample_spec
= {
7 .format
= SAMPLE_S16NE
,
12 struct memblock
*silence_memblock(struct memblock
* b
, struct 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 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 sample_spec
*spec
) {
27 assert(p
&& length
&& spec
);
29 switch (spec
->format
) {
47 size_t sample_size(struct sample_spec
*spec
) {
51 switch (spec
->format
) {
66 return b
* spec
->channels
;
69 size_t bytes_per_second(struct sample_spec
*spec
) {
71 return spec
->rate
*sample_size(spec
);
74 size_t mix_chunks(struct mix_info channels
[], unsigned nchannels
, void *data
, size_t length
, struct sample_spec
*spec
, uint8_t volume
) {
76 assert(channels
&& data
&& length
&& spec
);
77 assert(spec
->format
== SAMPLE_S16NE
);
79 for (d
= 0;; d
+= sizeof(int16_t)) {
85 for (c
= 0; c
< nchannels
; c
++) {
87 uint8_t volume
= channels
[c
].volume
;
89 if (d
>= channels
[c
].chunk
.length
)
95 v
= *((int16_t*) (channels
[c
].chunk
.memblock
->data
+ channels
[c
].chunk
.index
+ d
));
106 else if (volume
!= 0xFF)
107 sum
= sum
*volume
/0xFF;
109 if (sum
< -0x8000) sum
= -0x8000;
110 if (sum
> 0x7FFF) sum
= 0x7FFF;
112 *((int16_t*) data
) = sum
;
113 data
+= sizeof(int16_t);
117 uint32_t samples_usec(size_t length
, struct sample_spec
*spec
) {
120 return (uint32_t) (((double) length
/sample_size(spec
))/spec
->rate
*1000000);