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,1500 @@
1
+ /*
2
+ * RAOP : Client to control an AirPlay device, RAOP part
3
+ *
4
+ * Copyright (C) 2004 Shiro Ninomiya <shiron@snino.com>
5
+ * Philippe <philippe_44@outlook.com>
6
+ *
7
+ * See LICENSE
8
+ *
9
+ */
10
+
11
+ #include <stdio.h>
12
+ #include <string.h>
13
+ #include "platform.h"
14
+ #ifdef __ANDROID__
15
+ #include <android/log.h>
16
+ #endif
17
+
18
+ #include <openssl/rand.h>
19
+ #include <openssl/rsa.h>
20
+ #include <pthread.h>
21
+ #include <semaphore.h>
22
+ #include <time.h>
23
+ #include <stdlib.h>
24
+ #include <limits.h>
25
+
26
+ #include "alac_wrapper.h"
27
+ #include "cross_net.h"
28
+ #include "cross_log.h"
29
+ #include "cross_util.h"
30
+
31
+ #include "rtsp_client.h"
32
+ #include "raop_client.h"
33
+ #include "aes.h"
34
+
35
+ #define MAX_BACKLOG 512
36
+
37
+ #define JACK_STATUS_DISCONNECTED 0
38
+ #define JACK_STATUS_CONNECTED 1
39
+
40
+ #define JACK_TYPE_ANALOG 0
41
+ #define JACK_TYPE_DIGITAL 1
42
+
43
+ #define VOLUME_MIN -30
44
+ #define VOLUME_MAX 0
45
+
46
+ #define MD_TEXT 0x01
47
+ #define MD_ARTWORK 0x02
48
+ #define MD_PROGRESS 0x04
49
+
50
+ #define PUBKEY_SIZE 64
51
+
52
+ #define RAOP_SEC(ntp) ((uint32_t) ((ntp) >> 32))
53
+ #define RAOP_FRAC(ntp) ((uint32_t) (ntp))
54
+ #define RAOP_SECNTP(ntp) RAOP_SEC(ntp),RAOP_FRAC(ntp)
55
+ #define RAOP_MSEC(ntp) ((uint32_t) ((((ntp) >> 16)*1000) >> 16))
56
+
57
+ /*
58
+ --- timestamps (ts), millisecond (ms) and network time protocol (ntp) ---
59
+ NTP is starting Jan 1900 (EPOCH) made of 32 high bits (seconds) and 32
60
+ low bits (fraction).
61
+ The player needs timestamp that increment by one for every sample (44100/s), so
62
+ we created a "absolute" timestamp that is direcly based on NTP: it has the same
63
+ "origin" for time.
64
+ - TS = NTP * sample_rate / 2^32 (TS fits in 64bits no matter what)
65
+ - NTP = TS * 2^32 / sample_rate
66
+ Because sample_rate is less than 16 bits, then TS always have the highest 16
67
+ bits available, so this gives, with proper rounding and avoiding overflow:
68
+ - TS = ((NTP >> 16) * sample_rate) >> 16
69
+ - NTP = ((TS << 16) / sample_rate) << 16
70
+ If we want to use a more convenient millisecond base, it must be derived from
71
+ the same NTP and if we want to use only a 32 bits value, raopcl_time32_to_ntp()
72
+ do the "guess" of a 32 bits ms counter into a proper NTP
73
+
74
+ --- head_ts ---
75
+ The head_ts value indicates the absolute frame number of the frame to be played
76
+ in latency seconds.
77
+ When starting to play without a special start time, we assume that we want to
78
+ start at the closed opportunity, so by setting the head_ts to the current
79
+ absolute_ts (called now_ts), we are sure that the player will start to play the
80
+ first frame at now_ts + latency, which means it has time to process a frame
81
+ send with now_ts timestamp. We could further optimize that by reducing a bit
82
+ this value
83
+ When sending the 1st frame after a flush, the head_ts is reset to now_ts
84
+
85
+ --- latency ---
86
+ AirPlay devices seem to send everything with a latency of 11025 + the latency
87
+ set in the sync packet, no matter what.
88
+
89
+ --- start time ---
90
+ As explained in the header of this file, the caller of raopcl_set_start() must
91
+ anticipate by raopcl_latency() if he wants the next frame to be played exactly
92
+ at a given NTP time
93
+
94
+ --- raopcl_accept_frame ---
95
+ This function must be called before sending any data and forces the right pace
96
+ on the caller. When running, it simply checks that now_ts is above head_ts plus
97
+ chunk_len. But it has a critical role at start and resume. When called after a
98
+ raopcl_stop or raopcl_pause has been called, it will return false until a call
99
+ to raopcl_flush has been finished *or* the start_time has been reached. When
100
+ player has been actually flushed, then it will reset the head_ts to the current
101
+ time or the start_time, force sending of the various airplay sync bits and then
102
+ return true, resume normal mode.
103
+
104
+ --- why raopcl_stop/pause and raopcl_flush ---
105
+ It seems that they could have been merged into a single function. This allows
106
+ independant threads for audio sending (raopcl_accept_frames/raopcl_send_chunks)
107
+ and player control. The control thread can then call raopcl_stop and queue the
108
+ raopcl_flush in another thread (remember that raopcl_flush is RTSP so it can
109
+ take time). The thread doing the audio can call raopct_accept_frames as much
110
+ as it wants, it will not be allowed to send anything before the *actual* flush
111
+ is done. The control thread could even ask playback to restart immediately, no
112
+ audio data will be accepted until flush is actually done and synchronization
113
+ will be maintained, even in case of restart at a given time
114
+ */
115
+
116
+
117
+ // all the following must be 32-bits aligned
118
+
119
+ typedef struct {
120
+ rtp_header_t hdr;
121
+ uint32_t dummy;
122
+ ntp_t ref_time;
123
+ ntp_t recv_time;
124
+ ntp_t send_time;
125
+ } __attribute__ ((packed)) rtp_time_pkt_t;
126
+
127
+ typedef struct {
128
+ rtp_header_t hdr;
129
+ uint16_t seq_number;
130
+ uint16_t n;
131
+ } __attribute__ ((packed)) rtp_lost_pkt_t;
132
+
133
+ typedef struct raopcl_s {
134
+ struct rtspcl_s *rtspcl;
135
+ raop_state_t state;
136
+ uint64_t last_keepalive; // Track last keepalive time
137
+ char DACP_id[17], active_remote[11];
138
+ struct {
139
+ unsigned int ctrl, time;
140
+ struct { unsigned int avail, select, send; } audio;
141
+ } sane;
142
+ unsigned int retransmit;
143
+ uint8_t iv[16]; // initialization vector for aes-cbc
144
+ uint8_t key[16]; // key for aes-cbc
145
+ struct in_addr peer_addr, host_addr;
146
+ uint16_t rtsp_port;
147
+ rtp_port_t rtp_ports;
148
+ struct {
149
+ uint16_t seq_number;
150
+ uint64_t timestamp;
151
+ int size;
152
+ uint8_t *buffer;
153
+ } backlog[MAX_BACKLOG];
154
+ // int ajstatus, ajtype;
155
+ float volume;
156
+ aes_context ctx;
157
+ int size_in_aex;
158
+ bool encrypt;
159
+ bool first_pkt;
160
+ uint64_t head_ts, pause_ts, start_ts, first_ts;
161
+ uint64_t started_ts;
162
+ bool flushing;
163
+ uint16_t seq_number;
164
+ unsigned long ssrc;
165
+ uint32_t latency_frames;
166
+ int chunk_len;
167
+ pthread_t time_thread, ctrl_thread;
168
+ pthread_mutex_t mutex;
169
+ bool time_running, ctrl_running;
170
+ int sample_rate, sample_size, channels;
171
+ raop_codec_t codec;
172
+ struct alac_codec_s *alac_codec;
173
+ raop_crypto_t crypto;
174
+ bool auth;
175
+ char secret[SECRET_SIZE + 1];
176
+ char et[16];
177
+ uint8_t md_caps;
178
+ uint16_t port_base, port_range;
179
+ char passwd[64];
180
+ char device_name[128];
181
+ } raopcl_data_t;
182
+
183
+
184
+ extern log_level raop_loglevel;
185
+ static log_level *loglevel = &raop_loglevel;
186
+
187
+ static void *_rtp_timing_thread(void *args);
188
+ static void *_rtp_control_thread(void *args);
189
+ static void _raopcl_terminate_rtp(struct raopcl_s *p);
190
+ static void _raopcl_send_sync(struct raopcl_s *p, bool first);
191
+ static bool _raopcl_send_audio(struct raopcl_s *p, rtp_audio_pkt_t *packet, int size);
192
+ static bool _raopcl_disconnect(struct raopcl_s *p, bool force);
193
+
194
+ /*----------------------------------------------------------------------------*/
195
+ raop_state_t raopcl_state(struct raopcl_s *p)
196
+ {
197
+ if (!p) return RAOP_DOWN;
198
+ return p->state;
199
+ }
200
+
201
+
202
+ /*----------------------------------------------------------------------------*/
203
+ uint32_t raopcl_latency(struct raopcl_s *p)
204
+ {
205
+ if (!p) return 0;
206
+ // why do AirPlay devices use required latency + 11025 ???
207
+ return p->latency_frames + RAOP_LATENCY_MIN;
208
+ }
209
+
210
+
211
+ /*----------------------------------------------------------------------------*/
212
+ uint32_t raopcl_sample_rate(struct raopcl_s *p)
213
+ {
214
+ if (!p) return 0;
215
+ return p->sample_rate;
216
+ }
217
+
218
+ /*----------------------------------------------------------------------------*/
219
+ uint64_t raopcl_get_ntp(struct ntp_s* ntp)
220
+ {
221
+ uint64_t time = gettime_us();
222
+ uint32_t seconds = time / (1000 * 1000);
223
+ uint32_t fraction = ((time % (1000 * 1000)) << 32) / (1000 * 1000);
224
+
225
+ if (ntp) {
226
+ ntp->seconds = seconds;
227
+ ntp->fraction = fraction;
228
+ }
229
+
230
+ return ((uint64_t) seconds << 32) | fraction;
231
+ }
232
+
233
+ /*----------------------------------------------------------------------------*/
234
+ uint64_t raopcl_time32_to_ntp(uint32_t time)
235
+ {
236
+ uint64_t ntp_ms = ((raopcl_get_ntp(NULL) >> 16) * 1000) >> 16;
237
+ uint32_t ms = (uint32_t) ntp_ms;
238
+ uint64_t res;
239
+
240
+ /*
241
+ Received time is supposed to be derived from an NTP in a form of
242
+ (NTP.second * 1000 + NTP.fraction / 1000) & 0xFFFFFFFF
243
+ with many rollovers as NTP started in 1900. It's also assumed that "time"
244
+ is not older then 60 seconds
245
+ */
246
+ if (ms > time + 60000 || ms + 60000 < time) ntp_ms += 0x100000000LL;
247
+
248
+ res = ((((ntp_ms & 0xffffffff00000000LL) | time) << 16) / 1000) << 16;
249
+
250
+ return res;
251
+ }
252
+
253
+ /*----------------------------------------------------------------------------*/
254
+ bool raopcl_is_connected(struct raopcl_s *p)
255
+ {
256
+ bool rc;
257
+
258
+ if (!p) return false;
259
+
260
+ pthread_mutex_lock(&p->mutex);
261
+ rc = rtspcl_is_connected(p->rtspcl);
262
+ pthread_mutex_unlock(&p->mutex);
263
+
264
+ return rc;
265
+ }
266
+
267
+ /*----------------------------------------------------------------------------*/
268
+ bool raopcl_is_sane(struct raopcl_s *p)
269
+ {
270
+ if (p && p->state == RAOP_STREAMING &&
271
+ (!rtspcl_is_sane(p->rtspcl) ||
272
+ (p->sane.audio.send + p->sane.audio.avail*5 + p->sane.audio.select*50) >= 500 ||
273
+ p->sane.ctrl > 2 || p->sane.time > 2)) return false;
274
+
275
+ return true;
276
+ }
277
+
278
+ /*----------------------------------------------------------------------------*/
279
+ bool raopcl_is_playing(struct raopcl_s *p)
280
+ {
281
+ uint64_t now_ts = NTP2TS(raopcl_get_ntp(NULL), p->sample_rate);
282
+
283
+ if (!p) return false;
284
+
285
+ if (p->pause_ts || now_ts < p->head_ts + raopcl_latency(p)) return true;
286
+ else return false;
287
+ }
288
+
289
+ /*----------------------------------------------------------------------------*/
290
+ static int rsa_encrypt(uint8_t *text, int len, uint8_t *res)
291
+ {
292
+ RSA *rsa;
293
+ uint8_t modules[256];
294
+ uint8_t exponent[8];
295
+ int size;
296
+ char n[] =
297
+ "59dE8qLieItsH1WgjrcFRKj6eUWqi+bGLOX1HL3U3GhC/j0Qg90u3sG/1CUtwC"
298
+ "5vOYvfDmFI6oSFXi5ELabWJmT2dKHzBJKa3k9ok+8t9ucRqMd6DZHJ2YCCLlDR"
299
+ "KSKv6kDqnw4UwPdpOMXziC/AMj3Z/lUVX1G7WSHCAWKf1zNS1eLvqr+boEjXuB"
300
+ "OitnZ/bDzPHrTOZz0Dew0uowxf/+sG+NCK3eQJVxqcaJ/vEHKIVd2M+5qL71yJ"
301
+ "Q+87X6oV3eaYvt3zWZYD6z5vYTcrtij2VZ9Zmni/UAaHqn9JdsBWLUEpVviYnh"
302
+ "imNVvYFZeCXg/IdTQ+x4IRdiXNv5hEew==";
303
+ char e[] = "AQAB";
304
+ BIGNUM *n_bn, *e_bn;
305
+
306
+ rsa = RSA_new();
307
+ size = base64_decode(n, modules);
308
+ n_bn = BN_bin2bn(modules, size, NULL);
309
+ size = base64_decode(e, exponent);
310
+ e_bn = BN_bin2bn(exponent, size, NULL);
311
+ RSA_set0_key(rsa, n_bn, e_bn, NULL);
312
+ size = RSA_public_encrypt(len, text, res, rsa, RSA_PKCS1_OAEP_PADDING);
313
+ RSA_free(rsa);
314
+
315
+ return size;
316
+ }
317
+
318
+ /*----------------------------------------------------------------------------*/
319
+ static int raopcl_encrypt(raopcl_data_t *raopcld, uint8_t *data, int size)
320
+ {
321
+ uint8_t *buf;
322
+ uint8_t nv[16];
323
+ int i=0,j;
324
+ memcpy(nv,raopcld->iv,16);
325
+ while(i+16<=size){
326
+ buf=data+i;
327
+ for(j=0;j<16;j++) buf[j] ^= nv[j];
328
+ aes_encrypt(&raopcld->ctx, buf, buf);
329
+ memcpy(nv,buf,16);
330
+ i+=16;
331
+ }
332
+ #if 0
333
+ if(i<size){
334
+ uint8_t tmp[16];
335
+ LOG_INFO("[%p]: a block less than 16 bytes(%d) is not encrypted", raopcld, size-i);
336
+ memset(tmp,0,16);
337
+ memcpy(tmp,data+i,size-i);
338
+ for(j=0;j<16;j++) tmp[j] ^= nv[j];
339
+ aes_encrypt(&raopcld->ctx, tmp, tmp);
340
+ memcpy(nv,tmp,16);
341
+ memcpy(data+i,tmp,16);
342
+ i+=16;
343
+ }
344
+ #endif
345
+ return i;
346
+ }
347
+
348
+ /*----------------------------------------------------------------------------*/
349
+ bool raopcl_keepalive(struct raopcl_s *p) {
350
+ return rtspcl_options(p->rtspcl, NULL);
351
+ }
352
+
353
+ /*----------------------------------------------------------------------------*/
354
+ void raopcl_pause(struct raopcl_s *p)
355
+ {
356
+ if (!p || p->state != RAOP_STREAMING) return;
357
+
358
+ pthread_mutex_lock(&p->mutex);
359
+
360
+ p->pause_ts = p->head_ts;
361
+ p->flushing = true;
362
+
363
+ pthread_mutex_unlock(&p->mutex);
364
+
365
+ LOG_INFO("[%p]: set pause %" PRIu64 "", p, p->pause_ts);
366
+ }
367
+
368
+ /*----------------------------------------------------------------------------*/
369
+ bool raopcl_start_at(struct raopcl_s *p, uint64_t start_time)
370
+ {
371
+ if (!p) return false;
372
+
373
+ pthread_mutex_lock(&p->mutex);
374
+
375
+ p->start_ts = NTP2TS(start_time, p->sample_rate);
376
+
377
+ pthread_mutex_unlock(&p->mutex);
378
+
379
+ LOG_INFO("[%p]: set start time %u.%u (ts:%" PRIu64 ")", p, RAOP_SEC(start_time), RAOP_FRAC(start_time), p->start_ts);
380
+
381
+ return true;
382
+ }
383
+
384
+ /*----------------------------------------------------------------------------*/
385
+ void raopcl_stop(struct raopcl_s *p)
386
+ {
387
+ if (!p) return;
388
+
389
+ pthread_mutex_lock(&p->mutex);
390
+
391
+ p->flushing = true;
392
+ p->pause_ts = 0;
393
+
394
+ pthread_mutex_unlock(&p->mutex);
395
+ }
396
+
397
+ /*----------------------------------------------------------------------------*/
398
+ bool raopcl_accept_frames(struct raopcl_s *p)
399
+ {
400
+ bool accept = false, first_pkt = false;
401
+ uint64_t now_ts;
402
+
403
+ if (!p) return 0;
404
+
405
+ pthread_mutex_lock(&p->mutex);
406
+
407
+ // a flushing is pending
408
+ if (p->flushing) {
409
+ uint64_t now = raopcl_get_ntp(NULL);
410
+
411
+ now_ts = NTP2TS(now, p->sample_rate);
412
+
413
+ // Not flushed yet, but we have time to wait, so pretend we are full
414
+ if (p->state != RAOP_FLUSHED && (!p->start_ts || p->start_ts > now_ts + raopcl_latency(p))) {
415
+ pthread_mutex_unlock(&p->mutex);
416
+ return false;
417
+ }
418
+
419
+ // move to streaming only when really flushed - not when timedout
420
+ if (p->state == RAOP_FLUSHED) {
421
+ p->first_pkt = first_pkt = true;
422
+ LOG_INFO("[%p]: begining to stream hts:%" PRIu64 " n:%u.%u", p, p->head_ts, RAOP_SECNTP(now));
423
+ p->state = RAOP_STREAMING;
424
+ }
425
+
426
+ // unpausing ...
427
+ if (!p->pause_ts) {
428
+ p->head_ts = p->first_ts = p->start_ts ? p->start_ts : now_ts;
429
+ if (first_pkt) _raopcl_send_sync(p, true);
430
+ LOG_INFO("[%p]: restarting w/o pause n:%u.%u, hts:%" PRIu64 "", p, RAOP_SECNTP(now), p->head_ts);
431
+ }
432
+ else {
433
+ uint16_t n, i, chunks = raopcl_latency(p) / p->chunk_len;
434
+
435
+ // if un-pausing w/o start_time, can anticipate as we have buffer
436
+ p->first_ts = p->start_ts ? p->start_ts : now_ts - raopcl_latency(p);
437
+
438
+ // last head_ts shall be first + raopcl_latency - chunk_len
439
+ p->head_ts = p->first_ts - p->chunk_len;
440
+
441
+ if (first_pkt) _raopcl_send_sync(p, true);
442
+
443
+ LOG_INFO("[%p]: restarting w/ pause n:%u.%u, hts:%" PRIu64 " (re-send: %d)", p, RAOP_SECNTP(now), p->head_ts, chunks);
444
+
445
+ // search pause_ts in backlog, it should be backward, not too far
446
+ for (n = p->seq_number, i = 0;
447
+ i < MAX_BACKLOG && p->backlog[n % MAX_BACKLOG].timestamp > p->pause_ts;
448
+ i++, n--) { };
449
+
450
+ // the resend shall go up to (including) pause_ts
451
+ n = (n - chunks + 1) % MAX_BACKLOG;
452
+
453
+ // re-send old packets
454
+ for (i = 0; i < chunks; i++) {
455
+ rtp_audio_pkt_t *packet;
456
+ uint16_t reindex, index = (n + i) % MAX_BACKLOG;
457
+
458
+ if (!p->backlog[index].buffer) continue;
459
+
460
+ p->seq_number++;
461
+
462
+ packet = (rtp_audio_pkt_t*) (p->backlog[index].buffer + sizeof(rtp_header_t));
463
+ packet->hdr.seq[0] = (p->seq_number >> 8) & 0xff;
464
+ packet->hdr.seq[1] = p->seq_number & 0xff;
465
+ packet->timestamp = htonl(p->head_ts);
466
+ packet->hdr.type = 0x60 | (p->first_pkt ? 0x80 : 0);
467
+ p->first_pkt = false;
468
+
469
+ // then replace packets in backlog in case
470
+ reindex = p->seq_number % MAX_BACKLOG;
471
+
472
+ p->backlog[reindex].seq_number = p->seq_number;
473
+ p->backlog[reindex].timestamp = p->head_ts;
474
+ if (p->backlog[reindex].buffer) free(p->backlog[reindex].buffer);
475
+ p->backlog[reindex].buffer = p->backlog[index].buffer;
476
+ p->backlog[reindex].size = p->backlog[index].size;
477
+ p->backlog[index].buffer = NULL;
478
+
479
+ p->head_ts += p->chunk_len;
480
+
481
+ _raopcl_send_audio(p, packet, p->backlog[reindex].size);
482
+ }
483
+
484
+ LOG_DEBUG("[%p]: finished resend %u", p, i);
485
+ }
486
+
487
+ p->pause_ts = p->start_ts = 0;
488
+ p->flushing = false;
489
+ }
490
+
491
+ // when paused, fix "now" at the time when it was paused.
492
+ if (p->pause_ts) now_ts = p->pause_ts;
493
+ else now_ts = NTP2TS(raopcl_get_ntp(NULL), p->sample_rate);
494
+
495
+ if (now_ts >= p->head_ts + p->chunk_len) accept = true;
496
+
497
+ /* Direct android log for first 3 calls and then every 50000 */
498
+ {
499
+ static int af_count = 0;
500
+ if (af_count < 3 || af_count % 50000 == 0) {
501
+ __android_log_print(ANDROID_LOG_WARN, "RaopTiming",
502
+ "af#%d accept=%d now_ts=%" PRIu64 " head_ts=%" PRIu64
503
+ " chunk=%u gap=%" PRId64 " state=%d flushing=%d pause_ts=%" PRIu64,
504
+ af_count, accept, now_ts, p->head_ts, p->chunk_len,
505
+ (int64_t)(now_ts - p->head_ts - p->chunk_len),
506
+ p->state, p->flushing, p->pause_ts);
507
+ }
508
+ af_count++;
509
+ }
510
+
511
+ pthread_mutex_unlock(&p->mutex);
512
+
513
+ return accept;
514
+ }
515
+
516
+ /*----------------------------------------------------------------------------*/
517
+ bool raopcl_send_chunk(struct raopcl_s *p, uint8_t *sample, int frames, uint64_t *playtime)
518
+ {
519
+ uint8_t *encoded, *buffer;
520
+ rtp_audio_pkt_t *packet;
521
+ size_t n;
522
+ int size;
523
+ uint64_t now = raopcl_get_ntp(NULL);
524
+
525
+ if (!p || !sample) {
526
+ LOG_ERROR("[%p]: something went wrong (s:%p)", p, sample);
527
+ return false;
528
+ }
529
+
530
+ pthread_mutex_lock(&p->mutex);
531
+
532
+ /*
533
+ Move to streaming state only when really flushed. In most cases, this is
534
+ done by the raopcl_accept_frames function, except when a player takes too
535
+ long to flush (JBL OnBeat) and we have to "fake" accepting frames
536
+ */
537
+ if (p->state == RAOP_FLUSHED) {
538
+ p->first_pkt = true;
539
+ LOG_INFO("[%p]: begining to stream (LATE) hts:%" PRIu64 " n:%u.%u", p, p->head_ts, RAOP_SECNTP(now));
540
+ p->state = RAOP_STREAMING;
541
+ _raopcl_send_sync(p, true);
542
+ }
543
+
544
+ switch (p->codec) {
545
+ case RAOP_ALAC:
546
+ pcm_to_alac(p->alac_codec, sample, frames, &encoded, &size);
547
+ break;
548
+ case RAOP_ALAC_RAW:
549
+ pcm_to_alac_raw(sample, frames, &encoded, &size, p->chunk_len);
550
+ break;
551
+ case RAOP_PCM: {
552
+ uint8_t *src = sample, *dst = encoded = malloc(frames * 4);
553
+ for (size = 0; size < frames; size++) {
554
+ *dst++ = *(src + 1); *dst++ = *src++;
555
+ *dst++ = *(++src + 1); *dst++ = *src++;
556
+ src++;
557
+ }
558
+ size *= 4;
559
+ break;
560
+ }
561
+ default:
562
+ LOG_ERROR("[%p]: don't know what we're doing here", p);
563
+ return false;
564
+ }
565
+
566
+ if ((buffer = malloc(sizeof(rtp_header_t) + sizeof(rtp_audio_pkt_t) + size)) == NULL) {
567
+ pthread_mutex_unlock(&p->mutex);
568
+ if (encoded) free(encoded);
569
+ LOG_ERROR("[%p]: cannot allocate buffer",p);
570
+ return false;
571
+ }
572
+
573
+ *playtime = TS2NTP(p->head_ts + raopcl_latency(p), p->sample_rate);
574
+
575
+ LOG_SDEBUG("[%p]: sending audio ts:%" PRIu64 " (pt:%u.%u now:%" PRIu64 ") ", p, p->head_ts, RAOP_SEC(*playtime), RAOP_FRAC(*playtime), raopcl_get_ntp(NULL));
576
+
577
+ p->seq_number++;
578
+
579
+ // packet is after re-transmit header
580
+ packet = (rtp_audio_pkt_t *) (buffer + sizeof(rtp_header_t));
581
+ packet->hdr.proto = 0x80;
582
+ packet->hdr.type = 0x60 | (p->first_pkt ? 0x80 : 0);
583
+ p->first_pkt = false;
584
+ packet->hdr.seq[0] = (p->seq_number >> 8) & 0xff;
585
+ packet->hdr.seq[1] = p->seq_number & 0xff;
586
+ packet->timestamp = htonl(p->head_ts);
587
+ packet->ssrc = htonl(p->ssrc);
588
+
589
+ memcpy((uint8_t*) packet + sizeof(rtp_audio_pkt_t), encoded, size);
590
+
591
+ // with newer airport express, don't use encryption (??)
592
+ if (p->encrypt) raopcl_encrypt(p, (uint8_t*) packet + sizeof(rtp_audio_pkt_t), size);
593
+
594
+ n = p->seq_number % MAX_BACKLOG;
595
+ p->backlog[n].seq_number = p->seq_number;
596
+ p->backlog[n].timestamp = p->head_ts;
597
+ if (p->backlog[n].buffer) free(p->backlog[n].buffer);
598
+ p->backlog[n].buffer = buffer;
599
+ p->backlog[n].size = sizeof(rtp_audio_pkt_t) + size;
600
+
601
+ p->head_ts += p->chunk_len;
602
+
603
+ _raopcl_send_audio(p, packet, sizeof(rtp_audio_pkt_t) + size);
604
+
605
+ pthread_mutex_unlock(&p->mutex);
606
+
607
+ if (NTP2MS(*playtime) % 60000 < 8) {
608
+ LOG_INFO("[%p]: check n:%u p:%u ts:%" PRIu64 " sn:%u\n "
609
+ "retr: %u, avail: %u, send: %u, select: %u)", p,
610
+ RAOP_MSEC(now), RAOP_MSEC(*playtime), p->head_ts, p->seq_number,
611
+ p->retransmit, p->sane.audio.avail, p->sane.audio.send,
612
+ p->sane.audio.select);
613
+ }
614
+
615
+ if (encoded) free(encoded);
616
+
617
+ return true;
618
+ }
619
+
620
+ /*----------------------------------------------------------------------------*/
621
+ bool _raopcl_send_audio(struct raopcl_s *p, rtp_audio_pkt_t *packet, int size)
622
+ {
623
+ struct timeval timeout;
624
+ fd_set wfds;
625
+ struct sockaddr_in addr;
626
+ size_t n;
627
+ bool ret = true;
628
+
629
+ /*
630
+ Do not send if audio port closed or we are not yet in streaming state. We
631
+ might be just waiting for flush to happen in the case of a device taking a
632
+ lot of time to connect, so avoid disturbing it with frames. Still, for sync
633
+ reasons or when a starting time has been set, it's normal that the caller
634
+ uses raopcld_accept_frames() and tries to send frames even before the
635
+ connect has returned in case of multi-threaded application
636
+ */
637
+ if (p->rtp_ports.audio.fd == -1 || p->state != RAOP_STREAMING) return false;
638
+
639
+ addr.sin_family = AF_INET;
640
+ addr.sin_addr = p->peer_addr;
641
+ addr.sin_port = htons(p->rtp_ports.audio.rport);
642
+
643
+ FD_ZERO(&wfds);
644
+ FD_SET(p->rtp_ports.audio.fd, &wfds);
645
+
646
+ /*
647
+ The audio socket is non blocking, so we can can wait socket availability
648
+ but not too much. Half of the packet size if a good value. There is the
649
+ backlog buffer to re-send packets if needed, so nothign is lost
650
+ */
651
+ timeout.tv_sec = 0;
652
+ timeout.tv_usec = (p->chunk_len * 1000000L) / (p->sample_rate * 2);
653
+
654
+ if (select(p->rtp_ports.audio.fd + 1, NULL, &wfds, NULL, &timeout) == -1) {
655
+ LOG_ERROR("[%p]: audio socket closed", p);
656
+ p->sane.audio.select++;
657
+ }
658
+ else p->sane.audio.select = 0;
659
+
660
+ if (FD_ISSET(p->rtp_ports.audio.fd, &wfds)) {
661
+ n = sendto(p->rtp_ports.audio.fd, (void*) packet, + size, 0, (void*) &addr, sizeof(addr));
662
+ if (n != size) {
663
+ LOG_DEBUG("[%p]: error sending audio packet", p);
664
+ ret = false;
665
+ p->sane.audio.send++;
666
+ }
667
+ else p->sane.audio.send = 0;
668
+ p->sane.audio.avail = 0;
669
+ }
670
+ else {
671
+ LOG_DEBUG("[%p]: audio socket unavailable", p);
672
+ ret = false;
673
+ p->sane.audio.avail++;
674
+ }
675
+
676
+ return ret;
677
+ }
678
+
679
+ /*----------------------------------------------------------------------------*/
680
+ struct raopcl_s *raopcl_create(struct in_addr host, uint16_t port_base, uint16_t port_range,
681
+ char *DACP_id, char *active_remote,
682
+ raop_codec_t codec, int chunk_len, int latency_frames,
683
+ raop_crypto_t crypto, bool auth, char *secret, char* passwd,
684
+ char *et, char *md,
685
+ int sample_rate, int sample_size, int channels, float volume)
686
+ {
687
+ raopcl_data_t *raopcld;
688
+
689
+ if (chunk_len > MAX_FRAMES_PER_CHUNK) {
690
+ LOG_ERROR("Chunk length must below %d", MAX_FRAMES_PER_CHUNK);
691
+ return NULL;
692
+ }
693
+
694
+ raopcld = malloc(sizeof(raopcl_data_t));
695
+ memset(raopcld, 0, sizeof(raopcl_data_t));
696
+
697
+ raopcld->last_keepalive = raopcl_get_ntp(NULL); // Initialize last keepalive time
698
+ // raopcld->sane is set to 0
699
+ raopcld->port_base = port_base;
700
+ raopcld->port_range = port_base ? port_range : 1;
701
+ raopcld->sample_rate = sample_rate;
702
+ raopcld->sample_size = sample_size;
703
+ raopcld->channels = channels;
704
+ raopcld->volume = volume;
705
+ raopcld->codec = codec;
706
+ raopcld->crypto = crypto;
707
+ raopcld->auth = auth;
708
+ if (passwd) strncpy(raopcld->passwd, passwd, sizeof(raopcld->passwd) - 1);
709
+ if (secret) strncpy(raopcld->secret, secret, SECRET_SIZE);
710
+ if (et) strncpy(raopcld->et, et, 16);
711
+ raopcld->latency_frames = max(latency_frames, RAOP_LATENCY_MIN);
712
+ raopcld->chunk_len = chunk_len;
713
+ strcpy(raopcld->DACP_id, DACP_id ? DACP_id : "");
714
+ strcpy(raopcld->active_remote, active_remote ? active_remote : "");
715
+ raopcld->host_addr = host;
716
+ raopcld->rtp_ports.ctrl.fd = raopcld->rtp_ports.time.fd = raopcld->rtp_ports.audio.fd = -1;
717
+ raopcld->seq_number = rand();
718
+
719
+ if (md && strchr(md, '0')) raopcld->md_caps |= MD_TEXT;
720
+ if (md && strchr(md, '1')) raopcld->md_caps |= MD_ARTWORK;
721
+ if (md && strchr(md, '2')) raopcld->md_caps |= MD_PROGRESS;
722
+
723
+ // init RTSP if needed
724
+ if (((raopcld->rtspcl = rtspcl_create("iTunes/7.6.2 (Windows; N;)")) == NULL)) {
725
+ LOG_ERROR("[%p]: Cannot create RTSP context", raopcld);
726
+ free(raopcld);
727
+ return NULL;
728
+ }
729
+
730
+ if (codec == RAOP_ALAC && (raopcld->alac_codec = alac_create_encoder(raopcld->chunk_len, sample_rate, sample_size, channels)) == NULL) {
731
+ LOG_WARN("[%p]: cannot create ALAC codec", raopcld);
732
+ raopcld->codec = RAOP_ALAC_RAW;
733
+ }
734
+
735
+ LOG_INFO("[%p]: using %s coding", raopcld, raopcld->alac_codec ? "ALAC" : "PCM");
736
+
737
+ pthread_mutex_init(&raopcld->mutex, NULL);
738
+
739
+ RAND_bytes(raopcld->iv, sizeof(raopcld->iv));
740
+ VALGRIND_MAKE_MEM_DEFINED(raopcld->iv, sizeof(raopcld->iv));
741
+ RAND_bytes(raopcld->key, sizeof(raopcld->key));
742
+ VALGRIND_MAKE_MEM_DEFINED(raopcld->key, sizeof(raopcld->key));
743
+
744
+ aes_set_key(&raopcld->ctx, raopcld->key, 128);
745
+
746
+ raopcl_sanitize(raopcld);
747
+
748
+ return raopcld;
749
+ }
750
+
751
+ /*----------------------------------------------------------------------------*/
752
+ static void _raopcl_terminate_rtp(struct raopcl_s *p)
753
+ {
754
+ // Terminate RTP threads and close sockets
755
+ p->ctrl_running = false;
756
+ pthread_join(p->ctrl_thread, NULL);
757
+
758
+ p->time_running = false;
759
+ pthread_join(p->time_thread, NULL);
760
+
761
+ if (p->rtp_ports.ctrl.fd != -1) closesocket(p->rtp_ports.ctrl.fd);
762
+ if (p->rtp_ports.time.fd != -1) closesocket(p->rtp_ports.time.fd);
763
+ if (p->rtp_ports.audio.fd != -1) closesocket(p->rtp_ports.audio.fd);
764
+
765
+ p->rtp_ports.ctrl.fd = p->rtp_ports.time.fd = p->rtp_ports.audio.fd = -1;
766
+ }
767
+
768
+ /*----------------------------------------------------------------------------*/
769
+ bool raopcl_set_volume(struct raopcl_s *p, float vol)
770
+ {
771
+ char a[128];
772
+ if (!p) return false;
773
+
774
+ if ((vol < -30 || vol > 0) && vol != -144.0) return false;
775
+
776
+ p->volume = vol;
777
+
778
+ if (!p->rtspcl || p->state < RAOP_FLUSHED) return true;
779
+
780
+ sprintf(a, "volume: %f\r\n", vol);
781
+
782
+ return rtspcl_set_parameter(p->rtspcl, a);
783
+ }
784
+
785
+ /*----------------------------------------------------------------------------*/
786
+ // minimum=0, maximum=100
787
+ float raopcl_float_volume(int vol)
788
+ {
789
+ if (vol == 0) return -144.0;
790
+ return VOLUME_MIN + ((VOLUME_MAX - VOLUME_MIN) * (float) vol) / 100;
791
+ }
792
+
793
+ /*----------------------------------------------------------------------------*/
794
+ bool raopcl_set_progress_ms(struct raopcl_s *p, uint32_t elapsed, uint32_t duration)
795
+ {
796
+ return raopcl_set_progress(p, MS2NTP(elapsed), MS2NTP(duration));
797
+ }
798
+
799
+ /*----------------------------------------------------------------------------*/
800
+ bool raopcl_set_progress(struct raopcl_s *p, uint64_t elapsed, uint64_t duration)
801
+ {
802
+ char a[128];
803
+ uint64_t end, now;
804
+
805
+ if (!p || !p->rtspcl || p->state < RAOP_STREAMING || !(p->md_caps & MD_PROGRESS)) return false;
806
+
807
+ now = NTP2TS(raopcl_get_ntp(NULL), p->sample_rate);
808
+ p->started_ts = now - NTP2TS(elapsed, p->sample_rate);
809
+ end = duration ? p->started_ts + NTP2TS(duration, p->sample_rate) : now;
810
+
811
+ sprintf(a, "progress: %u/%u/%u\r\n", (uint32_t) p->started_ts, (uint32_t) now, (uint32_t) end);
812
+
813
+ return rtspcl_set_parameter(p->rtspcl, a);
814
+ }
815
+
816
+ /*----------------------------------------------------------------------------*/
817
+ uint64_t raopcl_get_progress_ms(struct raopcl_s* p)
818
+ {
819
+ uint64_t elapsed, now;
820
+
821
+ if (!p || p->state < RAOP_FLUSHING || !p->rtspcl || !(p->md_caps & MD_PROGRESS)) return 0;
822
+
823
+ // if we have no pause_ts and we are flushing or are not streaming, then we are stopped
824
+ if ((p->flushing || p->state < RAOP_STREAMING) && !p->pause_ts) return 0;
825
+
826
+ // we are not stopped, then pause_ts is to be taken into account if not 0
827
+ now = p->pause_ts ? p->pause_ts : NTP2TS(raopcl_get_ntp(NULL), p->sample_rate);
828
+ elapsed = TS2MS(now - p->started_ts, p->sample_rate);
829
+
830
+ return elapsed;
831
+ }
832
+
833
+ /*----------------------------------------------------------------------------*/
834
+ bool raopcl_set_artwork(struct raopcl_s *p, char *content_type, int size, char *image)
835
+ {
836
+ if (!p || !p->rtspcl || p->state < RAOP_FLUSHED || !(p->md_caps & MD_ARTWORK)) return false;
837
+
838
+ return rtspcl_set_artwork(p->rtspcl, p->head_ts + p->latency_frames, content_type, size, image);
839
+ }
840
+
841
+ /*----------------------------------------------------------------------------*/
842
+ bool raopcl_set_daap(struct raopcl_s *p, int count, ...)
843
+ {
844
+ va_list args;
845
+
846
+ if (!p || p->state < RAOP_FLUSHED || !(p->md_caps & MD_TEXT)) return false;
847
+
848
+ va_start(args, count);
849
+
850
+ return rtspcl_set_daap(p->rtspcl, p->head_ts + p->latency_frames, count, args);
851
+ }
852
+
853
+ /*----------------------------------------------------------------------------*/
854
+ static bool raopcl_set_sdp(struct raopcl_s *p, char *sdp)
855
+ {
856
+ bool rc = true;
857
+
858
+ // codec
859
+ switch (p->codec) {
860
+
861
+ case RAOP_ALAC_RAW:
862
+ case RAOP_ALAC: {
863
+ char buf[256];
864
+
865
+ sprintf(buf,
866
+ "m=audio 0 RTP/AVP 96\r\n"
867
+ "a=rtpmap:96 AppleLossless\r\n"
868
+ "a=fmtp:96 %d 0 %d 40 10 14 %d 255 0 0 %d\r\n",
869
+ p->chunk_len, p->sample_size, p->channels, p->sample_rate);
870
+ strcat(sdp, buf);
871
+ break;
872
+ }
873
+ case RAOP_PCM: {
874
+ char buf[256];
875
+
876
+ sprintf(buf,
877
+ "m=audio 0 RTP/AVP 96\r\n"
878
+ "a=rtpmap:96 L%d/%d/%d\r\n",
879
+ p->sample_size, p->sample_rate, p->channels);
880
+ strcat(sdp, buf);
881
+ break;
882
+ }
883
+ default:
884
+ rc = false;
885
+ LOG_ERROR("[%p]: unsupported codec: %d", p, p->codec);
886
+ break;
887
+ }
888
+
889
+ // add encryption if required - only RSA
890
+ switch (p->crypto ) {
891
+ case RAOP_RSA: {
892
+ char *key = NULL, *iv = NULL, *buf;
893
+ uint8_t rsakey[512];
894
+ int i;
895
+
896
+ i = rsa_encrypt(p->key, 16, rsakey);
897
+ base64_encode(rsakey, i, &key);
898
+ strremovechar(key, '=');
899
+ base64_encode(p->iv, 16, &iv);
900
+ strremovechar(iv, '=');
901
+ buf = malloc(strlen(key) + strlen(iv) + 128);
902
+ sprintf(buf, "a=rsaaeskey:%s\r\n"
903
+ "a=aesiv:%s\r\n",
904
+ key, iv);
905
+ strcat(sdp, buf);
906
+ free(key);
907
+ free(iv);
908
+ free(buf);
909
+ break;
910
+ }
911
+ case RAOP_CLEAR:
912
+ break;
913
+ default:
914
+ rc = false;
915
+ LOG_ERROR("[%p]: unsupported encryption: %d", p, p->crypto);
916
+ }
917
+
918
+ return rc;
919
+ }
920
+
921
+ /*----------------------------------------------------------------------------*/
922
+ static bool raopcl_analyse_setup(struct raopcl_s *p, key_data_t *setup_kd)
923
+ {
924
+ char *buf, *token, *pc;
925
+ const char delimiters[] = ";";
926
+ bool rc = true;
927
+
928
+ /*
929
+ // get audio jack info
930
+ if ((buf = kd_lookup(setup_kd,"Audio-Jack-Status")) == NULL) {
931
+ LOG_ERROR("[%p]: Audio-Jack-Status is missing", p);
932
+ rc = false;
933
+ }
934
+
935
+ token = strtok(buf,delimiters);
936
+ while(token){
937
+ if ((pc = strstr(token, "=")) != NULL){
938
+ *pc = 0;
939
+ if(!strcmp(token,"type") && !strcmp(pc + 1,"digital")) p->ajtype = JACK_TYPE_DIGITAL;
940
+ }
941
+ else {
942
+ if (!strcmp(token,"connected")) p->ajstatus = JACK_STATUS_CONNECTED;
943
+ }
944
+ token = strtok(NULL, delimiters);
945
+ }
946
+ */
947
+
948
+ // get transport (port ...) info
949
+ if ((buf = kd_lookup(setup_kd, "Transport")) == NULL){
950
+ LOG_ERROR("[%p]: no transport in response", p);
951
+ rc = false;
952
+ }
953
+
954
+ token = strtok(buf, delimiters);
955
+ while (token) {
956
+ if ((pc = strstr(token, "=")) != NULL) {
957
+ *pc = 0;
958
+ if (!strcmp(token,"server_port")) p->rtp_ports.audio.rport=atoi(pc+1);
959
+ if (!strcmp(token,"control_port")) p->rtp_ports.ctrl.rport=atoi(pc+1);
960
+ if (!strcmp(token,"timing_port")) p->rtp_ports.time.rport=atoi(pc+1);
961
+ }
962
+ token = strtok(NULL,delimiters);
963
+ }
964
+
965
+ if (!p->rtp_ports.audio.rport || !p->rtp_ports.ctrl.rport) {
966
+ LOG_ERROR("[%p]: missing a RTP port in response", p);
967
+ rc = false;
968
+ } else if (!p->rtp_ports.time.rport) {
969
+ LOG_INFO("[%p]: missing timing port, will get it later", p);
970
+ }
971
+
972
+ return rc;
973
+ }
974
+
975
+ /*----------------------------------------------------------------------------*/
976
+ bool raopcl_connect(struct raopcl_s *p, struct in_addr peer, uint16_t destport, bool set_volume)
977
+ {
978
+ struct {
979
+ uint32_t sid;
980
+ uint64_t sci;
981
+ uint8_t sac[16];
982
+ } seed;
983
+ char sid[10+1], sci[16+1];
984
+ char *sac = NULL;
985
+ char sdp[1024];
986
+ key_data_t kd[64];
987
+ char *buf;
988
+ struct {
989
+ uint16_t count, offset;
990
+ } port = { 0 };
991
+
992
+ if (!p) return false;
993
+
994
+ if (p->state >= RAOP_FLUSHING) return true;
995
+
996
+ kd[0].key = NULL;
997
+ port.offset = rand() % p->port_range;
998
+
999
+ if (peer.s_addr != INADDR_ANY) p->peer_addr.s_addr = peer.s_addr;
1000
+ if (destport != 0) p->rtsp_port = destport;
1001
+
1002
+ RAND_bytes((uint8_t*) &p->ssrc, sizeof(p->ssrc));
1003
+ VALGRIND_MAKE_MEM_DEFINED(&p->ssrc, sizeof(p->ssrc));
1004
+
1005
+ p->encrypt = (p->crypto != RAOP_CLEAR);
1006
+ memset(&p->sane, 0, sizeof(p->sane));
1007
+ p->retransmit = 0;
1008
+
1009
+ RAND_bytes((uint8_t*) &seed, sizeof(seed));
1010
+ VALGRIND_MAKE_MEM_DEFINED(&seed, sizeof(seed));
1011
+ sprintf(sid, "%010lu", (long unsigned int) seed.sid);
1012
+ sprintf(sci, "%016llx", (long long int) seed.sci);
1013
+
1014
+ // RTSP misc setup
1015
+ rtspcl_add_exthds(p->rtspcl,"Client-Instance", sci);
1016
+ if (*p->DACP_id) rtspcl_add_exthds(p->rtspcl,"DACP-ID", p->DACP_id);
1017
+ if (*p->active_remote) rtspcl_add_exthds(p->rtspcl,"Active-Remote", p->active_remote);
1018
+ if (*p->device_name) rtspcl_add_exthds(p->rtspcl,"X-Apple-Device-Name", p->device_name);
1019
+
1020
+ // RTSP connect
1021
+ if (!rtspcl_connect(p->rtspcl, p->host_addr, peer, destport, sid)) goto erexit;
1022
+
1023
+ LOG_INFO("[%p]: local interface %s", p, rtspcl_local_ip(p->rtspcl));
1024
+
1025
+ // RTSP pairing verify for AppleTV
1026
+ if (*p->secret && !rtspcl_pair_verify(p->rtspcl, p->secret)) goto erexit;
1027
+
1028
+ // Send pubkey for MFi devices
1029
+ if (strchr(p->et, '4')) rtspcl_auth_setup(p->rtspcl);
1030
+
1031
+ // build sdp parameter
1032
+ buf = strdup(inet_ntoa(peer));
1033
+ sprintf(sdp,
1034
+ "v=0\r\n"
1035
+ "o=iTunes %s 0 IN IP4 %s\r\n"
1036
+ "s=iTunes\r\n"
1037
+ "c=IN IP4 %s\r\n"
1038
+ "t=0 0\r\n",
1039
+ sid, rtspcl_local_ip(p->rtspcl), buf);
1040
+ free(buf);
1041
+
1042
+ if (!raopcl_set_sdp(p, sdp)) goto erexit;
1043
+
1044
+ // AppleTV expects now the timing port ot be opened BEFORE the setup message
1045
+ p->rtp_ports.time.rport = 0;
1046
+
1047
+ do {
1048
+ p->rtp_ports.time.lport = p->port_base + ((port.offset + port.count++) % p->port_range);
1049
+ p->rtp_ports.time.fd = open_udp_socket(p->host_addr, &p->rtp_ports.time.lport, true);
1050
+ } while (p->rtp_ports.time.fd < 0 && port.count < p->port_range);
1051
+
1052
+ if (p->rtp_ports.time.fd < 0) goto erexit;
1053
+
1054
+ p->time_running = true;
1055
+ pthread_create(&p->time_thread, NULL, _rtp_timing_thread, (void*) p);
1056
+
1057
+ // RTSP ANNOUNCE
1058
+ if (p->auth && p->crypto) {
1059
+ base64_encode(&seed.sac, 16, &sac);
1060
+ strremovechar(sac, '=');
1061
+ if (!rtspcl_add_exthds(p->rtspcl, "Apple-Challenge", sac)) goto erexit;
1062
+ if (!rtspcl_announce_sdp(p->rtspcl, sdp, p->passwd))goto erexit;
1063
+ if (!rtspcl_mark_del_exthds(p->rtspcl, "Apple-Challenge")) goto erexit;
1064
+ } else if (!rtspcl_announce_sdp(p->rtspcl, sdp, p->passwd)) {
1065
+ goto erexit;
1066
+ }
1067
+
1068
+ // open RTP sockets, need local ports here before sending SETUP
1069
+ do {
1070
+ p->rtp_ports.ctrl.lport = p->port_base + ((port.offset + port.count++) % p->port_range);
1071
+ p->rtp_ports.ctrl.fd = open_udp_socket(p->host_addr, &p->rtp_ports.ctrl.lport, true);
1072
+ } while (p->rtp_ports.ctrl.fd < 0 && port.count < p->port_range);
1073
+ do {
1074
+ p->rtp_ports.audio.lport = p->port_base + ((port.offset + port.count++) % p->port_range);
1075
+ p->rtp_ports.audio.fd = open_udp_socket(p->host_addr, &p->rtp_ports.audio.lport, false);
1076
+ } while (p->rtp_ports.audio.fd < 0 && port.count < p->port_range);
1077
+
1078
+ if (p->rtp_ports.ctrl.fd < 0 || p->rtp_ports.audio.fd < 0) goto erexit;
1079
+
1080
+ // RTSP SETUP : get all RTP destination ports
1081
+ if (!rtspcl_setup(p->rtspcl, &p->rtp_ports, kd)) goto erexit;
1082
+ if (!raopcl_analyse_setup(p, kd)) goto erexit;
1083
+ kd_free(kd);
1084
+
1085
+ LOG_DEBUG( "[%p]:opened audio socket l:%5d r:%d", p, p->rtp_ports.audio.lport, p->rtp_ports.audio.rport );
1086
+ LOG_DEBUG( "[%p]:opened timing socket l:%5d r:%d", p, p->rtp_ports.time.lport, p->rtp_ports.time.rport );
1087
+ LOG_DEBUG( "[%p]:opened control socket l:%5d r:%d", p, p->rtp_ports.ctrl.lport, p->rtp_ports.ctrl.rport );
1088
+
1089
+ if (!rtspcl_record(p->rtspcl, p->seq_number + 1, NTP2TS(raopcl_get_ntp(NULL), p->sample_rate), kd)) goto erexit;
1090
+
1091
+ if (kd_lookup(kd, "Audio-Latency")) {
1092
+ int latency = atoi(kd_lookup(kd, "Audio-Latency"));
1093
+
1094
+ p->latency_frames = max((uint32_t) latency, p->latency_frames);
1095
+ }
1096
+ kd_free(kd);
1097
+
1098
+ p->ctrl_running = true;
1099
+ pthread_create(&p->ctrl_thread, NULL, _rtp_control_thread, (void*) p);
1100
+
1101
+ pthread_mutex_lock(&p->mutex);
1102
+ // as connect might take time, state might already have been set
1103
+ if (p->state == RAOP_DOWN) p->state = RAOP_FLUSHED;
1104
+ pthread_mutex_unlock(&p->mutex);
1105
+
1106
+ if (set_volume) {
1107
+ LOG_INFO("[%p]: setting volume as part of connect %.2f", p, p->volume);
1108
+ raopcl_set_volume(p, p->volume);
1109
+ }
1110
+
1111
+ if (sac) free(sac);
1112
+ return true;
1113
+
1114
+ erexit:
1115
+ if (sac) free(sac);
1116
+ kd_free(kd);
1117
+ _raopcl_disconnect(p, true);
1118
+
1119
+ return false;
1120
+ }
1121
+
1122
+ /*----------------------------------------------------------------------------*/
1123
+ bool raopcl_flush(struct raopcl_s *p)
1124
+ {
1125
+ bool rc;
1126
+ uint16_t seq_number;
1127
+ uint32_t timestamp;
1128
+
1129
+ if (!p || p->state != RAOP_STREAMING) return false;
1130
+
1131
+ pthread_mutex_lock(&p->mutex);
1132
+ p->state = RAOP_FLUSHING;
1133
+ p->retransmit = 0;
1134
+ seq_number = p->seq_number;
1135
+ timestamp = p->head_ts;
1136
+ pthread_mutex_unlock(&p->mutex);
1137
+
1138
+ LOG_INFO("[%p]: flushing up to s:%u ts:%" PRIu64 "", p, seq_number, timestamp);
1139
+
1140
+ // everything BELOW these values should be FLUSHED ==> the +1 is mandatory
1141
+ rc = rtspcl_flush(p->rtspcl, seq_number + 1, timestamp + 1);
1142
+
1143
+ pthread_mutex_lock(&p->mutex);
1144
+ p->state = RAOP_FLUSHED;
1145
+ pthread_mutex_unlock(&p->mutex);
1146
+
1147
+ return rc;
1148
+ }
1149
+
1150
+ /*----------------------------------------------------------------------------*/
1151
+ bool _raopcl_disconnect(struct raopcl_s *p, bool force)
1152
+ {
1153
+ bool rc = true;
1154
+
1155
+ if (!force && (!p || p->state == RAOP_DOWN)) return true;
1156
+
1157
+ pthread_mutex_lock(&p->mutex);
1158
+ p->state = RAOP_DOWN;
1159
+ p->last_keepalive = raopcl_get_ntp(NULL);
1160
+ pthread_mutex_unlock(&p->mutex);
1161
+
1162
+ _raopcl_terminate_rtp(p);
1163
+
1164
+ rc = rtspcl_flush(p->rtspcl, p->seq_number + 1, p->head_ts + 1);
1165
+ rc &= rtspcl_disconnect(p->rtspcl);
1166
+ rc &= rtspcl_remove_all_exthds(p->rtspcl);
1167
+
1168
+ return rc;
1169
+ }
1170
+
1171
+ /*----------------------------------------------------------------------------*/
1172
+ bool raopcl_disconnect(struct raopcl_s *p)
1173
+ {
1174
+ return _raopcl_disconnect(p, false);
1175
+ }
1176
+
1177
+ /*----------------------------------------------------------------------------*/
1178
+ bool raopcl_repair(struct raopcl_s *p, bool set_volume)
1179
+ {
1180
+ bool rc = true;
1181
+
1182
+ if (!p) return false;
1183
+
1184
+ pthread_mutex_lock(&p->mutex);
1185
+ p->state = RAOP_DOWN;
1186
+ pthread_mutex_unlock(&p->mutex);
1187
+
1188
+ _raopcl_terminate_rtp(p);
1189
+
1190
+ // not thread safe, but does not matter really, all we want is "some" flush
1191
+ rc &= rtspcl_flush(p->rtspcl, p->seq_number + 1, p->head_ts + 1);
1192
+ rc &= rtspcl_disconnect(p->rtspcl);
1193
+ rc &= rtspcl_remove_all_exthds(p->rtspcl);
1194
+
1195
+ // this will put us again in FLUSHED state
1196
+ rc &= raopcl_connect(p, p->peer_addr, p->rtsp_port, set_volume);
1197
+
1198
+ return rc;
1199
+ }
1200
+
1201
+ /*----------------------------------------------------------------------------*/
1202
+ int raopcl_last_rtsp_status(struct raopcl_s *p) {
1203
+ if (!p || !p->rtspcl) return 0;
1204
+ return rtspcl_last_status(p->rtspcl);
1205
+ }
1206
+
1207
+ /*----------------------------------------------------------------------------*/
1208
+ void raopcl_set_password(struct raopcl_s *p, const char *passwd) {
1209
+ if (!p) return;
1210
+ if (passwd) {
1211
+ strncpy(p->passwd, passwd, sizeof(p->passwd) - 1);
1212
+ p->passwd[sizeof(p->passwd) - 1] = '\0';
1213
+ } else {
1214
+ p->passwd[0] = '\0';
1215
+ }
1216
+ }
1217
+
1218
+ /*----------------------------------------------------------------------------*/
1219
+ void raopcl_set_device_name(struct raopcl_s *p, const char *name) {
1220
+ if (!p || !name) return;
1221
+ strncpy(p->device_name, name, sizeof(p->device_name) - 1);
1222
+ p->device_name[sizeof(p->device_name) - 1] = '\0';
1223
+ }
1224
+
1225
+ /*----------------------------------------------------------------------------*/
1226
+ bool raopcl_destroy(struct raopcl_s *p)
1227
+ {
1228
+ int i;
1229
+ bool rc;
1230
+
1231
+ if (!p) return false;
1232
+
1233
+ rc = raopcl_disconnect(p);
1234
+ rc &= rtspcl_destroy(p->rtspcl);
1235
+ pthread_mutex_destroy(&p->mutex);
1236
+
1237
+ for (i = 0; i < MAX_BACKLOG; i++) {
1238
+ if (p->backlog[i].buffer) {
1239
+ free(p->backlog[i].buffer);
1240
+ }
1241
+ }
1242
+
1243
+ if (p->alac_codec) alac_delete_encoder(p->alac_codec);
1244
+
1245
+ free(p);
1246
+
1247
+ return rc;
1248
+ }
1249
+
1250
+ /*----------------------------------------------------------------------------*/
1251
+ bool raopcl_sanitize(struct raopcl_s *p)
1252
+ {
1253
+ if (!p) return false;
1254
+
1255
+ pthread_mutex_trylock(&p->mutex);
1256
+
1257
+ p->state = RAOP_DOWN;
1258
+ p->head_ts = p->pause_ts = p->start_ts = p->first_ts = 0;
1259
+ p->first_pkt = false;
1260
+ p->flushing = true;
1261
+
1262
+ pthread_mutex_unlock(&p->mutex);
1263
+
1264
+ return true;
1265
+ }
1266
+
1267
+ /*----------------------------------------------------------------------------*/
1268
+ void _raopcl_send_sync(struct raopcl_s *raopcld, bool first)
1269
+ {
1270
+ struct sockaddr_in addr;
1271
+ rtp_sync_pkt_t rsp;
1272
+ uint64_t now, timestamp;
1273
+ int n;
1274
+
1275
+ addr.sin_family = AF_INET;
1276
+ addr.sin_addr = raopcld->peer_addr;
1277
+ addr.sin_port = htons(raopcld->rtp_ports.ctrl.rport);
1278
+
1279
+ // do not send timesync on FLUSHED
1280
+ if (raopcld->state != RAOP_STREAMING) return;
1281
+
1282
+ rsp.hdr.proto = 0x80 | (first ? 0x10 : 0x00);
1283
+ rsp.hdr.type = 0x54 | 0x80;
1284
+ // seems that seq=7 shall be forced
1285
+ rsp.hdr.seq[0] = 0;
1286
+ rsp.hdr.seq[1] = 7;
1287
+
1288
+ // first sync is called with mutex locked, so don't block
1289
+ if (!first) pthread_mutex_lock(&raopcld->mutex);
1290
+
1291
+ timestamp = raopcld->head_ts;
1292
+ now = TS2NTP(timestamp, raopcld->sample_rate);
1293
+
1294
+ // set the NTP time in network order
1295
+ rsp.curr_time.seconds = htonl(now >> 32);
1296
+ rsp.curr_time.fraction = htonl(now);
1297
+
1298
+ // The DAC time is synchronized with gettime_ms(), minus the latency.
1299
+ rsp.rtp_timestamp = htonl(timestamp);
1300
+ rsp.rtp_timestamp_latency = htonl(timestamp - raopcld->latency_frames);
1301
+
1302
+ n = sendto(raopcld->rtp_ports.ctrl.fd, (void*) &rsp, sizeof(rsp), 0, (void*) &addr, sizeof(addr));
1303
+
1304
+ if (!first) pthread_mutex_unlock(&raopcld->mutex);
1305
+
1306
+ LOG_DEBUG("[%p]: sync ntp:%u.%u (ts:%" PRIu64 ")", raopcld, RAOP_SEC(now), RAOP_FRAC(now), raopcld->head_ts);
1307
+
1308
+ if (n < 0) LOG_ERROR("[%p]: write error: %s", raopcld, strerror(errno));
1309
+ if (n == 0) LOG_INFO("[%p]: write, disconnected on the other end", raopcld);
1310
+ }
1311
+
1312
+ /*----------------------------------------------------------------------------*/
1313
+ void *_rtp_timing_thread(void *args)
1314
+ {
1315
+ raopcl_data_t *raopcld = (raopcl_data_t*) args;
1316
+ struct sockaddr_in addr;
1317
+
1318
+ addr.sin_family = AF_INET;
1319
+ addr.sin_addr = raopcld->peer_addr;
1320
+ addr.sin_port = htons(raopcld->rtp_ports.time.rport);
1321
+
1322
+ while (raopcld->time_running)
1323
+ {
1324
+ rtp_time_pkt_t req;
1325
+ struct timeval timeout = { 1, 0 };
1326
+ fd_set rfds;
1327
+ int n;
1328
+
1329
+ FD_ZERO(&rfds);
1330
+ FD_SET(raopcld->rtp_ports.time.fd, &rfds);
1331
+
1332
+ if ((n = select(raopcld->rtp_ports.time.fd + 1, &rfds, NULL, NULL, &timeout)) == -1) {
1333
+ LOG_ERROR("[%p]: raopcl_time_connect: socket closed on the other end", raopcld);
1334
+ usleep(100000);
1335
+ continue;
1336
+ }
1337
+
1338
+ if (!FD_ISSET(raopcld->rtp_ports.time.fd, &rfds)) continue;
1339
+
1340
+ if (addr.sin_port) {
1341
+ n = recv(raopcld->rtp_ports.time.fd, (void*) &req, sizeof(req), 0);
1342
+ }
1343
+ else {
1344
+ struct sockaddr_in client;
1345
+ int len = sizeof(client);
1346
+ n = recvfrom(raopcld->rtp_ports.time.fd, (void*) &req, sizeof(req), 0, (struct sockaddr *)&client, (socklen_t *)&len);
1347
+ addr.sin_port = client.sin_port;
1348
+ LOG_DEBUG("[%p]: NTP remote port: %d", raopcld, ntohs(addr.sin_port));
1349
+ }
1350
+
1351
+ if( n > 0) {
1352
+ rtp_time_pkt_t rsp;
1353
+
1354
+ rsp.hdr = req.hdr;
1355
+ rsp.hdr.type = 0x53 | 0x80;
1356
+ // just copy the request header or set seq=7 and timestamp=0
1357
+ rsp.ref_time = req.send_time;
1358
+ VALGRIND_MAKE_MEM_DEFINED(&rsp, sizeof(rsp));
1359
+
1360
+ // transform timeval into NTP and set network order
1361
+ #ifdef __GNUC__
1362
+ #pragma GCC diagnostic push
1363
+ #pragma GCC diagnostic ignored "-Waddress-of-packed-member"
1364
+ raopcl_get_ntp(&rsp.recv_time);
1365
+ #pragma GCC diagnostic pop
1366
+ #else
1367
+ raopcl_get_ntp(&rsp.recv_time);
1368
+ #endif
1369
+
1370
+ rsp.recv_time.seconds = htonl(rsp.recv_time.seconds);
1371
+ rsp.recv_time.fraction = htonl(rsp.recv_time.fraction);
1372
+ rsp.send_time = rsp.recv_time; // might need to add a few fraction ?
1373
+
1374
+ n = sendto(raopcld->rtp_ports.time.fd, (void*) &rsp, sizeof(rsp), 0, (void*) &addr, sizeof(addr));
1375
+
1376
+ if (n != (int) sizeof(rsp)) {
1377
+ LOG_ERROR("[%p]: error responding to sync", raopcld);
1378
+ }
1379
+
1380
+ LOG_DEBUG( "[%p]: NTP sync: %u.%u (ref %u.%u)", raopcld, ntohl(rsp.send_time.seconds), ntohl(rsp.send_time.fraction),
1381
+ ntohl(rsp.ref_time.seconds), ntohl(rsp.ref_time.fraction) );
1382
+
1383
+ }
1384
+
1385
+ if (n < 0) {
1386
+ LOG_ERROR("[%p]: read error: %s", raopcld, strerror(errno));
1387
+ }
1388
+
1389
+ if (n == 0) {
1390
+ LOG_ERROR("[%p]: read, disconnected on the other end", raopcld);
1391
+ usleep(100000);
1392
+ continue;
1393
+ }
1394
+ }
1395
+
1396
+ return NULL;
1397
+ }
1398
+
1399
+ /*----------------------------------------------------------------------------*/
1400
+ void *_rtp_control_thread(void *args)
1401
+ {
1402
+ raopcl_data_t *raopcld = (raopcl_data_t*) args;
1403
+
1404
+ while (raopcld->ctrl_running) {
1405
+ struct timeval timeout = { 1, 0 };
1406
+ fd_set rfds;
1407
+ uint64_t now = raopcl_get_ntp(NULL);
1408
+
1409
+ // Send keepalive packet every 25 seconds
1410
+ if (now - raopcld->last_keepalive >= MS2NTP(25000)) {
1411
+ LOG_INFO("[%p]: sending keepalive packet", raopcld);
1412
+ raopcl_keepalive(raopcld);
1413
+ raopcld->last_keepalive = now;
1414
+ }
1415
+
1416
+ FD_ZERO(&rfds);
1417
+ FD_SET(raopcld->rtp_ports.ctrl.fd, &rfds);
1418
+
1419
+ if (select(raopcld->rtp_ports.ctrl.fd + 1, &rfds, NULL, NULL, &timeout) == -1) {
1420
+ if (raopcld->ctrl_running) {
1421
+ LOG_ERROR("[%p]: control socket closed", raopcld);
1422
+ raopcld->sane.ctrl++;
1423
+ sleep(1);
1424
+ }
1425
+ continue;
1426
+ }
1427
+
1428
+ if (FD_ISSET(raopcld->rtp_ports.ctrl.fd, &rfds)) {
1429
+ rtp_lost_pkt_t lost;
1430
+ int i, n, missed;
1431
+
1432
+ n = recv(raopcld->rtp_ports.ctrl.fd, (void*) &lost, sizeof(lost), 0);
1433
+
1434
+ if (n < 0) continue;
1435
+
1436
+ lost.seq_number = ntohs(lost.seq_number);
1437
+ lost.n = ntohs(lost.n);
1438
+
1439
+ if (n != sizeof(lost)) {
1440
+ LOG_ERROR("[%p]: error in received request sn:%d n:%d (recv:%d)",
1441
+ raopcld, lost.seq_number, lost.n, n);
1442
+ lost.n = 0;
1443
+ lost.seq_number = 0;
1444
+ raopcld->sane.ctrl++;
1445
+ }
1446
+ else raopcld->sane.ctrl = 0;
1447
+
1448
+ pthread_mutex_lock(&raopcld->mutex);
1449
+
1450
+ for (missed = 0, i = 0; i < lost.n; i++) {
1451
+ uint16_t index = (lost.seq_number + i) % MAX_BACKLOG;
1452
+
1453
+ if (raopcld->backlog[index].seq_number == lost.seq_number + i) {
1454
+ struct sockaddr_in addr;
1455
+ rtp_header_t *hdr = (rtp_header_t*) raopcld->backlog[index].buffer;
1456
+
1457
+ // packet have been released meanwhile, be extra cautious
1458
+ if (!hdr) {
1459
+ missed++;
1460
+ continue;
1461
+ }
1462
+
1463
+ hdr->proto = 0x80;
1464
+ hdr->type = 0x56 | 0x80;
1465
+ hdr->seq[0] = 0;
1466
+ hdr->seq[1] = 1;
1467
+
1468
+ addr.sin_family = AF_INET;
1469
+ addr.sin_addr = raopcld->peer_addr;
1470
+ addr.sin_port = htons(raopcld->rtp_ports.ctrl.rport);
1471
+
1472
+ raopcld->retransmit++;
1473
+
1474
+ n = sendto(raopcld->rtp_ports.ctrl.fd, (void*) hdr,
1475
+ sizeof(rtp_header_t) + raopcld->backlog[index].size,
1476
+ 0, (void*) &addr, sizeof(addr));
1477
+
1478
+ if (n == -1) {
1479
+ LOG_WARN("[%p]: error resending lost packet sn:%u (n:%d)",
1480
+ raopcld, lost.seq_number + i, n);
1481
+ }
1482
+ }
1483
+ else {
1484
+ LOG_WARN("[%p]: lost packet out of backlog %u", raopcld, lost.seq_number + i);
1485
+ }
1486
+ }
1487
+
1488
+ pthread_mutex_unlock(&raopcld->mutex);
1489
+
1490
+ LOG_DEBUG("[%p]: retransmit packet sn:%d nb:%d (mis:%d)",
1491
+ raopcld, lost.seq_number, lost.n, missed);
1492
+
1493
+ continue;
1494
+ }
1495
+
1496
+ _raopcl_send_sync(raopcld, false);
1497
+ }
1498
+
1499
+ return NULL;
1500
+ }