25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

150 satır
4.4 KiB

  1. #include <lol/lib/doctest_main>
  2. #include <lol/audio/stream>
  3. TEST_CASE("sample conversion between floating point types")
  4. {
  5. auto cv1 = lol::audio::sample::convert<float, float>;
  6. CHECK(cv1(-1.0f) == -1.0f);
  7. CHECK(cv1( 0.0f) == 0.0f);
  8. CHECK(cv1( 1.0f) == 1.0f);
  9. auto cv2 = lol::audio::sample::convert<float, double>;
  10. CHECK(cv2(-1.0f) == -1.0);
  11. CHECK(cv2( 0.0f) == 0.0);
  12. CHECK(cv2( 1.0f) == 1.0);
  13. auto cv3 = lol::audio::sample::convert<double, float>;
  14. CHECK(cv3(-1.0) == -1.0f);
  15. CHECK(cv3( 0.0) == 0.0f);
  16. CHECK(cv3( 1.0) == 1.0f);
  17. auto cv4 = lol::audio::sample::convert<double, double>;
  18. CHECK(cv4(-1.0) == -1.0);
  19. CHECK(cv4( 0.0) == 0.0);
  20. CHECK(cv4( 1.0) == 1.0);
  21. }
  22. TEST_CASE("sample conversion from float to 8-bit")
  23. {
  24. auto cv1 = lol::audio::sample::convert<float, int8_t>;
  25. CHECK(cv1(-1.5f) == -0x80);
  26. CHECK(cv1(-1.0f) == -0x80);
  27. CHECK(cv1(-0.5f) == -0x40);
  28. CHECK(cv1( 0.0f) == 0x00);
  29. CHECK(cv1( 0.5f) == 0x40);
  30. CHECK(cv1( 1.0f) == 0x7f);
  31. CHECK(cv1( 1.5f) == 0x7f);
  32. auto cv2 = lol::audio::sample::convert<float, uint8_t>;
  33. CHECK(cv2(-1.5f) == 0x00);
  34. CHECK(cv2(-1.0f) == 0x00);
  35. CHECK(cv2(-0.5f) == 0x40);
  36. CHECK(cv2( 0.0f) == 0x80);
  37. CHECK(cv2( 0.5f) == 0xc0);
  38. CHECK(cv2( 1.0f) == 0xff);
  39. CHECK(cv2( 1.5f) == 0xff);
  40. }
  41. TEST_CASE("sample conversion from 8-bit to float")
  42. {
  43. auto cv1 = lol::audio::sample::convert<int8_t, float>;
  44. CHECK(cv1(-0x80) == -1.0f);
  45. CHECK(cv1( 0x7f) == 1.0f);
  46. auto cv2 = lol::audio::sample::convert<uint8_t, float>;
  47. CHECK(cv2(0x00) == -1.0f);
  48. CHECK(cv2(0xff) == 1.0f);
  49. }
  50. TEST_CASE("sample conversion from float to 16-bit")
  51. {
  52. auto cv1 = lol::audio::sample::convert<float, int16_t>;
  53. CHECK(cv1(-1.5f) == -0x8000);
  54. CHECK(cv1(-1.0f) == -0x8000);
  55. CHECK(cv1(-0.5f) == -0x4000);
  56. CHECK(cv1( 0.0f) == 0x0000);
  57. CHECK(cv1( 0.5f) == 0x4000);
  58. CHECK(cv1( 1.0f) == 0x7fff);
  59. CHECK(cv1( 1.5f) == 0x7fff);
  60. auto cv2 = lol::audio::sample::convert<float, uint16_t>;
  61. CHECK(cv2(-1.5f) == 0x0000);
  62. CHECK(cv2(-1.0f) == 0x0000);
  63. CHECK(cv2(-0.5f) == 0x4000);
  64. CHECK(cv2( 0.0f) == 0x8000);
  65. CHECK(cv2( 0.5f) == 0xc000);
  66. CHECK(cv2( 1.0f) == 0xffff);
  67. CHECK(cv2( 1.5f) == 0xffff);
  68. }
  69. TEST_CASE("sample conversion from 16-bit to float")
  70. {
  71. auto cv1 = lol::audio::sample::convert<int16_t, float>;
  72. CHECK(cv1(-0x8000) == -1.0f);
  73. CHECK(cv1( 0x7fff) == 1.0f);
  74. auto cv2 = lol::audio::sample::convert<uint16_t, float>;
  75. CHECK(cv2(0x0000) == -1.0f);
  76. CHECK(cv2(0xffff) == 1.0f);
  77. }
  78. TEST_CASE("sample conversion between signed and unsigned 8-bit")
  79. {
  80. auto cv1 = lol::audio::sample::convert<int8_t, uint8_t>;
  81. CHECK(cv1(-0x80) == 0x00);
  82. CHECK(cv1(-0x40) == 0x40);
  83. CHECK(cv1(-0x01) == 0x7f);
  84. CHECK(cv1( 0x00) == 0x80);
  85. CHECK(cv1( 0x3f) == 0xbf);
  86. CHECK(cv1( 0x7f) == 0xff);
  87. auto cv2 = lol::audio::sample::convert<uint8_t, int8_t>;
  88. CHECK(cv2(0x00) == -0x80);
  89. CHECK(cv2(0x40) == -0x40);
  90. CHECK(cv2(0x7f) == -0x01);
  91. CHECK(cv2(0x80) == 0x00);
  92. CHECK(cv2(0xbf) == 0x3f);
  93. CHECK(cv2(0xff) == 0x7f);
  94. }
  95. TEST_CASE("sample conversion from 16-bit to 8-bit")
  96. {
  97. auto cv1 = lol::audio::sample::convert<int16_t, int8_t>;
  98. CHECK(cv1(-0x8000) == -0x80);
  99. CHECK(cv1(-0x4000) == -0x40);
  100. CHECK(cv1(-0x0080) == -0x01);
  101. CHECK(cv1(-0x0001) == -0x01);
  102. CHECK(cv1( 0x0000) == 0x00);
  103. CHECK(cv1( 0x00ff) == 0x00);
  104. CHECK(cv1( 0x3fff) == 0x3f);
  105. CHECK(cv1( 0x7fff) == 0x7f);
  106. auto cv2 = lol::audio::sample::convert<uint16_t, int8_t>;
  107. CHECK(cv2(0x0000) == -0x80);
  108. CHECK(cv2(0x4000) == -0x40);
  109. CHECK(cv2(0x7f80) == -0x01);
  110. CHECK(cv2(0x7fff) == -0x01);
  111. CHECK(cv2(0x8000) == 0x00);
  112. CHECK(cv2(0x80ff) == 0x00);
  113. CHECK(cv2(0xbfff) == 0x3f);
  114. CHECK(cv2(0xffff) == 0x7f);
  115. }
  116. TEST_CASE("round-trip conversion from 8-bit to 8-bit")
  117. {
  118. auto cv1 = lol::audio::sample::convert<int8_t, float>;
  119. auto cv2 = lol::audio::sample::convert<float, int8_t>;
  120. CHECK(cv2(cv1(-0x80)) == -0x80);
  121. CHECK(cv2(cv1(-0x7f)) == -0x7f);
  122. CHECK(cv2(cv1(-0x40)) == -0x40);
  123. CHECK(cv2(cv1(-0x20)) == -0x20);
  124. CHECK(cv2(cv1(-0x02)) == -0x02);
  125. CHECK(cv2(cv1(-0x01)) == -0x01);
  126. CHECK(cv2(cv1( 0x00)) == 0x00);
  127. CHECK(cv2(cv1( 0x01)) == 0x01);
  128. CHECK(cv2(cv1( 0x02)) == 0x02);
  129. CHECK(cv2(cv1( 0x20)) == 0x20);
  130. CHECK(cv2(cv1( 0x40)) == 0x40);
  131. CHECK(cv2(cv1( 0x7f)) == 0x7f);
  132. }