Showing the changes to src/src_zoh.c (1 of 3 files). Show all
Unified · Split
| @@ -29,7 +29,7 @@ typedef struct · 28 unmodified lines | ||
| 29 | 29 | bool dirty ; |
| 30 | 30 | long in_count, in_used ; |
| 31 | 31 | long out_count, out_gen ; |
| 32 | − float last_value [] ; | |
| 32 | + float *last_value ; | |
| 33 | 33 | } ZOH_DATA ; |
| 34 | 34 | |
| 35 | 35 | /*---------------------------------------------------------------------------------------- |
| @@ -151,7 +151,8 @@ zoh_get_description (int src_enum) · 115 unmodified lines | ||
| 151 | 151 | |
| 152 | 152 | enum SRC_ERR |
| 153 | 153 | zoh_set_converter (SRC_STATE *state, int src_enum) |
| 154 | −{ ZOH_DATA *priv = NULL ; | |
| 154 | +{ | |
| 155 | + ZOH_DATA *priv = NULL ; | |
| 155 | 156 | |
| 156 | 157 | if (src_enum != SRC_ZERO_ORDER_HOLD) |
| 157 | 158 | return SRC_ERR_BAD_CONVERTER ; |
| @@ -159,13 +160,24 @@ zoh_set_converter (SRC_STATE *state, int src_enum) · 1 unmodified line | ||
| 159 | 160 | zoh_close (state) ; |
| 160 | 161 | |
| 161 | 162 | if (state->private_data == NULL) |
| 162 | − { priv = ZERO_ALLOC (ZOH_DATA, sizeof (*priv) + state->channels * sizeof (float)) ; | |
| 163 | − state->private_data = priv ; | |
| 164 | − } ; | |
| 163 | + { | |
| 164 | + priv = ZERO_ALLOC (ZOH_DATA, sizeof (*priv)) ; | |
| 165 | + if (priv) | |
| 166 | + { | |
| 167 | + priv->last_value = calloc (state->channels, sizeof (float)) ; | |
| 168 | + if (!priv->last_value) | |
| 169 | + { | |
| 170 | + free (priv) ; | |
| 171 | + priv = NULL ; | |
| 172 | + } | |
| 173 | + } | |
| 174 | + } | |
| 165 | 175 | |
| 166 | 176 | if (priv == NULL) |
| 167 | 177 | return SRC_ERR_MALLOC_FAILED ; |
| 168 | 178 | |
| 179 | + state->private_data = priv ; | |
| 180 | + | |
| 169 | 181 | priv->zoh_magic_marker = ZOH_MAGIC_MARKER ; |
| 170 | 182 | |
| 171 | 183 | state->const_process = zoh_vari_process ; |
| @@ -191,7 +203,7 @@ zoh_reset (SRC_STATE *state) · 19 unmodified lines | ||
| 191 | 203 | return ; |
| 192 | 204 | |
| 193 | 205 | priv->dirty = false ; |
| 194 | − memset (priv->last_value, 0, sizeof (priv->last_value [0]) * state->channels) ; | |
| 206 | + memset (priv->last_value, 0, sizeof (float) * state->channels) ; | |
| 195 | 207 | |
| 196 | 208 | return ; |
| 197 | 209 | } /* zoh_reset */ |
| @@ -204,12 +216,18 @@ zoh_copy (SRC_STATE *from, SRC_STATE *to) · 6 unmodified lines | ||
| 204 | 216 | |
| 205 | 217 | ZOH_DATA *to_priv = NULL ; |
| 206 | 218 | ZOH_DATA* from_priv = (ZOH_DATA*) from->private_data ; |
| 207 | − size_t private_size = sizeof (*to_priv) + from->channels * sizeof (float) ; | |
| 208 | 219 | |
| 209 | − if ((to_priv = ZERO_ALLOC (ZOH_DATA, private_size)) == NULL) | |
| 220 | + if ((to_priv = ZERO_ALLOC (ZOH_DATA, sizeof (ZOH_DATA))) == NULL) | |
| 210 | 221 | return SRC_ERR_MALLOC_FAILED ; |
| 211 | 222 | |
| 212 | − memcpy (to_priv, from_priv, private_size) ; | |
| 223 | + memcpy (to_priv, from_priv, sizeof (ZOH_DATA)) ; | |
| 224 | + to_priv->last_value = malloc (sizeof (float) * from->channels) ; | |
| 225 | + if (!to_priv->last_value) | |
| 226 | + { free (to_priv) ; | |
| 227 | + return SRC_ERR_MALLOC_FAILED ; | |
| 228 | + } ; | |
| 229 | + memcpy (to_priv->last_value, from_priv->last_value, sizeof (float) * from->channels) ; | |
| 230 | + | |
| 213 | 231 | to->private_data = to_priv ; |
| 214 | 232 | |
| 215 | 233 | return SRC_ERR_NO_ERROR ; |
| @@ -220,10 +238,15 @@ zoh_close (SRC_STATE *state) · 4 unmodified lines | ||
| 220 | 238 | { |
| 221 | 239 | if (state) |
| 222 | 240 | { |
| 223 | − if (state->private_data) | |
| 241 | + ZOH_DATA *zoh = (ZOH_DATA *) state->private_data ; | |
| 242 | + if (zoh) | |
| 224 | 243 | { |
| 225 | − free (state->private_data) ; | |
| 226 | − state->private_data = NULL ; | |
| 244 | + if (zoh->last_value) | |
| 245 | + { free (zoh->last_value) ; | |
| 246 | + zoh->last_value = NULL ; | |
| 247 | + } ; | |
| 248 | + free (zoh) ; | |
| 249 | + zoh = NULL ; | |
| 227 | 250 | } |
| 228 | 251 | } |
| 229 | 252 | } /* zoh_close */ |