diff options
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]; +} |