cannam@126: /* cannam@126: ** Copyright (c) 2002-2016, Erik de Castro Lopo cannam@126: ** All rights reserved. cannam@126: ** cannam@126: ** This code is released under 2-clause BSD license. Please see the cannam@126: ** file at : https://github.com/erikd/libsamplerate/blob/master/COPYING cannam@126: */ cannam@126: cannam@126: #include cannam@126: #include cannam@126: #include cannam@126: cannam@126: #include cannam@126: cannam@126: #include "util.h" cannam@126: cannam@126: static void name_test (void) ; cannam@126: static void error_test (void) ; cannam@126: static void src_ratio_test (void) ; cannam@126: static void zero_input_test (int converter) ; cannam@126: cannam@126: int cannam@126: main (void) cannam@126: { cannam@126: puts ("") ; cannam@126: cannam@126: printf (" version : %s\n\n", src_get_version ()) ; cannam@126: cannam@126: /* Current max converter is SRC_LINEAR. */ cannam@126: name_test () ; cannam@126: cannam@126: error_test () ; cannam@126: cannam@126: src_ratio_test () ; cannam@126: cannam@126: zero_input_test (SRC_ZERO_ORDER_HOLD) ; cannam@126: zero_input_test (SRC_LINEAR) ; cannam@126: zero_input_test (SRC_SINC_FASTEST) ; cannam@126: cannam@126: puts ("") ; cannam@126: return 0 ; cannam@126: } /* main */ cannam@126: cannam@126: static void cannam@126: name_test (void) cannam@126: { const char *name ; cannam@126: int k = 0 ; cannam@126: cannam@126: puts (" name_test :") ; cannam@126: cannam@126: while (1) cannam@126: { name = src_get_name (k) ; cannam@126: if (name == NULL) cannam@126: break ; cannam@126: printf ("\tName %d : %s\n", k, name) ; cannam@126: printf ("\tDesc %d : %s\n", k, src_get_description (k)) ; cannam@126: k ++ ; cannam@126: } ; cannam@126: cannam@126: puts ("") ; cannam@126: cannam@126: return ; cannam@126: } /* name_test */ cannam@126: cannam@126: /*------------------------------------------------------------------------------ cannam@126: */ cannam@126: cannam@126: typedef struct cannam@126: { double ratio ; cannam@126: int should_pass ; cannam@126: } RATIO_TEST ; cannam@126: cannam@126: static RATIO_TEST ratio_test [] = cannam@126: { { 1.0 / 256.1, 0 }, cannam@126: { 1.0 / 256.0, 1 }, cannam@126: { 1.0, 1 }, cannam@126: { 256.0, 1 }, cannam@126: { 256.1, 0 }, cannam@126: { -1.0, 0 } cannam@126: } ; cannam@126: cannam@126: static void cannam@126: src_ratio_test (void) cannam@126: { int k ; cannam@126: cannam@126: puts (" src_ratio_test (SRC ratio must be in range [1/256, 256]):" ) ; cannam@126: cannam@126: cannam@126: for (k = 0 ; k < ARRAY_LEN (ratio_test) ; k++) cannam@126: { if (ratio_test [k].should_pass && src_is_valid_ratio (ratio_test [k].ratio) == 0) cannam@126: { printf ("\n\nLine %d : SRC ratio %f should have passed.\n\n", __LINE__, ratio_test [k].ratio) ; cannam@126: exit (1) ; cannam@126: } ; cannam@126: if (! ratio_test [k].should_pass && src_is_valid_ratio (ratio_test [k].ratio) != 0) cannam@126: { printf ("\n\nLine %d : SRC ratio %f should not have passed.\n\n", __LINE__, ratio_test [k].ratio) ; cannam@126: exit (1) ; cannam@126: } ; cannam@126: printf ("\t SRC ratio (%9.5f) : %s ................... ok\n", ratio_test [k].ratio, cannam@126: (ratio_test [k].should_pass ? "pass" : "fail")) ; cannam@126: } ; cannam@126: cannam@126: puts ("") ; cannam@126: cannam@126: return ; cannam@126: } /* src_ratio_test */ cannam@126: cannam@126: static void cannam@126: error_test (void) cannam@126: { const char *errorstr ; cannam@126: int k, errors = 0 ; cannam@126: cannam@126: puts (" error_test :") ; cannam@126: cannam@126: for (k = 0 ; 1 ; k++) cannam@126: { errorstr = src_strerror (k) ; cannam@126: printf ("\t%-2d : %s\n", k, errorstr) ; cannam@126: if (errorstr == NULL) cannam@126: { errors ++ ; cannam@126: continue ; cannam@126: } ; cannam@126: if (strstr (errorstr, "Placeholder.") == errorstr) cannam@126: break ; cannam@126: } ; cannam@126: cannam@126: if (errors != 0) cannam@126: { printf ("\n\nLine %d : Missing error numbers above.\n\n", __LINE__) ; cannam@126: exit (1) ; cannam@126: } ; cannam@126: cannam@126: puts ("") ; cannam@126: cannam@126: return ; cannam@126: } /* error_test */ cannam@126: cannam@126: static void cannam@126: zero_input_test (int converter) cannam@126: { SRC_DATA data ; cannam@126: SRC_STATE *state ; cannam@126: float out [100] ; cannam@126: int error ; cannam@126: cannam@126: printf (" %s (%-26s) ........ ", __func__, src_get_name (converter)) ; cannam@126: fflush (stdout) ; cannam@126: cannam@126: if ((state = src_new (converter, 1, &error)) == NULL) cannam@126: { printf ("\n\nLine %d : src_new failed : %s.\n\n", __LINE__, src_strerror (error)) ; cannam@126: exit (1) ; cannam@126: } ; cannam@126: cannam@126: data.data_in = (float *) 0xdeadbeef ; cannam@126: data.input_frames = 0 ; cannam@126: data.data_out = out ; cannam@126: data.output_frames = ARRAY_LEN (out) ; cannam@126: data.end_of_input = 0 ; cannam@126: data.src_ratio = 1.0 ; cannam@126: cannam@126: if ((error = src_process (state, &data))) cannam@126: { printf ("\n\nLine %d : src_new failed : %s.\n\n", __LINE__, src_strerror (error)) ; cannam@126: exit (1) ; cannam@126: } ; cannam@126: cannam@126: state = src_delete (state) ; cannam@126: cannam@126: puts ("ok") ; cannam@126: } /* zero_input_test */