react-native-queue-player 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1218) hide show
  1. package/LICENSE +201 -0
  2. package/QueuePlayer.podspec +114 -0
  3. package/README.md +194 -0
  4. package/android/CMakeLists.txt +41 -0
  5. package/android/build.gradle +257 -0
  6. package/android/src/androidTest/java/com/margelo/nitro/queueplayer/SignalsmithStretchNativeTest.kt +136 -0
  7. package/android/src/main/AndroidManifest.xml +173 -0
  8. package/android/src/main/cpp/CMakeLists.txt +221 -0
  9. package/android/src/main/cpp/THIRD_PARTY_LICENSES +128 -0
  10. package/android/src/main/cpp/THIRD_PARTY_VERSIONS.txt +32 -0
  11. package/android/src/main/cpp/airplay2_audio.c +537 -0
  12. package/android/src/main/cpp/airplay2_audio.h +66 -0
  13. package/android/src/main/cpp/airplay2_control.c +680 -0
  14. package/android/src/main/cpp/airplay2_control.h +101 -0
  15. package/android/src/main/cpp/airplay2_crypto.c +548 -0
  16. package/android/src/main/cpp/airplay2_crypto.h +213 -0
  17. package/android/src/main/cpp/airplay2_dmap.c +81 -0
  18. package/android/src/main/cpp/airplay2_dmap.h +53 -0
  19. package/android/src/main/cpp/airplay2_filelog.h +100 -0
  20. package/android/src/main/cpp/airplay2_jni.cpp +579 -0
  21. package/android/src/main/cpp/airplay2_ntp.c +203 -0
  22. package/android/src/main/cpp/airplay2_ntp.h +39 -0
  23. package/android/src/main/cpp/airplay2_pair.c +653 -0
  24. package/android/src/main/cpp/airplay2_pair.h +114 -0
  25. package/android/src/main/cpp/airplay2_plist.c +840 -0
  26. package/android/src/main/cpp/airplay2_plist.h +184 -0
  27. package/android/src/main/cpp/airplay2_ptp.c +509 -0
  28. package/android/src/main/cpp/airplay2_ptp.h +40 -0
  29. package/android/src/main/cpp/airplay2_rtsp.c +693 -0
  30. package/android/src/main/cpp/airplay2_rtsp.h +90 -0
  31. package/android/src/main/cpp/airplay2_session.c +196 -0
  32. package/android/src/main/cpp/airplay2_session.h +197 -0
  33. package/android/src/main/cpp/airplay2_tlv.c +135 -0
  34. package/android/src/main/cpp/airplay2_tlv.h +87 -0
  35. package/android/src/main/cpp/airplay_jni.cpp +589 -0
  36. package/android/src/main/cpp/build-openssl-android.sh +94 -0
  37. package/android/src/main/cpp/cpp-adapter.cpp +11 -0
  38. package/android/src/main/cpp/prebuilt/libsodium/arm64-v8a/lib/libsodium.a +0 -0
  39. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/core.h +28 -0
  40. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_aead_aegis128l.h +92 -0
  41. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_aead_aegis256.h +92 -0
  42. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_aead_aes256gcm.h +179 -0
  43. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_aead_chacha20poly1305.h +180 -0
  44. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_aead_xchacha20poly1305.h +100 -0
  45. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_auth.h +46 -0
  46. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_auth_hmacsha256.h +70 -0
  47. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_auth_hmacsha512.h +68 -0
  48. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_auth_hmacsha512256.h +65 -0
  49. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_box.h +177 -0
  50. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_box_curve25519xchacha20poly1305.h +164 -0
  51. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_box_curve25519xsalsa20poly1305.h +112 -0
  52. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_ed25519.h +104 -0
  53. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_hchacha20.h +36 -0
  54. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_hsalsa20.h +36 -0
  55. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_ristretto255.h +100 -0
  56. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_salsa20.h +36 -0
  57. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_salsa2012.h +36 -0
  58. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_salsa208.h +40 -0
  59. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_generichash.h +84 -0
  60. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_generichash_blake2b.h +122 -0
  61. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_hash.h +40 -0
  62. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_hash_sha256.h +60 -0
  63. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_hash_sha512.h +60 -0
  64. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_kdf.h +53 -0
  65. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_kdf_blake2b.h +44 -0
  66. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_kdf_hkdf_sha256.h +74 -0
  67. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_kdf_hkdf_sha512.h +75 -0
  68. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_kx.h +66 -0
  69. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_onetimeauth.h +65 -0
  70. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_onetimeauth_poly1305.h +72 -0
  71. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_pwhash.h +147 -0
  72. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_pwhash_argon2i.h +122 -0
  73. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_pwhash_argon2id.h +122 -0
  74. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_pwhash_scryptsalsa208sha256.h +120 -0
  75. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_scalarmult.h +46 -0
  76. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_scalarmult_curve25519.h +42 -0
  77. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_scalarmult_ed25519.h +51 -0
  78. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_scalarmult_ristretto255.h +43 -0
  79. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_secretbox.h +93 -0
  80. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_secretbox_xchacha20poly1305.h +70 -0
  81. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_secretbox_xsalsa20poly1305.h +69 -0
  82. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_secretstream_xchacha20poly1305.h +108 -0
  83. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_shorthash.h +41 -0
  84. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_shorthash_siphash24.h +50 -0
  85. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_sign.h +107 -0
  86. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_sign_ed25519.h +124 -0
  87. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_sign_edwards25519sha512batch.h +55 -0
  88. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream.h +59 -0
  89. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_chacha20.h +106 -0
  90. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_salsa20.h +61 -0
  91. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_salsa2012.h +53 -0
  92. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_salsa208.h +56 -0
  93. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_xchacha20.h +61 -0
  94. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_xsalsa20.h +61 -0
  95. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_verify_16.h +23 -0
  96. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_verify_32.h +23 -0
  97. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_verify_64.h +23 -0
  98. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/export.h +57 -0
  99. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/randombytes.h +72 -0
  100. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/randombytes_internal_random.h +22 -0
  101. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/randombytes_sysrandom.h +19 -0
  102. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/runtime.h +55 -0
  103. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/utils.h +179 -0
  104. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/version.h +33 -0
  105. package/android/src/main/cpp/prebuilt/libsodium/include/sodium.h +75 -0
  106. package/android/src/main/cpp/prebuilt/libsodium/x86_64/lib/libsodium.a +0 -0
  107. package/android/src/main/cpp/prebuilt/openssl/arm64-v8a/lib/libcrypto.a +0 -0
  108. package/android/src/main/cpp/prebuilt/openssl/arm64-v8a/lib/libssl.a +0 -0
  109. package/android/src/main/cpp/prebuilt/openssl/x86_64/lib/libcrypto.a +0 -0
  110. package/android/src/main/cpp/prebuilt/openssl/x86_64/lib/libssl.a +0 -0
  111. package/android/src/main/cpp/stretch_jni.cpp +171 -0
  112. package/android/src/main/cpp/third_party/alac/addons/alac_wrapper.cpp +198 -0
  113. package/android/src/main/cpp/third_party/alac/addons/alac_wrapper.h +46 -0
  114. package/android/src/main/cpp/third_party/alac/codec/ALACAudioTypes.h +197 -0
  115. package/android/src/main/cpp/third_party/alac/codec/ALACBitUtilities.c +260 -0
  116. package/android/src/main/cpp/third_party/alac/codec/ALACBitUtilities.h +104 -0
  117. package/android/src/main/cpp/third_party/alac/codec/ALACDecoder.cpp +730 -0
  118. package/android/src/main/cpp/third_party/alac/codec/ALACDecoder.h +65 -0
  119. package/android/src/main/cpp/third_party/alac/codec/ALACEncoder.cpp +1425 -0
  120. package/android/src/main/cpp/third_party/alac/codec/ALACEncoder.h +92 -0
  121. package/android/src/main/cpp/third_party/alac/codec/EndianPortable.c +181 -0
  122. package/android/src/main/cpp/third_party/alac/codec/EndianPortable.h +59 -0
  123. package/android/src/main/cpp/third_party/alac/codec/ag_dec.c +362 -0
  124. package/android/src/main/cpp/third_party/alac/codec/ag_enc.c +370 -0
  125. package/android/src/main/cpp/third_party/alac/codec/aglib.h +81 -0
  126. package/android/src/main/cpp/third_party/alac/codec/dp_dec.c +381 -0
  127. package/android/src/main/cpp/third_party/alac/codec/dp_enc.c +386 -0
  128. package/android/src/main/cpp/third_party/alac/codec/dplib.h +61 -0
  129. package/android/src/main/cpp/third_party/alac/codec/matrix_dec.c +390 -0
  130. package/android/src/main/cpp/third_party/alac/codec/matrix_enc.c +342 -0
  131. package/android/src/main/cpp/third_party/alac/codec/matrixlib.h +80 -0
  132. package/android/src/main/cpp/third_party/crosstools/cross_log.c +95 -0
  133. package/android/src/main/cpp/third_party/crosstools/cross_log.h +25 -0
  134. package/android/src/main/cpp/third_party/crosstools/cross_net.c +1139 -0
  135. package/android/src/main/cpp/third_party/crosstools/cross_net.h +51 -0
  136. package/android/src/main/cpp/third_party/crosstools/cross_ssl.c +371 -0
  137. package/android/src/main/cpp/third_party/crosstools/cross_ssl.h +15 -0
  138. package/android/src/main/cpp/third_party/crosstools/cross_thread.c +134 -0
  139. package/android/src/main/cpp/third_party/crosstools/cross_thread.h +20 -0
  140. package/android/src/main/cpp/third_party/crosstools/cross_util.c +753 -0
  141. package/android/src/main/cpp/third_party/crosstools/cross_util.h +125 -0
  142. package/android/src/main/cpp/third_party/crosstools/platform.c +227 -0
  143. package/android/src/main/cpp/third_party/crosstools/platform.h +127 -0
  144. package/android/src/main/cpp/third_party/curve25519/include/curve25519_dh.h +53 -0
  145. package/android/src/main/cpp/third_party/curve25519/include/ed25519_signature.h +98 -0
  146. package/android/src/main/cpp/third_party/curve25519/include/external_calls.h +36 -0
  147. package/android/src/main/cpp/third_party/curve25519/source/BaseTypes.h +125 -0
  148. package/android/src/main/cpp/third_party/curve25519/source/base_folding8.h +1288 -0
  149. package/android/src/main/cpp/third_party/curve25519/source/curve25519_dh.c +208 -0
  150. package/android/src/main/cpp/third_party/curve25519/source/curve25519_mehdi.c +410 -0
  151. package/android/src/main/cpp/third_party/curve25519/source/curve25519_mehdi.h +175 -0
  152. package/android/src/main/cpp/third_party/curve25519/source/curve25519_order.c +155 -0
  153. package/android/src/main/cpp/third_party/curve25519/source/curve25519_utils.c +153 -0
  154. package/android/src/main/cpp/third_party/curve25519/source/custom_blind.c +27 -0
  155. package/android/src/main/cpp/third_party/curve25519/source/custom_blind.h +11 -0
  156. package/android/src/main/cpp/third_party/curve25519/source/ed25519_sign.c +419 -0
  157. package/android/src/main/cpp/third_party/curve25519/source/ed25519_signature.h +98 -0
  158. package/android/src/main/cpp/third_party/curve25519/source/ed25519_verify.c +313 -0
  159. package/android/src/main/cpp/third_party/curve25519/source/sha512.c +294 -0
  160. package/android/src/main/cpp/third_party/curve25519/source/sha512.h +93 -0
  161. package/android/src/main/cpp/third_party/dmap-parser/dmap_parser.c +545 -0
  162. package/android/src/main/cpp/third_party/dmap-parser/dmap_parser.h +90 -0
  163. package/android/src/main/cpp/third_party/libraop/aes.c +863 -0
  164. package/android/src/main/cpp/third_party/libraop/aes.h +18 -0
  165. package/android/src/main/cpp/third_party/libraop/aes_ctr.c +89 -0
  166. package/android/src/main/cpp/third_party/libraop/aes_ctr.h +59 -0
  167. package/android/src/main/cpp/third_party/libraop/alac.c +1135 -0
  168. package/android/src/main/cpp/third_party/libraop/alac.h +55 -0
  169. package/android/src/main/cpp/third_party/libraop/raop_client.c +1500 -0
  170. package/android/src/main/cpp/third_party/libraop/raop_client.h +178 -0
  171. package/android/src/main/cpp/third_party/libraop/rtsp_client.c +743 -0
  172. package/android/src/main/cpp/third_party/libraop/rtsp_client.h +50 -0
  173. package/android/src/main/cpp/third_party/openssl/include/openssl/__DECC_INCLUDE_EPILOGUE.H +22 -0
  174. package/android/src/main/cpp/third_party/openssl/include/openssl/__DECC_INCLUDE_PROLOGUE.H +26 -0
  175. package/android/src/main/cpp/third_party/openssl/include/openssl/aes.h +111 -0
  176. package/android/src/main/cpp/third_party/openssl/include/openssl/asn1.h +1134 -0
  177. package/android/src/main/cpp/third_party/openssl/include/openssl/asn1.h.in +967 -0
  178. package/android/src/main/cpp/third_party/openssl/include/openssl/asn1err.h +142 -0
  179. package/android/src/main/cpp/third_party/openssl/include/openssl/asn1t.h +946 -0
  180. package/android/src/main/cpp/third_party/openssl/include/openssl/asn1t.h.in +923 -0
  181. package/android/src/main/cpp/third_party/openssl/include/openssl/async.h +104 -0
  182. package/android/src/main/cpp/third_party/openssl/include/openssl/asyncerr.h +29 -0
  183. package/android/src/main/cpp/third_party/openssl/include/openssl/bio.h +1022 -0
  184. package/android/src/main/cpp/third_party/openssl/include/openssl/bio.h.in +999 -0
  185. package/android/src/main/cpp/third_party/openssl/include/openssl/bioerr.h +72 -0
  186. package/android/src/main/cpp/third_party/openssl/include/openssl/blowfish.h +78 -0
  187. package/android/src/main/cpp/third_party/openssl/include/openssl/bn.h +590 -0
  188. package/android/src/main/cpp/third_party/openssl/include/openssl/bnerr.h +47 -0
  189. package/android/src/main/cpp/third_party/openssl/include/openssl/buffer.h +62 -0
  190. package/android/src/main/cpp/third_party/openssl/include/openssl/buffererr.h +25 -0
  191. package/android/src/main/cpp/third_party/openssl/include/openssl/byteorder.h +339 -0
  192. package/android/src/main/cpp/third_party/openssl/include/openssl/camellia.h +117 -0
  193. package/android/src/main/cpp/third_party/openssl/include/openssl/cast.h +71 -0
  194. package/android/src/main/cpp/third_party/openssl/include/openssl/cmac.h +52 -0
  195. package/android/src/main/cpp/third_party/openssl/include/openssl/cmp.h +727 -0
  196. package/android/src/main/cpp/third_party/openssl/include/openssl/cmp.h.in +584 -0
  197. package/android/src/main/cpp/third_party/openssl/include/openssl/cmp_util.h +56 -0
  198. package/android/src/main/cpp/third_party/openssl/include/openssl/cmperr.h +134 -0
  199. package/android/src/main/cpp/third_party/openssl/include/openssl/cms.h +511 -0
  200. package/android/src/main/cpp/third_party/openssl/include/openssl/cms.h.in +413 -0
  201. package/android/src/main/cpp/third_party/openssl/include/openssl/cmserr.h +126 -0
  202. package/android/src/main/cpp/third_party/openssl/include/openssl/comp.h +98 -0
  203. package/android/src/main/cpp/third_party/openssl/include/openssl/comp.h.in +76 -0
  204. package/android/src/main/cpp/third_party/openssl/include/openssl/comperr.h +38 -0
  205. package/android/src/main/cpp/third_party/openssl/include/openssl/conf.h +214 -0
  206. package/android/src/main/cpp/third_party/openssl/include/openssl/conf.h.in +177 -0
  207. package/android/src/main/cpp/third_party/openssl/include/openssl/conf_api.h +46 -0
  208. package/android/src/main/cpp/third_party/openssl/include/openssl/conferr.h +52 -0
  209. package/android/src/main/cpp/third_party/openssl/include/openssl/configuration.h +212 -0
  210. package/android/src/main/cpp/third_party/openssl/include/openssl/configuration.h.in +75 -0
  211. package/android/src/main/cpp/third_party/openssl/include/openssl/conftypes.h +44 -0
  212. package/android/src/main/cpp/third_party/openssl/include/openssl/core.h +236 -0
  213. package/android/src/main/cpp/third_party/openssl/include/openssl/core_dispatch.h +1141 -0
  214. package/android/src/main/cpp/third_party/openssl/include/openssl/core_names.h +575 -0
  215. package/android/src/main/cpp/third_party/openssl/include/openssl/core_names.h.in +126 -0
  216. package/android/src/main/cpp/third_party/openssl/include/openssl/core_object.h +41 -0
  217. package/android/src/main/cpp/third_party/openssl/include/openssl/crmf.h +278 -0
  218. package/android/src/main/cpp/third_party/openssl/include/openssl/crmf.h.in +207 -0
  219. package/android/src/main/cpp/third_party/openssl/include/openssl/crmferr.h +57 -0
  220. package/android/src/main/cpp/third_party/openssl/include/openssl/crypto.h +583 -0
  221. package/android/src/main/cpp/third_party/openssl/include/openssl/crypto.h.in +560 -0
  222. package/android/src/main/cpp/third_party/openssl/include/openssl/cryptoerr.h +56 -0
  223. package/android/src/main/cpp/third_party/openssl/include/openssl/cryptoerr_legacy.h +1466 -0
  224. package/android/src/main/cpp/third_party/openssl/include/openssl/ct.h +573 -0
  225. package/android/src/main/cpp/third_party/openssl/include/openssl/ct.h.in +525 -0
  226. package/android/src/main/cpp/third_party/openssl/include/openssl/cterr.h +45 -0
  227. package/android/src/main/cpp/third_party/openssl/include/openssl/decoder.h +133 -0
  228. package/android/src/main/cpp/third_party/openssl/include/openssl/decodererr.h +28 -0
  229. package/android/src/main/cpp/third_party/openssl/include/openssl/des.h +211 -0
  230. package/android/src/main/cpp/third_party/openssl/include/openssl/dh.h +339 -0
  231. package/android/src/main/cpp/third_party/openssl/include/openssl/dherr.h +59 -0
  232. package/android/src/main/cpp/third_party/openssl/include/openssl/dsa.h +280 -0
  233. package/android/src/main/cpp/third_party/openssl/include/openssl/dsaerr.h +44 -0
  234. package/android/src/main/cpp/third_party/openssl/include/openssl/dtls1.h +57 -0
  235. package/android/src/main/cpp/third_party/openssl/include/openssl/e_os2.h +310 -0
  236. package/android/src/main/cpp/third_party/openssl/include/openssl/e_ostime.h +38 -0
  237. package/android/src/main/cpp/third_party/openssl/include/openssl/ebcdic.h +39 -0
  238. package/android/src/main/cpp/third_party/openssl/include/openssl/ec.h +1588 -0
  239. package/android/src/main/cpp/third_party/openssl/include/openssl/ecdh.h +10 -0
  240. package/android/src/main/cpp/third_party/openssl/include/openssl/ecdsa.h +10 -0
  241. package/android/src/main/cpp/third_party/openssl/include/openssl/ecerr.h +104 -0
  242. package/android/src/main/cpp/third_party/openssl/include/openssl/encoder.h +124 -0
  243. package/android/src/main/cpp/third_party/openssl/include/openssl/encodererr.h +28 -0
  244. package/android/src/main/cpp/third_party/openssl/include/openssl/engine.h +833 -0
  245. package/android/src/main/cpp/third_party/openssl/include/openssl/engineerr.h +63 -0
  246. package/android/src/main/cpp/third_party/openssl/include/openssl/err.h +512 -0
  247. package/android/src/main/cpp/third_party/openssl/include/openssl/err.h.in +501 -0
  248. package/android/src/main/cpp/third_party/openssl/include/openssl/ess.h +128 -0
  249. package/android/src/main/cpp/third_party/openssl/include/openssl/ess.h.in +81 -0
  250. package/android/src/main/cpp/third_party/openssl/include/openssl/esserr.h +32 -0
  251. package/android/src/main/cpp/third_party/openssl/include/openssl/evp.h +2310 -0
  252. package/android/src/main/cpp/third_party/openssl/include/openssl/evperr.h +142 -0
  253. package/android/src/main/cpp/third_party/openssl/include/openssl/fips_names.h +50 -0
  254. package/android/src/main/cpp/third_party/openssl/include/openssl/fipskey.h +41 -0
  255. package/android/src/main/cpp/third_party/openssl/include/openssl/fipskey.h.in +40 -0
  256. package/android/src/main/cpp/third_party/openssl/include/openssl/hmac.h +62 -0
  257. package/android/src/main/cpp/third_party/openssl/include/openssl/hpke.h +169 -0
  258. package/android/src/main/cpp/third_party/openssl/include/openssl/http.h +119 -0
  259. package/android/src/main/cpp/third_party/openssl/include/openssl/httperr.h +56 -0
  260. package/android/src/main/cpp/third_party/openssl/include/openssl/idea.h +82 -0
  261. package/android/src/main/cpp/third_party/openssl/include/openssl/indicator.h +31 -0
  262. package/android/src/main/cpp/third_party/openssl/include/openssl/kdf.h +138 -0
  263. package/android/src/main/cpp/third_party/openssl/include/openssl/kdferr.h +16 -0
  264. package/android/src/main/cpp/third_party/openssl/include/openssl/lhash.h +398 -0
  265. package/android/src/main/cpp/third_party/openssl/include/openssl/lhash.h.in +373 -0
  266. package/android/src/main/cpp/third_party/openssl/include/openssl/macros.h +349 -0
  267. package/android/src/main/cpp/third_party/openssl/include/openssl/md2.h +56 -0
  268. package/android/src/main/cpp/third_party/openssl/include/openssl/md4.h +63 -0
  269. package/android/src/main/cpp/third_party/openssl/include/openssl/md5.h +62 -0
  270. package/android/src/main/cpp/third_party/openssl/include/openssl/mdc2.h +55 -0
  271. package/android/src/main/cpp/third_party/openssl/include/openssl/ml_kem.h +31 -0
  272. package/android/src/main/cpp/third_party/openssl/include/openssl/modes.h +219 -0
  273. package/android/src/main/cpp/third_party/openssl/include/openssl/obj_mac.h +6636 -0
  274. package/android/src/main/cpp/third_party/openssl/include/openssl/objects.h +184 -0
  275. package/android/src/main/cpp/third_party/openssl/include/openssl/objectserr.h +28 -0
  276. package/android/src/main/cpp/third_party/openssl/include/openssl/ocsp.h +483 -0
  277. package/android/src/main/cpp/third_party/openssl/include/openssl/ocsp.h.in +387 -0
  278. package/android/src/main/cpp/third_party/openssl/include/openssl/ocsperr.h +53 -0
  279. package/android/src/main/cpp/third_party/openssl/include/openssl/opensslconf.h +17 -0
  280. package/android/src/main/cpp/third_party/openssl/include/openssl/opensslv.h +114 -0
  281. package/android/src/main/cpp/third_party/openssl/include/openssl/opensslv.h.in +113 -0
  282. package/android/src/main/cpp/third_party/openssl/include/openssl/ossl_typ.h +16 -0
  283. package/android/src/main/cpp/third_party/openssl/include/openssl/param_build.h +63 -0
  284. package/android/src/main/cpp/third_party/openssl/include/openssl/params.h +163 -0
  285. package/android/src/main/cpp/third_party/openssl/include/openssl/pem.h +547 -0
  286. package/android/src/main/cpp/third_party/openssl/include/openssl/pem2.h +19 -0
  287. package/android/src/main/cpp/third_party/openssl/include/openssl/pemerr.h +59 -0
  288. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs12.h +366 -0
  289. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs12.h.in +343 -0
  290. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs12err.h +46 -0
  291. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs7.h +430 -0
  292. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs7.h.in +359 -0
  293. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs7err.h +63 -0
  294. package/android/src/main/cpp/third_party/openssl/include/openssl/prov_ssl.h +38 -0
  295. package/android/src/main/cpp/third_party/openssl/include/openssl/proverr.h +169 -0
  296. package/android/src/main/cpp/third_party/openssl/include/openssl/provider.h +94 -0
  297. package/android/src/main/cpp/third_party/openssl/include/openssl/quic.h +75 -0
  298. package/android/src/main/cpp/third_party/openssl/include/openssl/rand.h +131 -0
  299. package/android/src/main/cpp/third_party/openssl/include/openssl/randerr.h +70 -0
  300. package/android/src/main/cpp/third_party/openssl/include/openssl/rc2.h +68 -0
  301. package/android/src/main/cpp/third_party/openssl/include/openssl/rc4.h +47 -0
  302. package/android/src/main/cpp/third_party/openssl/include/openssl/rc5.h +79 -0
  303. package/android/src/main/cpp/third_party/openssl/include/openssl/ripemd.h +59 -0
  304. package/android/src/main/cpp/third_party/openssl/include/openssl/rsa.h +615 -0
  305. package/android/src/main/cpp/third_party/openssl/include/openssl/rsaerr.h +107 -0
  306. package/android/src/main/cpp/third_party/openssl/include/openssl/safestack.h +297 -0
  307. package/android/src/main/cpp/third_party/openssl/include/openssl/safestack.h.in +227 -0
  308. package/android/src/main/cpp/third_party/openssl/include/openssl/seed.h +113 -0
  309. package/android/src/main/cpp/third_party/openssl/include/openssl/self_test.h +112 -0
  310. package/android/src/main/cpp/third_party/openssl/include/openssl/sha.h +139 -0
  311. package/android/src/main/cpp/third_party/openssl/include/openssl/srp.h +285 -0
  312. package/android/src/main/cpp/third_party/openssl/include/openssl/srp.h.in +214 -0
  313. package/android/src/main/cpp/third_party/openssl/include/openssl/srtp.h +68 -0
  314. package/android/src/main/cpp/third_party/openssl/include/openssl/ssl.h +2933 -0
  315. package/android/src/main/cpp/third_party/openssl/include/openssl/ssl.h.in +2886 -0
  316. package/android/src/main/cpp/third_party/openssl/include/openssl/ssl2.h +30 -0
  317. package/android/src/main/cpp/third_party/openssl/include/openssl/ssl3.h +358 -0
  318. package/android/src/main/cpp/third_party/openssl/include/openssl/sslerr.h +382 -0
  319. package/android/src/main/cpp/third_party/openssl/include/openssl/sslerr_legacy.h +467 -0
  320. package/android/src/main/cpp/third_party/openssl/include/openssl/stack.h +90 -0
  321. package/android/src/main/cpp/third_party/openssl/include/openssl/store.h +377 -0
  322. package/android/src/main/cpp/third_party/openssl/include/openssl/storeerr.h +49 -0
  323. package/android/src/main/cpp/third_party/openssl/include/openssl/symhacks.h +39 -0
  324. package/android/src/main/cpp/third_party/openssl/include/openssl/thread.h +31 -0
  325. package/android/src/main/cpp/third_party/openssl/include/openssl/tls1.h +1220 -0
  326. package/android/src/main/cpp/third_party/openssl/include/openssl/trace.h +321 -0
  327. package/android/src/main/cpp/third_party/openssl/include/openssl/ts.h +522 -0
  328. package/android/src/main/cpp/third_party/openssl/include/openssl/tserr.h +67 -0
  329. package/android/src/main/cpp/third_party/openssl/include/openssl/txt_db.h +63 -0
  330. package/android/src/main/cpp/third_party/openssl/include/openssl/types.h +248 -0
  331. package/android/src/main/cpp/third_party/openssl/include/openssl/ui.h +407 -0
  332. package/android/src/main/cpp/third_party/openssl/include/openssl/ui.h.in +384 -0
  333. package/android/src/main/cpp/third_party/openssl/include/openssl/uierr.h +38 -0
  334. package/android/src/main/cpp/third_party/openssl/include/openssl/whrlpool.h +62 -0
  335. package/android/src/main/cpp/third_party/openssl/include/openssl/x509.h +1303 -0
  336. package/android/src/main/cpp/third_party/openssl/include/openssl/x509.h.in +1109 -0
  337. package/android/src/main/cpp/third_party/openssl/include/openssl/x509_acert.h +294 -0
  338. package/android/src/main/cpp/third_party/openssl/include/openssl/x509_acert.h.in +199 -0
  339. package/android/src/main/cpp/third_party/openssl/include/openssl/x509_vfy.h +903 -0
  340. package/android/src/main/cpp/third_party/openssl/include/openssl/x509_vfy.h.in +806 -0
  341. package/android/src/main/cpp/third_party/openssl/include/openssl/x509err.h +70 -0
  342. package/android/src/main/cpp/third_party/openssl/include/openssl/x509v3.h +1968 -0
  343. package/android/src/main/cpp/third_party/openssl/include/openssl/x509v3.h.in +1367 -0
  344. package/android/src/main/cpp/third_party/openssl/include/openssl/x509v3err.h +97 -0
  345. package/android/src/main/cpp/third_party/pair_ap/pair-internal.h +390 -0
  346. package/android/src/main/cpp/third_party/pair_ap/pair-tlv.c +221 -0
  347. package/android/src/main/cpp/third_party/pair_ap/pair-tlv.h +77 -0
  348. package/android/src/main/cpp/third_party/pair_ap/pair.c +806 -0
  349. package/android/src/main/cpp/third_party/pair_ap/pair.h +266 -0
  350. package/android/src/main/cpp/third_party/pair_ap/pair_fruit_stub.c +36 -0
  351. package/android/src/main/cpp/third_party/pair_ap/pair_homekit.c +3190 -0
  352. package/android/src/main/cpp/third_party/signalsmith/LICENSE-signalsmith-linear.txt +21 -0
  353. package/android/src/main/cpp/third_party/signalsmith/LICENSE-signalsmith-stretch.txt +21 -0
  354. package/android/src/main/cpp/third_party/signalsmith/THIRD_PARTY_VERSIONS.txt +9 -0
  355. package/android/src/main/cpp/third_party/signalsmith/include/signalsmith-linear/fft.h +1380 -0
  356. package/android/src/main/cpp/third_party/signalsmith/include/signalsmith-linear/linear.h +1075 -0
  357. package/android/src/main/cpp/third_party/signalsmith/include/signalsmith-linear/stft.h +643 -0
  358. package/android/src/main/cpp/third_party/signalsmith/include/signalsmith-stretch.h +1060 -0
  359. package/android/src/main/java/com/margelo/nitro/queueplayer/AirPlayEngine.kt +314 -0
  360. package/android/src/main/java/com/margelo/nitro/queueplayer/ArtworkContentProvider.kt +124 -0
  361. package/android/src/main/java/com/margelo/nitro/queueplayer/AudioFocusErrorMapping.kt +89 -0
  362. package/android/src/main/java/com/margelo/nitro/queueplayer/AudioPipelineRenderersFactory.kt +60 -0
  363. package/android/src/main/java/com/margelo/nitro/queueplayer/BrowseCallbackRegistry.kt +136 -0
  364. package/android/src/main/java/com/margelo/nitro/queueplayer/BrowseDataProvider.kt +128 -0
  365. package/android/src/main/java/com/margelo/nitro/queueplayer/BufferStateTranslator.kt +35 -0
  366. package/android/src/main/java/com/margelo/nitro/queueplayer/CacheMimeTypes.kt +79 -0
  367. package/android/src/main/java/com/margelo/nitro/queueplayer/CastManager.kt +629 -0
  368. package/android/src/main/java/com/margelo/nitro/queueplayer/CrossfadeEngine.kt +1350 -0
  369. package/android/src/main/java/com/margelo/nitro/queueplayer/CrossfadeForwardingPlayer.kt +66 -0
  370. package/android/src/main/java/com/margelo/nitro/queueplayer/CustomPresetStore.kt +100 -0
  371. package/android/src/main/java/com/margelo/nitro/queueplayer/Equalizer.kt +348 -0
  372. package/android/src/main/java/com/margelo/nitro/queueplayer/EqualizerEngine.kt +222 -0
  373. package/android/src/main/java/com/margelo/nitro/queueplayer/EqualizerLegacyEngine.kt +213 -0
  374. package/android/src/main/java/com/margelo/nitro/queueplayer/EqualizerPresets.kt +45 -0
  375. package/android/src/main/java/com/margelo/nitro/queueplayer/FFTProcessorTee.kt +173 -0
  376. package/android/src/main/java/com/margelo/nitro/queueplayer/FifoCacheEvictor.kt +96 -0
  377. package/android/src/main/java/com/margelo/nitro/queueplayer/GaplessEngine.kt +587 -0
  378. package/android/src/main/java/com/margelo/nitro/queueplayer/HeadlessJsMediaService.kt +220 -0
  379. package/android/src/main/java/com/margelo/nitro/queueplayer/IEqualizerEngine.kt +97 -0
  380. package/android/src/main/java/com/margelo/nitro/queueplayer/ListenerRegistry.kt +59 -0
  381. package/android/src/main/java/com/margelo/nitro/queueplayer/LookaheadCache.kt +343 -0
  382. package/android/src/main/java/com/margelo/nitro/queueplayer/LookaheadCacheWriter.kt +533 -0
  383. package/android/src/main/java/com/margelo/nitro/queueplayer/MediaButtonDispatch.kt +88 -0
  384. package/android/src/main/java/com/margelo/nitro/queueplayer/MediaItemBuilder.kt +281 -0
  385. package/android/src/main/java/com/margelo/nitro/queueplayer/MediaItemMapper.kt +76 -0
  386. package/android/src/main/java/com/margelo/nitro/queueplayer/MilestoneTracker.kt +66 -0
  387. package/android/src/main/java/com/margelo/nitro/queueplayer/MimeCapturingDataSource.kt +64 -0
  388. package/android/src/main/java/com/margelo/nitro/queueplayer/MultiplexingAudioBufferSink.kt +92 -0
  389. package/android/src/main/java/com/margelo/nitro/queueplayer/NotificationProvider.kt +37 -0
  390. package/android/src/main/java/com/margelo/nitro/queueplayer/NowPlayingFormatExtractor.kt +166 -0
  391. package/android/src/main/java/com/margelo/nitro/queueplayer/PendingBrowseRequests.kt +70 -0
  392. package/android/src/main/java/com/margelo/nitro/queueplayer/PendingIntentBuffer.kt +82 -0
  393. package/android/src/main/java/com/margelo/nitro/queueplayer/PitchAwareAudioProcessorChain.kt +69 -0
  394. package/android/src/main/java/com/margelo/nitro/queueplayer/PitchCorrection.kt +27 -0
  395. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaceholderArtwork.kt +65 -0
  396. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaceholderFallbackBitmapLoader.kt +75 -0
  397. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaybackEngine.kt +336 -0
  398. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaybackErrorMapping.kt +175 -0
  399. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaybackModeStateMachine.kt +127 -0
  400. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaybackService.kt +1716 -0
  401. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaybackServiceCallback.kt +755 -0
  402. package/android/src/main/java/com/margelo/nitro/queueplayer/ProgressEmissionGate.kt +70 -0
  403. package/android/src/main/java/com/margelo/nitro/queueplayer/QueueMutationArithmetic.kt +131 -0
  404. package/android/src/main/java/com/margelo/nitro/queueplayer/QueuePlayerPackage.kt +22 -0
  405. package/android/src/main/java/com/margelo/nitro/queueplayer/QueueSkipArithmetic.kt +113 -0
  406. package/android/src/main/java/com/margelo/nitro/queueplayer/RadixTwoFFT.kt +176 -0
  407. package/android/src/main/java/com/margelo/nitro/queueplayer/RemoteCommandDeduper.kt +81 -0
  408. package/android/src/main/java/com/margelo/nitro/queueplayer/ReplayGainAudioProcessor.kt +84 -0
  409. package/android/src/main/java/com/margelo/nitro/queueplayer/ReplayGainConfig.kt +34 -0
  410. package/android/src/main/java/com/margelo/nitro/queueplayer/ReplayGainData.kt +44 -0
  411. package/android/src/main/java/com/margelo/nitro/queueplayer/ReplayGainExtractor.kt +209 -0
  412. package/android/src/main/java/com/margelo/nitro/queueplayer/ReplayGainGain.kt +34 -0
  413. package/android/src/main/java/com/margelo/nitro/queueplayer/SearchResultCache.kt +72 -0
  414. package/android/src/main/java/com/margelo/nitro/queueplayer/SessionCommandForwardingPlayer.kt +167 -0
  415. package/android/src/main/java/com/margelo/nitro/queueplayer/SignalsmithStretchAudioProcessor.kt +225 -0
  416. package/android/src/main/java/com/margelo/nitro/queueplayer/SignalsmithStretchNative.kt +93 -0
  417. package/android/src/main/java/com/margelo/nitro/queueplayer/SleepTimerCore.kt +125 -0
  418. package/android/src/main/java/com/margelo/nitro/queueplayer/TrackPlayer.kt +4242 -0
  419. package/android/src/main/java/com/margelo/nitro/queueplayer/TransportStateTranslator.kt +70 -0
  420. package/android/src/main/java/com/margelo/nitro/queueplayer/UrlSchemes.kt +9 -0
  421. package/android/src/main/java/com/margelo/nitro/queueplayer/VisualizationGate.kt +35 -0
  422. package/android/src/main/java/com/margelo/nitro/queueplayer/Visualizer.kt +240 -0
  423. package/android/src/main/java/com/margelo/nitro/queueplayer/VisualizerTeeBuilder.kt +63 -0
  424. package/android/src/main/java/com/margelo/nitro/queueplayer/VoiceSearchExtrasParser.kt +103 -0
  425. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/AudioRouteState.kt +202 -0
  426. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/AuthRequiredException.kt +14 -0
  427. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastBackend.kt +41 -0
  428. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastBackends.kt +56 -0
  429. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastEventBridge.kt +122 -0
  430. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastMediaItem.kt +20 -0
  431. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastSession.kt +193 -0
  432. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastSinkRouter.kt +95 -0
  433. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastTransportRouter.kt +151 -0
  434. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/DiscoveryState.kt +53 -0
  435. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/MetadataAwareSession.kt +17 -0
  436. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/PlaybackStateRouter.kt +65 -0
  437. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/Receiver.kt +35 -0
  438. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlay2JNI.kt +129 -0
  439. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlay2MetadataSync.kt +189 -0
  440. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlay2Session.kt +123 -0
  441. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlay2Sink.kt +205 -0
  442. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayBackend.kt +585 -0
  443. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayBackendInitializer.kt +43 -0
  444. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayDiscovery.kt +511 -0
  445. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayDiscoveryLifecycleObserver.kt +57 -0
  446. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayMetadataSync.kt +199 -0
  447. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayReceiverMapper.kt +42 -0
  448. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayRenderersFactory.kt +43 -0
  449. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlaySession.kt +101 -0
  450. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlaySink.kt +265 -0
  451. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayTxtParser.kt +203 -0
  452. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirplayJNI.kt +106 -0
  453. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/MulticastLockHolder.kt +75 -0
  454. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/CastMediaItemConverter.kt +67 -0
  455. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/CastVolumeForwardingPlayer.kt +156 -0
  456. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/ChromecastBackend.kt +171 -0
  457. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/ChromecastOptionsProvider.kt +51 -0
  458. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/ChromecastReceiverMapper.kt +44 -0
  459. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/ChromecastSession.kt +544 -0
  460. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/MediaInfoBuilder.kt +92 -0
  461. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/RemoteMediaCallbacks.kt +113 -0
  462. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/http/LocalMediaServer.kt +160 -0
  463. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/http/LocalMediaServerLifecycle.kt +15 -0
  464. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/http/MediaServerHandle.kt +44 -0
  465. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/http/MediaTokenRegistry.kt +37 -0
  466. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/http/MimeTypes.kt +27 -0
  467. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/net/LocalAddressMonitor.kt +86 -0
  468. package/android/src/main/res/raw/rnqp_placeholder.jpg +0 -0
  469. package/android/src/main/res/values/cast_strings.xml +15 -0
  470. package/android/src/main/res/values/strings.xml +24 -0
  471. package/android/src/main/res/xml/automotive_app_desc.xml +15 -0
  472. package/android/src/test/java/androidx/media3/session/MediaSessionControllerRequestTestSeam.kt +27 -0
  473. package/android/src/test/java/com/margelo/nitro/queueplayer/ArtworkContentProviderTest.kt +124 -0
  474. package/android/src/test/java/com/margelo/nitro/queueplayer/AudioFocusErrorMappingTest.kt +122 -0
  475. package/android/src/test/java/com/margelo/nitro/queueplayer/AudioPipelineRenderersFactoryTest.kt +57 -0
  476. package/android/src/test/java/com/margelo/nitro/queueplayer/AvrcpMetadataTest.kt +264 -0
  477. package/android/src/test/java/com/margelo/nitro/queueplayer/BrowseCallbackRegistryTest.kt +104 -0
  478. package/android/src/test/java/com/margelo/nitro/queueplayer/BrowseDataProviderTest.kt +276 -0
  479. package/android/src/test/java/com/margelo/nitro/queueplayer/BufferStateTranslatorTest.kt +58 -0
  480. package/android/src/test/java/com/margelo/nitro/queueplayer/CacheMimeTypesTest.kt +116 -0
  481. package/android/src/test/java/com/margelo/nitro/queueplayer/CrossfadeEngineLifecycleTest.kt +214 -0
  482. package/android/src/test/java/com/margelo/nitro/queueplayer/CrossfadeEngineReplayGainTest.kt +180 -0
  483. package/android/src/test/java/com/margelo/nitro/queueplayer/CustomPresetStoreTest.kt +128 -0
  484. package/android/src/test/java/com/margelo/nitro/queueplayer/EqualizerEngineTest.kt +223 -0
  485. package/android/src/test/java/com/margelo/nitro/queueplayer/EqualizerKtTest.kt +274 -0
  486. package/android/src/test/java/com/margelo/nitro/queueplayer/EqualizerLegacyEngineTest.kt +214 -0
  487. package/android/src/test/java/com/margelo/nitro/queueplayer/EqualizerPresetsTest.kt +89 -0
  488. package/android/src/test/java/com/margelo/nitro/queueplayer/FFTProcessorTeeTest.kt +185 -0
  489. package/android/src/test/java/com/margelo/nitro/queueplayer/FifoCacheEvictorTest.kt +112 -0
  490. package/android/src/test/java/com/margelo/nitro/queueplayer/ForwardingPlayerTestAccess.kt +21 -0
  491. package/android/src/test/java/com/margelo/nitro/queueplayer/GaplessEngineLifecycleTest.kt +65 -0
  492. package/android/src/test/java/com/margelo/nitro/queueplayer/GaplessEngineReplayGainTest.kt +154 -0
  493. package/android/src/test/java/com/margelo/nitro/queueplayer/HeadlessJsMediaServiceTest.kt +106 -0
  494. package/android/src/test/java/com/margelo/nitro/queueplayer/LookaheadCacheTest.kt +183 -0
  495. package/android/src/test/java/com/margelo/nitro/queueplayer/LookaheadCacheWriterTest.kt +649 -0
  496. package/android/src/test/java/com/margelo/nitro/queueplayer/MediaButtonDispatchTest.kt +192 -0
  497. package/android/src/test/java/com/margelo/nitro/queueplayer/MediaItemBuilderTest.kt +389 -0
  498. package/android/src/test/java/com/margelo/nitro/queueplayer/MediaItemMapperTest.kt +145 -0
  499. package/android/src/test/java/com/margelo/nitro/queueplayer/MilestoneTrackerTest.kt +81 -0
  500. package/android/src/test/java/com/margelo/nitro/queueplayer/MultiplexingAudioBufferSinkTest.kt +112 -0
  501. package/android/src/test/java/com/margelo/nitro/queueplayer/NotificationProviderTest.kt +86 -0
  502. package/android/src/test/java/com/margelo/nitro/queueplayer/NowPlayingFormatExtractorTest.kt +106 -0
  503. package/android/src/test/java/com/margelo/nitro/queueplayer/PendingBrowseRequestsTest.kt +82 -0
  504. package/android/src/test/java/com/margelo/nitro/queueplayer/PendingIntentBufferTest.kt +192 -0
  505. package/android/src/test/java/com/margelo/nitro/queueplayer/PitchAwareAudioProcessorChainTest.kt +147 -0
  506. package/android/src/test/java/com/margelo/nitro/queueplayer/PitchCorrectionTest.kt +55 -0
  507. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaceholderFallbackBitmapLoaderTest.kt +187 -0
  508. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackEngineInterfaceTest.kt +134 -0
  509. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackModeStateMachineTest.kt +157 -0
  510. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceArtworkLoaderTest.kt +95 -0
  511. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceCallbackBrowseTest.kt +480 -0
  512. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceCallbackSearchTest.kt +171 -0
  513. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceCallbackTest.kt +773 -0
  514. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceCastBindTest.kt +100 -0
  515. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceLifecycleTest.kt +315 -0
  516. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceSessionActivityTest.kt +121 -0
  517. package/android/src/test/java/com/margelo/nitro/queueplayer/PlayerCommandsForTest.kt +246 -0
  518. package/android/src/test/java/com/margelo/nitro/queueplayer/ProgressEmissionGateTest.kt +113 -0
  519. package/android/src/test/java/com/margelo/nitro/queueplayer/QueueMutationArithmeticTest.kt +252 -0
  520. package/android/src/test/java/com/margelo/nitro/queueplayer/QueueSkipArithmeticTest.kt +343 -0
  521. package/android/src/test/java/com/margelo/nitro/queueplayer/RadixTwoFFTTest.kt +109 -0
  522. package/android/src/test/java/com/margelo/nitro/queueplayer/RemoteCommandDeduperTest.kt +106 -0
  523. package/android/src/test/java/com/margelo/nitro/queueplayer/ReplayGainAudioProcessorTest.kt +141 -0
  524. package/android/src/test/java/com/margelo/nitro/queueplayer/ReplayGainConfigTest.kt +103 -0
  525. package/android/src/test/java/com/margelo/nitro/queueplayer/ReplayGainExtractorTest.kt +469 -0
  526. package/android/src/test/java/com/margelo/nitro/queueplayer/ReplayGainGainTest.kt +129 -0
  527. package/android/src/test/java/com/margelo/nitro/queueplayer/RobolectricServiceBindHelper.kt +83 -0
  528. package/android/src/test/java/com/margelo/nitro/queueplayer/SearchResultCacheTest.kt +128 -0
  529. package/android/src/test/java/com/margelo/nitro/queueplayer/ServiceReadyReasonTest.kt +42 -0
  530. package/android/src/test/java/com/margelo/nitro/queueplayer/SessionCommandForwardingPlayerTest.kt +521 -0
  531. package/android/src/test/java/com/margelo/nitro/queueplayer/SleepTimerCoreTest.kt +125 -0
  532. package/android/src/test/java/com/margelo/nitro/queueplayer/SmokeTest.kt +27 -0
  533. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerAirPlayMetadataWiringTest.kt +305 -0
  534. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerAudioFocusTest.kt +179 -0
  535. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerEventsTest.kt +497 -0
  536. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerLifecycleTest.kt +209 -0
  537. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerLookaheadConfigTest.kt +417 -0
  538. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerMutationTest.kt +473 -0
  539. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerPitchCorrectionTest.kt +61 -0
  540. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerPlaybackModeTest.kt +28 -0
  541. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerProgressThrottleTest.kt +89 -0
  542. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerQueueTest.kt +290 -0
  543. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerReadersTest.kt +151 -0
  544. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerReplayGainTest.kt +69 -0
  545. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerSkipCapabilityTest.kt +324 -0
  546. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerSkipTest.kt +287 -0
  547. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerSourceClassifierTest.kt +82 -0
  548. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerTransportTest.kt +222 -0
  549. package/android/src/test/java/com/margelo/nitro/queueplayer/TransportStateTranslatorTest.kt +287 -0
  550. package/android/src/test/java/com/margelo/nitro/queueplayer/VisualizationGateTest.kt +96 -0
  551. package/android/src/test/java/com/margelo/nitro/queueplayer/VisualizerKtTest.kt +202 -0
  552. package/android/src/test/java/com/margelo/nitro/queueplayer/VoiceSearchExtrasParserTest.kt +211 -0
  553. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/CastSinkRouterTest.kt +120 -0
  554. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/FakeRemotePlayer.kt +62 -0
  555. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/PlaybackStateRouterTest.kt +43 -0
  556. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayDiscoveryFilterTest.kt +86 -0
  557. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayTxtParserClassificationTest.kt +34 -0
  558. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/chromecast/CastMediaItemConverterTest.kt +78 -0
  559. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/chromecast/CastVolumeForwardingPlayerTest.kt +176 -0
  560. package/app.plugin.js +466 -0
  561. package/ios/AVPlayerItemQueueItemId.swift +61 -0
  562. package/ios/AVQueueBuilder.swift +200 -0
  563. package/ios/Array+SafeSubscript.swift +6 -0
  564. package/ios/ArtworkLoader.swift +136 -0
  565. package/ios/ArtworkResolver.swift +87 -0
  566. package/ios/AudioCategoryMapping.swift +48 -0
  567. package/ios/AudioSession.swift +220 -0
  568. package/ios/AudioSessionError.swift +44 -0
  569. package/ios/AudioTapProvider.swift +647 -0
  570. package/ios/BiquadCoefficients.swift +80 -0
  571. package/ios/CarPlayBridge.swift +178 -0
  572. package/ios/CarPlayBrowseBuilder.swift +368 -0
  573. package/ios/CarPlayBrowseDataProvider.swift +162 -0
  574. package/ios/CarPlayCoordinator.swift +42 -0
  575. package/ios/CarPlaySceneDelegate.swift +199 -0
  576. package/ios/Cast/AirPlayRouteState.swift +281 -0
  577. package/ios/Cast/Chromecast/ChromecastDiscoveryAdapter.swift +27 -0
  578. package/ios/Cast/Chromecast/ChromecastReceiverMapper.swift +48 -0
  579. package/ios/Cast/Chromecast/ChromecastSession.swift +740 -0
  580. package/ios/Cast/Chromecast/ChromecastSessionAdapter.swift +114 -0
  581. package/ios/Cast/Chromecast/ChromecastSupport.swift +63 -0
  582. package/ios/Cast/Chromecast/MediaInfoBuilder.swift +104 -0
  583. package/ios/Cast/Chromecast/RemoteMediaObserver.swift +147 -0
  584. package/ios/Cast/Core/CastEventBridge.swift +210 -0
  585. package/ios/Cast/Core/CastMediaItem.swift +41 -0
  586. package/ios/Cast/Core/CastNowPlayingController.swift +310 -0
  587. package/ios/Cast/Core/CastReceiverState.swift +22 -0
  588. package/ios/Cast/Core/CastSession.swift +147 -0
  589. package/ios/Cast/Core/CastTransportRouter.swift +162 -0
  590. package/ios/Cast/Core/ChromecastBackend.swift +259 -0
  591. package/ios/Cast/Core/LocalAddressMonitor.swift +110 -0
  592. package/ios/Cast/Core/LocalMediaServer.swift +270 -0
  593. package/ios/Cast/Core/LocalNetworkPermissionProbe.swift +265 -0
  594. package/ios/Cast/Core/MediaHTTPConnection.swift +349 -0
  595. package/ios/Cast/Core/MediaServerHandle.swift +49 -0
  596. package/ios/Cast/Core/MediaTokenRegistry.swift +51 -0
  597. package/ios/Cast/Core/MimeTypes.swift +26 -0
  598. package/ios/Cast/Core/PlaybackStateRouter.swift +123 -0
  599. package/ios/CastManager.swift +493 -0
  600. package/ios/CrossfadeEngine.swift +1343 -0
  601. package/ios/CustomPresetStore.swift +78 -0
  602. package/ios/EQProcessor.swift +321 -0
  603. package/ios/EQTap.swift +241 -0
  604. package/ios/Equalizer.swift +321 -0
  605. package/ios/EqualizerPresets.swift +48 -0
  606. package/ios/FFTProcessor.swift +237 -0
  607. package/ios/GaplessEngine.swift +385 -0
  608. package/ios/InputGuards.swift +63 -0
  609. package/ios/InterruptionEventMapping.swift +51 -0
  610. package/ios/ListenerRegistry.swift +73 -0
  611. package/ios/LookaheadCache.swift +833 -0
  612. package/ios/LookaheadCacheEviction.swift +83 -0
  613. package/ios/LookaheadCachePrefetcher.swift +503 -0
  614. package/ios/MetadataReader.swift +555 -0
  615. package/ios/MilestoneTracker.swift +63 -0
  616. package/ios/NowPlayingFormatExtractor.swift +362 -0
  617. package/ios/NowPlayingInfo.swift +190 -0
  618. package/ios/OutputRouteMonitor.swift +125 -0
  619. package/ios/PendingBrowseRequests.swift +62 -0
  620. package/ios/PitchAlgorithm.swift +24 -0
  621. package/ios/PlaceholderArtwork.swift +46 -0
  622. package/ios/PlaybackEngine.swift +319 -0
  623. package/ios/PlaybackErrorMapping.swift +195 -0
  624. package/ios/PlaybackModeStateMachine.swift +159 -0
  625. package/ios/PlayerStateDerivation.swift +45 -0
  626. package/ios/ProgressEmissionGate.swift +54 -0
  627. package/ios/QueueMutationArithmetic.swift +129 -0
  628. package/ios/QueueSkipArithmetic.swift +109 -0
  629. package/ios/QueueState.swift +49 -0
  630. package/ios/RemoteCommands.swift +229 -0
  631. package/ios/ReplayGainData.swift +58 -0
  632. package/ios/ReplayGainExtractor.swift +82 -0
  633. package/ios/ReplayGainProcessor.swift +46 -0
  634. package/ios/Resources/RNQP-placeholder.jpg +0 -0
  635. package/ios/Resources/silence.m4a +0 -0
  636. package/ios/Siri/PendingIntentBuffer.swift +100 -0
  637. package/ios/Siri/PlayMediaIntentHandler.swift +283 -0
  638. package/ios/Siri/QueuePlayerMediaIntents.swift +45 -0
  639. package/ios/Siri/VoiceDonation.swift +50 -0
  640. package/ios/SleepTimerCore.swift +128 -0
  641. package/ios/StreamingBitrateProbe.swift +318 -0
  642. package/ios/Tests/AVQueueBuilderTests.swift +430 -0
  643. package/ios/Tests/ArtworkResolverTests.swift +540 -0
  644. package/ios/Tests/AudioSessionTests.swift +222 -0
  645. package/ios/Tests/AudioTapProviderReplayGainTests.swift +136 -0
  646. package/ios/Tests/AudioTapProviderVisualizationFlagTests.swift +104 -0
  647. package/ios/Tests/BiquadCoefficientsTests.swift +84 -0
  648. package/ios/Tests/CarPlayBridgeTests.swift +91 -0
  649. package/ios/Tests/CarPlayBrowseBuilderTests.swift +221 -0
  650. package/ios/Tests/CarPlayBrowseDataProviderTests.swift +218 -0
  651. package/ios/Tests/CastNowPlayingControllerTests.swift +204 -0
  652. package/ios/Tests/CrossfadeEngineStubTests.swift +43 -0
  653. package/ios/Tests/EQProcessorTests.swift +302 -0
  654. package/ios/Tests/EQTapTests.swift +49 -0
  655. package/ios/Tests/EqualizerAudioMixProviderTests.swift +110 -0
  656. package/ios/Tests/EqualizerHybridTests.swift +303 -0
  657. package/ios/Tests/EqualizerPresetsTests.swift +69 -0
  658. package/ios/Tests/FFTProcessorTests.swift +303 -0
  659. package/ios/Tests/Fixtures/silence-aac-128.m4a +0 -0
  660. package/ios/Tests/Fixtures/silence-cbr-128.mp3 +0 -0
  661. package/ios/Tests/Fixtures/silence-vbr.mp3 +0 -0
  662. package/ios/Tests/GaplessEngineLifecycleTests.swift +160 -0
  663. package/ios/Tests/InputGuardsTests.swift +75 -0
  664. package/ios/Tests/InterruptionEventMappingTests.swift +91 -0
  665. package/ios/Tests/LookaheadCacheEvictionTests.swift +217 -0
  666. package/ios/Tests/LookaheadCachePrefetcherTests.swift +630 -0
  667. package/ios/Tests/LookaheadCacheRuntimeConfigTests.swift +247 -0
  668. package/ios/Tests/LookaheadCacheTests.swift +717 -0
  669. package/ios/Tests/MediaHTTPConnectionTests.swift +163 -0
  670. package/ios/Tests/MetadataReaderTests.swift +605 -0
  671. package/ios/Tests/MilestoneTrackerTests.swift +76 -0
  672. package/ios/Tests/NowPlayingFormatExtractorTests.swift +158 -0
  673. package/ios/Tests/NowPlayingInfoTests.swift +292 -0
  674. package/ios/Tests/PendingBrowseRequestsTests.swift +69 -0
  675. package/ios/Tests/PendingIntentBufferTests.swift +164 -0
  676. package/ios/Tests/PlaybackEngineProtocolTests.swift +92 -0
  677. package/ios/Tests/PlaybackErrorMappingTests.swift +179 -0
  678. package/ios/Tests/PlaybackModeStateMachineTests.swift +40 -0
  679. package/ios/Tests/PlaybackStateRouterTests.swift +178 -0
  680. package/ios/Tests/PlayerStateDerivationTests.swift +69 -0
  681. package/ios/Tests/ProgressEmissionGateTests.swift +113 -0
  682. package/ios/Tests/QueueMutationArithmeticTests.swift +245 -0
  683. package/ios/Tests/RemoteCommandsTests.swift +147 -0
  684. package/ios/Tests/ReplayGainExtractorTests.swift +197 -0
  685. package/ios/Tests/ReplayGainProcessorTests.swift +90 -0
  686. package/ios/Tests/SkipCapabilityTests.swift +98 -0
  687. package/ios/Tests/SkipIndexTests.swift +259 -0
  688. package/ios/Tests/SleepTimerCoreTests.swift +98 -0
  689. package/ios/Tests/StreamingBitrateProbeTests.swift +29 -0
  690. package/ios/Tests/TrackSourceClassifierTests.swift +50 -0
  691. package/ios/Tests/VoiceDonationTests.swift +26 -0
  692. package/ios/TrackPlayer.swift +4766 -0
  693. package/ios/Visualizer.swift +274 -0
  694. package/ios/WindowApplicationSceneDelegate.swift +59 -0
  695. package/ios/tests-harness/Podfile +56 -0
  696. package/ios/tests-harness/TestHost/App.swift +12 -0
  697. package/ios/tests-harness/TestHost/Info.plist +37 -0
  698. package/ios/tests-harness/TestHost.xcodeproj/project.pbxproj +472 -0
  699. package/ios/tests-harness/TestHost.xcodeproj/xcshareddata/xcschemes/TestHost.xcscheme +68 -0
  700. package/ios/tests-harness/package.json +10 -0
  701. package/ios/tests-harness/scripts/seed-xcodeproj.rb +118 -0
  702. package/lib/module/CastManager.nitro.js +4 -0
  703. package/lib/module/CastManager.nitro.js.map +1 -0
  704. package/lib/module/Equalizer.nitro.js +4 -0
  705. package/lib/module/Equalizer.nitro.js.map +1 -0
  706. package/lib/module/TrackPlayer.nitro.js +4 -0
  707. package/lib/module/TrackPlayer.nitro.js.map +1 -0
  708. package/lib/module/Visualizer.nitro.js +4 -0
  709. package/lib/module/Visualizer.nitro.js.map +1 -0
  710. package/lib/module/cast/index.js +156 -0
  711. package/lib/module/cast/index.js.map +1 -0
  712. package/lib/module/clients.js +43 -0
  713. package/lib/module/clients.js.map +1 -0
  714. package/lib/module/equalizer.js +85 -0
  715. package/lib/module/equalizer.js.map +1 -0
  716. package/lib/module/hooks/index.js +16 -0
  717. package/lib/module/hooks/index.js.map +1 -0
  718. package/lib/module/hooks/useActiveTrack.js +50 -0
  719. package/lib/module/hooks/useActiveTrack.js.map +1 -0
  720. package/lib/module/hooks/useAudioRoute.js +60 -0
  721. package/lib/module/hooks/useAudioRoute.js.map +1 -0
  722. package/lib/module/hooks/useBufferState.js +34 -0
  723. package/lib/module/hooks/useBufferState.js.map +1 -0
  724. package/lib/module/hooks/useCanSkip.js +67 -0
  725. package/lib/module/hooks/useCanSkip.js.map +1 -0
  726. package/lib/module/hooks/useCast.js +107 -0
  727. package/lib/module/hooks/useCast.js.map +1 -0
  728. package/lib/module/hooks/useEqualizer.js +91 -0
  729. package/lib/module/hooks/useEqualizer.js.map +1 -0
  730. package/lib/module/hooks/useFullyBuffered.js +33 -0
  731. package/lib/module/hooks/useFullyBuffered.js.map +1 -0
  732. package/lib/module/hooks/useLookaheadCache.js +49 -0
  733. package/lib/module/hooks/useLookaheadCache.js.map +1 -0
  734. package/lib/module/hooks/useNowPlayingFormat.js +42 -0
  735. package/lib/module/hooks/useNowPlayingFormat.js.map +1 -0
  736. package/lib/module/hooks/usePlaybackState.js +36 -0
  737. package/lib/module/hooks/usePlaybackState.js.map +1 -0
  738. package/lib/module/hooks/useProgress.js +31 -0
  739. package/lib/module/hooks/useProgress.js.map +1 -0
  740. package/lib/module/hooks/useSleepTimer.js +65 -0
  741. package/lib/module/hooks/useSleepTimer.js.map +1 -0
  742. package/lib/module/hooks/useVisualizerState.js +99 -0
  743. package/lib/module/hooks/useVisualizerState.js.map +1 -0
  744. package/lib/module/index.js +37 -0
  745. package/lib/module/index.js.map +1 -0
  746. package/lib/module/package.json +1 -0
  747. package/lib/module/playbackService.js +174 -0
  748. package/lib/module/playbackService.js.map +1 -0
  749. package/lib/module/types.js +592 -0
  750. package/lib/module/types.js.map +1 -0
  751. package/lib/typescript/CastManager.nitro.d.ts +154 -0
  752. package/lib/typescript/CastManager.nitro.d.ts.map +1 -0
  753. package/lib/typescript/Equalizer.nitro.d.ts +30 -0
  754. package/lib/typescript/Equalizer.nitro.d.ts.map +1 -0
  755. package/lib/typescript/TrackPlayer.nitro.d.ts +584 -0
  756. package/lib/typescript/TrackPlayer.nitro.d.ts.map +1 -0
  757. package/lib/typescript/Visualizer.nitro.d.ts +36 -0
  758. package/lib/typescript/Visualizer.nitro.d.ts.map +1 -0
  759. package/lib/typescript/cast/index.d.ts +65 -0
  760. package/lib/typescript/cast/index.d.ts.map +1 -0
  761. package/lib/typescript/clients.d.ts +9 -0
  762. package/lib/typescript/clients.d.ts.map +1 -0
  763. package/lib/typescript/equalizer.d.ts +45 -0
  764. package/lib/typescript/equalizer.d.ts.map +1 -0
  765. package/lib/typescript/hooks/index.d.ts +22 -0
  766. package/lib/typescript/hooks/index.d.ts.map +1 -0
  767. package/lib/typescript/hooks/useActiveTrack.d.ts +21 -0
  768. package/lib/typescript/hooks/useActiveTrack.d.ts.map +1 -0
  769. package/lib/typescript/hooks/useAudioRoute.d.ts +13 -0
  770. package/lib/typescript/hooks/useAudioRoute.d.ts.map +1 -0
  771. package/lib/typescript/hooks/useBufferState.d.ts +18 -0
  772. package/lib/typescript/hooks/useBufferState.d.ts.map +1 -0
  773. package/lib/typescript/hooks/useCanSkip.d.ts +43 -0
  774. package/lib/typescript/hooks/useCanSkip.d.ts.map +1 -0
  775. package/lib/typescript/hooks/useCast.d.ts +32 -0
  776. package/lib/typescript/hooks/useCast.d.ts.map +1 -0
  777. package/lib/typescript/hooks/useEqualizer.d.ts +20 -0
  778. package/lib/typescript/hooks/useEqualizer.d.ts.map +1 -0
  779. package/lib/typescript/hooks/useFullyBuffered.d.ts +15 -0
  780. package/lib/typescript/hooks/useFullyBuffered.d.ts.map +1 -0
  781. package/lib/typescript/hooks/useLookaheadCache.d.ts +13 -0
  782. package/lib/typescript/hooks/useLookaheadCache.d.ts.map +1 -0
  783. package/lib/typescript/hooks/useNowPlayingFormat.d.ts +18 -0
  784. package/lib/typescript/hooks/useNowPlayingFormat.d.ts.map +1 -0
  785. package/lib/typescript/hooks/usePlaybackState.d.ts +9 -0
  786. package/lib/typescript/hooks/usePlaybackState.d.ts.map +1 -0
  787. package/lib/typescript/hooks/useProgress.d.ts +15 -0
  788. package/lib/typescript/hooks/useProgress.d.ts.map +1 -0
  789. package/lib/typescript/hooks/useSleepTimer.d.ts +26 -0
  790. package/lib/typescript/hooks/useSleepTimer.d.ts.map +1 -0
  791. package/lib/typescript/hooks/useVisualizerState.d.ts +40 -0
  792. package/lib/typescript/hooks/useVisualizerState.d.ts.map +1 -0
  793. package/lib/typescript/index.d.ts +14 -0
  794. package/lib/typescript/index.d.ts.map +1 -0
  795. package/lib/typescript/package.json +1 -0
  796. package/lib/typescript/playbackService.d.ts +140 -0
  797. package/lib/typescript/playbackService.d.ts.map +1 -0
  798. package/lib/typescript/types.d.ts +1215 -0
  799. package/lib/typescript/types.d.ts.map +1 -0
  800. package/nitro.json +53 -0
  801. package/nitrogen/generated/android/c++/JAudioCategoryOptions.hpp +65 -0
  802. package/nitrogen/generated/android/c++/JAudioCodec.hpp +73 -0
  803. package/nitrogen/generated/android/c++/JAudioContainer.hpp +76 -0
  804. package/nitrogen/generated/android/c++/JAudioContentType.hpp +58 -0
  805. package/nitrogen/generated/android/c++/JAudioRoute.hpp +75 -0
  806. package/nitrogen/generated/android/c++/JAudioRouteKind.hpp +91 -0
  807. package/nitrogen/generated/android/c++/JBrowseItem.hpp +78 -0
  808. package/nitrogen/generated/android/c++/JBrowseSection.hpp +97 -0
  809. package/nitrogen/generated/android/c++/JBrowseSnapshot.hpp +87 -0
  810. package/nitrogen/generated/android/c++/JBufferState.hpp +64 -0
  811. package/nitrogen/generated/android/c++/JCacheStatus.hpp +92 -0
  812. package/nitrogen/generated/android/c++/JCastConfigureOptions.hpp +62 -0
  813. package/nitrogen/generated/android/c++/JCastConnectOptions.hpp +57 -0
  814. package/nitrogen/generated/android/c++/JCastDeviceKind.hpp +70 -0
  815. package/nitrogen/generated/android/c++/JCastDiscoveryState.hpp +57 -0
  816. package/nitrogen/generated/android/c++/JCastLocalNetworkPermission.hpp +61 -0
  817. package/nitrogen/generated/android/c++/JCastLocalNetworkPermissionEvent.hpp +58 -0
  818. package/nitrogen/generated/android/c++/JCastProtocol.hpp +67 -0
  819. package/nitrogen/generated/android/c++/JCastReceiver.hpp +89 -0
  820. package/nitrogen/generated/android/c++/JCastReceiverCapabilities.hpp +66 -0
  821. package/nitrogen/generated/android/c++/JCastRoute.hpp +85 -0
  822. package/nitrogen/generated/android/c++/JCastSessionDiedEvent.hpp +63 -0
  823. package/nitrogen/generated/android/c++/JCastSessionEndReason.hpp +76 -0
  824. package/nitrogen/generated/android/c++/JCastStreamingModel.hpp +58 -0
  825. package/nitrogen/generated/android/c++/JEqualizerBand.hpp +61 -0
  826. package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +76 -0
  827. package/nitrogen/generated/android/c++/JEvictionPolicy.hpp +58 -0
  828. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_BrowseItem______std__string.hpp +146 -0
  829. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______MediaSearchRequest.hpp +161 -0
  830. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______std__string.hpp +147 -0
  831. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  832. package/nitrogen/generated/android/c++/JFunc_void_AudioRoute.hpp +80 -0
  833. package/nitrogen/generated/android/c++/JFunc_void_BufferState.hpp +77 -0
  834. package/nitrogen/generated/android/c++/JFunc_void_CacheStatus.hpp +79 -0
  835. package/nitrogen/generated/android/c++/JFunc_void_CastDiscoveryState.hpp +77 -0
  836. package/nitrogen/generated/android/c++/JFunc_void_CastLocalNetworkPermissionEvent.hpp +79 -0
  837. package/nitrogen/generated/android/c++/JFunc_void_CastRoute.hpp +86 -0
  838. package/nitrogen/generated/android/c++/JFunc_void_CastSessionDiedEvent.hpp +80 -0
  839. package/nitrogen/generated/android/c++/JFunc_void_PlaybackError.hpp +80 -0
  840. package/nitrogen/generated/android/c++/JFunc_void_PlayerProgress.hpp +77 -0
  841. package/nitrogen/generated/android/c++/JFunc_void_PlayerState_StateChangeReason.hpp +79 -0
  842. package/nitrogen/generated/android/c++/JFunc_void_ServiceReadyReason.hpp +77 -0
  843. package/nitrogen/generated/android/c++/JFunc_void_SkipCapability.hpp +77 -0
  844. package/nitrogen/generated/android/c++/JFunc_void_SleepTimerState.hpp +78 -0
  845. package/nitrogen/generated/android/c++/JFunc_void_VisualizerErrorReason.hpp +77 -0
  846. package/nitrogen/generated/android/c++/JFunc_void_VisualizerFrame.hpp +80 -0
  847. package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
  848. package/nitrogen/generated/android/c++/JFunc_void_double_double.hpp +75 -0
  849. package/nitrogen/generated/android/c++/JFunc_void_std__optional_TrackItem__double_TrackChangeReason_std__optional_double_.hpp +82 -0
  850. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__NowPlayingFormat__.hpp +93 -0
  851. package/nitrogen/generated/android/c++/JFunc_void_std__vector_CastReceiver_.hpp +105 -0
  852. package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +96 -0
  853. package/nitrogen/generated/android/c++/JHybridCastManagerSpec.cpp +388 -0
  854. package/nitrogen/generated/android/c++/JHybridCastManagerSpec.hpp +84 -0
  855. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +233 -0
  856. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +74 -0
  857. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +1052 -0
  858. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +130 -0
  859. package/nitrogen/generated/android/c++/JHybridVisualizerSpec.cpp +84 -0
  860. package/nitrogen/generated/android/c++/JHybridVisualizerSpec.hpp +64 -0
  861. package/nitrogen/generated/android/c++/JLookaheadCacheConfig.hpp +61 -0
  862. package/nitrogen/generated/android/c++/JMediaSearchOrigin.hpp +58 -0
  863. package/nitrogen/generated/android/c++/JMediaSearchQueueLocation.hpp +61 -0
  864. package/nitrogen/generated/android/c++/JMediaSearchReference.hpp +58 -0
  865. package/nitrogen/generated/android/c++/JMediaSearchReleaseDateRange.hpp +61 -0
  866. package/nitrogen/generated/android/c++/JMediaSearchRepeatMode.hpp +61 -0
  867. package/nitrogen/generated/android/c++/JMediaSearchRequest.hpp +126 -0
  868. package/nitrogen/generated/android/c++/JMediaSearchType.hpp +67 -0
  869. package/nitrogen/generated/android/c++/JNowPlayingFormat.hpp +123 -0
  870. package/nitrogen/generated/android/c++/JNowPlayingFormatAndroidExtras.hpp +71 -0
  871. package/nitrogen/generated/android/c++/JNowPlayingFormatIosExtras.hpp +61 -0
  872. package/nitrogen/generated/android/c++/JPitchCorrectionMode.hpp +61 -0
  873. package/nitrogen/generated/android/c++/JPlaybackError.hpp +87 -0
  874. package/nitrogen/generated/android/c++/JPlaybackErrorCode.hpp +88 -0
  875. package/nitrogen/generated/android/c++/JPlaybackMode.hpp +63 -0
  876. package/nitrogen/generated/android/c++/JPlaybackModeKind.hpp +58 -0
  877. package/nitrogen/generated/android/c++/JPlayerConfig.hpp +126 -0
  878. package/nitrogen/generated/android/c++/JPlayerProgress.hpp +65 -0
  879. package/nitrogen/generated/android/c++/JPlayerState.hpp +73 -0
  880. package/nitrogen/generated/android/c++/JRemoteControlOptions.hpp +66 -0
  881. package/nitrogen/generated/android/c++/JRemoteSkipMode.hpp +58 -0
  882. package/nitrogen/generated/android/c++/JRepeatMode.hpp +61 -0
  883. package/nitrogen/generated/android/c++/JReplayGainMode.hpp +61 -0
  884. package/nitrogen/generated/android/c++/JSectionIcon.hpp +91 -0
  885. package/nitrogen/generated/android/c++/JServiceReadyReason.hpp +58 -0
  886. package/nitrogen/generated/android/c++/JShuffleResult.hpp +88 -0
  887. package/nitrogen/generated/android/c++/JSkipCapability.hpp +61 -0
  888. package/nitrogen/generated/android/c++/JSleepTimerState.hpp +69 -0
  889. package/nitrogen/generated/android/c++/JStateChangeReason.hpp +73 -0
  890. package/nitrogen/generated/android/c++/JTrackChangeReason.hpp +73 -0
  891. package/nitrogen/generated/android/c++/JTrackItem.hpp +100 -0
  892. package/nitrogen/generated/android/c++/JTrackSource.hpp +61 -0
  893. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  894. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  895. package/nitrogen/generated/android/c++/JVariant_NullType_NowPlayingFormat.cpp +26 -0
  896. package/nitrogen/generated/android/c++/JVariant_NullType_NowPlayingFormat.hpp +83 -0
  897. package/nitrogen/generated/android/c++/JVariant_NullType_String.cpp +26 -0
  898. package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +70 -0
  899. package/nitrogen/generated/android/c++/JVisualizerConfig.hpp +65 -0
  900. package/nitrogen/generated/android/c++/JVisualizerErrorReason.hpp +64 -0
  901. package/nitrogen/generated/android/c++/JVisualizerFrame.hpp +67 -0
  902. package/nitrogen/generated/android/c++/JVoiceVocabulary.hpp +98 -0
  903. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioCategoryOptions.kt +61 -0
  904. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioCodec.kt +28 -0
  905. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioContainer.kt +29 -0
  906. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioContentType.kt +23 -0
  907. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioRoute.kt +71 -0
  908. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioRouteKind.kt +34 -0
  909. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/BrowseItem.kt +76 -0
  910. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/BrowseSection.kt +71 -0
  911. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/BrowseSnapshot.kt +56 -0
  912. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/BufferState.kt +25 -0
  913. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CacheStatus.kt +71 -0
  914. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastConfigureOptions.kt +56 -0
  915. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastConnectOptions.kt +51 -0
  916. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastDeviceKind.kt +27 -0
  917. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastDiscoveryState.kt +51 -0
  918. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastLocalNetworkPermission.kt +24 -0
  919. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastLocalNetworkPermissionEvent.kt +51 -0
  920. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastProtocol.kt +26 -0
  921. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastReceiver.kt +81 -0
  922. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastReceiverCapabilities.kt +61 -0
  923. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastRoute.kt +76 -0
  924. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastSessionDiedEvent.kt +56 -0
  925. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastSessionEndReason.kt +29 -0
  926. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastStreamingModel.kt +23 -0
  927. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/EqualizerBand.kt +56 -0
  928. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/EqualizerPreset.kt +61 -0
  929. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/EvictionPolicy.kt +23 -0
  930. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_BrowseItem______std__string.kt +80 -0
  931. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______MediaSearchRequest.kt +80 -0
  932. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______std__string.kt +80 -0
  933. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void.kt +80 -0
  934. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_AudioRoute.kt +80 -0
  935. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_BufferState.kt +80 -0
  936. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_CacheStatus.kt +80 -0
  937. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_CastDiscoveryState.kt +80 -0
  938. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_CastLocalNetworkPermissionEvent.kt +80 -0
  939. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_CastRoute.kt +80 -0
  940. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_CastSessionDiedEvent.kt +80 -0
  941. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_PlaybackError.kt +80 -0
  942. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_PlayerProgress.kt +80 -0
  943. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_PlayerState_StateChangeReason.kt +80 -0
  944. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_ServiceReadyReason.kt +80 -0
  945. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_SkipCapability.kt +80 -0
  946. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_SleepTimerState.kt +80 -0
  947. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_VisualizerErrorReason.kt +80 -0
  948. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_VisualizerFrame.kt +80 -0
  949. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_bool.kt +80 -0
  950. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_double_double.kt +80 -0
  951. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_std__optional_TrackItem__double_TrackChangeReason_std__optional_double_.kt +80 -0
  952. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_std__optional_std__variant_nitro__NullType__NowPlayingFormat__.kt +80 -0
  953. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_std__vector_CastReceiver_.kt +80 -0
  954. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
  955. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/HybridCastManagerSpec.kt +169 -0
  956. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/HybridEqualizerSpec.kt +109 -0
  957. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/HybridTrackPlayerSpec.kt +419 -0
  958. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/HybridVisualizerSpec.kt +63 -0
  959. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/LookaheadCacheConfig.kt +56 -0
  960. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchOrigin.kt +23 -0
  961. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchQueueLocation.kt +24 -0
  962. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchReference.kt +23 -0
  963. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchReleaseDateRange.kt +56 -0
  964. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchRepeatMode.kt +24 -0
  965. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchRequest.kt +121 -0
  966. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchType.kt +26 -0
  967. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/NowPlayingFormat.kt +116 -0
  968. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/NowPlayingFormatAndroidExtras.kt +61 -0
  969. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/NowPlayingFormatIosExtras.kt +51 -0
  970. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PitchCorrectionMode.kt +24 -0
  971. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlaybackError.kt +86 -0
  972. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlaybackErrorCode.kt +33 -0
  973. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlaybackMode.kt +56 -0
  974. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlaybackModeKind.kt +23 -0
  975. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlayerConfig.kt +111 -0
  976. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlayerProgress.kt +61 -0
  977. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlayerState.kt +28 -0
  978. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/RemoteControlOptions.kt +61 -0
  979. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/RemoteSkipMode.kt +23 -0
  980. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/RepeatMode.kt +24 -0
  981. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/ReplayGainMode.kt +24 -0
  982. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/SectionIcon.kt +34 -0
  983. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/ServiceReadyReason.kt +23 -0
  984. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/ShuffleResult.kt +61 -0
  985. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/SkipCapability.kt +56 -0
  986. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/SleepTimerState.kt +66 -0
  987. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/StateChangeReason.kt +28 -0
  988. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/TrackChangeReason.kt +28 -0
  989. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/TrackItem.kt +86 -0
  990. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/TrackSource.kt +24 -0
  991. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Variant_NullType_Double.kt +62 -0
  992. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Variant_NullType_NowPlayingFormat.kt +62 -0
  993. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Variant_NullType_String.kt +62 -0
  994. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/VisualizerConfig.kt +61 -0
  995. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/VisualizerErrorReason.kt +25 -0
  996. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/VisualizerFrame.kt +61 -0
  997. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/VoiceVocabulary.kt +56 -0
  998. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/queueplayerOnLoad.kt +35 -0
  999. package/nitrogen/generated/android/queueplayer+autolinking.cmake +90 -0
  1000. package/nitrogen/generated/android/queueplayer+autolinking.gradle +27 -0
  1001. package/nitrogen/generated/android/queueplayerOnLoad.cpp +152 -0
  1002. package/nitrogen/generated/android/queueplayerOnLoad.hpp +34 -0
  1003. package/nitrogen/generated/ios/QueuePlayer+autolinking.rb +62 -0
  1004. package/nitrogen/generated/ios/QueuePlayer-Swift-Cxx-Bridge.cpp +343 -0
  1005. package/nitrogen/generated/ios/QueuePlayer-Swift-Cxx-Bridge.hpp +1831 -0
  1006. package/nitrogen/generated/ios/QueuePlayer-Swift-Cxx-Umbrella.hpp +256 -0
  1007. package/nitrogen/generated/ios/QueuePlayerAutolinking.mm +57 -0
  1008. package/nitrogen/generated/ios/QueuePlayerAutolinking.swift +62 -0
  1009. package/nitrogen/generated/ios/c++/HybridCastManagerSpecSwift.cpp +11 -0
  1010. package/nitrogen/generated/ios/c++/HybridCastManagerSpecSwift.hpp +298 -0
  1011. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
  1012. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +178 -0
  1013. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.cpp +11 -0
  1014. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +749 -0
  1015. package/nitrogen/generated/ios/c++/HybridVisualizerSpecSwift.cpp +11 -0
  1016. package/nitrogen/generated/ios/c++/HybridVisualizerSpecSwift.hpp +103 -0
  1017. package/nitrogen/generated/ios/swift/AudioCategoryOptions.swift +78 -0
  1018. package/nitrogen/generated/ios/swift/AudioCodec.swift +60 -0
  1019. package/nitrogen/generated/ios/swift/AudioContainer.swift +64 -0
  1020. package/nitrogen/generated/ios/swift/AudioContentType.swift +40 -0
  1021. package/nitrogen/generated/ios/swift/AudioRoute.swift +49 -0
  1022. package/nitrogen/generated/ios/swift/AudioRouteKind.swift +84 -0
  1023. package/nitrogen/generated/ios/swift/BrowseItem.swift +93 -0
  1024. package/nitrogen/generated/ios/swift/BrowseSection.swift +74 -0
  1025. package/nitrogen/generated/ios/swift/BrowseSnapshot.swift +40 -0
  1026. package/nitrogen/generated/ios/swift/BufferState.swift +48 -0
  1027. package/nitrogen/generated/ios/swift/CacheStatus.swift +55 -0
  1028. package/nitrogen/generated/ios/swift/CastConfigureOptions.swift +47 -0
  1029. package/nitrogen/generated/ios/swift/CastConnectOptions.swift +29 -0
  1030. package/nitrogen/generated/ios/swift/CastDeviceKind.swift +56 -0
  1031. package/nitrogen/generated/ios/swift/CastDiscoveryState.swift +29 -0
  1032. package/nitrogen/generated/ios/swift/CastLocalNetworkPermission.swift +44 -0
  1033. package/nitrogen/generated/ios/swift/CastLocalNetworkPermissionEvent.swift +29 -0
  1034. package/nitrogen/generated/ios/swift/CastProtocol.swift +52 -0
  1035. package/nitrogen/generated/ios/swift/CastReceiver.swift +59 -0
  1036. package/nitrogen/generated/ios/swift/CastReceiverCapabilities.swift +39 -0
  1037. package/nitrogen/generated/ios/swift/CastRoute.swift +54 -0
  1038. package/nitrogen/generated/ios/swift/CastSessionDiedEvent.swift +34 -0
  1039. package/nitrogen/generated/ios/swift/CastSessionEndReason.swift +64 -0
  1040. package/nitrogen/generated/ios/swift/CastStreamingModel.swift +40 -0
  1041. package/nitrogen/generated/ios/swift/EqualizerBand.swift +34 -0
  1042. package/nitrogen/generated/ios/swift/EqualizerPreset.swift +45 -0
  1043. package/nitrogen/generated/ios/swift/EvictionPolicy.swift +40 -0
  1044. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_BrowseItem______std__string.swift +67 -0
  1045. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______MediaSearchRequest.swift +67 -0
  1046. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______std__string.swift +67 -0
  1047. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  1048. package/nitrogen/generated/ios/swift/Func_void_AudioRoute.swift +46 -0
  1049. package/nitrogen/generated/ios/swift/Func_void_BufferState.swift +46 -0
  1050. package/nitrogen/generated/ios/swift/Func_void_CacheStatus.swift +46 -0
  1051. package/nitrogen/generated/ios/swift/Func_void_CastDiscoveryState.swift +46 -0
  1052. package/nitrogen/generated/ios/swift/Func_void_CastLocalNetworkPermission.swift +46 -0
  1053. package/nitrogen/generated/ios/swift/Func_void_CastLocalNetworkPermissionEvent.swift +46 -0
  1054. package/nitrogen/generated/ios/swift/Func_void_CastRoute.swift +46 -0
  1055. package/nitrogen/generated/ios/swift/Func_void_CastSessionDiedEvent.swift +46 -0
  1056. package/nitrogen/generated/ios/swift/Func_void_PlaybackError.swift +46 -0
  1057. package/nitrogen/generated/ios/swift/Func_void_PlayerProgress.swift +46 -0
  1058. package/nitrogen/generated/ios/swift/Func_void_PlayerState_StateChangeReason.swift +46 -0
  1059. package/nitrogen/generated/ios/swift/Func_void_ServiceReadyReason.swift +46 -0
  1060. package/nitrogen/generated/ios/swift/Func_void_ShuffleResult.swift +46 -0
  1061. package/nitrogen/generated/ios/swift/Func_void_SkipCapability.swift +46 -0
  1062. package/nitrogen/generated/ios/swift/Func_void_SleepTimerState.swift +46 -0
  1063. package/nitrogen/generated/ios/swift/Func_void_VisualizerErrorReason.swift +46 -0
  1064. package/nitrogen/generated/ios/swift/Func_void_VisualizerFrame.swift +46 -0
  1065. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  1066. package/nitrogen/generated/ios/swift/Func_void_double_double.swift +46 -0
  1067. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  1068. package/nitrogen/generated/ios/swift/Func_void_std__optional_TrackItem__double_TrackChangeReason_std__optional_double_.swift +53 -0
  1069. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__NowPlayingFormat__.swift +65 -0
  1070. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__vector_BrowseItem___.swift +66 -0
  1071. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__vector_TrackItem___.swift +66 -0
  1072. package/nitrogen/generated/ios/swift/Func_void_std__vector_BrowseItem_.swift +46 -0
  1073. package/nitrogen/generated/ios/swift/Func_void_std__vector_CastReceiver_.swift +46 -0
  1074. package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +46 -0
  1075. package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +46 -0
  1076. package/nitrogen/generated/ios/swift/HybridCastManagerSpec.swift +76 -0
  1077. package/nitrogen/generated/ios/swift/HybridCastManagerSpec_cxx.swift +519 -0
  1078. package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +66 -0
  1079. package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +353 -0
  1080. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +122 -0
  1081. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +1430 -0
  1082. package/nitrogen/generated/ios/swift/HybridVisualizerSpec.swift +56 -0
  1083. package/nitrogen/generated/ios/swift/HybridVisualizerSpec_cxx.swift +163 -0
  1084. package/nitrogen/generated/ios/swift/LookaheadCacheConfig.swift +34 -0
  1085. package/nitrogen/generated/ios/swift/MediaSearchOrigin.swift +40 -0
  1086. package/nitrogen/generated/ios/swift/MediaSearchQueueLocation.swift +44 -0
  1087. package/nitrogen/generated/ios/swift/MediaSearchReference.swift +40 -0
  1088. package/nitrogen/generated/ios/swift/MediaSearchReleaseDateRange.swift +60 -0
  1089. package/nitrogen/generated/ios/swift/MediaSearchRepeatMode.swift +44 -0
  1090. package/nitrogen/generated/ios/swift/MediaSearchRequest.swift +239 -0
  1091. package/nitrogen/generated/ios/swift/MediaSearchType.swift +52 -0
  1092. package/nitrogen/generated/ios/swift/NowPlayingFormat.swift +394 -0
  1093. package/nitrogen/generated/ios/swift/NowPlayingFormatAndroidExtras.swift +135 -0
  1094. package/nitrogen/generated/ios/swift/NowPlayingFormatIosExtras.swift +61 -0
  1095. package/nitrogen/generated/ios/swift/PitchCorrectionMode.swift +44 -0
  1096. package/nitrogen/generated/ios/swift/PlaybackError.swift +64 -0
  1097. package/nitrogen/generated/ios/swift/PlaybackErrorCode.swift +80 -0
  1098. package/nitrogen/generated/ios/swift/PlaybackMode.swift +47 -0
  1099. package/nitrogen/generated/ios/swift/PlaybackModeKind.swift +40 -0
  1100. package/nitrogen/generated/ios/swift/PlayerConfig.swift +251 -0
  1101. package/nitrogen/generated/ios/swift/PlayerProgress.swift +39 -0
  1102. package/nitrogen/generated/ios/swift/PlayerState.swift +60 -0
  1103. package/nitrogen/generated/ios/swift/RemoteControlOptions.swift +39 -0
  1104. package/nitrogen/generated/ios/swift/RemoteSkipMode.swift +40 -0
  1105. package/nitrogen/generated/ios/swift/RepeatMode.swift +44 -0
  1106. package/nitrogen/generated/ios/swift/ReplayGainMode.swift +44 -0
  1107. package/nitrogen/generated/ios/swift/SectionIcon.swift +84 -0
  1108. package/nitrogen/generated/ios/swift/ServiceReadyReason.swift +40 -0
  1109. package/nitrogen/generated/ios/swift/ShuffleResult.swift +51 -0
  1110. package/nitrogen/generated/ios/swift/SkipCapability.swift +34 -0
  1111. package/nitrogen/generated/ios/swift/SleepTimerState.swift +70 -0
  1112. package/nitrogen/generated/ios/swift/StateChangeReason.swift +60 -0
  1113. package/nitrogen/generated/ios/swift/TrackChangeReason.swift +60 -0
  1114. package/nitrogen/generated/ios/swift/TrackItem.swift +169 -0
  1115. package/nitrogen/generated/ios/swift/TrackSource.swift +44 -0
  1116. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +30 -0
  1117. package/nitrogen/generated/ios/swift/Variant_NullType_NowPlayingFormat.swift +30 -0
  1118. package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +30 -0
  1119. package/nitrogen/generated/ios/swift/VisualizerConfig.swift +52 -0
  1120. package/nitrogen/generated/ios/swift/VisualizerErrorReason.swift +48 -0
  1121. package/nitrogen/generated/ios/swift/VisualizerFrame.swift +52 -0
  1122. package/nitrogen/generated/ios/swift/VoiceVocabulary.swift +46 -0
  1123. package/nitrogen/generated/shared/c++/AudioCategoryOptions.hpp +91 -0
  1124. package/nitrogen/generated/shared/c++/AudioCodec.hpp +96 -0
  1125. package/nitrogen/generated/shared/c++/AudioContainer.hpp +100 -0
  1126. package/nitrogen/generated/shared/c++/AudioContentType.hpp +76 -0
  1127. package/nitrogen/generated/shared/c++/AudioRoute.hpp +101 -0
  1128. package/nitrogen/generated/shared/c++/AudioRouteKind.hpp +120 -0
  1129. package/nitrogen/generated/shared/c++/BrowseItem.hpp +104 -0
  1130. package/nitrogen/generated/shared/c++/BrowseSection.hpp +106 -0
  1131. package/nitrogen/generated/shared/c++/BrowseSnapshot.hpp +90 -0
  1132. package/nitrogen/generated/shared/c++/BufferState.hpp +84 -0
  1133. package/nitrogen/generated/shared/c++/CacheStatus.hpp +100 -0
  1134. package/nitrogen/generated/shared/c++/CastConfigureOptions.hpp +88 -0
  1135. package/nitrogen/generated/shared/c++/CastConnectOptions.hpp +83 -0
  1136. package/nitrogen/generated/shared/c++/CastDeviceKind.hpp +92 -0
  1137. package/nitrogen/generated/shared/c++/CastDiscoveryState.hpp +83 -0
  1138. package/nitrogen/generated/shared/c++/CastLocalNetworkPermission.hpp +80 -0
  1139. package/nitrogen/generated/shared/c++/CastLocalNetworkPermissionEvent.hpp +84 -0
  1140. package/nitrogen/generated/shared/c++/CastProtocol.hpp +88 -0
  1141. package/nitrogen/generated/shared/c++/CastReceiver.hpp +115 -0
  1142. package/nitrogen/generated/shared/c++/CastReceiverCapabilities.hpp +92 -0
  1143. package/nitrogen/generated/shared/c++/CastRoute.hpp +111 -0
  1144. package/nitrogen/generated/shared/c++/CastSessionDiedEvent.hpp +89 -0
  1145. package/nitrogen/generated/shared/c++/CastSessionEndReason.hpp +100 -0
  1146. package/nitrogen/generated/shared/c++/CastStreamingModel.hpp +76 -0
  1147. package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
  1148. package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +92 -0
  1149. package/nitrogen/generated/shared/c++/EvictionPolicy.hpp +76 -0
  1150. package/nitrogen/generated/shared/c++/HybridCastManagerSpec.cpp +42 -0
  1151. package/nitrogen/generated/shared/c++/HybridCastManagerSpec.hpp +115 -0
  1152. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +32 -0
  1153. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +81 -0
  1154. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +88 -0
  1155. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +209 -0
  1156. package/nitrogen/generated/shared/c++/HybridVisualizerSpec.cpp +22 -0
  1157. package/nitrogen/generated/shared/c++/HybridVisualizerSpec.hpp +71 -0
  1158. package/nitrogen/generated/shared/c++/LookaheadCacheConfig.hpp +87 -0
  1159. package/nitrogen/generated/shared/c++/MediaSearchOrigin.hpp +76 -0
  1160. package/nitrogen/generated/shared/c++/MediaSearchQueueLocation.hpp +80 -0
  1161. package/nitrogen/generated/shared/c++/MediaSearchReference.hpp +76 -0
  1162. package/nitrogen/generated/shared/c++/MediaSearchReleaseDateRange.hpp +87 -0
  1163. package/nitrogen/generated/shared/c++/MediaSearchRepeatMode.hpp +80 -0
  1164. package/nitrogen/generated/shared/c++/MediaSearchRequest.hpp +157 -0
  1165. package/nitrogen/generated/shared/c++/MediaSearchType.hpp +88 -0
  1166. package/nitrogen/generated/shared/c++/NowPlayingFormat.hpp +149 -0
  1167. package/nitrogen/generated/shared/c++/NowPlayingFormatAndroidExtras.hpp +94 -0
  1168. package/nitrogen/generated/shared/c++/NowPlayingFormatIosExtras.hpp +85 -0
  1169. package/nitrogen/generated/shared/c++/PitchCorrectionMode.hpp +80 -0
  1170. package/nitrogen/generated/shared/c++/PlaybackError.hpp +113 -0
  1171. package/nitrogen/generated/shared/c++/PlaybackErrorCode.hpp +116 -0
  1172. package/nitrogen/generated/shared/c++/PlaybackMode.hpp +89 -0
  1173. package/nitrogen/generated/shared/c++/PlaybackModeKind.hpp +76 -0
  1174. package/nitrogen/generated/shared/c++/PlayerConfig.hpp +141 -0
  1175. package/nitrogen/generated/shared/c++/PlayerProgress.hpp +91 -0
  1176. package/nitrogen/generated/shared/c++/PlayerState.hpp +96 -0
  1177. package/nitrogen/generated/shared/c++/RemoteControlOptions.hpp +92 -0
  1178. package/nitrogen/generated/shared/c++/RemoteSkipMode.hpp +76 -0
  1179. package/nitrogen/generated/shared/c++/RepeatMode.hpp +80 -0
  1180. package/nitrogen/generated/shared/c++/ReplayGainMode.hpp +80 -0
  1181. package/nitrogen/generated/shared/c++/SectionIcon.hpp +120 -0
  1182. package/nitrogen/generated/shared/c++/ServiceReadyReason.hpp +76 -0
  1183. package/nitrogen/generated/shared/c++/ShuffleResult.hpp +94 -0
  1184. package/nitrogen/generated/shared/c++/SkipCapability.hpp +87 -0
  1185. package/nitrogen/generated/shared/c++/SleepTimerState.hpp +95 -0
  1186. package/nitrogen/generated/shared/c++/StateChangeReason.hpp +96 -0
  1187. package/nitrogen/generated/shared/c++/TrackChangeReason.hpp +96 -0
  1188. package/nitrogen/generated/shared/c++/TrackItem.hpp +113 -0
  1189. package/nitrogen/generated/shared/c++/TrackSource.hpp +80 -0
  1190. package/nitrogen/generated/shared/c++/VisualizerConfig.hpp +91 -0
  1191. package/nitrogen/generated/shared/c++/VisualizerErrorReason.hpp +84 -0
  1192. package/nitrogen/generated/shared/c++/VisualizerFrame.hpp +92 -0
  1193. package/nitrogen/generated/shared/c++/VoiceVocabulary.hpp +88 -0
  1194. package/package.json +167 -0
  1195. package/src/CastManager.nitro.ts +206 -0
  1196. package/src/Equalizer.nitro.ts +37 -0
  1197. package/src/TrackPlayer.nitro.ts +667 -0
  1198. package/src/Visualizer.nitro.ts +48 -0
  1199. package/src/cast/index.ts +224 -0
  1200. package/src/clients.ts +50 -0
  1201. package/src/equalizer.ts +86 -0
  1202. package/src/hooks/index.ts +33 -0
  1203. package/src/hooks/useActiveTrack.ts +55 -0
  1204. package/src/hooks/useAudioRoute.ts +69 -0
  1205. package/src/hooks/useBufferState.ts +35 -0
  1206. package/src/hooks/useCanSkip.ts +92 -0
  1207. package/src/hooks/useCast.ts +121 -0
  1208. package/src/hooks/useEqualizer.ts +111 -0
  1209. package/src/hooks/useFullyBuffered.ts +32 -0
  1210. package/src/hooks/useLookaheadCache.ts +54 -0
  1211. package/src/hooks/useNowPlayingFormat.ts +43 -0
  1212. package/src/hooks/usePlaybackState.ts +34 -0
  1213. package/src/hooks/useProgress.ts +36 -0
  1214. package/src/hooks/useSleepTimer.ts +63 -0
  1215. package/src/hooks/useVisualizerState.ts +121 -0
  1216. package/src/index.ts +125 -0
  1217. package/src/playbackService.ts +304 -0
  1218. package/src/types.ts +1387 -0
