react-native-nitro-player 0.3.0-alpha.9 → 0.4.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 (257) hide show
  1. package/README.md +444 -4
  2. package/android/build.gradle +4 -1
  3. package/android/src/main/AndroidManifest.xml +16 -1
  4. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAndroidAutoMediaLibrary.kt +2 -0
  5. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAudioDevices.kt +8 -0
  6. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridDownloadManager.kt +225 -0
  7. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridEqualizer.kt +105 -0
  8. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridPlayerQueue.kt +6 -6
  9. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +37 -12
  10. package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +970 -213
  11. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadDatabase.kt +475 -0
  12. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadFileManager.kt +159 -0
  13. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadManagerCore.kt +489 -0
  14. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadWorker.kt +209 -0
  15. package/android/src/main/java/com/margelo/nitro/nitroplayer/equalizer/EqualizerCore.kt +486 -0
  16. package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaBrowserService.kt +3 -1
  17. package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaSessionManager.kt +14 -6
  18. package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/PlaylistManager.kt +27 -0
  19. package/ios/HybridDownloadManager.swift +226 -0
  20. package/ios/HybridEqualizer.swift +111 -0
  21. package/ios/HybridTrackPlayer.swift +36 -8
  22. package/ios/core/TrackPlayerCore.swift +998 -276
  23. package/ios/download/DownloadDatabase.swift +493 -0
  24. package/ios/download/DownloadFileManager.swift +241 -0
  25. package/ios/download/DownloadManagerCore.swift +923 -0
  26. package/ios/equalizer/EqualizerCore.swift +685 -0
  27. package/ios/media/MediaSessionManager.swift +40 -28
  28. package/ios/playlist/PlaylistManager.swift +40 -9
  29. package/ios/queue/HybridPlayerQueue.swift +33 -13
  30. package/lib/hooks/downloadCallbackManager.d.ts +36 -0
  31. package/lib/hooks/downloadCallbackManager.js +108 -0
  32. package/lib/hooks/equalizerCallbackManager.d.ts +37 -0
  33. package/lib/hooks/equalizerCallbackManager.js +109 -0
  34. package/lib/hooks/index.d.ts +16 -0
  35. package/lib/hooks/index.js +10 -0
  36. package/lib/hooks/useActualQueue.d.ts +48 -0
  37. package/lib/hooks/useActualQueue.js +98 -0
  38. package/lib/hooks/useDownloadActions.d.ts +26 -0
  39. package/lib/hooks/useDownloadActions.js +117 -0
  40. package/lib/hooks/useDownloadProgress.d.ts +25 -0
  41. package/lib/hooks/useDownloadProgress.js +79 -0
  42. package/lib/hooks/useDownloadStorage.d.ts +19 -0
  43. package/lib/hooks/useDownloadStorage.js +60 -0
  44. package/lib/hooks/useDownloadedTracks.d.ts +25 -0
  45. package/lib/hooks/useDownloadedTracks.js +69 -0
  46. package/lib/hooks/useEqualizer.d.ts +25 -0
  47. package/lib/hooks/useEqualizer.js +124 -0
  48. package/lib/hooks/useEqualizerPresets.d.ts +22 -0
  49. package/lib/hooks/useEqualizerPresets.js +96 -0
  50. package/lib/hooks/useNowPlaying.js +3 -2
  51. package/lib/hooks/useOnChangeTrack.js +15 -12
  52. package/lib/hooks/useOnPlaybackStateChange.js +16 -13
  53. package/lib/hooks/usePlaylist.d.ts +48 -0
  54. package/lib/hooks/usePlaylist.js +136 -0
  55. package/lib/index.d.ts +6 -0
  56. package/lib/index.js +6 -0
  57. package/lib/specs/DownloadManager.nitro.d.ts +152 -0
  58. package/lib/specs/DownloadManager.nitro.js +1 -0
  59. package/lib/specs/Equalizer.nitro.d.ts +43 -0
  60. package/lib/specs/Equalizer.nitro.js +1 -0
  61. package/lib/specs/TrackPlayer.nitro.d.ts +6 -2
  62. package/lib/types/DownloadTypes.d.ts +110 -0
  63. package/lib/types/DownloadTypes.js +1 -0
  64. package/lib/types/EqualizerTypes.d.ts +52 -0
  65. package/lib/types/EqualizerTypes.js +1 -0
  66. package/lib/types/PlayerQueue.d.ts +4 -0
  67. package/nitro.json +8 -0
  68. package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +10 -1
  69. package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +32 -2
  70. package/nitrogen/generated/android/c++/JCurrentPlayingType.hpp +65 -0
  71. package/nitrogen/generated/android/c++/JDownloadConfig.hpp +92 -0
  72. package/nitrogen/generated/android/c++/JDownloadError.hpp +71 -0
  73. package/nitrogen/generated/android/c++/JDownloadErrorReason.hpp +74 -0
  74. package/nitrogen/generated/android/c++/JDownloadProgress.hpp +79 -0
  75. package/nitrogen/generated/android/c++/JDownloadQueueStatus.hpp +81 -0
  76. package/nitrogen/generated/android/c++/JDownloadState.hpp +71 -0
  77. package/nitrogen/generated/android/c++/JDownloadStorageInfo.hpp +73 -0
  78. package/nitrogen/generated/android/c++/JDownloadTask.hpp +108 -0
  79. package/nitrogen/generated/android/c++/JDownloadedPlaylist.hpp +111 -0
  80. package/nitrogen/generated/android/c++/JDownloadedTrack.hpp +92 -0
  81. package/nitrogen/generated/android/c++/JEqualizerBand.hpp +69 -0
  82. package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +78 -0
  83. package/nitrogen/generated/android/c++/JEqualizerState.hpp +91 -0
  84. package/nitrogen/generated/android/c++/JFunc_void_DownloadProgress.hpp +80 -0
  85. package/nitrogen/generated/android/c++/JFunc_void_DownloadedTrack.hpp +89 -0
  86. package/nitrogen/generated/android/c++/JFunc_void_TrackItem_std__optional_Reason_.hpp +2 -0
  87. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__std__string__.hpp +81 -0
  88. package/nitrogen/generated/android/c++/JFunc_void_std__string_Playlist_std__optional_QueueOperation_.hpp +2 -0
  89. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError_.hpp +83 -0
  90. package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +97 -0
  91. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Playlist__std__optional_QueueOperation_.hpp +2 -0
  92. package/nitrogen/generated/android/c++/JGainRange.hpp +61 -0
  93. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.cpp +470 -0
  94. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.hpp +99 -0
  95. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +204 -0
  96. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +82 -0
  97. package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.cpp +2 -0
  98. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +117 -15
  99. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +6 -2
  100. package/nitrogen/generated/android/c++/JPlaybackSource.hpp +62 -0
  101. package/nitrogen/generated/android/c++/JPlayerState.hpp +11 -3
  102. package/nitrogen/generated/android/c++/JPlaylist.hpp +2 -0
  103. package/nitrogen/generated/android/c++/JPresetType.hpp +59 -0
  104. package/nitrogen/generated/android/c++/JStorageLocation.hpp +59 -0
  105. package/nitrogen/generated/android/c++/JTrackItem.hpp +9 -3
  106. package/nitrogen/generated/android/c++/JTrackPlayerState.hpp +3 -3
  107. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  108. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  109. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.cpp +26 -0
  110. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.hpp +74 -0
  111. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.cpp +26 -0
  112. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.hpp +84 -0
  113. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.cpp +26 -0
  114. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.hpp +85 -0
  115. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.cpp +26 -0
  116. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.hpp +80 -0
  117. package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.hpp +2 -0
  118. package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.hpp +2 -0
  119. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/CurrentPlayingType.kt +23 -0
  120. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadConfig.kt +59 -0
  121. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadError.kt +47 -0
  122. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadErrorReason.kt +26 -0
  123. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadProgress.kt +53 -0
  124. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadQueueStatus.kt +56 -0
  125. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadState.kt +25 -0
  126. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadStorageInfo.kt +50 -0
  127. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadTask.kt +65 -0
  128. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedPlaylist.kt +53 -0
  129. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedTrack.kt +56 -0
  130. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerBand.kt +47 -0
  131. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerPreset.kt +44 -0
  132. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerState.kt +44 -0
  133. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadProgress.kt +80 -0
  134. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadedTrack.kt +80 -0
  135. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__optional_std__variant_nitro__NullType__std__string__.kt +80 -0
  136. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.kt +80 -0
  137. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
  138. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/GainRange.kt +41 -0
  139. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridDownloadManagerSpec.kt +210 -0
  140. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridEqualizerSpec.kt +141 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +19 -2
  142. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlaybackSource.kt +22 -0
  143. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerState.kt +6 -3
  144. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PresetType.kt +21 -0
  145. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/StorageLocation.kt +21 -0
  146. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackItem.kt +7 -3
  147. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackPlayerState.kt +2 -2
  148. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_Double.kt +59 -0
  149. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadError.kt +59 -0
  150. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadTask.kt +59 -0
  151. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedPlaylist.kt +59 -0
  152. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedTrack.kt +59 -0
  153. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +138 -8
  154. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +1046 -121
  155. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +66 -0
  156. package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +16 -0
  157. package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +30 -0
  158. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.cpp +11 -0
  159. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.hpp +386 -0
  160. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
  161. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +223 -0
  162. package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.hpp +1 -0
  163. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +46 -6
  164. package/nitrogen/generated/ios/swift/CurrentPlayingType.swift +48 -0
  165. package/nitrogen/generated/ios/swift/DownloadConfig.swift +270 -0
  166. package/nitrogen/generated/ios/swift/DownloadError.swift +69 -0
  167. package/nitrogen/generated/ios/swift/DownloadErrorReason.swift +60 -0
  168. package/nitrogen/generated/ios/swift/DownloadProgress.swift +91 -0
  169. package/nitrogen/generated/ios/swift/DownloadQueueStatus.swift +102 -0
  170. package/nitrogen/generated/ios/swift/DownloadState.swift +56 -0
  171. package/nitrogen/generated/ios/swift/DownloadStorageInfo.swift +80 -0
  172. package/nitrogen/generated/ios/swift/DownloadTask.swift +315 -0
  173. package/nitrogen/generated/ios/swift/DownloadedPlaylist.swift +103 -0
  174. package/nitrogen/generated/ios/swift/DownloadedTrack.swift +147 -0
  175. package/nitrogen/generated/ios/swift/EqualizerBand.swift +69 -0
  176. package/nitrogen/generated/ios/swift/EqualizerPreset.swift +70 -0
  177. package/nitrogen/generated/ios/swift/EqualizerState.swift +115 -0
  178. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  179. package/nitrogen/generated/ios/swift/Func_void_DownloadProgress.swift +47 -0
  180. package/nitrogen/generated/ios/swift/Func_void_DownloadStorageInfo.swift +47 -0
  181. package/nitrogen/generated/ios/swift/Func_void_DownloadedTrack.swift +47 -0
  182. package/nitrogen/generated/ios/swift/Func_void_PlayerState.swift +47 -0
  183. package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
  184. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  185. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__std__string__.swift +66 -0
  186. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  187. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.swift +47 -0
  188. package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +47 -0
  189. package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +47 -0
  190. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +47 -0
  191. package/nitrogen/generated/ios/swift/GainRange.swift +47 -0
  192. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec.swift +90 -0
  193. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec_cxx.swift +705 -0
  194. package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +73 -0
  195. package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +396 -0
  196. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +6 -2
  197. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +105 -8
  198. package/nitrogen/generated/ios/swift/PlaybackSource.swift +44 -0
  199. package/nitrogen/generated/ios/swift/PlayerState.swift +13 -2
  200. package/nitrogen/generated/ios/swift/PresetType.swift +40 -0
  201. package/nitrogen/generated/ios/swift/StorageLocation.swift +40 -0
  202. package/nitrogen/generated/ios/swift/TrackItem.swift +31 -1
  203. package/nitrogen/generated/ios/swift/TrackPlayerState.swift +4 -4
  204. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
  205. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadError.swift +18 -0
  206. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadTask.swift +18 -0
  207. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedPlaylist.swift +18 -0
  208. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedTrack.swift +18 -0
  209. package/nitrogen/generated/shared/c++/CurrentPlayingType.hpp +84 -0
  210. package/nitrogen/generated/shared/c++/DownloadConfig.hpp +108 -0
  211. package/nitrogen/generated/shared/c++/DownloadError.hpp +89 -0
  212. package/nitrogen/generated/shared/c++/DownloadErrorReason.hpp +96 -0
  213. package/nitrogen/generated/shared/c++/DownloadProgress.hpp +97 -0
  214. package/nitrogen/generated/shared/c++/DownloadQueueStatus.hpp +99 -0
  215. package/nitrogen/generated/shared/c++/DownloadState.hpp +92 -0
  216. package/nitrogen/generated/shared/c++/DownloadStorageInfo.hpp +91 -0
  217. package/nitrogen/generated/shared/c++/DownloadTask.hpp +122 -0
  218. package/nitrogen/generated/shared/c++/DownloadedPlaylist.hpp +101 -0
  219. package/nitrogen/generated/shared/c++/DownloadedTrack.hpp +107 -0
  220. package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
  221. package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +86 -0
  222. package/nitrogen/generated/shared/c++/EqualizerState.hpp +89 -0
  223. package/nitrogen/generated/shared/c++/GainRange.hpp +79 -0
  224. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.cpp +55 -0
  225. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.hpp +134 -0
  226. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +38 -0
  227. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +95 -0
  228. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +4 -0
  229. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +11 -5
  230. package/nitrogen/generated/shared/c++/PlaybackSource.hpp +80 -0
  231. package/nitrogen/generated/shared/c++/PlayerState.hpp +9 -2
  232. package/nitrogen/generated/shared/c++/PresetType.hpp +76 -0
  233. package/nitrogen/generated/shared/c++/StorageLocation.hpp +76 -0
  234. package/nitrogen/generated/shared/c++/TrackItem.hpp +7 -2
  235. package/nitrogen/generated/shared/c++/TrackPlayerState.hpp +5 -5
  236. package/package.json +1 -1
  237. package/src/hooks/downloadCallbackManager.ts +149 -0
  238. package/src/hooks/equalizerCallbackManager.ts +138 -0
  239. package/src/hooks/index.ts +23 -0
  240. package/src/hooks/useActualQueue.ts +116 -0
  241. package/src/hooks/useDownloadActions.ts +179 -0
  242. package/src/hooks/useDownloadProgress.ts +126 -0
  243. package/src/hooks/useDownloadStorage.ts +84 -0
  244. package/src/hooks/useDownloadedTracks.ts +138 -0
  245. package/src/hooks/useEqualizer.ts +173 -0
  246. package/src/hooks/useEqualizerPresets.ts +140 -0
  247. package/src/hooks/useNowPlaying.ts +3 -2
  248. package/src/hooks/useOnChangeTrack.ts +15 -11
  249. package/src/hooks/useOnPlaybackStateChange.ts +19 -15
  250. package/src/hooks/usePlaylist.ts +161 -0
  251. package/src/index.ts +12 -0
  252. package/src/specs/DownloadManager.nitro.ts +203 -0
  253. package/src/specs/Equalizer.nitro.ts +69 -0
  254. package/src/specs/TrackPlayer.nitro.ts +6 -2
  255. package/src/types/DownloadTypes.ts +135 -0
  256. package/src/types/EqualizerTypes.ts +72 -0
  257. package/src/types/PlayerQueue.ts +9 -0
