diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-10-01 20:16:28 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-10-01 20:16:28 +0000 |
commit | 7d83e5c7816b5e343695a75ba58b32dbe1be969a (patch) | |
tree | bfd1dfc9b7c8f4a2aaf66c1b30e78355dee8c88a /src/zero.c | |
parent | 762196328ab7e60f1d2908fd5a337d2ca99726dd (diff) |
move all sources down to a seperate src/ tree
git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@34 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce
Diffstat (limited to 'src/zero.c')
-rw-r--r-- | src/zero.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/zero.c b/src/zero.c new file mode 100644 index 0000000..4f477dc --- /dev/null +++ b/src/zero.c @@ -0,0 +1,53 @@ +#include <string.h> + +#include "macro.h" +#include "zero.h" + +static void zero_u8(void *dst, size_t dstr, size_t bytes) { + uint8_t *d = dst; + + if (dstr == 1) + memset(dst, 0x80, bytes); + else { + for (; bytes > 0; bytes --, d += dstr) + *d = 0x80; + } +} + +static void zero_16(void *dst, size_t dstr, size_t bytes) { + uint16_t *d = dst; + unsigned n = bytes/sizeof(uint16_t); + + if (dstr == sizeof(uint16_t)) + memset(dst, 0, bytes); + else { + for (; n > 0; n --, d += dstr/sizeof(uint16_t)) + *d = 0; + } +} + +static void zero_32(void *dst, size_t dstr, size_t bytes) { + uint32_t *d = dst; + unsigned n = bytes/sizeof(float); + + if (dstr == sizeof(uint32_t)) + memset(dst, 0, bytes); + else { + for (; n > 0; n --, d += dstr/sizeof(uint32_t)) + *d = 0; + } +} + +sa_zero_func_t sa_get_zero_func(sa_pcm_format_t f) { + + static const sa_zero_func_t funcs[_SA_PCM_FORMAT_MAX] = { + [SA_PCM_FORMAT_U8] = zero_u8, + [SA_PCM_FORMAT_S16_NE] = zero_16, + [SA_PCM_FORMAT_S32_NE] = zero_32, + [SA_PCM_FORMAT_FLOAT32_NE] = zero_32 + }; + + sa_assert(f < _SA_PCM_FORMAT_MAX); + + return funcs[f]; +} |