From 181e9c6d5d11cb1e5d36a2777eeb233ad8ed00e5 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 9 Oct 2008 18:15:23 +0200 Subject: big pile of updates to match more what happened with libcanberra --- src/zero.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 5 deletions(-) (limited to 'src/zero.c') diff --git a/src/zero.c b/src/zero.c index 9d4c054..0cceb23 100644 --- a/src/zero.c +++ b/src/zero.c @@ -1,3 +1,23 @@ +/*** + This file is part of libsydney. + + Copyright 2007-2008 Lennart Poettering + + libsydney is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 2.1 of the + License, or (at your option) any later version. + + libsydney is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with libsydney. If not, see + . +***/ + #ifdef HAVE_CONFIG_H #include #endif @@ -18,9 +38,31 @@ static void zero_u8(void *dst, size_t dstr, size_t bytes) { } } +static void zero_ulaw(void *dst, size_t dstr, size_t bytes) { + uint8_t *d = dst; + + if (dstr == 1) + memset(dst, 0xff, bytes); + else { + for (; bytes > 0; bytes --, d += dstr) + *d = 0xff; + } +} + +static void zero_alaw(void *dst, size_t dstr, size_t bytes) { + uint8_t *d = dst; + + if (dstr == 1) + memset(dst, 0xd5, bytes); + else { + for (; bytes > 0; bytes --, d += dstr) + *d = 0xd5; + } +} + static void zero_16(void *dst, size_t dstr, size_t bytes) { uint16_t *d = dst; - unsigned n = bytes/sizeof(uint16_t); + size_t n = bytes/sizeof(uint16_t); if (dstr == sizeof(uint16_t)) memset(dst, 0, bytes); @@ -30,9 +72,21 @@ static void zero_16(void *dst, size_t dstr, size_t bytes) { } } +static void zero_24(void *dst, size_t dstr, size_t bytes) { + uint8_t *d = dst; + size_t n = bytes/3; + + if (dstr == 3) + memset(dst, 0, bytes); + else { + for (; n > 0; n --, d += dstr/3) + d[0] = d[1] = d[2] = 0; + } +} + static void zero_32(void *dst, size_t dstr, size_t bytes) { uint32_t *d = dst; - unsigned n = bytes/sizeof(float); + size_t n = bytes/sizeof(float); if (dstr == sizeof(uint32_t)) memset(dst, 0, bytes); @@ -46,9 +100,16 @@ 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_PCM_FORMAT_ULAW] = zero_ulaw, + [SA_PCM_FORMAT_ALAW] = zero_alaw, + [SA_PCM_FORMAT_S16_LE] = zero_16, + [SA_PCM_FORMAT_S16_BE] = zero_16, + [SA_PCM_FORMAT_S24_LE] = zero_24, + [SA_PCM_FORMAT_S24_BE] = zero_24, + [SA_PCM_FORMAT_S32_LE] = zero_32, + [SA_PCM_FORMAT_S32_BE] = zero_32, + [SA_PCM_FORMAT_FLOAT32_LE] = zero_32, + [SA_PCM_FORMAT_FLOAT32_BE] = zero_32 }; sa_assert(f < _SA_PCM_FORMAT_MAX); -- cgit