174 строки
4.8 KiB

  1. #include <lol/lib/doctest_main>
  2. #include <lol/audio/stream>
  3. TEST_CASE("sample conversion: float|double ←→ float|double")
  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: float → int8|uint8")
  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: int8|uint8 → 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. for (int n = -0x80; n < 0x7f; ++n)
  47. {
  48. CAPTURE(n);
  49. CHECK(cv1(n) < cv1(n + 1));
  50. }
  51. auto cv2 = lol::audio::sample::convert<uint8_t, float>;
  52. CHECK(cv2(0x00) == -1.0f);
  53. CHECK(cv2(0xff) == 1.0f);
  54. for (int n = 0x00; n < 0xff; ++n)
  55. {
  56. CAPTURE(n);
  57. CHECK(cv2(n) < cv2(n + 1));
  58. }
  59. }
  60. TEST_CASE("sample conversion: float → int16|uint16")
  61. {
  62. auto cv1 = lol::audio::sample::convert<float, int16_t>;
  63. CHECK(cv1(-1.5f) == -0x8000);
  64. CHECK(cv1(-1.0f) == -0x8000);
  65. CHECK(cv1(-0.5f) == -0x4000);
  66. CHECK(cv1( 0.0f) == 0x0000);
  67. CHECK(cv1( 0.5f) == 0x4000);
  68. CHECK(cv1( 1.0f) == 0x7fff);
  69. CHECK(cv1( 1.5f) == 0x7fff);
  70. auto cv2 = lol::audio::sample::convert<float, uint16_t>;
  71. CHECK(cv2(-1.5f) == 0x0000);
  72. CHECK(cv2(-1.0f) == 0x0000);
  73. CHECK(cv2(-0.5f) == 0x4000);
  74. CHECK(cv2( 0.0f) == 0x8000);
  75. CHECK(cv2( 0.5f) == 0xc000);
  76. CHECK(cv2( 1.0f) == 0xffff);
  77. CHECK(cv2( 1.5f) == 0xffff);
  78. }
  79. TEST_CASE("sample conversion: int16|uint16 → float")
  80. {
  81. auto cv1 = lol::audio::sample::convert<int16_t, float>;
  82. CHECK(cv1(-0x8000) == -1.0f);
  83. CHECK(cv1( 0x7fff) == 1.0f);
  84. for (int n = -0x8000; n < 0x7fff; ++n)
  85. {
  86. CAPTURE(n);
  87. CHECK(cv1(n) < cv1(n + 1));
  88. }
  89. auto cv2 = lol::audio::sample::convert<uint16_t, float>;
  90. CHECK(cv2(0x0000) == -1.0f);
  91. CHECK(cv2(0xffff) == 1.0f);
  92. for (int n = 0x0000; n < 0xffff; ++n)
  93. {
  94. CAPTURE(n);
  95. CHECK(cv2(n) < cv2(n + 1));
  96. }
  97. }
  98. TEST_CASE("sample conversion: int8 ←→ uint8")
  99. {
  100. auto cv1 = lol::audio::sample::convert<int8_t, uint8_t>;
  101. CHECK(cv1(-0x80) == 0x00);
  102. CHECK(cv1(-0x40) == 0x40);
  103. CHECK(cv1(-0x01) == 0x7f);
  104. CHECK(cv1( 0x00) == 0x80);
  105. CHECK(cv1( 0x3f) == 0xbf);
  106. CHECK(cv1( 0x7f) == 0xff);
  107. auto cv2 = lol::audio::sample::convert<uint8_t, int8_t>;
  108. CHECK(cv2(0x00) == -0x80);
  109. CHECK(cv2(0x40) == -0x40);
  110. CHECK(cv2(0x7f) == -0x01);
  111. CHECK(cv2(0x80) == 0x00);
  112. CHECK(cv2(0xbf) == 0x3f);
  113. CHECK(cv2(0xff) == 0x7f);
  114. }
  115. TEST_CASE("sample conversion: int16|uint16 → int8")
  116. {
  117. auto cv1 = lol::audio::sample::convert<int16_t, int8_t>;
  118. CHECK(cv1(-0x8000) == -0x80);
  119. CHECK(cv1(-0x4000) == -0x40);
  120. CHECK(cv1(-0x0080) == -0x01);
  121. CHECK(cv1(-0x0001) == -0x01);
  122. CHECK(cv1( 0x0000) == 0x00);
  123. CHECK(cv1( 0x00ff) == 0x00);
  124. CHECK(cv1( 0x3fff) == 0x3f);
  125. CHECK(cv1( 0x7fff) == 0x7f);
  126. auto cv2 = lol::audio::sample::convert<uint16_t, int8_t>;
  127. CHECK(cv2(0x0000) == -0x80);
  128. CHECK(cv2(0x4000) == -0x40);
  129. CHECK(cv2(0x7f80) == -0x01);
  130. CHECK(cv2(0x7fff) == -0x01);
  131. CHECK(cv2(0x8000) == 0x00);
  132. CHECK(cv2(0x80ff) == 0x00);
  133. CHECK(cv2(0xbfff) == 0x3f);
  134. CHECK(cv2(0xffff) == 0x7f);
  135. }
  136. TEST_CASE("sample conversion: int8 → float → int8")
  137. {
  138. auto cv1 = lol::audio::sample::convert<int8_t, float>;
  139. auto cv2 = lol::audio::sample::convert<float, int8_t>;
  140. CHECK(cv2(cv1(-0x80)) == -0x80);
  141. CHECK(cv2(cv1(-0x7f)) == -0x7f);
  142. CHECK(cv2(cv1(-0x40)) == -0x40);
  143. CHECK(cv2(cv1(-0x20)) == -0x20);
  144. CHECK(cv2(cv1(-0x02)) == -0x02);
  145. CHECK(cv2(cv1(-0x01)) == -0x01);
  146. CHECK(cv2(cv1( 0x00)) == 0x00);
  147. CHECK(cv2(cv1( 0x01)) == 0x01);
  148. CHECK(cv2(cv1( 0x02)) == 0x02);
  149. CHECK(cv2(cv1( 0x20)) == 0x20);
  150. CHECK(cv2(cv1( 0x40)) == 0x40);
  151. CHECK(cv2(cv1( 0x7f)) == 0x7f);
  152. }