summaryrefslogtreecommitdiffstats
path: root/src/zero.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/zero.c')
-rw-r--r--src/zero.c71
1 files changed, 66 insertions, 5 deletions
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
+ <http://www.gnu.org/licenses/>.
+***/
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#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);