From fc7a74905b3285022ba9c51b0279ced2060eb5e7 Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Sat, 14 Jun 2014 19:49:05 +0800 Subject: [PATCH] Various little memory leak possibilities in spandsp sorts, and the spandsp test suite is now mostly OK with valgrind. --- libs/spandsp/spandsp-sim/g1050.c | 57 ++++++++++-------- libs/spandsp/spandsp-sim/line_model.c | 18 ++++-- libs/spandsp/spandsp-sim/make_line_models.c | 9 ++- libs/spandsp/spandsp-sim/rfc2198_sim.c | 16 ++++- libs/spandsp/spandsp-sim/spandsp/g1050.h | 2 + libs/spandsp/spandsp-sim/spandsp/line_model.h | 4 +- .../spandsp/spandsp-sim/spandsp/rfc2198_sim.h | 2 + libs/spandsp/spandsp-sim/spandsp/test_utils.h | 4 +- libs/spandsp/spandsp-sim/test_utils.c | 25 +++++--- libs/spandsp/src/bell_r2_mf.c | 2 + libs/spandsp/src/dtmf.c | 2 + libs/spandsp/src/fax.c | 3 +- libs/spandsp/src/image_translate.c | 9 +-- libs/spandsp/src/t30.c | 6 +- libs/spandsp/src/t31.c | 5 ++ libs/spandsp/src/t4_tx.c | 59 +++++++++++-------- libs/spandsp/src/t85_decode.c | 12 ++-- libs/spandsp/src/t85_encode.c | 12 ++-- libs/spandsp/src/time_scale.c | 2 +- libs/spandsp/src/v18.c | 2 + libs/spandsp/src/v8.c | 3 +- libs/spandsp/tests/ademco_contactid_tests.c | 8 ++- libs/spandsp/tests/at_interpreter_tests.c | 1 + libs/spandsp/tests/awgn_tests.c | 15 ++++- libs/spandsp/tests/bell_mf_rx_tests.c | 2 + libs/spandsp/tests/bell_mf_tx_tests.c | 1 + libs/spandsp/tests/bert_tests.c | 31 +++++++++- libs/spandsp/tests/dc_restore_tests.c | 1 + libs/spandsp/tests/dtmf_rx_tests.c | 5 ++ libs/spandsp/tests/dtmf_tx_tests.c | 1 + libs/spandsp/tests/fax_decode.c | 2 +- libs/spandsp/tests/fax_tests.c | 26 ++++---- libs/spandsp/tests/fsk_tests.c | 16 +++++ libs/spandsp/tests/g1050_tests.c | 2 + libs/spandsp/tests/g168_tests.c | 9 +++ libs/spandsp/tests/g711_tests.c | 6 +- libs/spandsp/tests/g722_tests.c | 9 +++ libs/spandsp/tests/g726_tests.c | 14 +++-- libs/spandsp/tests/gsm0610_tests.c | 12 ++-- libs/spandsp/tests/ima_adpcm_tests.c | 4 +- libs/spandsp/tests/image_translate_tests.c | 2 + libs/spandsp/tests/line_model_tests.c | 6 +- libs/spandsp/tests/logging_tests.c | 2 + libs/spandsp/tests/lpc10_tests.c | 4 +- libs/spandsp/tests/oki_adpcm_tests.c | 6 +- libs/spandsp/tests/power_meter_tests.c | 2 + libs/spandsp/tests/r2_mf_rx_tests.c | 7 ++- libs/spandsp/tests/rfc2198_sim_tests.c | 4 ++ libs/spandsp/tests/sig_tone_tests.c | 2 + libs/spandsp/tests/swept_tone_tests.c | 4 ++ libs/spandsp/tests/t31_tests.c | 7 ++- libs/spandsp/tests/t38_non_ecm_buffer_tests.c | 7 +++ libs/spandsp/tests/t42_tests.c | 18 +++++- libs/spandsp/tests/t43_tests.c | 9 ++- libs/spandsp/tests/t4_t6_tests.c | 4 +- libs/spandsp/tests/t4_tests.c | 6 +- .../tests/t81_t82_arith_coding_tests.c | 3 +- libs/spandsp/tests/t85_tests.c | 9 +-- libs/spandsp/tests/time_scale_tests.c | 2 + libs/spandsp/tests/tone_detect_tests.c | 2 + libs/spandsp/tests/tone_generate_tests.c | 16 ++--- libs/spandsp/tests/tsb85_tests.c | 24 ++++++++ libs/spandsp/tests/v17_tests.c | 7 ++- libs/spandsp/tests/v22bis_tests.c | 1 + libs/spandsp/tests/v27ter_tests.c | 9 ++- libs/spandsp/tests/v29_tests.c | 8 ++- 66 files changed, 419 insertions(+), 171 deletions(-) diff --git a/libs/spandsp/spandsp-sim/g1050.c b/libs/spandsp/spandsp-sim/g1050.c index c1e8b9d415..ed7d8e900b 100644 --- a/libs/spandsp/spandsp-sim/g1050.c +++ b/libs/spandsp/spandsp-sim/g1050.c @@ -41,6 +41,11 @@ #define GEN_CONST #include #endif +#if defined(HAVE_STDBOOL_H) +#include +#else +#include "spandsp/stdbool.h" +#endif #include "floating_fudge.h" #include "spandsp.h" @@ -48,9 +53,6 @@ #define PACKET_LOSS_TIME -1 -#define FALSE 0 -#define TRUE (!FALSE) - g1050_constants_t g1050_constants[1] = { { @@ -746,7 +748,7 @@ static void g1050_segment_init(g1050_segment_state_t *s, s->max_jitter = parms->max_jitter; /* The following is common state information to all links. */ - s->high_loss = FALSE; + s->high_loss = false; s->congestion_delay = 0.0; s->last_arrival_time = 0.0; @@ -797,7 +799,7 @@ static void g1050_core_init(g1050_core_state_t *s, g1050_core_model_t *parms, in static void g1050_segment_model(g1050_segment_state_t *s, double delays[], int len) { int i; - int lose; + bool lose; int was_high_loss; double impulse; double slice_delay; @@ -805,7 +807,7 @@ static void g1050_segment_model(g1050_segment_state_t *s, double delays[], int l /* Compute delay and loss value for each time slice. */ for (i = 0; i < len; i++) { - lose = FALSE; + lose = false; /* Initialize delay to the serial delay plus some jitter. */ slice_delay = s->serial_delay + s->max_jitter*q1050_rand(); /* If no QoS, do congestion delay and packet loss analysis. */ @@ -826,14 +828,14 @@ static void g1050_segment_model(g1050_segment_state_t *s, double delays[], int l } if (was_high_loss && q1050_rand() < s->prob_packet_loss) - lose = TRUE; + lose = true; /* Single pole LPF for the congestion delay impulses. */ s->congestion_delay = s->congestion_delay*s->impulse_coeff + impulse*(1.0 - s->impulse_coeff); slice_delay += s->congestion_delay; } /* If duplex mismatch on LAN, packet loss based on loss probability. */ if (s->multiple_access && (q1050_rand() < s->prob_packet_collision_loss)) - lose = TRUE; + lose = true; /* Put computed delay into time slice array. */ if (lose) { @@ -851,12 +853,12 @@ static void g1050_segment_model(g1050_segment_state_t *s, double delays[], int l static void g1050_core_model(g1050_core_state_t *s, double delays[], int len) { int32_t i; - int lose; + bool lose; double jitter_delay; for (i = 0; i < len; i++) { - lose = FALSE; + lose = false; jitter_delay = s->base_delay + s->max_jitter*q1050_rand(); /* Route flapping */ if (--s->route_flap_counter <= 0) @@ -866,18 +868,18 @@ static void g1050_core_model(g1050_core_state_t *s, double delays[], int len) s->route_flap_counter = s->route_flap_interval; } if (q1050_rand() < s->prob_packet_loss) - lose = TRUE; + lose = true; /* Link failures */ if (--s->link_failure_counter <= 0) { /* We are in a link failure */ - lose = TRUE; + lose = true; if (--s->link_recovery_counter <= 0) { /* Leave failure state. */ s->link_failure_counter = s->link_failure_interval_ticks; s->link_recovery_counter = s->link_failure_duration_ticks; - lose = FALSE; + lose = false; } } if (lose) @@ -1056,23 +1058,23 @@ static void g1050_simulate_chunk(g1050_state_t *s) s->base_time += 1.0; - memcpy(&s->segment[0].delays[0], &s->segment[0].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[0].delays[0])); + memmove(&s->segment[0].delays[0], &s->segment[0].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[0].delays[0])); g1050_segment_model(&s->segment[0], &s->segment[0].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC); - memcpy(&s->segment[1].delays[0], &s->segment[1].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[1].delays[0])); + memmove(&s->segment[1].delays[0], &s->segment[1].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[1].delays[0])); g1050_segment_model(&s->segment[1], &s->segment[1].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC); - memcpy(&s->core.delays[0], &s->core.delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->core.delays[0])); + memmove(&s->core.delays[0], &s->core.delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->core.delays[0])); g1050_core_model(&s->core, &s->core.delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC); - memcpy(&s->segment[2].delays[0], &s->segment[2].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[2].delays[0])); + memmove(&s->segment[2].delays[0], &s->segment[2].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[2].delays[0])); g1050_segment_model(&s->segment[2], &s->segment[2].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC); - memcpy(&s->segment[3].delays[0], &s->segment[3].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[3].delays[0])); + memmove(&s->segment[3].delays[0], &s->segment[3].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[3].delays[0])); g1050_segment_model(&s->segment[3], &s->segment[3].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC); - memcpy(&s->arrival_times_1[0], &s->arrival_times_1[s->packet_rate], 2*s->packet_rate*sizeof(s->arrival_times_1[0])); - memcpy(&s->arrival_times_2[0], &s->arrival_times_2[s->packet_rate], 2*s->packet_rate*sizeof(s->arrival_times_2[0])); + memmove(&s->arrival_times_1[0], &s->arrival_times_1[s->packet_rate], 2*s->packet_rate*sizeof(s->arrival_times_1[0])); + memmove(&s->arrival_times_2[0], &s->arrival_times_2[s->packet_rate], 2*s->packet_rate*sizeof(s->arrival_times_2[0])); for (i = 0; i < s->packet_rate; i++) { s->arrival_times_1[2*s->packet_rate + i] = s->base_time + 2.0 + (double) i/(double) s->packet_rate; @@ -1126,7 +1128,7 @@ SPAN_DECLARE(g1050_state_t *) g1050_init(int model, &mo->sidea_lan, sp->sidea_lan_bit_rate, sp->sidea_lan_multiple_access, - FALSE, + false, packet_size, packet_rate); g1050_segment_init(&s->segment[1], @@ -1134,7 +1136,7 @@ SPAN_DECLARE(g1050_state_t *) g1050_init(int model, &constants->segment[1], &mo->sidea_access_link, sp->sidea_access_link_bit_rate_ab, - FALSE, + false, sp->sidea_access_link_qos_enabled, packet_size, packet_rate); @@ -1144,7 +1146,7 @@ SPAN_DECLARE(g1050_state_t *) g1050_init(int model, &constants->segment[2], &mo->sideb_access_link, sp->sideb_access_link_bit_rate_ba, - FALSE, + false, sp->sideb_access_link_qos_enabled, packet_size, packet_rate); @@ -1154,7 +1156,7 @@ SPAN_DECLARE(g1050_state_t *) g1050_init(int model, &mo->sideb_lan, sp->sideb_lan_bit_rate, sp->sideb_lan_multiple_access, - FALSE, + false, packet_size, packet_rate); @@ -1186,6 +1188,13 @@ SPAN_DECLARE(g1050_state_t *) g1050_init(int model, } /*- End of function --------------------------------------------------------*/ +SPAN_DECLARE(int) g1050_free(g1050_state_t *s) +{ + free(s); + return 0; +} +/*- End of function --------------------------------------------------------*/ + SPAN_DECLARE(void) g1050_dump_parms(int model, int speed_pattern) { g1050_channel_speeds_t *sp; diff --git a/libs/spandsp/spandsp-sim/line_model.c b/libs/spandsp/spandsp-sim/line_model.c index 4326ae7d29..9da1f15495 100644 --- a/libs/spandsp/spandsp-sim/line_model.c +++ b/libs/spandsp/spandsp-sim/line_model.c @@ -41,6 +41,11 @@ #define GEN_CONST #include #endif +#if defined(HAVE_STDBOOL_H) +#include +#else +#include "spandsp/stdbool.h" +#endif #include "floating_fudge.h" #define SPANDSP_EXPOSE_INTERNAL_STRUCTURES @@ -345,7 +350,7 @@ SPAN_DECLARE(void) one_way_line_model_set_mains_pickup(one_way_line_model_state_ if (f) { - tone_gen_descriptor_init(&mains_tone_desc, f, (int) (level - 10.0f), f*3, (int) level, 1, 0, 0, 0, TRUE); + tone_gen_descriptor_init(&mains_tone_desc, f, (int) (level - 10.0f), f*3, (int) level, 1, 0, 0, 0, true); tone_gen_init(&s->mains_tone, &mains_tone_desc); } s->mains_interference = f; @@ -454,9 +459,9 @@ SPAN_DECLARE(void) both_ways_line_model_set_mains_pickup(both_ways_line_model_st if (f) { - tone_gen_descriptor_init(&mains_tone_desc, f, (int) (level1 - 10.0f), f*3, (int) level1, 1, 0, 0, 0, TRUE); + tone_gen_descriptor_init(&mains_tone_desc, f, (int) (level1 - 10.0f), f*3, (int) level1, 1, 0, 0, 0, true); tone_gen_init(&s->line1.mains_tone, &mains_tone_desc); - tone_gen_descriptor_init(&mains_tone_desc, f, (int) (level2 - 10.0f), f*3, (int) level2, 1, 0, 0, 0, TRUE); + tone_gen_descriptor_init(&mains_tone_desc, f, (int) (level2 - 10.0f), f*3, (int) level2, 1, 0, 0, 0, true); tone_gen_init(&s->line2.mains_tone, &mains_tone_desc); } s->line1.mains_interference = f; @@ -494,8 +499,9 @@ SPAN_DECLARE(one_way_line_model_state_t *) one_way_line_model_init(int model, fl } /*- End of function --------------------------------------------------------*/ -SPAN_DECLARE(int) one_way_line_model_release(one_way_line_model_state_t *s) +SPAN_DECLARE(int) one_way_line_model_free(one_way_line_model_state_t *s) { + codec_munge_free(s->munge); free(s); return 0; } @@ -559,8 +565,10 @@ SPAN_DECLARE(both_ways_line_model_state_t *) both_ways_line_model_init(int model } /*- End of function --------------------------------------------------------*/ -SPAN_DECLARE(int) both_ways_line_model_release(both_ways_line_model_state_t *s) +SPAN_DECLARE(int) both_ways_line_model_free(both_ways_line_model_state_t *s) { + codec_munge_free(s->line1.munge); + codec_munge_free(s->line2.munge); free(s); return 0; } diff --git a/libs/spandsp/spandsp-sim/make_line_models.c b/libs/spandsp/spandsp-sim/make_line_models.c index ed7cfe934e..8c5e1f2b5b 100644 --- a/libs/spandsp/spandsp-sim/make_line_models.c +++ b/libs/spandsp/spandsp-sim/make_line_models.c @@ -40,17 +40,16 @@ #include #include #include -#include "floating_fudge.h" #if defined(HAVE_FFTW3_H) #include #else #include #endif -#if defined(HAVE_TGMATH_H) -#include -#endif -#if defined(HAVE_MATH_H) #include +#if defined(HAVE_STDBOOL_H) +#include +#else +#include "spandsp/stdbool.h" #endif #include "spandsp.h" diff --git a/libs/spandsp/spandsp-sim/rfc2198_sim.c b/libs/spandsp/spandsp-sim/rfc2198_sim.c index 6ecba89214..9e286b5dbd 100644 --- a/libs/spandsp/spandsp-sim/rfc2198_sim.c +++ b/libs/spandsp/spandsp-sim/rfc2198_sim.c @@ -41,6 +41,11 @@ #define GEN_CONST #include #endif +#if defined(HAVE_STDBOOL_H) +#include +#else +#include "spandsp/stdbool.h" +#endif #include "floating_fudge.h" #include "spandsp.h" @@ -49,9 +54,6 @@ #define PACKET_LOSS_TIME -1 -#define FALSE 0 -#define TRUE (!FALSE) - SPAN_DECLARE(rfc2198_sim_state_t *) rfc2198_sim_init(int model, int speed_pattern, int packet_size, @@ -70,6 +72,14 @@ SPAN_DECLARE(rfc2198_sim_state_t *) rfc2198_sim_init(int model, } /*- End of function --------------------------------------------------------*/ +SPAN_DECLARE(int) rfc2198_sim_free(rfc2198_sim_state_t *s) +{ + g1050_free(s->g1050); + free(s); + return 0; +} +/*- End of function --------------------------------------------------------*/ + SPAN_DECLARE(int) rfc2198_sim_put(rfc2198_sim_state_t *s, const uint8_t buf[], int len, diff --git a/libs/spandsp/spandsp-sim/spandsp/g1050.h b/libs/spandsp/spandsp-sim/spandsp/g1050.h index 687630e834..d9d62bc23c 100644 --- a/libs/spandsp/spandsp-sim/spandsp/g1050.h +++ b/libs/spandsp/spandsp-sim/spandsp/g1050.h @@ -272,6 +272,8 @@ SPAN_DECLARE(g1050_state_t *) g1050_init(int model, int packet_size, int packet_rate); +SPAN_DECLARE(int) g1050_free(g1050_state_t *s); + SPAN_DECLARE(void) g1050_dump_parms(int model, int speed_pattern); SPAN_DECLARE(int) g1050_put(g1050_state_t *s, diff --git a/libs/spandsp/spandsp-sim/spandsp/line_model.h b/libs/spandsp/spandsp-sim/spandsp/line_model.h index 8465d4b457..72fe4811c9 100644 --- a/libs/spandsp/spandsp-sim/spandsp/line_model.h +++ b/libs/spandsp/spandsp-sim/spandsp/line_model.h @@ -154,7 +154,7 @@ SPAN_DECLARE(both_ways_line_model_state_t *) both_ways_line_model_init(int model int codec, int rbs_pattern); -SPAN_DECLARE(int) both_ways_line_model_release(both_ways_line_model_state_t *s); +SPAN_DECLARE(int) both_ways_line_model_free(both_ways_line_model_state_t *s); SPAN_DECLARE(void) one_way_line_model(one_way_line_model_state_t *s, int16_t output[], @@ -167,7 +167,7 @@ SPAN_DECLARE(void) one_way_line_model_set_mains_pickup(one_way_line_model_state_ SPAN_DECLARE(one_way_line_model_state_t *) one_way_line_model_init(int model, float noise, int codec, int rbs_pattern); -SPAN_DECLARE(int) one_way_line_model_release(one_way_line_model_state_t *s); +SPAN_DECLARE(int) one_way_line_model_free(one_way_line_model_state_t *s); #ifdef __cplusplus } diff --git a/libs/spandsp/spandsp-sim/spandsp/rfc2198_sim.h b/libs/spandsp/spandsp-sim/spandsp/rfc2198_sim.h index a0c3d64b62..5aaa495ba1 100644 --- a/libs/spandsp/spandsp-sim/spandsp/rfc2198_sim.h +++ b/libs/spandsp/spandsp-sim/spandsp/rfc2198_sim.h @@ -73,6 +73,8 @@ SPAN_DECLARE(rfc2198_sim_state_t *) rfc2198_sim_init(int model, int packet_rate, int redundancy_depth); +SPAN_DECLARE(int) rfc2198_sim_free(rfc2198_sim_state_t *s); + SPAN_DECLARE(int) rfc2198_sim_put(rfc2198_sim_state_t *s, const uint8_t buf[], int len, diff --git a/libs/spandsp/spandsp-sim/spandsp/test_utils.h b/libs/spandsp/spandsp-sim/spandsp/test_utils.h index 6144f64d0e..407b800048 100644 --- a/libs/spandsp/spandsp-sim/spandsp/test_utils.h +++ b/libs/spandsp/spandsp-sim/spandsp/test_utils.h @@ -51,7 +51,7 @@ extern "C" { SPAN_DECLARE(complexify_state_t *) complexify_init(void); -SPAN_DECLARE(void) complexify_release(complexify_state_t *s); +SPAN_DECLARE(int) complexify_free(complexify_state_t *s); SPAN_DECLARE(complexf_t) complexify(complexify_state_t *s, int16_t amp); @@ -61,7 +61,7 @@ SPAN_DECLARE(void) ifft(complex_t data[], int len); SPAN_DECLARE(codec_munge_state_t *) codec_munge_init(int codec, int info); -SPAN_DECLARE(void) codec_munge_release(codec_munge_state_t *s); +SPAN_DECLARE(void) codec_munge_free(codec_munge_state_t *s); SPAN_DECLARE(void) codec_munge(codec_munge_state_t *s, int16_t amp[], int len); diff --git a/libs/spandsp/spandsp-sim/test_utils.c b/libs/spandsp/spandsp-sim/test_utils.c index d37c8977bb..69394702c0 100644 --- a/libs/spandsp/spandsp-sim/test_utils.c +++ b/libs/spandsp/spandsp-sim/test_utils.c @@ -39,6 +39,11 @@ #if defined(HAVE_MATH_H) #include #endif +#if defined(HAVE_STDBOOL_H) +#include +#else +#include "spandsp/stdbool.h" +#endif #include "floating_fudge.h" #include #include @@ -66,12 +71,14 @@ struct complexify_state_s }; static complex_t circle[MAX_FFT_LEN/2]; -static int circle_init = FALSE; +static int circle_init = false; static complex_t icircle[MAX_FFT_LEN/2]; -static int icircle_init = FALSE; +static int icircle_init = false; #define SF_MAX_HANDLE 32 -static int sf_close_at_exit_registered = FALSE; + +static int sf_close_at_exit_registered = false; + static SNDFILE *sf_close_at_exit_list[SF_MAX_HANDLE] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -95,9 +102,10 @@ SPAN_DECLARE(complexify_state_t *) complexify_init(void) } /*- End of function --------------------------------------------------------*/ -SPAN_DECLARE(void) complexify_release(complexify_state_t *s) +SPAN_DECLARE(int) complexify_free(complexify_state_t *s) { free(s); + return 0; } /*- End of function --------------------------------------------------------*/ @@ -243,7 +251,7 @@ SPAN_DECLARE(void) fft(complex_t data[], int len) x = -(2.0*3.1415926535*i)/(double) MAX_FFT_LEN; circle[i] = expj(x); } - circle_init = TRUE; + circle_init = true; } fftx(data, temp, len); } @@ -263,7 +271,7 @@ SPAN_DECLARE(void) ifft(complex_t data[], int len) x = (2.0*3.1415926535*i)/(double) MAX_FFT_LEN; icircle[i] = expj(x); } - icircle_init = TRUE; + icircle_init = true; } ifftx(data, temp, len); } @@ -308,7 +316,7 @@ SPAN_DECLARE(codec_munge_state_t *) codec_munge_init(int codec, int info) } /*- End of function --------------------------------------------------------*/ -SPAN_DECLARE(void) codec_munge_release(codec_munge_state_t *s) +SPAN_DECLARE(void) codec_munge_free(codec_munge_state_t *s) { free(s); } @@ -389,7 +397,7 @@ static int sf_record_handle(SNDFILE *handle) if (!sf_close_at_exit_registered) { atexit(sf_close_at_exit); - sf_close_at_exit_registered = TRUE; + sf_close_at_exit_registered = true; } return 0; } @@ -455,7 +463,6 @@ SPAN_DECLARE(int) sf_close_telephony(SNDFILE *handle) { if (sf_close_at_exit_list[i] == handle) { - sf_close(sf_close_at_exit_list[i]); sf_close_at_exit_list[i] = NULL; break; } diff --git a/libs/spandsp/src/bell_r2_mf.c b/libs/spandsp/src/bell_r2_mf.c index b8e507026e..41c11674b4 100644 --- a/libs/spandsp/src/bell_r2_mf.c +++ b/libs/spandsp/src/bell_r2_mf.c @@ -348,12 +348,14 @@ SPAN_DECLARE(bell_mf_tx_state_t *) bell_mf_tx_init(bell_mf_tx_state_t *s) SPAN_DECLARE(int) bell_mf_tx_release(bell_mf_tx_state_t *s) { + queue_release(&s->queue.queue); return 0; } /*- End of function --------------------------------------------------------*/ SPAN_DECLARE(int) bell_mf_tx_free(bell_mf_tx_state_t *s) { + queue_release(&s->queue.queue); span_free(s); return 0; } diff --git a/libs/spandsp/src/dtmf.c b/libs/spandsp/src/dtmf.c index 1f4e012dd3..fe235f45a1 100644 --- a/libs/spandsp/src/dtmf.c +++ b/libs/spandsp/src/dtmf.c @@ -597,12 +597,14 @@ SPAN_DECLARE(dtmf_tx_state_t *) dtmf_tx_init(dtmf_tx_state_t *s, SPAN_DECLARE(int) dtmf_tx_release(dtmf_tx_state_t *s) { + queue_release(&s->queue.queue); return 0; } /*- End of function --------------------------------------------------------*/ SPAN_DECLARE(int) dtmf_tx_free(dtmf_tx_state_t *s) { + queue_release(&s->queue.queue); span_free(s); return 0; } diff --git a/libs/spandsp/src/fax.c b/libs/spandsp/src/fax.c index 998af14177..ea6a1d523a 100644 --- a/libs/spandsp/src/fax.c +++ b/libs/spandsp/src/fax.c @@ -515,13 +515,14 @@ SPAN_DECLARE(fax_state_t *) fax_init(fax_state_t *s, int calling_party) SPAN_DECLARE(int) fax_release(fax_state_t *s) { t30_release(&s->t30); + v8_release(&s->v8); return 0; } /*- End of function --------------------------------------------------------*/ SPAN_DECLARE(int) fax_free(fax_state_t *s) { - t30_release(&s->t30); + fax_release(s); span_free(s); return 0; } diff --git a/libs/spandsp/src/image_translate.c b/libs/spandsp/src/image_translate.c index d337ee98a2..64a45d0495 100644 --- a/libs/spandsp/src/image_translate.c +++ b/libs/spandsp/src/image_translate.c @@ -546,7 +546,7 @@ static int floyd_steinberg_dither_row(image_translate_state_t *s, uint8_t buf[]) s->pixel_row[0][x - 1] = saturateu8(s->pixel_row[0][x - 1] + (7*quant_error)/16); s->pixel_row[1][x + 0] = saturateu8(s->pixel_row[1][x + 0] + (5*quant_error)/16); s->pixel_row[1][x - 1] = saturateu8(s->pixel_row[1][x - 1] + (1*quant_error)/16); - for ( ; x > 0; x--) + while (--x > 0) { old_pixel = s->pixel_row[0][x]; new_pixel = find_closest_palette_color(old_pixel); @@ -574,7 +574,7 @@ static int floyd_steinberg_dither_row(image_translate_state_t *s, uint8_t buf[]) s->pixel_row[0][x + 1] = saturateu8(s->pixel_row[0][x + 1] + (7*quant_error)/16); s->pixel_row[1][x + 0] = saturateu8(s->pixel_row[1][x + 0] + (5*quant_error)/16); s->pixel_row[1][x + 1] = saturateu8(s->pixel_row[1][x + 1] + (1*quant_error)/16); - for ( ; x < s->output_width - 1; x++) + while (++x < s->output_width - 1) { old_pixel = s->pixel_row[0][x]; new_pixel = find_closest_palette_color(old_pixel); @@ -772,10 +772,7 @@ SPAN_DECLARE(image_translate_state_t *) image_translate_init(image_translate_sta s->output_bytes_per_pixel = image_format_to_bytes_per_pixel(s->output_format); s->resize = (output_width > 0); - if (s->resize) - s->output_width = output_width; - else - s->output_width = s->input_width; + s->output_width = (s->resize) ? output_width : s->input_width; if (image_translate_restart(s, input_length)) return NULL; diff --git a/libs/spandsp/src/t30.c b/libs/spandsp/src/t30.c index 39c972a350..dadb9b50ef 100644 --- a/libs/spandsp/src/t30.c +++ b/libs/spandsp/src/t30.c @@ -3619,7 +3619,7 @@ static void process_state_f_doc_non_ecm(t30_state_t *s, const uint8_t *msg, int /* Treat this as a bad quality page. */ if (s->phase_d_handler) s->phase_d_handler(s->phase_d_user_data, fcf); - s->next_rx_step = msg[2] & 0xFE; + s->next_rx_step = fcf; queue_phase(s, T30_PHASE_D_TX); set_state(s, T30_STATE_III_Q_RTN); send_simple_frame(s, T30_RTN); @@ -3634,7 +3634,7 @@ static void process_state_f_doc_non_ecm(t30_state_t *s, const uint8_t *msg, int /* Treat this as a bad quality page. */ if (s->phase_d_handler) s->phase_d_handler(s->phase_d_user_data, fcf); - s->next_rx_step = msg[2] & 0xFE; + s->next_rx_step = fcf; /* Return to phase B */ queue_phase(s, T30_PHASE_B_TX); set_state(s, T30_STATE_III_Q_RTN); @@ -3649,7 +3649,7 @@ static void process_state_f_doc_non_ecm(t30_state_t *s, const uint8_t *msg, int /* Treat this as a bad quality page. */ if (s->phase_d_handler) s->phase_d_handler(s->phase_d_user_data, fcf); - s->next_rx_step = msg[2] & 0xFE; + s->next_rx_step = fcf; queue_phase(s, T30_PHASE_D_TX); set_state(s, T30_STATE_III_Q_RTN); send_simple_frame(s, T30_RTN); diff --git a/libs/spandsp/src/t31.c b/libs/spandsp/src/t31.c index ef8dcd16f6..ddc330694d 100644 --- a/libs/spandsp/src/t31.c +++ b/libs/spandsp/src/t31.c @@ -3045,6 +3045,8 @@ SPAN_DECLARE(t31_state_t *) t31_init(t31_state_t *s, s->modem = FAX_MODEM_NONE; s->at_state.transmit = true; + if (s->rx_queue) + queue_free(s->rx_queue); if ((s->rx_queue = queue_init(NULL, 4096, QUEUE_WRITE_ATOMIC | QUEUE_READ_ATOMIC)) == NULL) { if (alloced) @@ -3070,6 +3072,9 @@ SPAN_DECLARE(t31_state_t *) t31_init(t31_state_t *s, SPAN_DECLARE(int) t31_release(t31_state_t *s) { at_reset_call_info(&s->at_state); + v8_release(&s->audio.v8); + fax_modems_release(&s->audio.modems); + queue_free(s->rx_queue); return 0; } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/src/t4_tx.c b/libs/spandsp/src/t4_tx.c index c944f6d8b1..c273326fdb 100644 --- a/libs/spandsp/src/t4_tx.c +++ b/libs/spandsp/src/t4_tx.c @@ -1644,6 +1644,35 @@ SPAN_DECLARE(int) t4_tx_set_row_read_handler(t4_tx_state_t *s, t4_row_read_handl } /*- End of function --------------------------------------------------------*/ +static int release_encoder(t4_tx_state_t *s) +{ + switch (s->metadata.compression) + { + case T4_COMPRESSION_T4_1D: + case T4_COMPRESSION_T4_2D: + case T4_COMPRESSION_T6: + return t4_t6_encode_release(&s->encoder.t4_t6); + case T4_COMPRESSION_T85: + case T4_COMPRESSION_T85_L0: + return t85_encode_release(&s->encoder.t85); +#if defined(SPANDSP_SUPPORT_T88) + case T4_COMPRESSION_T88: + return t88_encode_release(&s->encoder.t88); +#endif + case T4_COMPRESSION_T42_T81: + case T4_COMPRESSION_SYCC_T81: + return t42_encode_release(&s->encoder.t42); + case T4_COMPRESSION_T43: + return t43_encode_release(&s->encoder.t43); +#if defined(SPANDSP_SUPPORT_T45) + case T4_COMPRESSION_T45: + return t45_encode_release(&s->encoder.t45); +#endif + } + return -1; +} +/*- End of function --------------------------------------------------------*/ + SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s, int supported_compressions, int supported_image_sizes, @@ -2002,6 +2031,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s, case T4_COMPRESSION_T6: break; default: + release_encoder(s); t4_t6_encode_init(&s->encoder.t4_t6, compression, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data); break; } @@ -2018,6 +2048,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s, case T4_COMPRESSION_T85_L0: break; default: + release_encoder(s); t85_encode_init(&s->encoder.t85, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data); break; } @@ -2046,6 +2077,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s, case T4_COMPRESSION_SYCC_T81: break; default: + release_encoder(s); t42_encode_init(&s->encoder.t42, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data); break; } @@ -2058,6 +2090,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s, case T4_COMPRESSION_T43: break; default: + release_encoder(s); t43_encode_init(&s->encoder.t43, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data); break; } @@ -2071,6 +2104,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_image_format(t4_tx_state_t *s, case T4_COMPRESSION_T45: break; default: + release_encoder(s); t45_encode_init(&s->encoder.t45, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data); break; } @@ -2603,30 +2637,7 @@ SPAN_DECLARE(int) t4_tx_release(t4_tx_state_t *s) span_free(s->colour_map); s->colour_map = NULL; } - switch (s->metadata.compression) - { - case T4_COMPRESSION_T4_1D: - case T4_COMPRESSION_T4_2D: - case T4_COMPRESSION_T6: - return t4_t6_encode_release(&s->encoder.t4_t6); - case T4_COMPRESSION_T85: - case T4_COMPRESSION_T85_L0: - return t85_encode_release(&s->encoder.t85); -#if defined(SPANDSP_SUPPORT_T88) - case T4_COMPRESSION_T88: - return t88_encode_release(&s->encoder.t88); -#endif - case T4_COMPRESSION_T42_T81: - case T4_COMPRESSION_SYCC_T81: - return t42_encode_release(&s->encoder.t42); - case T4_COMPRESSION_T43: - return t43_encode_release(&s->encoder.t43); -#if defined(SPANDSP_SUPPORT_T45) - case T4_COMPRESSION_T45: - return t45_encode_release(&s->encoder.t45); -#endif - } - return -1; + return release_encoder(s); } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/src/t85_decode.c b/libs/spandsp/src/t85_decode.c index a687961c02..2bc32e7212 100644 --- a/libs/spandsp/src/t85_decode.c +++ b/libs/spandsp/src/t85_decode.c @@ -853,6 +853,12 @@ SPAN_DECLARE(int) t85_decode_new_plane(t85_decode_state_t *s) } /*- End of function --------------------------------------------------------*/ +SPAN_DECLARE(logging_state_t *) t85_decode_get_logging_state(t85_decode_state_t *s) +{ + return &s->logging; +} +/*- End of function --------------------------------------------------------*/ + SPAN_DECLARE(int) t85_decode_restart(t85_decode_state_t *s) { s->xd = 0; @@ -888,12 +894,6 @@ SPAN_DECLARE(int) t85_decode_restart(t85_decode_state_t *s) } /*- End of function --------------------------------------------------------*/ -SPAN_DECLARE(logging_state_t *) t85_decode_get_logging_state(t85_decode_state_t *s) -{ - return &s->logging; -} -/*- End of function --------------------------------------------------------*/ - SPAN_DECLARE(t85_decode_state_t *) t85_decode_init(t85_decode_state_t *s, t4_row_write_handler_t handler, void *user_data) diff --git a/libs/spandsp/src/t85_encode.c b/libs/spandsp/src/t85_encode.c index ed4d1adaff..8c35c5465b 100644 --- a/libs/spandsp/src/t85_encode.c +++ b/libs/spandsp/src/t85_encode.c @@ -645,6 +645,12 @@ SPAN_DECLARE(int) t85_encode_set_row_read_handler(t85_encode_state_t *s, } /*- End of function --------------------------------------------------------*/ +SPAN_DECLARE(logging_state_t *) t85_encode_get_logging_state(t85_encode_state_t *s) +{ + return &s->logging; +} +/*- End of function --------------------------------------------------------*/ + SPAN_DECLARE(int) t85_encode_restart(t85_encode_state_t *s, uint32_t image_width, uint32_t image_length) { int bytes_per_row; @@ -681,12 +687,6 @@ SPAN_DECLARE(int) t85_encode_restart(t85_encode_state_t *s, uint32_t image_width } /*- End of function --------------------------------------------------------*/ -SPAN_DECLARE(logging_state_t *) t85_encode_get_logging_state(t85_encode_state_t *s) -{ - return &s->logging; -} -/*- End of function --------------------------------------------------------*/ - SPAN_DECLARE(t85_encode_state_t *) t85_encode_init(t85_encode_state_t *s, uint32_t image_width, uint32_t image_length, diff --git a/libs/spandsp/src/time_scale.c b/libs/spandsp/src/time_scale.c index 2378b4f1c8..6d0ae51071 100644 --- a/libs/spandsp/src/time_scale.c +++ b/libs/spandsp/src/time_scale.c @@ -220,7 +220,7 @@ SPAN_DECLARE(int) time_scale(time_scale_state_t *s, int16_t out[], int16_t in[], { memcpy(&out[out_len], s->buf, sizeof(int16_t)*s->lcp); out_len += s->lcp; - memcpy(s->buf, &s->buf[s->lcp], sizeof(int16_t)*(s->buf_len - s->lcp)); + memmove(s->buf, &s->buf[s->lcp], sizeof(int16_t)*(s->buf_len - s->lcp)); if (len - in_len < s->lcp) { /* Cannot continue without more samples */ diff --git a/libs/spandsp/src/v18.c b/libs/spandsp/src/v18.c index 0af5a6313a..3b72b296e1 100644 --- a/libs/spandsp/src/v18.c +++ b/libs/spandsp/src/v18.c @@ -1220,12 +1220,14 @@ SPAN_DECLARE(v18_state_t *) v18_init(v18_state_t *s, SPAN_DECLARE(int) v18_release(v18_state_t *s) { + queue_release(&s->queue.queue); return 0; } /*- End of function --------------------------------------------------------*/ SPAN_DECLARE(int) v18_free(v18_state_t *s) { + queue_release(&s->queue.queue); span_free(s); return 0; } diff --git a/libs/spandsp/src/v8.c b/libs/spandsp/src/v8.c index 5052e45d68..c9c2e3a144 100644 --- a/libs/spandsp/src/v8.c +++ b/libs/spandsp/src/v8.c @@ -1104,7 +1104,8 @@ SPAN_DECLARE(int) v8_restart(v8_state_t *s, bool calling_party, v8_parms_t *parm modem_connect_tones_tx_init(&s->ansam_tx, s->parms.modem_connect_tone); s->modem_connect_tone_tx_on = ms_to_samples(75) + 1; } - + if (s->tx_queue) + queue_free(s->tx_queue); if ((s->tx_queue = queue_init(NULL, 1024, 0)) == NULL) return -1; return 0; diff --git a/libs/spandsp/tests/ademco_contactid_tests.c b/libs/spandsp/tests/ademco_contactid_tests.c index 936fd557de..b1c9c4f42d 100644 --- a/libs/spandsp/tests/ademco_contactid_tests.c +++ b/libs/spandsp/tests/ademco_contactid_tests.c @@ -106,7 +106,7 @@ static int mitel_cm7291_side_2_and_bellcore_tests(void) /* The remainder of the Mitel tape is the talk-off test */ /* Here we use the Bellcore test tapes (much tougher), in six - files - 1 from each side of the original 3 cassette tapes */ + files - 1 from each side of the original 3 cassette tapes */ /* Bellcore say you should get no more than 470 false detections with a good receiver. Dialogic claim 20. Of course, we can do better than that, eh? */ @@ -135,6 +135,7 @@ static int mitel_cm7291_side_2_and_bellcore_tests(void) return -1; } printf(" Passed\n"); + ademco_contactid_sender_free(sender); return 0; } /*- End of function --------------------------------------------------------*/ @@ -254,6 +255,7 @@ static int end_to_end_tests(void) sf_writef_short(outhandle, sndfile_buf, SAMPLES_PER_CHUNK); } + codec_munge_free(munge); if (!rx_callback_reported) { fprintf(stderr, " Report not received\n"); @@ -266,6 +268,8 @@ static int end_to_end_tests(void) return -1; } printf(" Passed\n"); + ademco_contactid_sender_free(sender); + ademco_contactid_receiver_free(receiver); return 0; } /*- End of function --------------------------------------------------------*/ @@ -323,6 +327,8 @@ static int encode_decode_tests(void) printf("'%s'\n", buf); printf("\n"); printf(" Passed\n"); + ademco_contactid_sender_free(sender); + ademco_contactid_receiver_free(receiver); return 0; } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/tests/at_interpreter_tests.c b/libs/spandsp/tests/at_interpreter_tests.c index 6826e030db..d771afecf2 100644 --- a/libs/spandsp/tests/at_interpreter_tests.c +++ b/libs/spandsp/tests/at_interpreter_tests.c @@ -564,6 +564,7 @@ int main(int argc, char *argv[]) exit(2); } printf("Tests passed.\n"); + at_free(at_state); return 0; } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/tests/awgn_tests.c b/libs/spandsp/tests/awgn_tests.c index f5ba0c71ac..c105a9b243 100644 --- a/libs/spandsp/tests/awgn_tests.c +++ b/libs/spandsp/tests/awgn_tests.c @@ -75,7 +75,11 @@ int main(int argc, char *argv[]) clip_high = 0; clip_low = 0; total = 0.0; - noise_source = awgn_init_dbm0(NULL, idum, (float) j); + if ((noise_source = awgn_init_dbm0(NULL, idum, (float) j)) == NULL) + { + printf("Failed to allocation AWGN source\n"); + exit(2); + } total_samples = 1000000; for (i = 0; i < total_samples; i++) { @@ -99,6 +103,7 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + awgn_free(noise_source); } /* Now look at the statistical spread of the results, by collecting data in bins from a large number of samples. Use a fairly high noise level, but @@ -107,7 +112,11 @@ int main(int argc, char *argv[]) memset(bins, 0, sizeof(bins)); clip_high = 0; clip_low = 0; - awgn_init_dbm0(noise_source, idum, -15); + if ((noise_source = awgn_init_dbm0(NULL, idum, -15.0)) == NULL) + { + printf("Failed to allocation AWGN source\n"); + exit(2); + } total_samples = 10000000; for (i = 0; i < total_samples; i++) { @@ -134,7 +143,7 @@ int main(int argc, char *argv[]) /* Now send it out for graphing. */ printf("%6d %.7f %.7f\n", i - 32768, x, p); } - + awgn_free(noise_source); printf("Tests passed.\n"); return 0; } diff --git a/libs/spandsp/tests/bell_mf_rx_tests.c b/libs/spandsp/tests/bell_mf_rx_tests.c index 678c4f8e62..31fbd4068a 100644 --- a/libs/spandsp/tests/bell_mf_rx_tests.c +++ b/libs/spandsp/tests/bell_mf_rx_tests.c @@ -512,6 +512,7 @@ int main(int argc, char *argv[]) printf(" Failed\n"); exit(2); } + bell_mf_rx_free(mf_state); printf(" Passed\n"); /* The remainder of the Mitel tape is the talk-off test. This is @@ -540,6 +541,7 @@ int main(int argc, char *argv[]) printf(" Failed\n"); exit(2); } + bell_mf_rx_free(mf_state); printf(" Passed\n"); duration = time (NULL) - now; diff --git a/libs/spandsp/tests/bell_mf_tx_tests.c b/libs/spandsp/tests/bell_mf_tx_tests.c index 69f6c77a2d..6c88f985ff 100644 --- a/libs/spandsp/tests/bell_mf_tx_tests.c +++ b/libs/spandsp/tests/bell_mf_tx_tests.c @@ -157,6 +157,7 @@ int main(int argc, char *argv[]) fprintf(stderr, " Cannot close audio file '%s'\n", OUTPUT_FILE_NAME); exit (2); } + bell_mf_tx_free(gen); return 0; } diff --git a/libs/spandsp/tests/bert_tests.c b/libs/spandsp/tests/bert_tests.c index 5b6bb6151f..214815d6f2 100644 --- a/libs/spandsp/tests/bert_tests.c +++ b/libs/spandsp/tests/bert_tests.c @@ -97,9 +97,11 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); - bert_init(tx_bert, 0, BERT_PATTERN_ONES, 300, 20); - bert_init(rx_bert, 0, BERT_PATTERN_ONES, 300, 20); + tx_bert = bert_init(NULL, 0, BERT_PATTERN_ONES, 300, 20); + rx_bert = bert_init(NULL, 0, BERT_PATTERN_ONES, 300, 20); for (i = 0; i < 511*2; i++) { bit = bert_get_bit(tx_bert); @@ -112,6 +114,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_1_TO_7, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_1_TO_7, 300, 20); @@ -127,6 +131,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_1_TO_3, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_1_TO_3, 300, 20); @@ -142,6 +148,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_1_TO_1, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_1_TO_1, 300, 20); @@ -157,6 +165,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_3_TO_1, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_3_TO_1, 300, 20); @@ -172,6 +182,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_7_TO_1, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_7_TO_1, 300, 20); @@ -187,6 +199,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_ITU_O153_9, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_ITU_O153_9, 300, 20); @@ -231,6 +245,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_ITU_O152_11, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_ITU_O152_11, 300, 20); @@ -275,6 +291,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_ITU_O151_15, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_ITU_O151_15, 300, 20); @@ -319,6 +337,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_ITU_O151_20, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_ITU_O151_20, 300, 20); @@ -360,6 +380,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_ITU_O151_23, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_ITU_O151_23, 300, 20); @@ -401,6 +423,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); tx_bert = bert_init(NULL, 0, BERT_PATTERN_QBF, 300, 20); rx_bert = bert_init(NULL, 0, BERT_PATTERN_QBF, 300, 20); @@ -416,6 +440,8 @@ int main(int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + bert_free(tx_bert); + bert_free(rx_bert); /* Test the mechanism for categorising the error rate into <10^x bands */ /* TODO: The result of this test is not checked automatically */ @@ -447,6 +473,7 @@ int main(int argc, char *argv[]) // bert_put_bit(bert, bit); bert_put_bit(bert, bit); } + bert_free(bert); printf("Tests passed.\n"); return 0; diff --git a/libs/spandsp/tests/dc_restore_tests.c b/libs/spandsp/tests/dc_restore_tests.c index 6fae1458a7..0150aa02ad 100644 --- a/libs/spandsp/tests/dc_restore_tests.c +++ b/libs/spandsp/tests/dc_restore_tests.c @@ -84,6 +84,7 @@ int main (int argc, char *argv[]) printf("Test failed.\n"); exit(2); } + awgn_free(noise_source); printf("Test passed.\n"); return 0; } diff --git a/libs/spandsp/tests/dtmf_rx_tests.c b/libs/spandsp/tests/dtmf_rx_tests.c index 947f80589f..d0fa87a3b1 100644 --- a/libs/spandsp/tests/dtmf_rx_tests.c +++ b/libs/spandsp/tests/dtmf_rx_tests.c @@ -613,6 +613,7 @@ static void mitel_cm7291_side_1_tests(void) printf(" Failed\n"); exit(2); } + dtmf_rx_free(dtmf_state); printf(" Passed\n"); } /*- End of function --------------------------------------------------------*/ @@ -686,6 +687,7 @@ static void mitel_cm7291_side_2_and_bellcore_tests(void) exit(2); } printf(" Passed\n"); + dtmf_rx_free(dtmf_state); } /*- End of function --------------------------------------------------------*/ @@ -741,6 +743,7 @@ static void dial_tone_tolerance_tests(void) exit(2); } printf(" Passed\n"); + dtmf_rx_free(dtmf_state); } /*- End of function --------------------------------------------------------*/ @@ -817,6 +820,7 @@ static void callback_function_tests(void) printf(" Failed\n"); exit(2); } + dtmf_rx_free(dtmf_state); } /*- End of function --------------------------------------------------------*/ @@ -915,6 +919,7 @@ int main(int argc, char *argv[]) printf("Tests passed in %ds\n", duration); } + codec_munge_free(munge); return 0; } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/tests/dtmf_tx_tests.c b/libs/spandsp/tests/dtmf_tx_tests.c index 3f6f234ce7..1d0ad29178 100644 --- a/libs/spandsp/tests/dtmf_tx_tests.c +++ b/libs/spandsp/tests/dtmf_tx_tests.c @@ -211,6 +211,7 @@ int main(int argc, char *argv[]) fprintf(stderr, " Cannot close audio file '%s'\n", OUTPUT_FILE_NAME); exit(2); } + dtmf_tx_free(gen); return 0; } diff --git a/libs/spandsp/tests/fax_decode.c b/libs/spandsp/tests/fax_decode.c index 12cc11bb92..7b624bd6f8 100644 --- a/libs/spandsp/tests/fax_decode.c +++ b/libs/spandsp/tests/fax_decode.c @@ -356,7 +356,7 @@ static void v21_put_bit(void *user_data, int bit) } return; } - fprintf(stderr, "V.21 Rx bit %d - %d\n", rx_bits++, bit); + //fprintf(stderr, "V.21 Rx bit %d - %d\n", rx_bits++, bit); if (fast_trained == FAX_NONE) hdlc_rx_put_bit(&hdlcrx, bit); } diff --git a/libs/spandsp/tests/fax_tests.c b/libs/spandsp/tests/fax_tests.c index 96105edcae..9dbf6ce4e6 100644 --- a/libs/spandsp/tests/fax_tests.c +++ b/libs/spandsp/tests/fax_tests.c @@ -116,13 +116,14 @@ enum int mode[2] = {AUDIO_FAX, AUDIO_FAX}; -t30_state_t *t30_state[2]; -fax_state_t *fax_state[2]; -t38_gateway_state_t *t38_gateway_state[2]; -t38_terminal_state_t *t38_state[2]; -t38_core_state_t *t38_core_state[2]; -g1050_state_t *g1050_path[2]; -awgn_state_t *awgn_state[2]; +t30_state_t *t30_state[2] = {NULL, NULL}; +fax_state_t *fax_state[2] = {NULL, NULL}; +t38_gateway_state_t *t38_gateway_state[2] = {NULL, NULL}; +t38_terminal_state_t *t38_state[2] = {NULL, NULL}; +t38_core_state_t *t38_core_state[2] = {NULL, NULL}; +faxtester_state_t *faxtester[2] = {NULL, NULL}; +g1050_state_t *g1050_path[2] = {NULL, NULL}; +awgn_state_t *awgn_state[2] = {NULL, NULL}; int16_t audio_buffer[2*2][SAMPLES_PER_CHUNK]; int t38_subst_seq[2] = {0, 0}; @@ -1264,11 +1265,16 @@ int main(int argc, char *argv[]) break; } if (mode[i] == T38_TERMINAL_FAX) - t38_terminal_release(t38_state[i]); + t38_terminal_free(t38_state[i]); else - fax_release(fax_state[i]); + fax_free(fax_state[i]); if (mode[i] == T38_GATEWAY_FAX) - t38_gateway_release(t38_gateway_state[i]); + t38_gateway_free(t38_gateway_state[i]); + if (g1050_path[i]) + { + g1050_free(g1050_path[i]); + g1050_path[i] = NULL; + } } if (i < 2) { diff --git a/libs/spandsp/tests/fsk_tests.c b/libs/spandsp/tests/fsk_tests.c index db8a1335a7..1dc3e6cc12 100644 --- a/libs/spandsp/tests/fsk_tests.c +++ b/libs/spandsp/tests/fsk_tests.c @@ -296,6 +296,7 @@ int main(int argc, char *argv[]) fprintf(stderr, " Cannot close audio file '%s'\n", decode_test_file); exit(2); } + fsk_rx_free(caller_rx); } else { @@ -357,6 +358,7 @@ int main(int argc, char *argv[]) printf("Tests failed.\n"); exit(2); } + fsk_rx_free(caller_rx); printf("Test with BERT\n"); test_bps = preset_fsk_specs[modem_under_test_1].baud_rate; @@ -491,6 +493,7 @@ int main(int argc, char *argv[]) fsk_rx_set_modem_status_handler(caller_rx, rx_status, (void *) &caller_rx); } noise_level++; + both_ways_line_model_free(model); if ((model = both_ways_line_model_init(line_model_no, (float) noise_level, line_model_no, @@ -511,6 +514,19 @@ int main(int argc, char *argv[]) bert_set_report(&answerer_bert, 100000, reporter, (void *) (intptr_t) 2); } } + bert_release(&caller_bert); + bert_release(&answerer_bert); + if (modem_under_test_1 >= 0) + { + fsk_tx_free(caller_tx); + fsk_rx_free(answerer_rx); + } + if (modem_under_test_2 >= 0) + { + fsk_tx_free(answerer_tx); + fsk_rx_free(caller_rx); + } + both_ways_line_model_free(model); printf("Tests passed.\n"); } if (log_audio) diff --git a/libs/spandsp/tests/g1050_tests.c b/libs/spandsp/tests/g1050_tests.c index a7919e9575..397a2c6225 100644 --- a/libs/spandsp/tests/g1050_tests.c +++ b/libs/spandsp/tests/g1050_tests.c @@ -233,6 +233,8 @@ int main(int argc, char *argv[]) exit(2); } printf("%.3f%% of packets lost\n", 100.0*(packets_put - packets_really_put)/packets_put); + g1050_free(s); + free(packet_arrival_times); return 0; } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/tests/g168_tests.c b/libs/spandsp/tests/g168_tests.c index 41351496c6..6eb9d7b48f 100644 --- a/libs/spandsp/tests/g168_tests.c +++ b/libs/spandsp/tests/g168_tests.c @@ -309,6 +309,15 @@ int main(int argc, char *argv[]) printf("%d\n", css_c3[i]); signal_free(&local_css); signal_free(&far_css); + fir32_free(&line_model_d2); + fir32_free(&line_model_d3); + fir32_free(&line_model_d4); + fir32_free(&line_model_d5); + fir32_free(&line_model_d6); + fir32_free(&line_model_d7); + fir32_free(&line_model_d8); + fir32_free(&line_model_d9); + fir_float_free(&level_measurement_bp); return 0; } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/tests/g711_tests.c b/libs/spandsp/tests/g711_tests.c index c6ef2b1f78..9efb8ebaaa 100644 --- a/libs/spandsp/tests/g711_tests.c +++ b/libs/spandsp/tests/g711_tests.c @@ -314,9 +314,9 @@ static void compliance_tests(int log_audio) } } } - g711_release(enc_state); - g711_release(transcode); - g711_release(dec_state); + g711_free(enc_state); + g711_free(transcode); + g711_free(dec_state); if (log_audio) { diff --git a/libs/spandsp/tests/g722_tests.c b/libs/spandsp/tests/g722_tests.c index ac72e4c7b6..6a4251bb1b 100644 --- a/libs/spandsp/tests/g722_tests.c +++ b/libs/spandsp/tests/g722_tests.c @@ -278,6 +278,7 @@ static void itu_compliance_tests(void) exit(2); } printf("Test passed\n"); + g722_encode_free(enc_state); } #endif #if 1 @@ -346,6 +347,7 @@ static void itu_compliance_tests(void) exit(2); } printf("Test passed\n"); + g722_decode_free(dec_state); } } #endif @@ -403,6 +405,11 @@ static void signal_to_distortion_tests(void) printf("%10d, %10d, %f\n", in_level, out_level, (float) out_level/in_level); } while (len > 0); + swept_tone_free(swept); + g722_encode_free(enc_state); + g722_decode_free(dec_state); + power_meter_free(in_meter); + power_meter_free(out_meter); } /*- End of function --------------------------------------------------------*/ @@ -657,6 +664,7 @@ int main(int argc, char *argv[]) fprintf(stderr, " Cannot close audio file '%s'\n", IN_FILE_NAME); exit(2); } + g722_encode_free(enc_state); } else { @@ -669,6 +677,7 @@ int main(int argc, char *argv[]) fprintf(stderr, " Cannot close audio file '%s'\n", OUT_FILE_NAME); exit(2); } + g722_decode_free(dec_state); } else { diff --git a/libs/spandsp/tests/g726_tests.c b/libs/spandsp/tests/g726_tests.c index 0bba6e2fcc..75d1a542cd 100644 --- a/libs/spandsp/tests/g726_tests.c +++ b/libs/spandsp/tests/g726_tests.c @@ -1193,8 +1193,8 @@ static void itu_compliance_tests(void) int main(int argc, char *argv[]) { - g726_state_t enc_state; - g726_state_t dec_state; + g726_state_t *enc_state; + g726_state_t *dec_state; int opt; bool itutests; int bit_rate; @@ -1251,13 +1251,13 @@ int main(int argc, char *argv[]) } printf("ADPCM packing is %d\n", packing); - g726_init(&enc_state, bit_rate, G726_ENCODING_LINEAR, packing); - g726_init(&dec_state, bit_rate, G726_ENCODING_LINEAR, packing); + enc_state = g726_init(NULL, bit_rate, G726_ENCODING_LINEAR, packing); + dec_state = g726_init(NULL, bit_rate, G726_ENCODING_LINEAR, packing); while ((frames = sf_readf_short(inhandle, amp, 159))) { - adpcm = g726_encode(&enc_state, adpcmdata, amp, frames); - frames = g726_decode(&dec_state, amp, adpcmdata, adpcm); + adpcm = g726_encode(enc_state, adpcmdata, amp, frames); + frames = g726_decode(dec_state, amp, adpcmdata, adpcm); sf_writef_short(outhandle, amp, frames); } if (sf_close_telephony(inhandle)) @@ -1271,6 +1271,8 @@ int main(int argc, char *argv[]) exit(2); } printf("'%s' transcoded to '%s' at %dbps.\n", IN_FILE_NAME, OUT_FILE_NAME, bit_rate); + g726_free(enc_state); + g726_free(dec_state); } return 0; } diff --git a/libs/spandsp/tests/gsm0610_tests.c b/libs/spandsp/tests/gsm0610_tests.c index 346f574e99..06177fd9fd 100644 --- a/libs/spandsp/tests/gsm0610_tests.c +++ b/libs/spandsp/tests/gsm0610_tests.c @@ -321,7 +321,7 @@ static int perform_linear_test(int full, int disk, const char *name) mismatches++; } } - gsm0610_release(gsm0610_enc_state); + gsm0610_free(gsm0610_enc_state); if (mismatches) { printf("Test failed: %d of %d samples mismatch\n", mismatches, xxx); @@ -350,7 +350,7 @@ static int perform_linear_test(int full, int disk, const char *name) printf("Test failed: %d of %d samples mismatch\n", mismatches, vector_len); exit(2); } - gsm0610_release(gsm0610_dec_state); + gsm0610_free(gsm0610_dec_state); printf("Test passed\n"); return 0; } @@ -405,7 +405,7 @@ static int perform_law_test(int full, int law, const char *name) exit(2); } printf("Test passed\n"); - gsm0610_release(gsm0610_enc_state); + gsm0610_free(gsm0610_enc_state); } if ((gsm0610_dec_state = gsm0610_init(NULL, GSM0610_PACKING_NONE)) == NULL) @@ -438,7 +438,7 @@ static int perform_law_test(int full, int law, const char *name) printf("Test failed: %d of %d samples mismatch\n", mismatches, vector_len); exit(2); } - gsm0610_release(gsm0610_dec_state); + gsm0610_free(gsm0610_dec_state); printf("Test passed\n"); return 0; } @@ -613,8 +613,8 @@ int main(int argc, char *argv[]) fprintf(stderr, " Cannot close audio file '%s'\n", OUT_FILE_NAME); exit(2); } - gsm0610_release(gsm0610_enc_state); - gsm0610_release(gsm0610_dec_state); + gsm0610_free(gsm0610_enc_state); + gsm0610_free(gsm0610_dec_state); } return 0; } diff --git a/libs/spandsp/tests/ima_adpcm_tests.c b/libs/spandsp/tests/ima_adpcm_tests.c index e080330313..46645f09f0 100644 --- a/libs/spandsp/tests/ima_adpcm_tests.c +++ b/libs/spandsp/tests/ima_adpcm_tests.c @@ -187,8 +187,8 @@ int main(int argc, char *argv[]) fprintf(stderr, " Cannot close audio file '%s'\n", OUT_FILE_NAME); exit(2); } - ima_adpcm_release(ima_enc_state); - ima_adpcm_release(ima_dec_state); + ima_adpcm_free(ima_enc_state); + ima_adpcm_free(ima_dec_state); printf("Pre samples: %d\n", total_pre_samples); printf("Compressed bytes: %d\n", total_compressed_bytes); diff --git a/libs/spandsp/tests/image_translate_tests.c b/libs/spandsp/tests/image_translate_tests.c index 7b4fa9d3d3..9ec0691fbe 100644 --- a/libs/spandsp/tests/image_translate_tests.c +++ b/libs/spandsp/tests/image_translate_tests.c @@ -811,6 +811,8 @@ static void lenna_tests(int output_width, int output_length_scaling, const char TIFFWriteDirectory(out_file); TIFFClose(out_file); image_translate_free(s); + free(image); + free(image2); } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/tests/line_model_tests.c b/libs/spandsp/tests/line_model_tests.c index 8d31413cd4..b44f9771de 100644 --- a/libs/spandsp/tests/line_model_tests.c +++ b/libs/spandsp/tests/line_model_tests.c @@ -88,6 +88,8 @@ static void complexify_tests(void) out[2*i] = cc.re; out[2*i + 1] = cc.im; } + awgn_release(&noise1); + complexify_free(s); outframes = sf_writef_short(outhandle, out, 20000); if (outframes != 20000) { @@ -183,7 +185,7 @@ static void test_one_way_model(int line_model_no, int speech_test) fprintf(stderr, " Cannot close audio file '%s'\n", OUT_FILE_NAME1); exit(2); } - one_way_line_model_release(model); + one_way_line_model_free(model); } /*- End of function --------------------------------------------------------*/ @@ -302,7 +304,7 @@ static void test_both_ways_model(int line_model_no, int speech_test) fprintf(stderr, " Cannot close audio file '%s'\n", OUT_FILE_NAME2); exit(2); } - both_ways_line_model_release(model); + both_ways_line_model_free(model); } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/tests/logging_tests.c b/libs/spandsp/tests/logging_tests.c index 666fc1e9bb..2ba4bac9db 100644 --- a/libs/spandsp/tests/logging_tests.c +++ b/libs/spandsp/tests/logging_tests.c @@ -203,6 +203,8 @@ int main(int argc, char *argv[]) span_log_set_message_handler(log, &message_handler, NULL); + span_log_free(log); + printf("Tests passed.\n"); return 0; } diff --git a/libs/spandsp/tests/lpc10_tests.c b/libs/spandsp/tests/lpc10_tests.c index 0ecacfb847..a733659bc2 100644 --- a/libs/spandsp/tests/lpc10_tests.c +++ b/libs/spandsp/tests/lpc10_tests.c @@ -236,8 +236,8 @@ int main(int argc, char *argv[]) close(compress_file); if (decompress) close(decompress_file); - lpc10_encode_release(lpc10_enc_state); - lpc10_decode_release(lpc10_dec_state); + lpc10_encode_free(lpc10_enc_state); + lpc10_decode_free(lpc10_dec_state); if (!decompress) { diff --git a/libs/spandsp/tests/oki_adpcm_tests.c b/libs/spandsp/tests/oki_adpcm_tests.c index f41208239c..84604b69be 100644 --- a/libs/spandsp/tests/oki_adpcm_tests.c +++ b/libs/spandsp/tests/oki_adpcm_tests.c @@ -276,15 +276,15 @@ int main(int argc, char *argv[]) } - oki_adpcm_release(oki_enc_state); + oki_adpcm_free(oki_enc_state); if (sf_close_telephony(inhandle)) { fprintf(stderr, " Cannot close audio file '%s'\n", in_file_name); exit(2); } } - oki_adpcm_release(oki_dec_state); - oki_adpcm_release(oki_dec_state2); + oki_adpcm_free(oki_dec_state); + oki_adpcm_free(oki_dec_state2); if (sf_close_telephony(outhandle)) { fprintf(stderr, " Cannot close audio file '%s'\n", OUT_FILE_NAME); diff --git a/libs/spandsp/tests/power_meter_tests.c b/libs/spandsp/tests/power_meter_tests.c index 518fa3a694..59287b7d21 100644 --- a/libs/spandsp/tests/power_meter_tests.c +++ b/libs/spandsp/tests/power_meter_tests.c @@ -147,6 +147,8 @@ static int power_surge_detector_tests(void) exit(2); } printf("Min on %d, max on %d, min off %d, max off %d\n", extremes[0], extremes[1], extremes[2], extremes[3]); + power_surge_detector_free(sig); + awgn_free(awgnx); return 0; } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/tests/r2_mf_rx_tests.c b/libs/spandsp/tests/r2_mf_rx_tests.c index bc4c5b4840..da244336c5 100644 --- a/libs/spandsp/tests/r2_mf_rx_tests.c +++ b/libs/spandsp/tests/r2_mf_rx_tests.c @@ -181,6 +181,7 @@ static int my_mf_generate(int16_t amp[], char digit) { tone = tone_gen_init(NULL, &my_mf_digit_tones[cp - r2_mf_tone_codes]); len += tone_gen(tone, amp + len, 9999); + tone_gen_free(tone); } return len; } @@ -524,6 +525,7 @@ static int test_a_tone_set(int fwd) if (r2_mf_rx_get(mf_state) != digit) break; } + awgn_free(noise_source); if (j < 500) break; } @@ -541,7 +543,7 @@ static int test_a_tone_set(int fwd) printf("Test 8: Callback digit delivery mode.\n"); callback_ok = false; callback_roll = 0; - mf_state = r2_mf_rx_init(NULL, fwd, digit_delivery, (void *) 0x12345678); + mf_state = r2_mf_rx_init(mf_state, fwd, digit_delivery, (void *) 0x12345678); my_mf_gen_init(0.0, -3, 0.0, -3, 68, fwd); s = r2_mf_tone_codes; noise_source = awgn_init_dbm0(NULL, 1234567, -40.0f); @@ -560,6 +562,7 @@ static int test_a_tone_set(int fwd) codec_munge(amp, len); r2_mf_rx(mf_state, amp, len); } + awgn_free(noise_source); if (!callback_ok) { printf(" Failed\n"); @@ -567,6 +570,8 @@ static int test_a_tone_set(int fwd) } printf(" Passed\n"); + r2_mf_rx_free(mf_state); + /* The remainder of the Mitel tape is the talk-off test. This is meaningless for R2 MF. However the decoder's tolerance of out of band noise is significant. */ diff --git a/libs/spandsp/tests/rfc2198_sim_tests.c b/libs/spandsp/tests/rfc2198_sim_tests.c index 95d8f6b971..fe210a2555 100644 --- a/libs/spandsp/tests/rfc2198_sim_tests.c +++ b/libs/spandsp/tests/rfc2198_sim_tests.c @@ -229,6 +229,10 @@ int main(int argc, char *argv[]) fclose(out_file); + rfc2198_sim_free(s); + + free(packet_arrival_times); + printf("Put %d packets. Really put %d packets. Got %d packets.\n", packets_put, packets_really_put, packets_got); printf("%d OOS packets, %d missing packets\n", oos_packets_got, missing_packets_got - oos_packets_got); printf("%d packets queued, %d received\n", packets_really_put, packets_got); diff --git a/libs/spandsp/tests/sig_tone_tests.c b/libs/spandsp/tests/sig_tone_tests.c index 00af89eeba..61f93ccb0e 100644 --- a/libs/spandsp/tests/sig_tone_tests.c +++ b/libs/spandsp/tests/sig_tone_tests.c @@ -648,6 +648,8 @@ int main(int argc, char *argv[]) speech_immunity_tests(&rx_state); level_and_ratio_tests(&rx_state, fc); sequence_tests(&tx_state, &rx_state, munge); + if (munge) + codec_munge_free(munge); } /*endfor*/ diff --git a/libs/spandsp/tests/swept_tone_tests.c b/libs/spandsp/tests/swept_tone_tests.c index aebc54a409..8fef132295 100644 --- a/libs/spandsp/tests/swept_tone_tests.c +++ b/libs/spandsp/tests/swept_tone_tests.c @@ -92,6 +92,10 @@ int main(int argc, char *argv[]) exit(2); } + swept_tone_free(s); + + power_meter_release(&meter); + printf("Tests passed.\n"); return 0; } diff --git a/libs/spandsp/tests/t31_tests.c b/libs/spandsp/tests/t31_tests.c index d9356296e9..beff7f9cce 100644 --- a/libs/spandsp/tests/t31_tests.c +++ b/libs/spandsp/tests/t31_tests.c @@ -852,8 +852,13 @@ static int t30_tests(int t38_mode, int use_gui, int log_audio, int test_sending, span_log_bump_samples(at_get_logging_state(t31_get_at_state(t31_state)), SAMPLES_PER_CHUNK); } + g1050_free(path_a_to_b); + g1050_free(path_b_to_a); if (t38_mode) - t38_terminal_release(t38_state); + t38_terminal_free(t38_state); + else + fax_free(fax_state); + t31_free(t31_state); if (decode_test_file) { diff --git a/libs/spandsp/tests/t38_non_ecm_buffer_tests.c b/libs/spandsp/tests/t38_non_ecm_buffer_tests.c index 9b4cb4039c..4ed2bcf7d2 100644 --- a/libs/spandsp/tests/t38_non_ecm_buffer_tests.c +++ b/libs/spandsp/tests/t38_non_ecm_buffer_tests.c @@ -168,6 +168,7 @@ int main(int argc, char *argv[]) printf(" Done\n"); t38_non_ecm_buffer_report_input_status(&buffer, &logging); t38_non_ecm_buffer_report_output_status(&buffer, &logging); + t38_non_ecm_buffer_release(&buffer); printf("2 - Impose no minimum for the bits per row, different alignment\n"); t38_non_ecm_buffer_init(&buffer, true, 0); @@ -233,6 +234,7 @@ int main(int argc, char *argv[]) } t38_non_ecm_buffer_report_input_status(&buffer, &logging); t38_non_ecm_buffer_report_output_status(&buffer, &logging); + t38_non_ecm_buffer_release(&buffer); printf("3 - Demand a fairly high minimum for the bits per row\n"); t38_non_ecm_buffer_init(&buffer, true, 400); @@ -298,6 +300,7 @@ int main(int argc, char *argv[]) } t38_non_ecm_buffer_report_input_status(&buffer, &logging); t38_non_ecm_buffer_report_output_status(&buffer, &logging); + t38_non_ecm_buffer_release(&buffer); printf("4 - Take some time to get to the first row of the image, output ahead\n"); t38_non_ecm_buffer_init(&buffer, true, 400); @@ -446,6 +449,7 @@ int main(int argc, char *argv[]) printf(" RTC output OK\n"); t38_non_ecm_buffer_report_input_status(&buffer, &logging); t38_non_ecm_buffer_report_output_status(&buffer, &logging); + t38_non_ecm_buffer_release(&buffer); printf("5 - Take some time to get to the first row of the image, output behind\n"); t38_non_ecm_buffer_init(&buffer, true, 400); @@ -583,6 +587,7 @@ int main(int argc, char *argv[]) printf(" RTC output OK\n"); t38_non_ecm_buffer_report_input_status(&buffer, &logging); t38_non_ecm_buffer_report_output_status(&buffer, &logging); + t38_non_ecm_buffer_release(&buffer); printf("6 - TCF without leading ones\n"); t38_non_ecm_buffer_init(&buffer, false, 400); @@ -628,6 +633,7 @@ int main(int argc, char *argv[]) printf(" End of data seen OK\n"); t38_non_ecm_buffer_report_input_status(&buffer, &logging); t38_non_ecm_buffer_report_output_status(&buffer, &logging); + t38_non_ecm_buffer_release(&buffer); printf("7 - TCF with leading ones\n"); t38_non_ecm_buffer_init(&buffer, false, 400); @@ -695,6 +701,7 @@ int main(int argc, char *argv[]) printf(" End of data seen OK\n"); t38_non_ecm_buffer_report_input_status(&buffer, &logging); t38_non_ecm_buffer_report_output_status(&buffer, &logging); + t38_non_ecm_buffer_release(&buffer); printf("Tests passed\n"); return 0; diff --git a/libs/spandsp/tests/t42_tests.c b/libs/spandsp/tests/t42_tests.c index bfdaf80b8e..d9f80da5b5 100644 --- a/libs/spandsp/tests/t42_tests.c +++ b/libs/spandsp/tests/t42_tests.c @@ -287,7 +287,11 @@ int main(int argc, char *argv[]) for (i = 0, total_image_len = 0; i < nstrips; i++) total_image_len += TIFFRawStripSize(tif, i); - data = malloc(total_image_len); + if ((data = malloc(total_image_len)) == NULL) + { + printf("Failed to allocate buffer\n"); + exit(2); + } for (i = 0, total_len = 0; i < nstrips; i++, total_len += len) { if ((len = TIFFReadRawStrip(tif, i, &data[total_len], total_image_len - total_len)) < 0) @@ -439,7 +443,11 @@ int main(int argc, char *argv[]) printf("total %d\n", totdata); /* Read the image into memory. */ - data = malloc(totdata); + if ((data = malloc(totdata)) == NULL) + { + printf("Failed to allocate buffer\n"); + exit(2); + } off = 0; for (row = 0; row < h; row++) { @@ -561,7 +569,11 @@ int main(int argc, char *argv[]) } free(data); #else - data2 = malloc(totdata); + if ((data2 = malloc(totdata)) == NULL) + { + printf("Failed to allocate buffer\n"); + exit(2); + } start = rdtscll(); //if (!t42_itulab_jpeg_to_srgb(logging, &lab_param, data2, &off, data, off, &w, &h, &samples_per_pixel)) { diff --git a/libs/spandsp/tests/t43_tests.c b/libs/spandsp/tests/t43_tests.c index bc9242d044..3df17ea7f2 100644 --- a/libs/spandsp/tests/t43_tests.c +++ b/libs/spandsp/tests/t43_tests.c @@ -486,8 +486,7 @@ int read_file(meta_t *meta, int page) if (TIFFGetField(tif, TIFFTAG_COLORMAP, &map_L, &map_a, &map_b, &map_z)) { entries = 1 << meta->bits_per_sample; - meta->colour_map = malloc(3*entries); - if (meta->colour_map) + if ((meta->colour_map = malloc(3*entries))) { #if 0 /* Sweep the colormap in the proper order */ @@ -1349,7 +1348,11 @@ int main(int argc, char *argv[]) free(data); data = data2; #elif 1 - data2 = malloc(totdata); + if ((data2 = malloc(totdata)) == NULL) + { + printf("Failed to allocate buffer\n"); + exit(2); + } start = rdtscll(); //if (!t42_itulab_jpeg_to_srgb(&logging2, &lab_param, data2, &off, data, off, &meta.image_width, &meta.image_length, &meta.samples_per_pixel)) { diff --git a/libs/spandsp/tests/t4_t6_tests.c b/libs/spandsp/tests/t4_t6_tests.c index 0e583ab059..476f737530 100644 --- a/libs/spandsp/tests/t4_t6_tests.c +++ b/libs/spandsp/tests/t4_t6_tests.c @@ -412,8 +412,8 @@ int main(int argc, char *argv[]) if (compression_step < 0) break; } - t4_t6_encode_release(send_state); - t4_t6_decode_release(receive_state); + t4_t6_encode_free(send_state); + t4_t6_decode_free(receive_state); #endif printf("Tests passed\n"); return 0; diff --git a/libs/spandsp/tests/t4_tests.c b/libs/spandsp/tests/t4_tests.c index 98a57cfe54..4599e0c449 100644 --- a/libs/spandsp/tests/t4_tests.c +++ b/libs/spandsp/tests/t4_tests.c @@ -454,7 +454,7 @@ int main(int argc, char *argv[]) dump_image_as_xxx(receive_state); t4_rx_end_page(receive_state); display_page_stats(receive_state); - t4_rx_release(receive_state); + t4_rx_free(receive_state); } else { @@ -621,8 +621,8 @@ int main(int argc, char *argv[]) t4_rx_end_page(receive_state); sends++; } - t4_tx_release(send_state); - t4_rx_release(receive_state); + t4_tx_free(send_state); + t4_rx_free(receive_state); /* And we should now have a matching received TIFF file. Note this will only match at the image level. TIFF files allow a lot of ways to express the same thing, so bit matching of the files is not the normal case. */ diff --git a/libs/spandsp/tests/t81_t82_arith_coding_tests.c b/libs/spandsp/tests/t81_t82_arith_coding_tests.c index 8de5749928..84a61a5df1 100644 --- a/libs/spandsp/tests/t81_t82_arith_coding_tests.c +++ b/libs/spandsp/tests/t81_t82_arith_coding_tests.c @@ -225,7 +225,8 @@ int main(int argc, char *argv[]) exit(2); } printf("Test passed\n"); - + t81_t82_arith_encode_free(se); + t81_t82_arith_encode_free(sd); printf("Tests passed\n"); return 0; } diff --git a/libs/spandsp/tests/t85_tests.c b/libs/spandsp/tests/t85_tests.c index 8acca038c5..338fe30caf 100644 --- a/libs/spandsp/tests/t85_tests.c +++ b/libs/spandsp/tests/t85_tests.c @@ -228,7 +228,6 @@ static int test_cycle(const char *test_id, if (comment && testbuf_len == 1000) t85_encode_comment(t85_enc, comment, strlen((const char *) comment) + 1); } - t85_encode_release(t85_enc); printf("Encoded BIE has %lu bytes\n", (unsigned long int) testbuf_len); if (correct_length > 0) { @@ -241,6 +240,9 @@ static int test_cycle(const char *test_id, printf("Test passed\n"); } + cnt_a = t85_encode_get_compressed_image_size(t85_enc); + t85_encode_free(t85_enc); + printf("%s.2: Decode in one big chunk\n", test_id); if ((decoded_image = (uint8_t *) malloc(image_size)) == NULL) { @@ -254,7 +256,6 @@ static int test_cycle(const char *test_id, result = t85_decode_put(t85_dec, testbuf, testbuf_len); if (result == T4_DECODE_MORE_DATA) result = t85_decode_put(t85_dec, NULL, 0); - cnt_a = t85_encode_get_compressed_image_size(t85_enc); cnt_b = t85_decode_get_compressed_image_size(t85_dec); if (cnt_a != cnt_b || cnt_a != testbuf_len*8 || result != T4_DECODE_OK) { @@ -274,7 +275,7 @@ static int test_cycle(const char *test_id, exit(2); } free(decoded_image); - t85_decode_release(t85_dec); + t85_decode_free(t85_dec); printf("Test passed\n"); printf("%s.3: Decode byte by byte\n", test_id); @@ -316,7 +317,7 @@ static int test_cycle(const char *test_id, exit(2); } free(decoded_image); - t85_decode_release(t85_dec); + t85_decode_free(t85_dec); printf("Test passed\n"); return 0; diff --git a/libs/spandsp/tests/time_scale_tests.c b/libs/spandsp/tests/time_scale_tests.c index 3400b5f9b2..abd5300fdf 100644 --- a/libs/spandsp/tests/time_scale_tests.c +++ b/libs/spandsp/tests/time_scale_tests.c @@ -94,6 +94,7 @@ int main(int argc, char *argv[]) break; } } + memset(&info, 0, sizeof(info)); if ((inhandle = sf_open(in_file_name, SFM_READ, &info)) == NULL) { printf(" Cannot open audio file '%s'\n", in_file_name); @@ -151,6 +152,7 @@ int main(int argc, char *argv[]) count = 0; } } + time_scale_release(&state); if (sf_close(inhandle)) { printf(" Cannot close audio file '%s'\n", in_file_name); diff --git a/libs/spandsp/tests/tone_detect_tests.c b/libs/spandsp/tests/tone_detect_tests.c index fd62c932b9..016e0096e3 100644 --- a/libs/spandsp/tests/tone_detect_tests.c +++ b/libs/spandsp/tests/tone_detect_tests.c @@ -122,6 +122,8 @@ static int periodogram_tests(void) return -1; } } + awgn_free(noise_source_re); + awgn_free(noise_source_im); } return 0; } diff --git a/libs/spandsp/tests/tone_generate_tests.c b/libs/spandsp/tests/tone_generate_tests.c index 6f1f8af4ea..ffa87eb3ad 100644 --- a/libs/spandsp/tests/tone_generate_tests.c +++ b/libs/spandsp/tests/tone_generate_tests.c @@ -70,7 +70,6 @@ int main(int argc, char *argv[]) 400, false); tone_gen_init(&tone_state, &tone_desc); - for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); @@ -79,6 +78,7 @@ int main(int argc, char *argv[]) break; sf_writef_short(outhandle, amp, len); } + tone_gen_release(&tone_state); /* Try a different tone pair */ tone_gen_descriptor_init(&tone_desc, @@ -92,7 +92,6 @@ int main(int argc, char *argv[]) 100, true); tone_gen_init(&tone_state, &tone_desc); - for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); @@ -101,6 +100,7 @@ int main(int argc, char *argv[]) break; sf_writef_short(outhandle, amp, len); } + tone_gen_release(&tone_state); /* Try a different tone pair */ tone_gen_descriptor_init(&tone_desc, @@ -114,7 +114,6 @@ int main(int argc, char *argv[]) 400, true); tone_gen_init(&tone_state, &tone_desc); - for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); @@ -123,6 +122,7 @@ int main(int argc, char *argv[]) break; sf_writef_short(outhandle, amp, len); } + tone_gen_release(&tone_state); /* Try a single tone */ tone_gen_descriptor_init(&tone_desc, @@ -136,7 +136,6 @@ int main(int argc, char *argv[]) 400, true); tone_gen_init(&tone_state, &tone_desc); - for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); @@ -145,6 +144,7 @@ int main(int argc, char *argv[]) break; sf_writef_short(outhandle, amp, len); } + tone_gen_release(&tone_state); /* Try a single non-repeating tone */ tone_gen_descriptor_init(&tone_desc, @@ -158,7 +158,6 @@ int main(int argc, char *argv[]) 0, false); tone_gen_init(&tone_state, &tone_desc); - for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); @@ -167,6 +166,7 @@ int main(int argc, char *argv[]) break; sf_writef_short(outhandle, amp, len); } + tone_gen_release(&tone_state); /* Try a single non-repeating tone at 0dBm0 */ tone_gen_descriptor_init(&tone_desc, @@ -180,7 +180,6 @@ int main(int argc, char *argv[]) 0, false); tone_gen_init(&tone_state, &tone_desc); - for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); @@ -189,6 +188,7 @@ int main(int argc, char *argv[]) break; sf_writef_short(outhandle, amp, len); } + tone_gen_release(&tone_state); /* Try an AM modulated tone at a modest modulation level (25%) */ tone_gen_descriptor_init(&tone_desc, @@ -202,7 +202,6 @@ int main(int argc, char *argv[]) 400, true); tone_gen_init(&tone_state, &tone_desc); - for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); @@ -211,6 +210,7 @@ int main(int argc, char *argv[]) break; sf_writef_short(outhandle, amp, len); } + tone_gen_release(&tone_state); /* Try an AM modulated tone at maximum modulation level (100%) */ tone_gen_descriptor_init(&tone_desc, @@ -224,7 +224,6 @@ int main(int argc, char *argv[]) 400, true); tone_gen_init(&tone_state, &tone_desc); - for (i = 0; i < 1000; i++) { len = tone_gen(&tone_state, amp, 160); @@ -233,6 +232,7 @@ int main(int argc, char *argv[]) break; sf_writef_short(outhandle, amp, len); } + tone_gen_release(&tone_state); if (sf_close_telephony(outhandle)) { diff --git a/libs/spandsp/tests/tsb85_tests.c b/libs/spandsp/tests/tsb85_tests.c index f383eb8f47..a7c02a6b86 100644 --- a/libs/spandsp/tests/tsb85_tests.c +++ b/libs/spandsp/tests/tsb85_tests.c @@ -94,6 +94,8 @@ char next_tx_file[1000]; static int next_step(faxtester_state_t *s); +static bool test_for_call_drop = false; + static int phase_b_handler(void *user_data, int result) { int ch; @@ -641,6 +643,7 @@ static int next_step(faxtester_state_t *s) t4_tx_state_t t4_tx_state; t30_state_t *t30; + test_for_call_drop = false; if (s->cur == NULL) { if (!s->final_delayed) @@ -798,6 +801,11 @@ static int next_step(faxtester_state_t *s) { faxtest_set_rx_silence(s); } + else if (strcasecmp((const char *) type, "DROPCALL") == 0) + { + span_log(&s->logging, SPAN_LOG_FLOW, "Far end should drop the call\n"); + test_for_call_drop = true; + } else { span_log(&s->logging, SPAN_LOG_FLOW, "Unrecognised type '%s'\n", (const char *) type); @@ -1109,6 +1117,11 @@ static int next_step(faxtester_state_t *s) span_log(&s->logging, SPAN_LOG_FLOW, "ECM image is %d bytes (min row bits %d)\n", len, min_row_bits); faxtester_set_ecm_image_buffer(s, image, len, ecm_block, ecm_frame_size, i); } + else if (strcasecmp((const char *) type, "DROPCALL") == 0) + { + span_log(&s->logging, SPAN_LOG_FLOW, "Time to drop the call\n"); + return 0; + } else { span_log(&s->logging, SPAN_LOG_FLOW, "Unrecognised type '%s'\n", (const char *) type); @@ -1198,6 +1211,16 @@ static void exchange(faxtester_state_t *s) /*endif*/ } /*endif*/ + if (test_for_call_drop) + { + if (!t30_call_active(fax_get_t30_state(fax))) + { + printf("Call dropped\n"); + //break; + } + /*endif*/ + } + /*endif*/ } /*endfor*/ if (log_audio) @@ -1391,6 +1414,7 @@ int main(int argc, char *argv[]) span_log_set_level(&state.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME | SPAN_LOG_FLOW); span_log_set_tag(&state.logging, "B"); get_test_set(&state, xml_file_name, test_name); + faxtester_release(&state); printf("Done\n"); return 0; } diff --git a/libs/spandsp/tests/v17_tests.c b/libs/spandsp/tests/v17_tests.c index 8ceb12060e..4ef9f7306f 100644 --- a/libs/spandsp/tests/v17_tests.c +++ b/libs/spandsp/tests/v17_tests.c @@ -535,7 +535,7 @@ int main(int argc, char *argv[]) //rx.eq_put_step = rand()%(192*10/3); bert_init(&bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&bert, 10000, reporter, NULL); - one_way_line_model_release(line_model); + one_way_line_model_free(line_model); if ((line_model = one_way_line_model_init(line_model_no, (float) noise_level, channel_codec, 0)) == NULL) { fprintf(stderr, " Failed to create line model\n"); @@ -565,7 +565,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "At completion:\n"); fprintf(stderr, "Final result %ddBm0/%ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, noise_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); fprintf(stderr, "Last report %ddBm0/%ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, noise_level, latest_results.total_bits, latest_results.bad_bits, latest_results.resyncs); - one_way_line_model_release(line_model); + one_way_line_model_free(line_model); if (signal_level > -43) { @@ -575,6 +575,9 @@ int main(int argc, char *argv[]) printf("Tests passed.\n"); } + v17_rx_free(rx); + if (tx) + v17_tx_free(tx); #if defined(ENABLE_GUI) if (use_gui) qam_wait_to_end(qam_monitor); diff --git a/libs/spandsp/tests/v22bis_tests.c b/libs/spandsp/tests/v22bis_tests.c index 3729687c35..d42b2f4f4d 100644 --- a/libs/spandsp/tests/v22bis_tests.c +++ b/libs/spandsp/tests/v22bis_tests.c @@ -455,6 +455,7 @@ int main(int argc, char *argv[]) } } } + both_ways_line_model_free(model); #if defined(ENABLE_GUI) if (use_gui) qam_wait_to_end(endpoint[0].qam_monitor); diff --git a/libs/spandsp/tests/v27ter_tests.c b/libs/spandsp/tests/v27ter_tests.c index 671fd935af..edac945aa3 100644 --- a/libs/spandsp/tests/v27ter_tests.c +++ b/libs/spandsp/tests/v27ter_tests.c @@ -540,7 +540,7 @@ int main(int argc, char *argv[]) v27ter_rx_restart(rx, test_bps, false); bert_init(&bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&bert, 10000, reporter, NULL); - one_way_line_model_release(line_model); + one_way_line_model_free(line_model); if ((line_model = one_way_line_model_init(line_model_no, (float) noise_level, channel_codec, 0)) == NULL) { fprintf(stderr, " Failed to create line model\n"); @@ -571,7 +571,8 @@ int main(int argc, char *argv[]) fprintf(stderr, "At completion:\n"); fprintf(stderr, "Final result %ddBm0/%ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, noise_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); fprintf(stderr, "Last report %ddBm0/%ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, noise_level, latest_results.total_bits, latest_results.bad_bits, latest_results.resyncs); - one_way_line_model_release(line_model); + one_way_line_model_free(line_model); + if (signal_level > -43) { printf("Tests failed.\n"); @@ -580,6 +581,10 @@ int main(int argc, char *argv[]) printf("Tests passed.\n"); } + v27ter_rx_free(rx); + if (tx) + v27ter_tx_free(tx); + bert_release(&bert); #if defined(ENABLE_GUI) if (use_gui) qam_wait_to_end(qam_monitor); diff --git a/libs/spandsp/tests/v29_tests.c b/libs/spandsp/tests/v29_tests.c index ec678c148a..946170cb5d 100644 --- a/libs/spandsp/tests/v29_tests.c +++ b/libs/spandsp/tests/v29_tests.c @@ -520,7 +520,7 @@ int main(int argc, char *argv[]) #endif bert_init(&bert, bits_per_test, BERT_PATTERN_ITU_O152_11, test_bps, 20); bert_set_report(&bert, 10000, reporter, NULL); - one_way_line_model_release(line_model); + one_way_line_model_free(line_model); if ((line_model = one_way_line_model_init(line_model_no, (float) noise_level, channel_codec, 0)) == NULL) { fprintf(stderr, " Failed to create line model\n"); @@ -550,7 +550,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "At completion:\n"); fprintf(stderr, "Final result %ddBm0/%ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, noise_level, bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); fprintf(stderr, "Last report %ddBm0/%ddBm0, %d bits, %d bad bits, %d resyncs\n", signal_level, noise_level, latest_results.total_bits, latest_results.bad_bits, latest_results.resyncs); - one_way_line_model_release(line_model); + one_way_line_model_free(line_model); if (signal_level > -43) { @@ -560,6 +560,10 @@ int main(int argc, char *argv[]) printf("Tests passed.\n"); } + v29_rx_free(rx); + if (tx) + v29_tx_free(tx); + bert_release(&bert); #if defined(ENABLE_GUI) if (use_gui) qam_wait_to_end(qam_monitor);