add interleaving/deinterleaving APIs

git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1942 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
Lennart Poettering 2007-10-22 21:48:16 +00:00
parent 190081782c
commit 925eadd9e2
2 changed files with 60 additions and 0 deletions

View file

@ -31,6 +31,7 @@
#include <stdlib.h>
#include <liboil/liboilfuncs.h>
#include <liboil/liboil.h>
#include <pulsecore/log.h>
#include <pulsecore/macro.h>
@ -485,3 +486,59 @@ int pa_frame_aligned(size_t l, const pa_sample_spec *ss) {
return l % fs == 0;
}
void pa_interleave(const void *src[], unsigned channels, void *dst, size_t ss, unsigned n) {
unsigned c;
size_t fs;
pa_assert(src);
pa_assert(channels > 0);
pa_assert(dst);
pa_assert(ss > 0);
pa_assert(n > 0);
fs = ss * channels;
for (c = 0; c < channels; c++) {
unsigned j;
void *d;
const void *s;
s = src[c];
d = (uint8_t*) dst + c * ss;
for (j = 0; j < n; j ++) {
oil_memcpy(d, s, ss);
s = (uint8_t*) s + ss;
d = (uint8_t*) d + fs;
}
}
}
void pa_deinterleave(const void *src, void *dst[], unsigned channels, size_t ss, unsigned n) {
size_t fs;
unsigned c;
pa_assert(src);
pa_assert(dst);
pa_assert(channels > 0);
pa_assert(ss > 0);
pa_assert(n > 0);
fs = ss * channels;
for (c = 0; c < channels; c++) {
unsigned j;
const void *s;
void *d;
s = (uint8_t*) src + c * ss;
d = dst[c];
for (j = 0; j < n; j ++) {
oil_memcpy(d, s, ss);
s = (uint8_t*) s + fs;
d = (uint8_t*) d + ss;
}
}
}

View file

@ -60,4 +60,7 @@ size_t pa_frame_align(size_t l, const pa_sample_spec *ss) PA_GCC_PURE;
int pa_frame_aligned(size_t l, const pa_sample_spec *ss) PA_GCC_PURE;
void pa_interleave(const void *src[], unsigned channels, void *dst, size_t ss, unsigned n);
void pa_deinterleave(const void *src, void *dst[], unsigned channels, size_t ss, unsigned n);
#endif