You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.6KB

  1. /*
  2. ** Copyright (c) 2002-2016, Erik de Castro Lopo <erikd@mega-nerd.com>
  3. ** All rights reserved.
  4. **
  5. ** This code is released under 2-clause BSD license. Please see the
  6. ** file at : https://github.com/erikd/libsamplerate/blob/master/COPYING
  7. */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <math.h>
  12. #include <samplerate.h>
  13. #include "util.h"
  14. #define BUFFER_LEN 2048
  15. static void simple_test (int converter, double ratio) ;
  16. int
  17. main (void)
  18. { static double src_ratios [] =
  19. { 1.0001, 0.099, 0.1, 0.33333333, 0.789, 1.9, 3.1, 9.9
  20. } ;
  21. int k ;
  22. puts ("") ;
  23. puts (" Zero Order Hold interpolator :") ;
  24. for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
  25. simple_test (SRC_ZERO_ORDER_HOLD, src_ratios [k]) ;
  26. puts (" Linear interpolator :") ;
  27. for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
  28. simple_test (SRC_LINEAR, src_ratios [k]) ;
  29. puts (" Sinc interpolator :") ;
  30. for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
  31. simple_test (SRC_SINC_FASTEST, src_ratios [k]) ;
  32. puts ("") ;
  33. return 0 ;
  34. } /* main */
  35. static void
  36. simple_test (int converter, double src_ratio)
  37. { static float input [BUFFER_LEN], output [BUFFER_LEN] ;
  38. SRC_DATA src_data ;
  39. int input_len, output_len, error, terminate ;
  40. printf ("\tsimple_test (SRC ratio = %6.4f) ........... ", src_ratio) ;
  41. fflush (stdout) ;
  42. /* Calculate maximun input and output lengths. */
  43. if (src_ratio >= 1.0)
  44. { output_len = BUFFER_LEN ;
  45. input_len = (int) floor (BUFFER_LEN / src_ratio) ;
  46. }
  47. else
  48. { input_len = BUFFER_LEN ;
  49. output_len = (int) floor (BUFFER_LEN * src_ratio) ;
  50. } ;
  51. /* Reduce input_len by 10 so output is longer than necessary. */
  52. input_len -= 10 ;
  53. if (output_len > BUFFER_LEN)
  54. { printf ("\n\nLine %d : output_len > BUFFER_LEN\n\n", __LINE__) ;
  55. exit (1) ;
  56. } ;
  57. memset (&src_data, 0, sizeof (src_data)) ;
  58. src_data.data_in = input ;
  59. src_data.input_frames = input_len ;
  60. src_data.src_ratio = src_ratio ;
  61. src_data.data_out = output ;
  62. src_data.output_frames = BUFFER_LEN ;
  63. if ((error = src_simple (&src_data, converter, 1)))
  64. { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
  65. exit (1) ;
  66. } ;
  67. terminate = (int) ceil ((src_ratio >= 1.0) ? src_ratio : 1.0 / src_ratio) ;
  68. if (fabs (src_data.output_frames_gen - src_ratio * input_len) > 2 * terminate)
  69. { printf ("\n\nLine %d : bad output data length %ld should be %d.\n", __LINE__,
  70. src_data.output_frames_gen, (int) floor (src_ratio * input_len)) ;
  71. printf ("\tsrc_ratio : %.4f\n", src_ratio) ;
  72. printf ("\tinput_len : %d\n\toutput_len : %d\n\n", input_len, output_len) ;
  73. exit (1) ;
  74. } ;
  75. puts ("ok") ;
  76. return ;
  77. } /* simple_test */