@@ -0,0 +1,486 @@
1
+ package com.margelo.nitro.nitroplayer.equalizer
2
+
3
+ import android.content.Context
4
+ import android.content.SharedPreferences
5
+ import android.media.audiofx.Equalizer
6
+ import android.util.Log
7
+ import com.margelo.nitro.core.NullType
8
+ import com.margelo.nitro.nitroplayer.EqualizerBand
9
+ import com.margelo.nitro.nitroplayer.EqualizerPreset
10
+ import com.margelo.nitro.nitroplayer.EqualizerState
11
+ import com.margelo.nitro.nitroplayer.GainRange
12
+ import com.margelo.nitro.nitroplayer.PresetType
13
+ import com.margelo.nitro.nitroplayer.Variant_NullType_String
14
+ import org.json.JSONArray
15
+ import org.json.JSONObject
16
+ import java.lang.ref.WeakReference
17
+ import java.util.Collections
18
+
19
+ class EqualizerCore private constructor(
20
+ private val context: Context,
21
+ ) {
22
+ private var equalizer: Equalizer? = null
23
+ private var audioSessionId: Int = 0
24
+ private var isUsingFallbackSession: Boolean = false // Track if using fallback session 0
25
+ private var isEqualizerEnabled: Boolean = false
26
+ private var currentPresetName: String? = null
27
+
28
+ // Standard 5-band frequencies: 60Hz, 230Hz, 910Hz, 3.6kHz, 14kHz
29
+ private val targetFrequencies = intArrayOf(60000, 230000, 910000, 3600000, 14000000) // milliHz
30
+ private val frequencyLabels = arrayOf("60 Hz", "230 Hz", "910 Hz", "3.6 kHz", "14 kHz")
31
+ private val frequencies = intArrayOf(60, 230, 910, 3600, 14000)
32
+ private var bandMapping = IntArray(5) // Maps our 5 bands to actual EQ bands
33
+
34
+ private val prefs: SharedPreferences =
35
+ context.getSharedPreferences("equalizer_settings", Context.MODE_PRIVATE)
36
+
37
+ // Weak callback wrapper for auto-cleanup
38
+ private data class WeakCallbackBox<T>(
39
+ private val ownerRef: WeakReference<Any>,
40
+ val callback: T,
41
+ ) {
42
+ val isAlive: Boolean get() = ownerRef.get() != null
43
+ }
44
+
45
+ // Event listeners
46
+ private val onEnabledChangeListeners =
47
+ Collections.synchronizedList(mutableListOf<WeakCallbackBox<(Boolean) -> Unit>>())
48
+ private val onBandChangeListeners =
49
+ Collections.synchronizedList(mutableListOf<WeakCallbackBox<(Array<EqualizerBand>) -> Unit>>())
50
+ private val onPresetChangeListeners =
51
+ Collections.synchronizedList(mutableListOf<WeakCallbackBox<(Variant_NullType_String?) -> Unit>>())
52
+
53
+ companion object {
54
+ private const val TAG = "EqualizerCore"
55
+
56
+ @Volatile
57
+ private var INSTANCE: EqualizerCore? = null
58
+
59
+ fun getInstance(context: Context): EqualizerCore =
60
+ INSTANCE ?: synchronized(this) {
61
+ INSTANCE ?: EqualizerCore(context).also { INSTANCE = it }
62
+ }
63
+
64
+ // Built-in presets: name -> [60Hz, 230Hz, 910Hz, 3.6kHz, 14kHz] in dB
65
+ private val BUILT_IN_PRESETS =
66
+ mapOf(
67
+ "Flat" to doubleArrayOf(0.0, 0.0, 0.0, 0.0, 0.0),
68
+ "Bass Boost" to doubleArrayOf(6.0, 4.0, 0.0, 0.0, 0.0),
69
+ "Bass Reducer" to doubleArrayOf(-6.0, -4.0, 0.0, 0.0, 0.0),
70
+ "Treble Boost" to doubleArrayOf(0.0, 0.0, 0.0, 4.0, 6.0),
71
+ "Treble Reducer" to doubleArrayOf(0.0, 0.0, 0.0, -4.0, -6.0),
72
+ "Vocal Boost" to doubleArrayOf(-2.0, 0.0, 4.0, 2.0, 0.0),
73
+ "Rock" to doubleArrayOf(5.0, 3.0, -1.0, 3.0, 5.0),
74
+ "Pop" to doubleArrayOf(-1.0, 2.0, 4.0, 2.0, -1.0),
75
+ "Jazz" to doubleArrayOf(3.0, 1.0, -2.0, 2.0, 4.0),
76
+ "Classical" to doubleArrayOf(4.0, 2.0, -1.0, 2.0, 3.0),
77
+ "Hip Hop" to doubleArrayOf(6.0, 4.0, 0.0, 1.0, 3.0),
78
+ "Electronic" to doubleArrayOf(5.0, 3.0, 0.0, 2.0, 5.0),
79
+ "Acoustic" to doubleArrayOf(4.0, 2.0, 1.0, 3.0, 3.0),
80
+ "R&B" to doubleArrayOf(3.0, 6.0, 2.0, -1.0, 2.0),
81
+ "Loudness" to doubleArrayOf(6.0, 3.0, -1.0, 3.0, 6.0),
82
+ )
83
+ }
84
+
85
+ /**
86
+ * Initialize equalizer with audio session from ExoPlayer
87
+ * Must be called after TrackPlayerCore is initialized
88
+ */
89
+ fun initialize(audioSessionId: Int) {
90
+ this.audioSessionId = audioSessionId
91
+ this.isUsingFallbackSession = (audioSessionId == 0)
92
+
93
+ try {
94
+ equalizer?.release()
95
+ equalizer =
96
+ Equalizer(0, audioSessionId).apply {
97
+ enabled = false
98
+ }
99
+ setupBandMapping()
100
+ restoreSettings()
101
+ } catch (e: Exception) {
102
+ Log.e(TAG, "Failed to initialize equalizer: ${e.message}")
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Ensure equalizer is initialized, using audio session 0 (global output mix) if needed
108
+ * This allows the equalizer to work even before TrackPlayer is used
109
+ */
110
+ fun ensureInitialized() {
111
+ if (equalizer == null) {
112
+ initialize(0)
113
+ }
114
+ }
115
+
116
+ private fun setupBandMapping() {
117
+ val eq = equalizer ?: return
118
+ val numBands = eq.numberOfBands.toInt()
119
+
120
+ // Map each target frequency to the closest available band
121
+ for (i in targetFrequencies.indices) {
122
+ var closestBand = 0
123
+ var closestDiff = Int.MAX_VALUE
124
+
125
+ for (band in 0 until numBands) {
126
+ val bandFreq = eq.getCenterFreq(band.toShort())
127
+ val diff = kotlin.math.abs(bandFreq - targetFrequencies[i])
128
+ if (diff < closestDiff) {
129
+ closestDiff = diff
130
+ closestBand = band
131
+ }
132
+ }
133
+ bandMapping[i] = closestBand
134
+ }
135
+ }
136
+
137
+ fun setEnabled(enabled: Boolean): Boolean {
138
+ val eq = equalizer ?: return false
139
+
140
+ return try {
141
+ eq.enabled = enabled
142
+ isEqualizerEnabled = enabled
143
+ notifyEnabledChange(enabled)
144
+ saveEnabled(enabled)
145
+ true
146
+ } catch (e: Exception) {
147
+ Log.e(TAG, "Failed to set enabled: ${e.message}")
148
+ false
149
+ }
150
+ }
151
+
152
+ fun isEnabled(): Boolean = isEqualizerEnabled
153
+
154
+ fun getBands(): Array<EqualizerBand> {
155
+ val eq = equalizer ?: return emptyArray()
156
+
157
+ return (0 until 5)
158
+ .map { i ->
159
+ val actualBand = bandMapping[i].toShort()
160
+ val gainMb =
161
+ try {
162
+ eq.getBandLevel(actualBand)
163
+ } catch (e: Exception) {
164
+ 0.toShort()
165
+ }
166
+ val gainDb = gainMb / 100.0 // convert millibels to dB
167
+
168
+ EqualizerBand(
169
+ index = i.toDouble(),
170
+ centerFrequency = frequencies[i].toDouble(),
171
+ gainDb = gainDb,
172
+ frequencyLabel = frequencyLabels[i],
173
+ )
174
+ }.toTypedArray()
175
+ }
176
+
177
+ fun setBandGain(
178
+ bandIndex: Int,
179
+ gainDb: Double,
180
+ ): Boolean {
181
+ if (bandIndex !in 0..4) return false
182
+
183
+ val eq = equalizer ?: return false
184
+ val clampedGain = gainDb.coerceIn(-12.0, 12.0)
185
+ val gainMb = (clampedGain * 100).toInt().toShort() // convert dB to millibels
186
+
187
+ return try {
188
+ eq.setBandLevel(bandMapping[bandIndex].toShort(), gainMb)
189
+ currentPresetName = null // Custom settings
190
+ notifyBandChange(getBands())
191
+ notifyPresetChange(null)
192
+ saveBandGains(getAllGains())
193
+ saveCurrentPreset(null)
194
+ true
195
+ } catch (e: Exception) {
196
+ false
197
+ }
198
+ }
199
+
200
+ fun setAllBandGains(gains: DoubleArray): Boolean {
201
+ if (gains.size != 5) return false
202
+
203
+ val eq = equalizer ?: return false
204
+
205
+ return try {
206
+ gains.forEachIndexed { i, gain ->
207
+ val clampedGain = gain.coerceIn(-12.0, 12.0)
208
+ val gainMb = (clampedGain * 100).toInt().toShort()
209
+ eq.setBandLevel(bandMapping[i].toShort(), gainMb)
210
+ }
211
+ notifyBandChange(getBands())
212
+ saveBandGains(gains.toList())
213
+ true
214
+ } catch (e: Exception) {
215
+ false
216
+ }
217
+ }
218
+
219
+ private fun getAllGains(): List<Double> {
220
+ val eq = equalizer ?: return listOf(0.0, 0.0, 0.0, 0.0, 0.0)
221
+ return (0 until 5).map { i ->
222
+ try {
223
+ eq.getBandLevel(bandMapping[i].toShort()) / 100.0
224
+ } catch (e: Exception) {
225
+ 0.0
226
+ }
227
+ }
228
+ }
229
+
230
+ fun getBandRange(): GainRange {
231
+ val eq = equalizer
232
+ return if (eq != null) {
233
+ val range = eq.bandLevelRange
234
+ GainRange(
235
+ min = (range[0] / 100.0).coerceAtLeast(-12.0),
236
+ max = (range[1] / 100.0).coerceAtMost(12.0),
237
+ )
238
+ } else {
239
+ GainRange(min = -12.0, max = 12.0)
240
+ }
241
+ }
242
+
243
+ fun getPresets(): Array<EqualizerPreset> {
244
+ val builtIn = getBuiltInPresets()
245
+ val custom = getCustomPresets()
246
+ return builtIn + custom
247
+ }
248
+
249
+ fun getBuiltInPresets(): Array<EqualizerPreset> =
250
+ BUILT_IN_PRESETS
251
+ .map { (name, gains) ->
252
+ EqualizerPreset(
253
+ name = name,
254
+ gains = gains,
255
+ type = PresetType.BUILT_IN,
256
+ )
257
+ }.toTypedArray()
258
+
259
+ fun getCustomPresets(): Array<EqualizerPreset> {
260
+ val customPresetsJson = prefs.getString("custom_presets", null) ?: return emptyArray()
261
+ return try {
262
+ val json = JSONObject(customPresetsJson)
263
+ json
264
+ .keys()
265
+ .asSequence()
266
+ .map { name ->
267
+ val gainsArray = json.getJSONArray(name)
268
+ val gains = DoubleArray(5) { gainsArray.getDouble(it) }
269
+ EqualizerPreset(
270
+ name = name,
271
+ gains = gains,
272
+ type = PresetType.CUSTOM,
273
+ )
274
+ }.toList()
275
+ .toTypedArray()
276
+ } catch (e: Exception) {
277
+ emptyArray()
278
+ }
279
+ }
280
+
281
+ fun applyPreset(presetName: String): Boolean {
282
+ // Try built-in preset first
283
+ val gains =
284
+ BUILT_IN_PRESETS[presetName]
285
+ ?: getCustomPresetGains(presetName)
286
+ ?: return false
287
+
288
+ if (setAllBandGains(gains)) {
289
+ currentPresetName = presetName
290
+ notifyPresetChange(presetName)
291
+ saveCurrentPreset(presetName)
292
+ return true
293
+ }
294
+ return false
295
+ }
296
+
297
+ private fun getCustomPresetGains(name: String): DoubleArray? {
298
+ val customPresetsJson = prefs.getString("custom_presets", null) ?: return null
299
+ return try {
300
+ val json = JSONObject(customPresetsJson)
301
+ if (json.has(name)) {
302
+ val gainsArray = json.getJSONArray(name)
303
+ DoubleArray(5) { gainsArray.getDouble(it) }
304
+ } else {
305
+ null
306
+ }
307
+ } catch (e: Exception) {
308
+ null
309
+ }
310
+ }
311
+
312
+ fun getCurrentPresetName(): String? = currentPresetName
313
+
314
+ fun saveCustomPreset(name: String): Boolean =
315
+ try {
316
+ val currentGains = getAllGains()
317
+ val customPresetsJson = prefs.getString("custom_presets", null)
318
+ val json = if (customPresetsJson != null) JSONObject(customPresetsJson) else JSONObject()
319
+
320
+ val gainsArray = JSONArray()
321
+ currentGains.forEach { gainsArray.put(it) }
322
+ json.put(name, gainsArray)
323
+
324
+ prefs.edit().putString("custom_presets", json.toString()).apply()
325
+ currentPresetName = name
326
+ notifyPresetChange(name)
327
+ saveCurrentPreset(name)
328
+ true
329
+ } catch (e: Exception) {
330
+ false
331
+ }
332
+
333
+ fun deleteCustomPreset(name: String): Boolean {
334
+ return try {
335
+ val customPresetsJson = prefs.getString("custom_presets", null) ?: return false
336
+ val json = JSONObject(customPresetsJson)
337
+
338
+ if (json.has(name)) {
339
+ json.remove(name)
340
+ prefs.edit().putString("custom_presets", json.toString()).apply()
341
+
342
+ if (currentPresetName == name) {
343
+ currentPresetName = null
344
+ notifyPresetChange(null)
345
+ saveCurrentPreset(null)
346
+ }
347
+ return true
348
+ }
349
+ false
350
+ } catch (e: Exception) {
351
+ false
352
+ }
353
+ }
354
+
355
+ fun getState(): EqualizerState =
356
+ EqualizerState(
357
+ enabled = isEqualizerEnabled,
358
+ bands = getBands(),
359
+ currentPreset =
360
+ currentPresetName?.let { Variant_NullType_String.create(it) }
361
+ ?: Variant_NullType_String.create(NullType.NULL),
362
+ )
363
+
364
+ fun reset() {
365
+ setAllBandGains(doubleArrayOf(0.0, 0.0, 0.0, 0.0, 0.0))
366
+ currentPresetName = "Flat"
367
+ notifyPresetChange("Flat")
368
+ saveCurrentPreset("Flat")
369
+ }
370
+
371
+ // === Persistence ===
372
+
373
+ private fun saveEnabled(enabled: Boolean) {
374
+ prefs.edit().putBoolean("eq_enabled", enabled).apply()
375
+ }
376
+
377
+ private fun saveBandGains(gains: List<Double>) {
378
+ val json = JSONArray()
379
+ gains.forEach { json.put(it) }
380
+ prefs.edit().putString("eq_band_gains", json.toString()).apply()
381
+ }
382
+
383
+ private fun saveCurrentPreset(name: String?) {
384
+ if (name != null) {
385
+ prefs.edit().putString("eq_current_preset", name).apply()
386
+ } else {
387
+ prefs.edit().remove("eq_current_preset").apply()
388
+ }
389
+ }
390
+
391
+ private fun restoreSettings() {
392
+ val enabled = prefs.getBoolean("eq_enabled", false)
393
+ val gainsJson = prefs.getString("eq_band_gains", null)
394
+ val presetName = prefs.getString("eq_current_preset", null)
395
+
396
+ if (gainsJson != null) {
397
+ try {
398
+ val arr = JSONArray(gainsJson)
399
+ val gains = DoubleArray(5) { arr.getDouble(it) }
400
+ setAllBandGains(gains)
401
+ } catch (e: Exception) {
402
+ // Ignore
403
+ }
404
+ }
405
+
406
+ currentPresetName = presetName
407
+ isEqualizerEnabled = enabled
408
+
409
+ try {
410
+ equalizer?.enabled = enabled
411
+ } catch (e: Exception) {
412
+ // Ignore
413
+ }
414
+ }
415
+
416
+ // === Callback management ===
417
+
418
+ fun addOnEnabledChangeListener(callback: (Boolean) -> Unit) {
419
+ val box = WeakCallbackBox(WeakReference(callback as Any), callback)
420
+ onEnabledChangeListeners.add(box)
421
+ }
422
+
423
+ fun addOnBandChangeListener(callback: (Array<EqualizerBand>) -> Unit) {
424
+ val box = WeakCallbackBox(WeakReference(callback as Any), callback)
425
+ synchronized(onBandChangeListeners) {
426
+ @Suppress("UNCHECKED_CAST")
427
+ (onBandChangeListeners as MutableList<WeakCallbackBox<(Array<EqualizerBand>) -> Unit>>).add(box)
428
+ }
429
+ }
430
+
431
+ fun addOnPresetChangeListener(callback: (Variant_NullType_String?) -> Unit) {
432
+ val box = WeakCallbackBox(WeakReference(callback as Any), callback)
433
+ onPresetChangeListeners.add(box)
434
+ }
435
+
436
+ private fun notifyEnabledChange(enabled: Boolean) {
437
+ synchronized(onEnabledChangeListeners) {
438
+ onEnabledChangeListeners.removeAll { !it.isAlive }
439
+ onEnabledChangeListeners.forEach { box ->
440
+ try {
441
+ box.callback(enabled)
442
+ } catch (e: Exception) {
443
+ // Ignore callback errors
444
+ }
445
+ }
446
+ }
447
+ }
448
+
449
+ private fun notifyBandChange(bands: Array<EqualizerBand>) {
450
+ synchronized(onBandChangeListeners) {
451
+ @Suppress("UNCHECKED_CAST")
452
+ val listeners = onBandChangeListeners as MutableList<WeakCallbackBox<(Array<EqualizerBand>) -> Unit>>
453
+ listeners.removeAll { !it.isAlive }
454
+ listeners.forEach { box ->
455
+ try {
456
+ box.callback(bands)
457
+ } catch (e: Exception) {
458
+ // Ignore callback errors
459
+ }
460
+ }
461
+ }
462
+ }
463
+
464
+ private fun notifyPresetChange(presetName: String?) {
465
+ synchronized(onPresetChangeListeners) {
466
+ onPresetChangeListeners.removeAll { !it.isAlive }
467
+ onPresetChangeListeners.forEach { box ->
468
+ try {
469
+ val variant = presetName?.let { Variant_NullType_String.create(it) }
470
+ box.callback(variant)
471
+ } catch (e: Exception) {
472
+ // Ignore callback errors
473
+ }
474
+ }
475
+ }
476
+ }
477
+
478
+ fun release() {
479
+ try {
480
+ equalizer?.release()
481
+ equalizer = null
482
+ } catch (e: Exception) {
483
+ // Ignore
484
+ }
485
+ }
486
+ }
@@ -50,7 +50,9 @@ class NitroPlayerMediaBrowserService : MediaBrowserServiceCompat() {
50
50
  val session = mediaSessionManager?.mediaSession
51
51
  if (session != null) {
52
52
  // Convert Media3 MediaSession to MediaSessionCompat for MediaBrowserService
53
- sessionToken = session.sessionCompatToken
53
+ sessionToken =
54
+ android.support.v4.media.session.MediaSessionCompat.Token
55
+ .fromToken(session.platformToken)
54
56
  println("🎵 NitroPlayerMediaBrowserService: MediaSession token set successfully")
55
57
  } else {
56
58
  println("⚠️ NitroPlayerMediaBrowserService: MediaSession not available yet")
@@ -10,6 +10,7 @@ import android.graphics.Bitmap
10
10
  import android.graphics.BitmapFactory
11
11
  import android.net.Uri
12
12
  import android.os.Build
13
+ import android.util.Log
13
14
  import androidx.core.app.NotificationCompat
14
15
  import androidx.media3.common.MediaItem
15
16
  import androidx.media3.common.MediaMetadata
@@ -379,12 +380,19 @@ class MediaSessionManager(
379
380
  .setShowWhen(false)
380
381
  .setPriority(NotificationCompat.PRIORITY_LOW)
381
382
  .setCategory(NotificationCompat.CATEGORY_TRANSPORT)
382
- .setStyle(
383
- androidx.media.app.NotificationCompat
384
- .MediaStyle()
385
- .setMediaSession(mediaSession.sessionCompatToken)
386
- .setShowActionsInCompactView(0, 1, 2),
387
- )
383
+ try {
384
+ val compatToken =
385
+ android.support.v4.media.session.MediaSessionCompat.Token
386
+ .fromToken(mediaSession.platformToken)
387
+ builder.setStyle(
388
+ androidx.media.app.NotificationCompat
389
+ .MediaStyle()
390
+ .setMediaSession(compatToken)
391
+ .setShowActionsInCompactView(0, 1, 2),
392
+ )
393
+ } catch (e: Exception) {
394
+ Log.w("MediaSessionManager", "Failed to set media session token: ${e.message}")
395
+ }
388
396
 
389
397
  // Add action buttons
390
398
  builder.addAction(
@@ -13,6 +13,8 @@ import org.json.JSONObject
13
13
  import java.util.UUID
14
14
  import java.util.concurrent.CopyOnWriteArrayList
15
15
 
16
+ import com.margelo.nitro.core.AnyMap
17
+
16
18
  /**
17
19
  * Manages multiple playlists using ExoPlayer's native playlist functionality
18
20
  * Based on: https://developer.android.com/media/media3/exoplayer/playlists
@@ -381,6 +383,12 @@ class PlaylistManager private constructor(
381
383
  put("duration", track.duration)
382
384
  put("url", track.url)
383
385
  track.artwork?.let { put("artwork", it) }
386
+ // Serialize extraPayload to JSON for persistence
387
+ track.extraPayload?.let { payload ->
388
+ val extraPayloadMap = payload.toHashMap()
389
+ val extraPayloadJson = JSONObject(extraPayloadMap)
390
+ put("extraPayload", extraPayloadJson)
391
+ }
384
392
  },
385
393
  )
386
394
  }
@@ -420,6 +428,24 @@ class PlaylistManager private constructor(
420
428
  } else {
421
429
  null
422
430
  }
431
+ // Deserialize extraPayload from JSON
432
+ val extraPayload: AnyMap? =
433
+ if (trackObj.has("extraPayload")) {
434
+ val extraPayloadJson = trackObj.getJSONObject("extraPayload")
435
+ val map = AnyMap()
436
+ val keyIterator = extraPayloadJson.keys()
437
+ while (keyIterator.hasNext()) {
438
+ val key = keyIterator.next()
439
+ when (val value = extraPayloadJson.get(key)) {
440
+ is String -> map.setString(key, value)
441
+ is Number -> map.setDouble(key, value.toDouble())
442
+ is Boolean -> map.setBoolean(key, value)
443
+ }
444
+ }
445
+ map
446
+ } else {
447
+ null
448
+ }
423
449
  tracks.add(
424
450
  TrackItem(
425
451
  id = trackObj.getString("id"),
@@ -429,6 +455,7 @@ class PlaylistManager private constructor(
429
455
  duration = trackObj.getDouble("duration"),
430
456
  url = trackObj.getString("url"),
431
457
  artwork = artwork,
458
+ extraPayload = extraPayload,
432
459
  ),
433
460
  )
434
461
  }