@@ -0,0 +1,1380 @@
1
+ #ifndef SIGNALSMITH_AUDIO_LINEAR_FFT_H
2
+ #define SIGNALSMITH_AUDIO_LINEAR_FFT_H
3
+
4
+ #include <complex>
5
+ #include <vector>
6
+ #include <cmath>
7
+
8
+ #if defined(__FAST_MATH__) && (__apple_build_version__ >= 16000000) && (__apple_build_version__ <= 16000099) && !defined(SIGNALSMITH_IGNORE_BROKEN_APPLECLANG)
9
+ # error Apple Clang 16.0.0 generates incorrect SIMD for ARM. If you HAVE to use this version of Clang, turn off -ffast-math.
10
+ #endif
11
+
12
+ #ifndef M_PI
13
+ # define M_PI 3.14159265358979323846
14
+ #endif
15
+
16
+ namespace signalsmith { namespace linear {
17
+
18
+ namespace _impl {
19
+ // Helpers for complex arithmetic, ignoring the NaN/Inf edge-cases you get without `-ffast-math`
20
+ template<class V>
21
+ void complexMul(std::complex<V> *a, const std::complex<V> *b, const std::complex<V> *c, size_t size) {
22
+ for (size_t i = 0; i < size; ++i) {
23
+ auto bi = b[i], ci = c[i];
24
+ a[i] = {bi.real()*ci.real() - bi.imag()*ci.imag(), bi.imag()*ci.real() + bi.real()*ci.imag()};
25
+ }
26
+ }
27
+ template<class V>
28
+ void complexMulConj(std::complex<V> *a, const std::complex<V> *b, const std::complex<V> *c, size_t size) {
29
+ for (size_t i = 0; i < size; ++i) {
30
+ auto bi = b[i], ci = c[i];
31
+ a[i] = {bi.real()*ci.real() + bi.imag()*ci.imag(), bi.imag()*ci.real() - bi.real()*ci.imag()};
32
+ }
33
+ }
34
+ template<class V>
35
+ void complexMul(V *ar, V *ai, const V *br, const V *bi, const V *cr, const V *ci, size_t size) {
36
+ for (size_t i = 0; i < size; ++i) {
37
+ V rr = br[i]*cr[i] - bi[i]*ci[i];
38
+ V ri = br[i]*ci[i] + bi[i]*cr[i];
39
+ ar[i] = rr;
40
+ ai[i] = ri;
41
+ }
42
+ }
43
+ template<class V>
44
+ void complexMulConj(V *ar, V *ai, const V *br, const V *bi, const V *cr, const V *ci, size_t size) {
45
+ for (size_t i = 0; i < size; ++i) {
46
+ V rr = cr[i]*br[i] + ci[i]*bi[i];
47
+ V ri = cr[i]*bi[i] - ci[i]*br[i];
48
+ ar[i] = rr;
49
+ ai[i] = ri;
50
+ }
51
+ }
52
+
53
+ // Input: aStride elements next to each other -> output with bStride
54
+ template<size_t aStride, class V>
55
+ void interleaveCopy(const V *a, V *b, size_t bStride) {
56
+ for (size_t bi = 0; bi < bStride; ++bi) {
57
+ const V *offsetA = a + bi*aStride;
58
+ V *offsetB = b + bi;
59
+ for (size_t ai = 0; ai < aStride; ++ai) {
60
+ offsetB[ai*bStride] = offsetA[ai];
61
+ }
62
+ }
63
+ }
64
+ template<class V>
65
+ void interleaveCopy(const V *a, V *b, size_t aStride, size_t bStride) {
66
+ for (size_t bi = 0; bi < bStride; ++bi) {
67
+ const V *offsetA = a + bi*aStride;
68
+ V *offsetB = b + bi;
69
+ for (size_t ai = 0; ai < aStride; ++ai) {
70
+ offsetB[ai*bStride] = offsetA[ai];
71
+ }
72
+ }
73
+ }
74
+ template<size_t aStride, class V>
75
+ void interleaveCopy(const V *aReal, const V *aImag, V *bReal, V *bImag, size_t bStride) {
76
+ for (size_t bi = 0; bi < bStride; ++bi) {
77
+ const V *offsetAr = aReal + bi*aStride;
78
+ const V *offsetAi = aImag + bi*aStride;
79
+ V *offsetBr = bReal + bi;
80
+ V *offsetBi = bImag + bi;
81
+ for (size_t ai = 0; ai < aStride; ++ai) {
82
+ offsetBr[ai*bStride] = offsetAr[ai];
83
+ offsetBi[ai*bStride] = offsetAi[ai];
84
+ }
85
+ }
86
+ }
87
+ template<class V>
88
+ void interleaveCopy(const V *aReal, const V *aImag, V *bReal, V *bImag, size_t aStride, size_t bStride) {
89
+ for (size_t bi = 0; bi < bStride; ++bi) {
90
+ const V *offsetAr = aReal + bi*aStride;
91
+ const V *offsetAi = aImag + bi*aStride;
92
+ V *offsetBr = bReal + bi;
93
+ V *offsetBi = bImag + bi;
94
+ for (size_t ai = 0; ai < aStride; ++ai) {
95
+ offsetBr[ai*bStride] = offsetAr[ai];
96
+ offsetBi[ai*bStride] = offsetAi[ai];
97
+ }
98
+ }
99
+ }
100
+ }
101
+
102
+ /// Fairly simple and very portable power-of-2 FFT
103
+ template<typename Sample>
104
+ struct SimpleFFT {
105
+ using Complex = std::complex<Sample>;
106
+
107
+ SimpleFFT(size_t size=0) {
108
+ resize(size);
109
+ }
110
+
111
+ void resize(size_t size) {
112
+ twiddles.resize(size*3/4);
113
+ for (size_t i = 0; i < size*3/4; ++i) {
114
+ Sample twiddlePhase = -2*M_PI*i/size;
115
+ twiddles[i] = std::polar(Sample(1), twiddlePhase);
116
+ }
117
+ working.resize(size);
118
+ }
119
+
120
+ void fft(const Complex *time, Complex *freq) {
121
+ size_t size = working.size();
122
+ if (size <= 1) {
123
+ *freq = *time;
124
+ return;
125
+ }
126
+ fftPass<false>(size, 1, time, freq, working.data());
127
+ }
128
+
129
+ void ifft(const Complex *freq, Complex *time) {
130
+ size_t size = working.size();
131
+ if (size <= 1) {
132
+ *time = *freq;
133
+ return;
134
+ }
135
+ fftPass<true>(size, 1, freq, time, working.data());
136
+ }
137
+
138
+ void fft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {
139
+ size_t size = working.size();
140
+ if (size <= 1) {
141
+ *outR = *inR;
142
+ *outI = *inI;
143
+ return;
144
+ }
145
+ Sample *workingR = (Sample *)working.data(), *workingI = workingR + size;
146
+ fftPass<false>(size, 1, inR, inI, outR, outI, workingR, workingI);
147
+ }
148
+ void ifft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {
149
+ size_t size = working.size();
150
+ if (size <= 1) {
151
+ *outR = *inR;
152
+ *outI = *inI;
153
+ return;
154
+ }
155
+ Sample *workingR = (Sample *)working.data(), *workingI = workingR + size;
156
+ fftPass<true>(size, 1, inR, inI, outR, outI, workingR, workingI);
157
+ }
158
+ private:
159
+ std::vector<Complex> twiddles;
160
+ std::vector<Complex> working;
161
+
162
+ template<bool conjB>
163
+ static Complex mul(const Complex &a, const Complex &b) {
164
+ return conjB ? Complex{
165
+ a.real()*b.real() + a.imag()*b.imag(),
166
+ a.imag()*b.real() - a.real()*b.imag()
167
+ } : Complex{
168
+ a.real()*b.real() - a.imag()*b.imag(),
169
+ a.imag()*b.real() + a.real()*b.imag()
170
+ };
171
+ }
172
+
173
+ // Calculate a [size]-point FFT, where each element is a block of [stride] values
174
+ template<bool inverse>
175
+ void fftPass(size_t size, size_t stride, const Complex *input, Complex *output, Complex *working) {
176
+ if (size/4 > 1) {
177
+ // Calculate four quarter-size FFTs
178
+ fftPass<inverse>(size/4, stride*4, input, working, output);
179
+ combine4<inverse>(size, stride, working, output);
180
+ } else if (size == 4) {
181
+ combine4<inverse>(4, stride, input, output);
182
+ } else {
183
+ // 2-point FFT
184
+ for (size_t s = 0; s < stride; ++s) {
185
+ Complex a = input[s];
186
+ Complex b = input[s + stride];
187
+ output[s] = a + b;
188
+ output[s + stride] = a - b;
189
+ }
190
+ }
191
+ }
192
+
193
+ // Combine interleaved results into a single spectrum
194
+ template<bool inverse>
195
+ void combine4(size_t size, size_t stride, const Complex *input, Complex *output) const {
196
+ auto twiddleStep = working.size()/size;
197
+ for (size_t i = 0; i < size/4; ++i) {
198
+ Complex twiddleB = twiddles[i*twiddleStep];
199
+ Complex twiddleC = twiddles[i*2*twiddleStep];
200
+ Complex twiddleD = twiddles[i*3*twiddleStep];
201
+
202
+ const Complex *inputA = input + 4*i*stride;
203
+ const Complex *inputB = input + (4*i + 1)*stride;
204
+ const Complex *inputC = input + (4*i + 2)*stride;
205
+ const Complex *inputD = input + (4*i + 3)*stride;
206
+ Complex *outputA = output + i*stride;
207
+ Complex *outputB = output + (i + size/4)*stride;
208
+ Complex *outputC = output + (i + size/4*2)*stride;
209
+ Complex *outputD = output + (i + size/4*3)*stride;
210
+ for (size_t s = 0; s < stride; ++s) {
211
+ Complex a = inputA[s];
212
+ Complex b = mul<inverse>(inputB[s], twiddleB);
213
+ Complex c = mul<inverse>(inputC[s], twiddleC);
214
+ Complex d = mul<inverse>(inputD[s], twiddleD);
215
+ Complex ac0 = a + c, ac1 = a - c;
216
+ Complex bd0 = b + d, bd1 = inverse ? (b - d) : (d - b);
217
+ Complex bd1i = {-bd1.imag(), bd1.real()};
218
+ outputA[s] = ac0 + bd0;
219
+ outputB[s] = ac1 + bd1i;
220
+ outputC[s] = ac0 - bd0;
221
+ outputD[s] = ac1 - bd1i;
222
+ }
223
+ }
224
+ }
225
+
226
+ // The same thing, but translated for split-complex input/output
227
+ template<bool inverse>
228
+ void fftPass(size_t size, size_t stride, const Sample *inputR, const Sample *inputI, Sample *outputR, Sample *outputI, Sample *workingR, Sample *workingI) const {
229
+ if (size/4 > 1) {
230
+ // Calculate four quarter-size FFTs
231
+ fftPass<inverse>(size/4, stride*4, inputR, inputI, workingR, workingI, outputR, outputI);
232
+ combine4<inverse>(size, stride, workingR, workingI, outputR, outputI);
233
+ } else if (size == 4) {
234
+ combine4<inverse>(4, stride, inputR, inputI, outputR, outputI);
235
+ } else {
236
+ // 2-point FFT
237
+ for (size_t s = 0; s < stride; ++s) {
238
+ Sample ar = inputR[s], ai = inputI[s];
239
+ Sample br = inputR[s + stride], bi = inputI[s + stride];
240
+ outputR[s] = ar + br;
241
+ outputI[s] = ai + bi;
242
+ outputR[s + stride] = ar - br;
243
+ outputI[s + stride] = ai - bi;
244
+ }
245
+ }
246
+ }
247
+
248
+ // Combine interleaved results into a single spectrum
249
+ template<bool inverse>
250
+ void combine4(size_t size, size_t stride, const Sample *inputR, const Sample *inputI, Sample *outputR, Sample *outputI) const {
251
+ auto twiddleStep = working.size()/size;
252
+ for (size_t i = 0; i < size/4; ++i) {
253
+ Complex twiddleB = twiddles[i*twiddleStep];
254
+ Complex twiddleC = twiddles[i*2*twiddleStep];
255
+ Complex twiddleD = twiddles[i*3*twiddleStep];
256
+
257
+ const Sample *inputAr = inputR + 4*i*stride, *inputAi = inputI + 4*i*stride;
258
+ const Sample *inputBr = inputR + (4*i + 1)*stride, *inputBi = inputI + (4*i + 1)*stride;
259
+ const Sample *inputCr = inputR + (4*i + 2)*stride, *inputCi = inputI + (4*i + 2)*stride;
260
+ const Sample *inputDr = inputR + (4*i + 3)*stride, *inputDi = inputI + (4*i + 3)*stride;
261
+ Sample *outputAr = outputR + i*stride, *outputAi = outputI + i*stride;
262
+ Sample *outputBr = outputR + (i + size/4)*stride, *outputBi = outputI + (i + size/4)*stride;
263
+ Sample *outputCr = outputR + (i + size/4*2)*stride, *outputCi = outputI + (i + size/4*2)*stride;
264
+ Sample *outputDr = outputR + (i + size/4*3)*stride, *outputDi = outputI + (i + size/4*3)*stride;
265
+ for (size_t s = 0; s < stride; ++s) {
266
+ Complex a = {inputAr[s], inputAi[s]};
267
+ Complex b = mul<inverse>({inputBr[s], inputBi[s]}, twiddleB);
268
+ Complex c = mul<inverse>({inputCr[s], inputCi[s]}, twiddleC);
269
+ Complex d = mul<inverse>({inputDr[s], inputDi[s]}, twiddleD);
270
+ Complex ac0 = a + c, ac1 = a - c;
271
+ Complex bd0 = b + d, bd1 = inverse ? (b - d) : (d - b);
272
+ Complex bd1i = {-bd1.imag(), bd1.real()};
273
+ outputAr[s] = ac0.real() + bd0.real();
274
+ outputAi[s] = ac0.imag() + bd0.imag();
275
+ outputBr[s] = ac1.real() + bd1i.real();
276
+ outputBi[s] = ac1.imag() + bd1i.imag();
277
+ outputCr[s] = ac0.real() - bd0.real();
278
+ outputCi[s] = ac0.imag() - bd0.imag();
279
+ outputDr[s] = ac1.real() - bd1i.real();
280
+ outputDi[s] = ac1.imag() - bd1i.imag();
281
+ }
282
+ }
283
+ }
284
+ };
285
+
286
+ /// A power-of-2 only FFT, specialised with platform-specific fast implementations where available
287
+ template<typename Sample>
288
+ struct Pow2FFT {
289
+ static constexpr bool prefersSplit = true; // whether this FFT implementation is faster when given split-complex inputs
290
+ using Complex = std::complex<Sample>;
291
+
292
+ Pow2FFT(size_t size=0) {
293
+ resize(size);
294
+ }
295
+ // Allow move, but not copy
296
+ Pow2FFT(const Pow2FFT &other) = delete;
297
+ Pow2FFT(Pow2FFT &&other) : tmp(std::move(other.tmp)), simpleFFT(std::move(other.simpleFFT)) {}
298
+
299
+ void resize(size_t size) {
300
+ simpleFFT.resize(size);
301
+ tmp.resize(size);
302
+ }
303
+
304
+ void fft(const Complex *time, Complex *freq) {
305
+ simpleFFT.fft(time, freq);
306
+ }
307
+ void fft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {
308
+ simpleFFT.fft(inR, inI, outR, outI);
309
+ }
310
+
311
+ void ifft(const Complex *freq, Complex *time) {
312
+ simpleFFT.ifft(freq, time);
313
+ }
314
+ void ifft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {
315
+ simpleFFT.ifft(inR, inI, outR, outI);
316
+ }
317
+
318
+ private:
319
+ std::vector<Complex> tmp;
320
+ SimpleFFT<Sample> simpleFFT;
321
+ };
322
+
323
+ /// An FFT which can handle multiples of 3 and 5, and can be computed in chunks
324
+ template<typename Sample, bool splitComputation=false>
325
+ struct SplitFFT {
326
+ using Complex = std::complex<Sample>;
327
+ static constexpr bool prefersSplit = Pow2FFT<Sample>::prefersSplit;
328
+
329
+ static constexpr size_t maxSplit = splitComputation ? 4 : 1;
330
+ static constexpr size_t minInnerSize = 32;
331
+
332
+ static size_t fastSizeAbove(size_t size) {
333
+ size_t pow2 = 1;
334
+ while (pow2 < 16 && pow2 < size) pow2 *= 2;
335
+ while (pow2*8 < size) pow2 *= 2;
336
+ size_t multiple = (size + pow2 - 1)/pow2; // will be 1-8
337
+ if (multiple == 7) ++multiple;
338
+ return multiple*pow2;
339
+ }
340
+
341
+ SplitFFT(size_t size=0) {
342
+ resize(size);
343
+ }
344
+
345
+ void resize(size_t size) {
346
+ innerSize = 1;
347
+ outerSize = size;
348
+
349
+ dftTmp.resize(0);
350
+ dftTwists.resize(0);
351
+ plan.resize(0);
352
+ if (!size) return;
353
+
354
+ // Inner size = largest power of 2 such that either the inner size >= minInnerSize, or we have the target number of splits
355
+ while (!(outerSize&1) && (outerSize > maxSplit || innerSize < minInnerSize)) {
356
+ innerSize *= 2;
357
+ outerSize /= 2;
358
+ }
359
+ tmpFreq.resize(size);
360
+ innerFFT.resize(innerSize);
361
+
362
+ outerTwiddles.resize(innerSize*(outerSize - 1));
363
+ outerTwiddlesR.resize(innerSize*(outerSize - 1));
364
+ outerTwiddlesI.resize(innerSize*(outerSize - 1));
365
+ for (size_t i = 0; i < innerSize; ++i) {
366
+ for (size_t s = 1; s < outerSize; ++s) {
367
+ Sample twiddlePhase = Sample(-2*M_PI*i/innerSize*s/outerSize);
368
+ outerTwiddles[i + (s - 1)*innerSize] = std::polar(Sample(1), twiddlePhase);
369
+ }
370
+ }
371
+ for (size_t i = 0; i < outerTwiddles.size(); ++i) {
372
+ outerTwiddlesR[i] = outerTwiddles[i].real();
373
+ outerTwiddlesI[i] = outerTwiddles[i].imag();
374
+ }
375
+
376
+ StepType interleaveStep = StepType::interleaveOrderN;
377
+ StepType finalStep = StepType::finalOrderN;
378
+ if (outerSize == 2) {
379
+ interleaveStep = StepType::interleaveOrder2;
380
+ finalStep = StepType::finalOrder2;
381
+ }
382
+ if (outerSize == 3) {
383
+ interleaveStep = StepType::interleaveOrder3;
384
+ finalStep = StepType::finalOrder3;
385
+ }
386
+ if (outerSize == 4) {
387
+ interleaveStep = StepType::interleaveOrder4;
388
+ finalStep = StepType::finalOrder4;
389
+ }
390
+ if (outerSize == 5) {
391
+ interleaveStep = StepType::interleaveOrder5;
392
+ finalStep = StepType::finalOrder5;
393
+ }
394
+
395
+ if (outerSize <= 1) {
396
+ if (size > 0) plan.push_back(Step{StepType::passthrough, 0});
397
+ } else {
398
+ plan.push_back({interleaveStep, 0});
399
+ plan.push_back({StepType::firstFFT, 0});
400
+ for (size_t s = 1; s < outerSize; ++s) {
401
+ plan.push_back({StepType::middleFFT, s*innerSize});
402
+ }
403
+ plan.push_back({StepType::twiddles, 0});
404
+ plan.push_back({finalStep, 0});
405
+
406
+ if (finalStep == StepType::finalOrderN) {
407
+ dftTmp.resize(outerSize);
408
+ dftTwists.resize(outerSize);
409
+ for (size_t s = 0; s < outerSize; ++s) {
410
+ Sample dftPhase = Sample(-2*M_PI*s/outerSize);
411
+ dftTwists[s] = std::polar(Sample(1), dftPhase);
412
+ }
413
+ }
414
+ }
415
+ }
416
+
417
+ size_t size() const {
418
+ return innerSize*outerSize;
419
+ }
420
+ size_t steps() const {
421
+ return plan.size();
422
+ }
423
+
424
+ void fft(const Complex *time, Complex *freq) {
425
+ for (auto &step : plan) {
426
+ fftStep<false>(step, time, freq);
427
+ }
428
+ }
429
+ void fft(size_t step, const Complex *time, Complex *freq) {
430
+ fftStep<false>(plan[step], time, freq);
431
+ }
432
+ void fft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {
433
+ for (auto &step : plan) {
434
+ fftStep<false>(step, inR, inI, outR, outI);
435
+ }
436
+ }
437
+ void fft(size_t step, const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {
438
+ fftStep<false>(plan[step], inR, inI, outR, outI);
439
+ }
440
+
441
+ void ifft(const Complex *freq, Complex *time) {
442
+ for (auto &step : plan) {
443
+ fftStep<true>(step, freq, time);
444
+ }
445
+ }
446
+ void ifft(size_t step, const Complex *freq, Complex *time) {
447
+ fftStep<true>(plan[step], freq, time);
448
+ }
449
+ void ifft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {
450
+ for (auto &step : plan) {
451
+ fftStep<true>(step, inR, inI, outR, outI);
452
+ }
453
+ }
454
+ void ifft(size_t step, const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {
455
+ fftStep<true>(plan[step], inR, inI, outR, outI);
456
+ }
457
+ private:
458
+ using InnerFFT = Pow2FFT<Sample>;
459
+ InnerFFT innerFFT;
460
+
461
+ size_t innerSize, outerSize;
462
+ std::vector<Complex> tmpFreq;
463
+ std::vector<Complex> outerTwiddles;
464
+ std::vector<Sample> outerTwiddlesR, outerTwiddlesI;
465
+ std::vector<Complex> dftTwists, dftTmp;
466
+
467
+ enum class StepType {
468
+ passthrough,
469
+ interleaveOrder2, interleaveOrder3, interleaveOrder4, interleaveOrder5, interleaveOrderN,
470
+ firstFFT, middleFFT,
471
+ twiddles,
472
+ finalOrder2, finalOrder3, finalOrder4, finalOrder5, finalOrderN
473
+ };
474
+ struct Step {
475
+ StepType type;
476
+ size_t offset;
477
+ };
478
+ std::vector<Step> plan;
479
+
480
+ template<bool inverse>
481
+ void fftStep(Step step, const Complex *time, Complex *freq) {
482
+ switch (step.type) {
483
+ case (StepType::passthrough): {
484
+ if (inverse) {
485
+ innerFFT.ifft(time, freq);
486
+ } else {
487
+ innerFFT.fft(time, freq);
488
+ }
489
+ break;
490
+ }
491
+ case (StepType::interleaveOrder2): {
492
+ _impl::interleaveCopy<2>(time, tmpFreq.data(), innerSize);
493
+ break;
494
+ }
495
+ case (StepType::interleaveOrder3): {
496
+ _impl::interleaveCopy<3>(time, tmpFreq.data(), innerSize);
497
+ break;
498
+ }
499
+ case (StepType::interleaveOrder4): {
500
+ _impl::interleaveCopy<4>(time, tmpFreq.data(), innerSize);
501
+ break;
502
+ }
503
+ case (StepType::interleaveOrder5): {
504
+ _impl::interleaveCopy<5>(time, tmpFreq.data(), innerSize);
505
+ break;
506
+ }
507
+ case (StepType::interleaveOrderN): {
508
+ _impl::interleaveCopy(time, tmpFreq.data(), outerSize, innerSize);
509
+ break;
510
+ }
511
+ case (StepType::firstFFT): {
512
+ if (inverse) {
513
+ innerFFT.ifft(tmpFreq.data(), freq);
514
+ } else {
515
+ innerFFT.fft(tmpFreq.data(), freq);
516
+ }
517
+ break;
518
+ }
519
+ case (StepType::middleFFT): {
520
+ Complex *offsetOut = freq + step.offset;
521
+ if (inverse) {
522
+ innerFFT.ifft(tmpFreq.data() + step.offset, offsetOut);
523
+ } else {
524
+ innerFFT.fft(tmpFreq.data() + step.offset, offsetOut);
525
+ }
526
+ break;
527
+ }
528
+ case (StepType::twiddles): {
529
+ if (inverse) {
530
+ _impl::complexMulConj(freq + innerSize, freq + innerSize, outerTwiddles.data(), innerSize*(outerSize - 1));
531
+ } else {
532
+ _impl::complexMul(freq + innerSize, freq + innerSize, outerTwiddles.data(), innerSize*(outerSize - 1));
533
+ }
534
+ break;
535
+ }
536
+ case StepType::finalOrder2:
537
+ finalPass2(freq);
538
+ break;
539
+ case StepType::finalOrder3:
540
+ finalPass3<inverse>(freq);
541
+ break;
542
+ case StepType::finalOrder4:
543
+ finalPass4<inverse>(freq);
544
+ break;
545
+ case StepType::finalOrder5:
546
+ finalPass5<inverse>(freq);
547
+ break;
548
+ case StepType::finalOrderN:
549
+ finalPassN<inverse>(freq);
550
+ break;
551
+ }
552
+ }
553
+ template<bool inverse>
554
+ void fftStep(Step step, const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {
555
+ Sample *tmpR = (Sample *)tmpFreq.data(), *tmpI = tmpR + tmpFreq.size();
556
+ switch (step.type) {
557
+ case (StepType::passthrough): {
558
+ if (inverse) {
559
+ innerFFT.ifft(inR, inI, outR, outI);
560
+ } else {
561
+ innerFFT.fft(inR, inI, outR, outI);
562
+ }
563
+ break;
564
+ }
565
+ case (StepType::interleaveOrder2): {
566
+ _impl::interleaveCopy<2>(inR, tmpR, innerSize);
567
+ _impl::interleaveCopy<2>(inI, tmpI, innerSize);
568
+ break;
569
+ }
570
+ case (StepType::interleaveOrder3): {
571
+ _impl::interleaveCopy<3>(inR, tmpR, innerSize);
572
+ _impl::interleaveCopy<3>(inI, tmpI, innerSize);
573
+ break;
574
+ }
575
+ case (StepType::interleaveOrder4): {
576
+ _impl::interleaveCopy<4>(inR, tmpR, innerSize);
577
+ _impl::interleaveCopy<4>(inI, tmpI, innerSize);
578
+ break;
579
+ }
580
+ case (StepType::interleaveOrder5): {
581
+ _impl::interleaveCopy<5>(inR, tmpR, innerSize);
582
+ _impl::interleaveCopy<5>(inI, tmpI, innerSize);
583
+ break;
584
+ }
585
+ case (StepType::interleaveOrderN): {
586
+ _impl::interleaveCopy(inR, inI, tmpR, tmpI, outerSize, innerSize);
587
+ break;
588
+ }
589
+ case (StepType::firstFFT): {
590
+ if (inverse) {
591
+ innerFFT.ifft(tmpR, tmpI, outR, outI);
592
+ } else {
593
+ innerFFT.fft(tmpR, tmpI, outR, outI);
594
+ }
595
+ break;
596
+ }
597
+ case (StepType::middleFFT): {
598
+ size_t offset = step.offset;
599
+ Sample *offsetOutR = outR + offset;
600
+ Sample *offsetOutI = outI + offset;
601
+ if (inverse) {
602
+ innerFFT.ifft(tmpR + offset, tmpI + offset, offsetOutR, offsetOutI);
603
+ } else {
604
+ innerFFT.fft(tmpR + offset, tmpI + offset, offsetOutR, offsetOutI);
605
+ }
606
+ break;
607
+ }
608
+ case(StepType::twiddles): {
609
+ auto *twiddlesR = outerTwiddlesR.data();
610
+ auto *twiddlesI = outerTwiddlesI.data();
611
+ if (inverse) {
612
+ _impl::complexMulConj(outR + innerSize, outI + innerSize, outR + innerSize, outI + innerSize, twiddlesR, twiddlesI, innerSize*(outerSize - 1));
613
+ } else {
614
+ _impl::complexMul(outR + innerSize, outI + innerSize, outR + innerSize, outI + innerSize, twiddlesR, twiddlesI, innerSize*(outerSize - 1));
615
+ }
616
+ break;
617
+ }
618
+ case StepType::finalOrder2:
619
+ finalPass2(outR, outI);
620
+ break;
621
+ case StepType::finalOrder3:
622
+ finalPass3<inverse>(outR, outI);
623
+ break;
624
+ case StepType::finalOrder4:
625
+ finalPass4<inverse>(outR, outI);
626
+ break;
627
+ case StepType::finalOrder5:
628
+ finalPass5<inverse>(outR, outI);
629
+ break;
630
+ case StepType::finalOrderN:
631
+ finalPassN<inverse>(outR, outI);
632
+ break;
633
+ }
634
+ }
635
+
636
+ void finalPass2(Complex *f0) {
637
+ auto *f1 = f0 + innerSize;
638
+ for (size_t i = 0; i < innerSize; ++i) {
639
+ Complex a = f0[i], b = f1[i];
640
+ f0[i] = a + b;
641
+ f1[i] = a - b;
642
+ }
643
+ }
644
+ void finalPass2(Sample *f0r, Sample *f0i) {
645
+ auto *f1r = f0r + innerSize;
646
+ auto *f1i = f0i + innerSize;
647
+ for (size_t i = 0; i < innerSize; ++i) {
648
+ Sample ar = f0r[i], ai = f0i[i];
649
+ Sample br = f1r[i], bi = f1i[i];
650
+ f0r[i] = ar + br;
651
+ f0i[i] = ai + bi;
652
+ f1r[i] = ar - br;
653
+ f1i[i] = ai - bi;
654
+ }
655
+ }
656
+ template<bool inverse>
657
+ void finalPass3(Complex *f0) {
658
+ auto *f1 = f0 + innerSize;
659
+ auto *f2 = f0 + innerSize*2;
660
+ const Complex tw1{Sample(-0.5), Sample(-std::sqrt(0.75)*(inverse ? -1 : 1))};
661
+ for (size_t i = 0; i < innerSize; ++i) {
662
+ Complex a = f0[i], b = f1[i], c = f2[i];
663
+ Complex bc0 = b + c, bc1 = b - c;
664
+ f0[i] = a + bc0;
665
+ f1[i] = {
666
+ a.real() + bc0.real()*tw1.real() - bc1.imag()*tw1.imag(),
667
+ a.imag() + bc0.imag()*tw1.real() + bc1.real()*tw1.imag()
668
+ };
669
+ f2[i] = {
670
+ a.real() + bc0.real()*tw1.real() + bc1.imag()*tw1.imag(),
671
+ a.imag() + bc0.imag()*tw1.real() - bc1.real()*tw1.imag()
672
+ };
673
+ }
674
+ }
675
+ template<bool inverse>
676
+ void finalPass3(Sample *f0r, Sample *f0i) {
677
+ auto *f1r = f0r + innerSize;
678
+ auto *f1i = f0i + innerSize;
679
+ auto *f2r = f0r + innerSize*2;
680
+ auto *f2i = f0i + innerSize*2;
681
+ const Sample tw1r = -0.5, tw1i = -std::sqrt(0.75)*(inverse ? -1 : 1);
682
+
683
+ for (size_t i = 0; i < innerSize; ++i) {
684
+ Sample ar = f0r[i], ai = f0i[i], br = f1r[i], bi = f1i[i], cr = f2r[i], ci = f2i[i];
685
+
686
+ f0r[i] = ar + br + cr;
687
+ f0i[i] = ai + bi + ci;
688
+ f1r[i] = ar + br*tw1r - bi*tw1i + cr*tw1r + ci*tw1i;
689
+ f1i[i] = ai + bi*tw1r + br*tw1i - cr*tw1i + ci*tw1r;
690
+ f2r[i] = ar + br*tw1r + bi*tw1i + cr*tw1r - ci*tw1i;
691
+ f2i[i] = ai + bi*tw1r - br*tw1i + cr*tw1i + ci*tw1r;
692
+ }
693
+ }
694
+ template<bool inverse>
695
+ void finalPass4(Complex *f0) {
696
+ auto *f1 = f0 + innerSize;
697
+ auto *f2 = f0 + innerSize*2;
698
+ auto *f3 = f0 + innerSize*3;
699
+ for (size_t i = 0; i < innerSize; ++i) {
700
+ Complex a = f0[i], b = f1[i], c = f2[i], d = f3[i];
701
+
702
+ Complex ac0 = a + c, ac1 = a - c;
703
+ Complex bd0 = b + d, bd1 = inverse ? (b - d) : (d - b);
704
+ Complex bd1i = {-bd1.imag(), bd1.real()};
705
+ f0[i] = ac0 + bd0;
706
+ f1[i] = ac1 + bd1i;
707
+ f2[i] = ac0 - bd0;
708
+ f3[i] = ac1 - bd1i;
709
+ }
710
+ }
711
+ template<bool inverse>
712
+ void finalPass4(Sample *f0r, Sample *f0i) {
713
+ auto *f1r = f0r + innerSize;
714
+ auto *f1i = f0i + innerSize;
715
+ auto *f2r = f0r + innerSize*2;
716
+ auto *f2i = f0i + innerSize*2;
717
+ auto *f3r = f0r + innerSize*3;
718
+ auto *f3i = f0i + innerSize*3;
719
+ for (size_t i = 0; i < innerSize; ++i) {
720
+ Sample ar = f0r[i], ai = f0i[i], br = f1r[i], bi = f1i[i], cr = f2r[i], ci = f2i[i], dr = f3r[i], di = f3i[i];
721
+
722
+ Sample ac0r = ar + cr, ac0i = ai + ci;
723
+ Sample ac1r = ar - cr, ac1i = ai - ci;
724
+ Sample bd0r = br + dr, bd0i = bi + di;
725
+ Sample bd1r = br - dr, bd1i = bi - di;
726
+
727
+ f0r[i] = ac0r + bd0r;
728
+ f0i[i] = ac0i + bd0i;
729
+ f1r[i] = inverse ? (ac1r - bd1i) : (ac1r + bd1i);
730
+ f1i[i] = inverse ? (ac1i + bd1r) : (ac1i - bd1r);
731
+ f2r[i] = ac0r - bd0r;
732
+ f2i[i] = ac0i - bd0i;
733
+ f3r[i] = inverse ? (ac1r + bd1i) : (ac1r - bd1i);
734
+ f3i[i] = inverse ? (ac1i - bd1r) : (ac1i + bd1r);
735
+ }
736
+ }
737
+ template<bool inverse>
738
+ void finalPass5(Complex *f0) {
739
+ auto *f1 = f0 + innerSize;
740
+ auto *f2 = f0 + innerSize*2;
741
+ auto *f3 = f0 + innerSize*3;
742
+ auto *f4 = f0 + innerSize*4;
743
+ const Sample tw1r = 0.30901699437494745;
744
+ const Sample tw1i = -0.9510565162951535*(inverse ? -1 : 1);
745
+ const Sample tw2r = -0.8090169943749473;
746
+ const Sample tw2i = -0.5877852522924732*(inverse ? -1 : 1);
747
+ for (size_t i = 0; i < innerSize; ++i) {
748
+ Complex a = f0[i], b = f1[i], c = f2[i], d = f3[i], e = f4[i];
749
+
750
+ Complex be0 = b + e, be1 = {e.imag() - b.imag(), b.real() - e.real()}; // (b - e)*i
751
+ Complex cd0 = c + d, cd1 = {d.imag() - c.imag(), c.real() - d.real()};
752
+
753
+ Complex bcde01 = be0*tw1r + cd0*tw2r;
754
+ Complex bcde02 = be0*tw2r + cd0*tw1r;
755
+ Complex bcde11 = be1*tw1i + cd1*tw2i;
756
+ Complex bcde12 = be1*tw2i - cd1*tw1i;
757
+
758
+ f0[i] = a + be0 + cd0;
759
+ f1[i] = a + bcde01 + bcde11;
760
+ f2[i] = a + bcde02 + bcde12;
761
+ f3[i] = a + bcde02 - bcde12;
762
+ f4[i] = a + bcde01 - bcde11;
763
+ }
764
+ }
765
+ template<bool inverse>
766
+ void finalPass5(Sample *f0r, Sample *f0i) {
767
+ auto *f1r = f0r + innerSize;
768
+ auto *f1i = f0i + innerSize;
769
+ auto *f2r = f0r + innerSize*2;
770
+ auto *f2i = f0i + innerSize*2;
771
+ auto *f3r = f0r + innerSize*3;
772
+ auto *f3i = f0i + innerSize*3;
773
+ auto *f4r = f0r + innerSize*4;
774
+ auto *f4i = f0i + innerSize*4;
775
+
776
+ const Sample tw1r = 0.30901699437494745;
777
+ const Sample tw1i = -0.9510565162951535*(inverse ? -1 : 1);
778
+ const Sample tw2r = -0.8090169943749473;
779
+ const Sample tw2i = -0.5877852522924732*(inverse ? -1 : 1);
780
+ for (size_t i = 0; i < innerSize; ++i) {
781
+ Sample ar = f0r[i], ai = f0i[i], br = f1r[i], bi = f1i[i], cr = f2r[i], ci = f2i[i], dr = f3r[i], di = f3i[i], er = f4r[i], ei = f4i[i];
782
+
783
+ Sample be0r = br + er, be0i = bi + ei;
784
+ Sample be1r = ei - bi, be1i = br - er;
785
+ Sample cd0r = cr + dr, cd0i = ci + di;
786
+ Sample cd1r = di - ci, cd1i = cr - dr;
787
+
788
+ Sample bcde01r = be0r*tw1r + cd0r*tw2r, bcde01i = be0i*tw1r + cd0i*tw2r;
789
+ Sample bcde02r = be0r*tw2r + cd0r*tw1r, bcde02i = be0i*tw2r + cd0i*tw1r;
790
+ Sample bcde11r = be1r*tw1i + cd1r*tw2i, bcde11i = be1i*tw1i + cd1i*tw2i;
791
+ Sample bcde12r = be1r*tw2i - cd1r*tw1i, bcde12i = be1i*tw2i - cd1i*tw1i;
792
+
793
+ f0r[i] = ar + be0r + cd0r;
794
+ f0i[i] = ai + be0i + cd0i;
795
+ f1r[i] = ar + bcde01r + bcde11r;
796
+ f1i[i] = ai + bcde01i + bcde11i;
797
+ f2r[i] = ar + bcde02r + bcde12r;
798
+ f2i[i] = ai + bcde02i + bcde12i;
799
+ f3r[i] = ar + bcde02r - bcde12r;
800
+ f3i[i] = ai + bcde02i - bcde12i;
801
+ f4r[i] = ar + bcde01r - bcde11r;
802
+ f4i[i] = ai + bcde01i - bcde11i;
803
+ }
804
+ }
805
+
806
+ template<bool inverse>
807
+ void finalPassN(Complex *f0) {
808
+ for (size_t i = 0; i < innerSize; ++i) {
809
+ Complex *offsetFreq = f0 + i;
810
+ Complex sum = 0;
811
+ for (size_t i2 = 0; i2 < outerSize; ++i2) {
812
+ sum += (dftTmp[i2] = offsetFreq[i2*innerSize]);
813
+ }
814
+ offsetFreq[0] = sum;
815
+
816
+ for (size_t f = 1; f < outerSize; ++f) {
817
+ Complex sum = dftTmp[0];
818
+
819
+ for (size_t i2 = 1; i2 < outerSize; ++i2) {
820
+ size_t twistIndex = (i2*f)%outerSize;
821
+ Complex twist = inverse ? std::conj(dftTwists[twistIndex]) : dftTwists[twistIndex];
822
+ sum += Complex{
823
+ dftTmp[i2].real()*twist.real() - dftTmp[i2].imag()*twist.imag(),
824
+ dftTmp[i2].imag()*twist.real() + dftTmp[i2].real()*twist.imag()
825
+ };
826
+ }
827
+
828
+ offsetFreq[f*innerSize] = sum;
829
+ }
830
+ }
831
+ }
832
+ template<bool inverse>
833
+ void finalPassN(Sample *f0r, Sample *f0i) {
834
+ Sample *tmpR = (Sample *)dftTmp.data(), *tmpI = tmpR + outerSize;
835
+
836
+ for (size_t i = 0; i < innerSize; ++i) {
837
+ Sample *offsetR = f0r + i;
838
+ Sample *offsetI = f0i + i;
839
+ Sample sumR = 0, sumI = 0;
840
+ for (size_t i2 = 0; i2 < outerSize; ++i2) {
841
+ sumR += (tmpR[i2] = offsetR[i2*innerSize]);
842
+ sumI += (tmpI[i2] = offsetI[i2*innerSize]);
843
+ }
844
+ offsetR[0] = sumR;
845
+ offsetI[0] = sumI;
846
+
847
+ for (size_t f = 1; f < outerSize; ++f) {
848
+ Sample sumR = *tmpR, sumI = *tmpI;
849
+
850
+ for (size_t i2 = 1; i2 < outerSize; ++i2) {
851
+ size_t twistIndex = (i2*f)%outerSize;
852
+ Complex twist = inverse ? std::conj(dftTwists[twistIndex]) : dftTwists[twistIndex];
853
+ sumR += tmpR[i2]*twist.real() - tmpI[i2]*twist.imag();
854
+ sumI += tmpI[i2]*twist.real() + tmpR[i2]*twist.imag();
855
+ }
856
+
857
+ offsetR[f*innerSize] = sumR;
858
+ offsetI[f*innerSize] = sumI;
859
+ }
860
+ }
861
+ }
862
+ };
863
+
864
+ template<typename Sample, bool splitComputation=false>
865
+ using FFT = SplitFFT<Sample, splitComputation>;
866
+
867
+ // Wraps a complex FFT into a real one
868
+ template<typename Sample, class ComplexFFT=Pow2FFT<Sample>>
869
+ struct SimpleRealFFT {
870
+ using Complex = std::complex<Sample>;
871
+
872
+ static constexpr bool prefersSplit = ComplexFFT::prefersSplit;
873
+
874
+ SimpleRealFFT(size_t size=0) {
875
+ resize(size);
876
+ }
877
+
878
+ void resize(size_t size) {
879
+ complexFft.resize(size);
880
+ tmpTime.resize(size);
881
+ tmpFreq.resize(size);
882
+ }
883
+
884
+ void fft(const Sample *time, Complex *freq) {
885
+ for (size_t i = 0; i < tmpTime.size(); ++i) {
886
+ tmpTime[i] = time[i];
887
+ }
888
+ complexFft.fft(tmpTime.data(), tmpFreq.data());
889
+ for (size_t i = 0; i < tmpFreq.size()/2; ++i) {
890
+ freq[i] = tmpFreq[i];
891
+ }
892
+ freq[0] = {
893
+ tmpFreq[0].real(),
894
+ tmpFreq[tmpFreq.size()/2].real()
895
+ };
896
+ }
897
+ void fft(const Sample *inR, Sample *outR, Sample *outI) {
898
+ Sample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + tmpFreq.size();
899
+ for (size_t i = 0; i < tmpTime.size()/2; ++i) {
900
+ tmpTime[i] = 0;
901
+ }
902
+ complexFft.fft(inR, (const Sample *)tmpTime.data(), tmpFreqR, tmpFreqI);
903
+ for (size_t i = 0; i < tmpTime.size()/2; ++i) {
904
+ outR[i] = tmpFreqR[i];
905
+ outI[i] = tmpFreqI[i];
906
+ }
907
+ outI[0] = tmpFreqR[tmpFreq.size()/2];
908
+ }
909
+
910
+ void ifft(const Complex *freq, Sample *time) {
911
+ tmpFreq[0] = freq[0].real();
912
+ tmpFreq[tmpFreq.size()/2] = freq[0].imag();
913
+ for (size_t i = 1; i < tmpFreq.size()/2; ++i) {
914
+ tmpFreq[i] = freq[i];
915
+ tmpFreq[tmpFreq.size() - i] = std::conj(freq[i]);
916
+ }
917
+ complexFft.ifft(tmpFreq.data(), tmpTime.data());
918
+ for (size_t i = 0; i < tmpTime.size(); ++i) {
919
+ time[i] = tmpTime[i].real();
920
+ }
921
+ }
922
+ void ifft(const Sample *inR, const Sample *inI, Sample *outR) {
923
+ Sample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + tmpFreq.size();
924
+ tmpFreqR[0] = inR[0];
925
+ tmpFreqR[tmpFreq.size()/2] = inI[0];
926
+ tmpFreqI[0] = 0;
927
+ tmpFreqI[tmpFreq.size()/2] = 0;
928
+ for (size_t i = 1; i < tmpFreq.size()/2; ++i) {
929
+ tmpFreqR[i] = inR[i];
930
+ tmpFreqI[i] = inI[i];
931
+ tmpFreqR[tmpFreq.size() - i] = inR[i];
932
+ tmpFreqI[tmpFreq.size() - i] = -inI[i];
933
+ }
934
+ complexFft.ifft(tmpFreqR, tmpFreqI, outR, (Sample *)tmpTime.data());
935
+ }
936
+
937
+ private:
938
+ ComplexFFT complexFft;
939
+ std::vector<Complex> tmpTime, tmpFreq;
940
+ };
941
+
942
+ /// A default power-of-2 FFT, specialised with platform-specific fast implementations where available
943
+ template<typename Sample>
944
+ struct Pow2RealFFT : public SimpleRealFFT<Sample> {
945
+ static constexpr bool prefersSplit = SimpleRealFFT<Sample>::prefersSplit;
946
+
947
+ using SimpleRealFFT<Sample>::SimpleRealFFT;
948
+
949
+ // Prevent copying, since it might be a problem for specialisations
950
+ Pow2RealFFT(const Pow2RealFFT &other) = delete;
951
+ // Pass move-constructor through, just to be explicit about it
952
+ Pow2RealFFT(Pow2RealFFT &&other) : SimpleRealFFT<Sample>(std::move(other)) {}
953
+ };
954
+
955
+ /// A Real FFT which can handle multiples of 3 and 5, and can be computed in chunks
956
+ template<typename Sample, bool splitComputation=false, bool halfBinShift=false>
957
+ struct RealFFT {
958
+ using Complex = std::complex<Sample>;
959
+ static constexpr bool prefersSplit = SplitFFT<Sample, splitComputation>::prefersSplit;
960
+
961
+ static size_t fastSizeAbove(size_t size) {
962
+ return ComplexFFT::fastSizeAbove((size + 1)/2)*2;
963
+ }
964
+
965
+ RealFFT(size_t size=0) {
966
+ resize(size);
967
+ }
968
+
969
+ void resize(size_t size) {
970
+ size_t hSize = size/2;
971
+ complexFft.resize(hSize);
972
+ tmpFreq.resize(hSize);
973
+ tmpTime.resize(hSize);
974
+
975
+ twiddles.resize(hSize/2 + 1);
976
+
977
+ if (!halfBinShift) {
978
+ for (size_t i = 0; i < twiddles.size(); ++i) {
979
+ Sample rotPhase = i*(-2*M_PI/size) - M_PI/2; // bake rotation by (-i) into twiddles
980
+ twiddles[i] = std::polar(Sample(1), rotPhase);
981
+ }
982
+ } else {
983
+ for (size_t i = 0; i < twiddles.size(); ++i) {
984
+ Sample rotPhase = (i + 0.5)*(-2*M_PI/size) - M_PI/2;
985
+ twiddles[i] = std::polar(Sample(1), rotPhase);
986
+ }
987
+
988
+ halfBinTwists.resize(hSize);
989
+ for (size_t i = 0; i < hSize; ++i) {
990
+ Sample twistPhase = -2*M_PI*i/size;
991
+ halfBinTwists[i] = std::polar(Sample(1), twistPhase);
992
+ }
993
+ }
994
+ }
995
+
996
+ size_t size() const {
997
+ return complexFft.size()*2;
998
+ }
999
+ size_t steps() const {
1000
+ return complexFft.steps() + (splitComputation ? 3 : 2);
1001
+ }
1002
+
1003
+ void fft(const Sample *time, Complex *freq) {
1004
+ for (size_t s = 0; s < steps(); ++s) {
1005
+ fft(s, time, freq);
1006
+ }
1007
+ }
1008
+ void fft(size_t step, const Sample *time, Complex *freq) {
1009
+ if (complexPrefersSplit) {
1010
+ size_t hSize = complexFft.size();
1011
+ Sample *tmpTimeR = (Sample *)tmpTime.data(), *tmpTimeI = tmpTimeR + hSize;
1012
+ Sample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + hSize;
1013
+ if (step-- == 0) {
1014
+ size_t hSize = complexFft.size();
1015
+ if (halfBinShift) {
1016
+ for (size_t i = 0; i < hSize; ++i) {
1017
+ Sample tr = time[2*i], ti = time[2*i + 1];
1018
+ Complex twist = halfBinTwists[i];
1019
+ tmpTimeR[i] = tr*twist.real() - ti*twist.imag();
1020
+ tmpTimeI[i] = ti*twist.real() + tr*twist.imag();
1021
+ }
1022
+ } else {
1023
+ for (size_t i = 0; i < hSize; ++i) {
1024
+ tmpTimeR[i] = time[2*i];
1025
+ tmpTimeI[i] = time[2*i + 1];
1026
+ }
1027
+ }
1028
+ } else if (step < complexFft.steps()) {
1029
+ complexFft.fft(step, tmpTimeR, tmpTimeI, tmpFreqR, tmpFreqI);
1030
+ } else {
1031
+ if (!halfBinShift) {
1032
+ Sample bin0r = tmpFreqR[0], bin0i = tmpFreqI[0];
1033
+ freq[0] = {bin0r + bin0i, bin0r - bin0i};
1034
+ }
1035
+
1036
+ size_t startI = halfBinShift ? 0 : 1;
1037
+ size_t endI = hSize/2 + 1;
1038
+ if (splitComputation) { // Do this last twiddle in two halves
1039
+ if (step == complexFft.steps()) {
1040
+ endI = (startI + endI)/2;
1041
+ } else {
1042
+ startI = (startI + endI)/2;
1043
+ }
1044
+ }
1045
+ for (size_t i = startI; i < endI; ++i) {
1046
+ size_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);
1047
+ Complex twiddle = twiddles[i];
1048
+
1049
+ Sample oddR = (tmpFreqR[i] + tmpFreqR[conjI])*Sample(0.5);
1050
+ Sample oddI = (tmpFreqI[i] - tmpFreqI[conjI])*Sample(0.5);
1051
+ Sample evenIR = (tmpFreqR[i] - tmpFreqR[conjI])*Sample(0.5);
1052
+ Sample evenII = (tmpFreqI[i] + tmpFreqI[conjI])*Sample(0.5);
1053
+ Sample evenRotMinusIR = evenIR*twiddle.real() - evenII*twiddle.imag();
1054
+ Sample evenRotMinusII = evenII*twiddle.real() + evenIR*twiddle.imag();
1055
+
1056
+ freq[i] = {oddR + evenRotMinusIR, oddI + evenRotMinusII};
1057
+ freq[conjI] = {oddR - evenRotMinusIR, evenRotMinusII - oddI};
1058
+ }
1059
+ }
1060
+ } else {
1061
+ bool canUseTime = !halfBinShift && !(size_t(time)%alignof(Complex));
1062
+ if (step-- == 0) {
1063
+ size_t hSize = complexFft.size();
1064
+ if (halfBinShift) {
1065
+ for (size_t i = 0; i < hSize; ++i) {
1066
+ Sample tr = time[2*i], ti = time[2*i + 1];
1067
+ Complex twist = halfBinTwists[i];
1068
+ tmpTime[i] = {
1069
+ tr*twist.real() - ti*twist.imag(),
1070
+ ti*twist.real() + tr*twist.imag()
1071
+ };
1072
+ }
1073
+ } else if (!canUseTime) {
1074
+ std::memcpy(tmpTime.data(), time, sizeof(Complex)*hSize);
1075
+ }
1076
+ } else if (step < complexFft.steps()) {
1077
+ complexFft.fft(step, canUseTime ? (const Complex *)time : tmpTime.data(), tmpFreq.data());
1078
+ } else {
1079
+ if (!halfBinShift) {
1080
+ Complex bin0 = tmpFreq[0];
1081
+ freq[0] = { // pack DC & Nyquist together
1082
+ bin0.real() + bin0.imag(),
1083
+ bin0.real() - bin0.imag()
1084
+ };
1085
+ }
1086
+
1087
+ size_t hSize = complexFft.size();
1088
+ size_t startI = halfBinShift ? 0 : 1;
1089
+ size_t endI = hSize/2 + 1;
1090
+ if (splitComputation) { // Do this last twiddle in two halves
1091
+ if (step == complexFft.steps()) {
1092
+ endI = (startI + endI)/2;
1093
+ } else {
1094
+ startI = (startI + endI)/2;
1095
+ }
1096
+ }
1097
+ for (size_t i = startI; i < endI; ++i) {
1098
+ size_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);
1099
+ Complex twiddle = twiddles[i];
1100
+
1101
+ Complex odd = (tmpFreq[i] + std::conj(tmpFreq[conjI]))*Sample(0.5);
1102
+ Complex evenI = (tmpFreq[i] - std::conj(tmpFreq[conjI]))*Sample(0.5);
1103
+ Complex evenRotMinusI = { // twiddle includes a factor of -i
1104
+ evenI.real()*twiddle.real() - evenI.imag()*twiddle.imag(),
1105
+ evenI.imag()*twiddle.real() + evenI.real()*twiddle.imag()
1106
+ };
1107
+
1108
+ freq[i] = odd + evenRotMinusI;
1109
+ freq[conjI] = {odd.real() - evenRotMinusI.real(), evenRotMinusI.imag() - odd.imag()};
1110
+ }
1111
+ }
1112
+ }
1113
+ }
1114
+ void fft(const Sample *inR, Sample *outR, Sample *outI) {
1115
+ for (size_t s = 0; s < steps(); ++s) {
1116
+ fft(s, inR, outR, outI);
1117
+ }
1118
+ }
1119
+ void fft(size_t step, const Sample *inR, Sample *outR, Sample *outI) {
1120
+ size_t hSize = complexFft.size();
1121
+ Sample *tmpTimeR = (Sample *)tmpTime.data(), *tmpTimeI = tmpTimeR + hSize;
1122
+ Sample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + hSize;
1123
+ if (step-- == 0) {
1124
+ size_t hSize = complexFft.size();
1125
+ if (halfBinShift) {
1126
+ for (size_t i = 0; i < hSize; ++i) {
1127
+ Sample tr = inR[2*i], ti = inR[2*i + 1];
1128
+ Complex twist = halfBinTwists[i];
1129
+ tmpTimeR[i] = tr*twist.real() - ti*twist.imag();
1130
+ tmpTimeI[i] = ti*twist.real() + tr*twist.imag();
1131
+ }
1132
+ } else {
1133
+ for (size_t i = 0; i < hSize; ++i) {
1134
+ tmpTimeR[i] = inR[2*i];
1135
+ tmpTimeI[i] = inR[2*i + 1];
1136
+ }
1137
+ }
1138
+ } else if (step < complexFft.steps()) {
1139
+ complexFft.fft(step, tmpTimeR, tmpTimeI, tmpFreqR, tmpFreqI);
1140
+ } else {
1141
+ if (!halfBinShift) {
1142
+ Sample bin0r = tmpFreqR[0], bin0i = tmpFreqI[0];
1143
+ outR[0] = bin0r + bin0i;
1144
+ outI[0] = bin0r - bin0i;
1145
+ }
1146
+
1147
+ size_t startI = halfBinShift ? 0 : 1;
1148
+ size_t endI = hSize/2 + 1;
1149
+ if (splitComputation) { // Do this last twiddle in two halves
1150
+ if (step == complexFft.steps()) {
1151
+ endI = (startI + endI)/2;
1152
+ } else {
1153
+ startI = (startI + endI)/2;
1154
+ }
1155
+ }
1156
+ for (size_t i = startI; i < endI; ++i) {
1157
+ size_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);
1158
+ Complex twiddle = twiddles[i];
1159
+
1160
+ Sample oddR = (tmpFreqR[i] + tmpFreqR[conjI])*Sample(0.5);
1161
+ Sample oddI = (tmpFreqI[i] - tmpFreqI[conjI])*Sample(0.5);
1162
+ Sample evenIR = (tmpFreqR[i] - tmpFreqR[conjI])*Sample(0.5);
1163
+ Sample evenII = (tmpFreqI[i] + tmpFreqI[conjI])*Sample(0.5);
1164
+ Sample evenRotMinusIR = evenIR*twiddle.real() - evenII*twiddle.imag();
1165
+ Sample evenRotMinusII = evenII*twiddle.real() + evenIR*twiddle.imag();
1166
+
1167
+ outR[i] = oddR + evenRotMinusIR;
1168
+ outI[i] = oddI + evenRotMinusII;
1169
+ outR[conjI] = oddR - evenRotMinusIR;
1170
+ outI[conjI] = evenRotMinusII - oddI;
1171
+ }
1172
+ }
1173
+ }
1174
+
1175
+ void ifft(const Complex *freq, Sample *time) {
1176
+ for (size_t s = 0; s < steps(); ++s) {
1177
+ ifft(s, freq, time);
1178
+ }
1179
+ }
1180
+ void ifft(size_t step, const Complex *freq, Sample *time) {
1181
+ if (complexPrefersSplit) {
1182
+ size_t hSize = complexFft.size();
1183
+ Sample *tmpTimeR = (Sample *)tmpTime.data(), *tmpTimeI = tmpTimeR + hSize;
1184
+ Sample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + hSize;
1185
+
1186
+ bool splitFirst = splitComputation && (step-- == 0);
1187
+ if (splitFirst || step-- == 0) {
1188
+ Complex bin0 = freq[0];
1189
+ if (!halfBinShift) {
1190
+ tmpFreqR[0] = bin0.real() + bin0.imag();
1191
+ tmpFreqI[0] = bin0.real() - bin0.imag();
1192
+ }
1193
+ size_t startI = halfBinShift ? 0 : 1;
1194
+ size_t endI = hSize/2 + 1;
1195
+ if (splitComputation) { // Do this first twiddle in two halves
1196
+ if (splitFirst) {
1197
+ endI = (startI + endI)/2;
1198
+ } else {
1199
+ startI = (startI + endI)/2;
1200
+ }
1201
+ }
1202
+ for (size_t i = startI; i < endI; ++i) {
1203
+ size_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);
1204
+ Complex twiddle = twiddles[i];
1205
+
1206
+ Complex odd = freq[i] + std::conj(freq[conjI]);
1207
+ Complex evenRotMinusI = freq[i] - std::conj(freq[conjI]);
1208
+ Complex evenI = { // Conjugate twiddle
1209
+ evenRotMinusI.real()*twiddle.real() + evenRotMinusI.imag()*twiddle.imag(),
1210
+ evenRotMinusI.imag()*twiddle.real() - evenRotMinusI.real()*twiddle.imag()
1211
+ };
1212
+
1213
+ tmpFreqR[i] = odd.real() + evenI.real();
1214
+ tmpFreqI[i] = odd.imag() + evenI.imag();
1215
+ tmpFreqR[conjI] = odd.real() - evenI.real();
1216
+ tmpFreqI[conjI] = evenI.imag() - odd.imag();
1217
+ }
1218
+ } else if (step < complexFft.steps()) {
1219
+ complexFft.ifft(step, tmpFreqR, tmpFreqI, tmpTimeR, tmpTimeI);
1220
+ } else {
1221
+ size_t hSize = complexFft.size();
1222
+ if (halfBinShift) {
1223
+ for (size_t i = 0; i < hSize; ++i) {
1224
+ Sample tr = tmpTimeR[i], ti = tmpTimeI[i];
1225
+ Complex twist = halfBinTwists[i];
1226
+ time[2*i] = tr*twist.real() + ti*twist.imag();
1227
+ time[2*i + 1] = ti*twist.real() - tr*twist.imag();
1228
+ }
1229
+ } else {
1230
+ for (size_t i = 0; i < hSize; ++i) {
1231
+ time[2*i] = tmpTimeR[i];
1232
+ time[2*i + 1] = tmpTimeI[i];
1233
+ }
1234
+ }
1235
+ }
1236
+ } else {
1237
+ bool canUseTime = !halfBinShift && !(size_t(time)%alignof(Complex));
1238
+ bool splitFirst = splitComputation && (step-- == 0);
1239
+ if (splitFirst || step-- == 0) {
1240
+ Complex bin0 = freq[0];
1241
+ if (!halfBinShift) {
1242
+ tmpFreq[0] = {
1243
+ bin0.real() + bin0.imag(),
1244
+ bin0.real() - bin0.imag()
1245
+ };
1246
+ }
1247
+ size_t hSize = complexFft.size();
1248
+ size_t startI = halfBinShift ? 0 : 1;
1249
+ size_t endI = hSize/2 + 1;
1250
+ if (splitComputation) { // Do this first twiddle in two halves
1251
+ if (splitFirst) {
1252
+ endI = (startI + endI)/2;
1253
+ } else {
1254
+ startI = (startI + endI)/2;
1255
+ }
1256
+ }
1257
+ for (size_t i = startI; i < endI; ++i) {
1258
+ size_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);
1259
+ Complex twiddle = twiddles[i];
1260
+
1261
+ Complex odd = freq[i] + std::conj(freq[conjI]);
1262
+ Complex evenRotMinusI = freq[i] - std::conj(freq[conjI]);
1263
+ Complex evenI = { // Conjugate twiddle
1264
+ evenRotMinusI.real()*twiddle.real() + evenRotMinusI.imag()*twiddle.imag(),
1265
+ evenRotMinusI.imag()*twiddle.real() - evenRotMinusI.real()*twiddle.imag()
1266
+ };
1267
+
1268
+ tmpFreq[i] = odd + evenI;
1269
+ tmpFreq[conjI] = {odd.real() - evenI.real(), evenI.imag() - odd.imag()};
1270
+ }
1271
+ } else if (step < complexFft.steps()) {
1272
+ // Can't just use time as (Complex *), since it might not be aligned properly
1273
+ complexFft.ifft(step, tmpFreq.data(), canUseTime ? (Complex *)time : tmpTime.data());
1274
+ } else {
1275
+ size_t hSize = complexFft.size();
1276
+ if (halfBinShift) {
1277
+ for (size_t i = 0; i < hSize; ++i) {
1278
+ Complex t = tmpTime[i];
1279
+ Complex twist = halfBinTwists[i];
1280
+ time[2*i] = t.real()*twist.real() + t.imag()*twist.imag();
1281
+ time[2*i + 1] = t.imag()*twist.real() - t.real()*twist.imag();
1282
+ }
1283
+ } else if (!canUseTime) {
1284
+ std::memcpy(time, tmpTime.data(), sizeof(Complex)*hSize);
1285
+ }
1286
+ }
1287
+ }
1288
+ }
1289
+ void ifft(const Sample *inR, const Sample *inI, Sample *outR) {
1290
+ for (size_t s = 0; s < steps(); ++s) {
1291
+ ifft(s, inR, inI, outR);
1292
+ }
1293
+ }
1294
+ void ifft(size_t step, const Sample *inR, const Sample *inI, Sample *outR) {
1295
+ size_t hSize = complexFft.size();
1296
+ Sample *tmpTimeR = (Sample *)tmpTime.data(), *tmpTimeI = tmpTimeR + hSize;
1297
+ Sample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + hSize;
1298
+
1299
+ bool splitFirst = splitComputation && (step-- == 0);
1300
+ if (splitFirst || step-- == 0) {
1301
+ Sample bin0r = inR[0], bin0i = inI[0];
1302
+ if (!halfBinShift) {
1303
+ tmpFreqR[0] = bin0r + bin0i;
1304
+ tmpFreqI[0] = bin0r - bin0i;
1305
+ }
1306
+ size_t startI = halfBinShift ? 0 : 1;
1307
+ size_t endI = hSize/2 + 1;
1308
+ if (splitComputation) { // Do this first twiddle in two halves
1309
+ if (splitFirst) {
1310
+ endI = (startI + endI)/2;
1311
+ } else {
1312
+ startI = (startI + endI)/2;
1313
+ }
1314
+ }
1315
+ for (size_t i = startI; i < endI; ++i) {
1316
+ size_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);
1317
+ Complex twiddle = twiddles[i];
1318
+ Sample fir = inR[i], fii = inI[i];
1319
+ Sample fcir = inR[conjI], fcii = inI[conjI];
1320
+
1321
+ Complex odd = {fir + fcir, fii - fcii};
1322
+ Complex evenRotMinusI = {fir - fcir, fii + fcii};
1323
+ Complex evenI = { // Conjugate twiddle
1324
+ evenRotMinusI.real()*twiddle.real() + evenRotMinusI.imag()*twiddle.imag(),
1325
+ evenRotMinusI.imag()*twiddle.real() - evenRotMinusI.real()*twiddle.imag()
1326
+ };
1327
+
1328
+ tmpFreqR[i] = odd.real() + evenI.real();
1329
+ tmpFreqI[i] = odd.imag() + evenI.imag();
1330
+ tmpFreqR[conjI] = odd.real() - evenI.real();
1331
+ tmpFreqI[conjI] = evenI.imag() - odd.imag();
1332
+ }
1333
+ } else if (step < complexFft.steps()) {
1334
+ // Can't just use time as (Complex *), since it might not be aligned properly
1335
+ complexFft.ifft(step, tmpFreqR, tmpFreqI, tmpTimeR, tmpTimeI);
1336
+ } else {
1337
+ if (halfBinShift) {
1338
+ for (size_t i = 0; i < hSize; ++i) {
1339
+ Sample tr = tmpTimeR[i], ti = tmpTimeI[i];
1340
+ Complex twist = halfBinTwists[i];
1341
+ outR[2*i] = tr*twist.real() + ti*twist.imag();
1342
+ outR[2*i + 1] = ti*twist.real() - tr*twist.imag();
1343
+ }
1344
+ } else {
1345
+ for (size_t i = 0; i < hSize; ++i) {
1346
+ outR[2*i] = tmpTimeR[i];
1347
+ outR[2*i + 1] = tmpTimeI[i];
1348
+ }
1349
+ }
1350
+ }
1351
+ }
1352
+ private:
1353
+ using ComplexFFT = SplitFFT<Sample, splitComputation>;
1354
+ ComplexFFT complexFft;
1355
+
1356
+ static constexpr bool complexPrefersSplit = ComplexFFT::prefersSplit;
1357
+ std::vector<Complex> tmpFreq, tmpTime;
1358
+ std::vector<Complex> twiddles, halfBinTwists;
1359
+ };
1360
+
1361
+ template<typename Sample, bool splitComputation=false>
1362
+ using ModifiedRealFFT = RealFFT<Sample, splitComputation, true>;
1363
+
1364
+ }} // namespace
1365
+
1366
+ // Override `Pow2FFT` / `Pow2RealFFT` templates with faster implementations
1367
+ #if defined(SIGNALSMITH_USE_PFFFT) || defined(SIGNALSMITH_USE_PFFFT_DOUBLE)
1368
+ # if defined(SIGNALSMITH_USE_PFFFT)
1369
+ # include "./platform/fft-pffft.h"
1370
+ # endif
1371
+ # if defined(SIGNALSMITH_USE_PFFFT_DOUBLE)
1372
+ # include "./platform/fft-pffft-double.h"
1373
+ # endif
1374
+ #elif defined(SIGNALSMITH_USE_ACCELERATE)
1375
+ # include "./platform/fft-accelerate.h"
1376
+ #elif defined(SIGNALSMITH_USE_IPP)
1377
+ # include "./platform/fft-ipp.h"
1378
+ #endif
1379
+
1380
+ #endif // include guard