test_ima_oki_adpcm.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:5k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (c) 2007 <robs@users.sourceforge.net>
  3. ** Copyright (C) 2007-2009 Erik de Castro Lopo <erikd@mega-nerd.com>
  4. **
  5. ** This library is free software; you can redistribute it and/or modify it
  6. ** under the terms of the GNU Lesser General Public License as published by
  7. ** the Free Software Foundation; either version 2 of the License, or (at
  8. ** your option) any later version.
  9. **
  10. ** This library is distributed in the hope that it will be useful, but
  11. ** WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
  13. ** General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU Lesser General Public License
  16. ** along with this library.  If not, write to the Free Software Foundation,
  17. ** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA.
  18. */
  19. #include "sfconfig.h"
  20. #include <stdio.h>
  21. #include "test_main.h"
  22. #include "ima_oki_adpcm.c"
  23. static const unsigned char test_codes [] =
  24. { 0x08, 0x08, 0x04, 0x7f, 0x72, 0xf7, 0x9f, 0x7c, 0xd7, 0xbc, 0x7a, 0xa7, 0xb8,
  25. 0x4b, 0x0b, 0x38, 0xf6, 0x9d, 0x7a, 0xd7, 0xbc, 0x7a, 0xd7, 0xa8, 0x6c, 0x81,
  26. 0x98, 0xe4, 0x0e, 0x7a, 0xd7, 0x9e, 0x7b, 0xc7, 0xab, 0x7a, 0x85, 0xc0, 0xb3,
  27. 0x8f, 0x58, 0xd7, 0xad, 0x7a, 0xd7, 0xad, 0x7a, 0x87, 0xd0, 0x2b, 0x0e, 0x48,
  28. 0xd7, 0xad, 0x78, 0xf7, 0xbc, 0x7a, 0xb7, 0xa8, 0x4b, 0x88, 0x18, 0xd5, 0x8d,
  29. 0x6a, 0xa4, 0x98, 0x08, 0x00, 0x80, 0x88,
  30. } ;
  31. static const short test_pcm [] =
  32. { 32, 0, 32, 0, 32, 320, 880, -336, 2304, 4192, -992, 10128, 5360, -16352,
  33. 30208, 2272, -31872, 14688, -7040, -32432, 14128, -1392, -15488, 22960,
  34. 1232, -1584, 21488, -240, 2576, -15360, 960, -1152, -30032, 10320, 1008,
  35. -30032, 16528, 1008, -30032, 16528, -5200, -30592, 15968, 448, -30592,
  36. 15968, 448, -2368, 30960, 3024, -80, 8384, 704, -1616, -29168, -1232, 1872,
  37. -32768, 13792, -1728, -32768, 13792, 4480, -32192, 14368, -7360, -32752,
  38. 13808, -1712, -21456, 16992, 1472, -1344, 26848, -1088, 2016, -17728, 208,
  39. -2112, -32768, 1376, -1728, -32768, 13792, -1728, -32768, 13792, -1728,
  40. -32768, 13792, -1728, -32768, 13792, -1728, -4544, 32767, -1377, 1727,
  41. 15823, -2113, 207, -27345, 591, -2513, -32768, 13792, -1728, -32768, 13792,
  42. 10688, -31632, 14928, -6800, -32192, 14368, -1152, -20896, 17552, 2032,
  43. -784, 22288, 560, -2256, -4816, 2176, 64, -21120, 9920, 6816, -24224, 16128,
  44. 608, -13488, 9584, 272, -2544, 16, -2304, -192, 1728, -16, 1568, 128, -1184,
  45. } ;
  46. static void
  47. test_oki_adpcm (void)
  48. {
  49. IMA_OKI_ADPCM adpcm ;
  50. unsigned char code ;
  51. int i, j ;
  52. print_test_name ("Testing ima/oki encoder") ;
  53. ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
  54. for (i = 0 ; i < ARRAY_LEN (test_codes) ; i++)
  55. for (j = 0, code = test_codes [i] ; j < 2 ; j++, code <<= 4)
  56. if (adpcm_decode (&adpcm, code >> 4) != test_pcm [2 * i + j])
  57. { printf ("nnFail at i = %d, j = %d.nn", i, j) ;
  58. exit (1) ;
  59. } ;
  60. puts ("ok") ;
  61. print_test_name ("Testing ima/oki decoder") ;
  62. ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
  63. for (i = 0 ; i < ARRAY_LEN (test_pcm) - 1 ; i += 2)
  64. { code = adpcm_encode (&adpcm, test_pcm [i]) ;
  65. code = (code << 4) | adpcm_encode (&adpcm, test_pcm [i + 1]) ;
  66. if (code != test_codes [i / 2])
  67. { printf ("nnFail at i = %d, %d should be %dnn", i, code, test_codes [i / 2]) ;
  68. exit (1) ;
  69. } ;
  70. } ;
  71. puts ("ok") ;
  72. } /* test_oki_adpcm */
  73. static void
  74. test_oki_adpcm_block (void)
  75. {
  76. IMA_OKI_ADPCM adpcm ;
  77. int k ;
  78. if (ARRAY_LEN (adpcm.pcm) < ARRAY_LEN (test_pcm))
  79. { printf ("nnLine %d : ARRAY_LEN (adpcm->pcm) > ARRAY_LEN (test_pcm) (%d > %d).nn", __LINE__, ARRAY_LEN (adpcm.pcm), ARRAY_LEN (test_pcm)) ;
  80. exit (1) ;
  81. } ;
  82. if (ARRAY_LEN (adpcm.codes) < ARRAY_LEN (test_codes))
  83. { printf ("nnLine %d : ARRAY_LEN (adcodes->codes) > ARRAY_LEN (test_codes).n", __LINE__) ;
  84. exit (1) ;
  85. } ;
  86. print_test_name ("Testing ima/oki block encoder") ;
  87. ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
  88. memcpy (adpcm.pcm, test_pcm, sizeof (adpcm.pcm [0]) * ARRAY_LEN (test_pcm)) ;
  89. adpcm.pcm_count = ARRAY_LEN (test_pcm) ;
  90. adpcm.code_count = 13 ;
  91. ima_oki_adpcm_encode_block (&adpcm) ;
  92. if (adpcm.code_count * 2 != ARRAY_LEN (test_pcm))
  93. { printf ("nnLine %d : %d * 2 != %dnn", __LINE__, adpcm.code_count * 2, ARRAY_LEN (test_pcm)) ;
  94. exit (1) ;
  95. } ;
  96. for (k = 0 ; k < ARRAY_LEN (test_codes) ; k++)
  97. if (adpcm.codes [k] != test_codes [k])
  98. { printf ("nnLine %d : Fail at k = %d, %d should be %dnn", __LINE__, k, adpcm.codes [k], test_codes [k]) ;
  99. exit (1) ;
  100. } ;
  101. puts ("ok") ;
  102. print_test_name ("Testing ima/oki block decoder") ;
  103. ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
  104. memcpy (adpcm.codes, test_codes, sizeof (adpcm.codes [0]) * ARRAY_LEN (test_codes)) ;
  105. adpcm.code_count = ARRAY_LEN (test_codes) ;
  106. adpcm.pcm_count = 13 ;
  107. ima_oki_adpcm_decode_block (&adpcm) ;
  108. if (adpcm.pcm_count != 2 * ARRAY_LEN (test_codes))
  109. { printf ("nnLine %d : %d * 2 != %dnn", __LINE__, adpcm.pcm_count, 2 * ARRAY_LEN (test_codes)) ;
  110. exit (1) ;
  111. } ;
  112. for (k = 0 ; k < ARRAY_LEN (test_pcm) ; k++)
  113. if (adpcm.pcm [k] != test_pcm [k])
  114. { printf ("nnLine %d : Fail at i = %d, %d should be %d.nn", __LINE__, k, adpcm.pcm [k], test_pcm [k]) ;
  115. exit (1) ;
  116. } ;
  117. puts ("ok") ;
  118. } /* test_oki_adpcm_block */
  119. void
  120. test_ima_oki_adpcm (void)
  121. {
  122. test_oki_adpcm () ;
  123. test_oki_adpcm_block () ;
  124. } /* main */