From 9cb0b933e260008c6a03e24a4a149f726b8d86b2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 8 Jun 2004 23:54:24 +0000 Subject: initial commit git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@3 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/sample.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/sample.c (limited to 'src/sample.c') diff --git a/src/sample.c b/src/sample.c new file mode 100644 index 00000000..74a54937 --- /dev/null +++ b/src/sample.c @@ -0,0 +1,80 @@ +#include +#include + +#include "sample.h" + +struct sample_spec default_sample_spec = { + .format = SAMPLE_S16NE, + .rate = 44100, + .channels = 2 +}; + +struct memblock *silence(struct memblock* b, struct sample_spec *spec) { + char c; + assert(b && spec); + memblock_assert_exclusive(b); + + switch (spec->format) { + case SAMPLE_U8: + c = 127; + break; + case SAMPLE_S16LE: + case SAMPLE_S16BE: + case SAMPLE_FLOAT32: + c = 0; + break; + case SAMPLE_ALAW: + case SAMPLE_ULAW: + c = 80; + break; + } + + memset(b->data, c, b->length); + return b; +} + +void add_clip(struct memchunk *target, struct memchunk *chunk, struct sample_spec *spec) { + int16_t *p, *d; + size_t i; + assert(target && target->memblock && chunk && chunk->memblock && spec); + assert(spec->format == SAMPLE_S16NE); + assert((target->length & 1) == 0); + + d = target->memblock->data + target->index; + p = chunk->memblock->data + chunk->index; + + for (i = 0; i < target->length && i < chunk->length; i++) { + int32_t r = (int32_t) *d + (int32_t) *p; + if (r < -0x8000) r = 0x8000; + if (r > 0x7FFF) r = 0x7FFF; + *d = (int16_t) r; + } +} + +size_t sample_size(struct sample_spec *spec) { + assert(spec); + size_t b; + + switch (spec->format) { + case SAMPLE_U8: + case SAMPLE_ULAW: + case SAMPLE_ALAW: + b = 1; + break; + case SAMPLE_S16LE: + case SAMPLE_S16BE: + b = 2; + break; + case SAMPLE_FLOAT32: + b = 4; + break; + } + + return b * spec->channels; +} + +size_t bytes_per_second(struct sample_spec *spec) { + assert(spec); + return spec->rate*sample_size(spec); +} + -- cgit