source: roaraudio/libroardsp/filter_clip.c @ 5177:49fc5113e053

Last change on this file since 5177:49fc5113e053 was 5177:49fc5113e053, checked in by phi, 13 years ago

added 8 and 32 bit support

File size: 3.7 KB
Line 
1//filter_clip.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008-2011
5 *
6 *  This file is part of libroardsp a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroardsp is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
23 *
24 */
25
26#include "libroardsp.h"
27
28int roardsp_clip_init  (struct roardsp_filter * filter, struct roar_stream * stream, int id) {
29 if ( (filter->inst = roar_mm_malloc(sizeof(struct roardsp_clip))) == NULL )
30  return -1;
31
32 return roardsp_filter_reset(filter, ROARDSP_RESET_FULL);
33}
34
35int roardsp_clip_uninit(struct roardsp_filter * filter) {
36 roar_mm_free(filter->inst);
37 return 0;
38}
39
40#define _clipX(bits) \
41static inline int##bits##_t _clip##bits (int##bits##_t s, struct roardsp_clip * self) { \
42 switch (self->mode) { \
43  case ROARDSP_CLIP_MODE_LIMIT: \
44    return s > 0 ? self->limit : -self->limit; \
45   break; \
46  case ROARDSP_CLIP_MODE_ZERO: \
47    return 0; \
48   break; \
49  case ROARDSP_CLIP_MODE_WARP: \
50    if ( s > 0 ) { \
51     return s - 2*self->limit; \
52    } else { \
53     return s + 2*self->limit; \
54    } \
55   break; \
56  case ROARDSP_CLIP_MODE_NOISE: \
57    return (s > 0 ? 1 : -1) * (self->limit - (roar_random_uint16() & 0xFF)); \
58   break; \
59 } \
60\
61 ROAR_WARN("_clip16(s=%i, self=%p{.mode=%i, ...}) = 0 // ERROR: Bad mode", (int)s, self, (int)self->mode); \
62 return 0; \
63}
64
65#define _calcX(bits) \
66int roardsp_clip_calc##bits  (struct roardsp_filter * filter, void * data, size_t samples) { \
67 struct roardsp_clip * self = filter->inst; \
68 int##bits##_t * samp = (int##bits##_t *) data; \
69 register int32_t s = self->limit; \
70 size_t i; \
71\
72 for (i = 0; i < samples; i++) { \
73  if ( samp[i] > s ) { \
74   samp[i]  = _clip##bits (samp[i], self); \
75  } else if ( -samp[i] > s ) { \
76   samp[i]  = _clip##bits (samp[i], self); \
77  } \
78 } \
79\
80 ROAR_DBG("roardsp_quantify_calc16(*) = 0"); \
81 return 0; \
82}
83
84#define _setX(bits) \
85 _clipX(bits) \
86 _calcX(bits)
87
88_setX(8)
89_setX(16)
90_setX(32)
91
92int roardsp_clip_ctl   (struct roardsp_filter * filter, int cmd, void * data) {
93 struct roardsp_clip * self = filter->inst;
94 int32_t old;
95
96 switch (cmd) {
97  case ROARDSP_FCTL_LIMIT:
98    old = self->limit;
99    self->limit = labs(*(int32_t*)data);
100    *(int32_t*)data = old;
101   break;
102  case ROARDSP_FCTL_MODE:
103    old = self->mode;
104    self->mode = *(int32_t*)data;
105    *(int32_t*)data = old;
106   break;
107  default:
108    ROAR_DBG("roardsp_clip_ctl(*) = -1");
109    return -1;
110   break;
111 }
112
113
114 ROAR_DBG("roardsp_clip_ctl(*) = 0");
115 return 0;
116}
117
118int roardsp_clip_reset (struct roardsp_filter * filter, int what) {
119 int32_t mode = ROARDSP_CLIP_MODE_LIMIT;
120 int32_t n;
121
122 if ( filter == NULL )
123  return -1;
124
125 switch (filter->bits) {
126  case  8: n =         64L; break;
127  case 16: n =      16384L; break;
128  case 32: n = 1073741824L; break;
129  default:
130    roar_err_set(ROAR_ERROR_NOTSUP);
131    return -1;
132   break;
133 }
134
135 switch (what) {
136  case ROARDSP_RESET_NONE:
137  case ROARDSP_RESET_STATE:
138    return  0;
139   break;
140  case ROARDSP_RESET_FULL:
141    roardsp_clip_ctl(filter, ROARDSP_FCTL_LIMIT, &n);
142    roardsp_clip_ctl(filter, ROARDSP_FCTL_MODE, &mode);
143    return  0;
144   break;
145  default:
146    return -1;
147 }
148
149 return -1;
150}
151
152//ll
Note: See TracBrowser for help on using the repository browser.