@javascriptcommon/react-native-track-player 1.2.23 → 4.1.5

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 (507) hide show
  1. package/LICENSE +201 -21
  2. package/README.md +8 -0
  3. package/android/build.gradle +80 -63
  4. package/android/proguard-rules.txt +0 -3
  5. package/android/src/main/AndroidManifest.xml +10 -11
  6. package/android/src/main/java/com/doublesymmetry/trackplayer/HeadlessJsMediaService.kt +199 -0
  7. package/android/src/main/java/com/doublesymmetry/trackplayer/TrackPlayer.kt +33 -0
  8. package/android/src/main/java/com/{guichaguri → doublesymmetry}/trackplayer/extensions/AudioPlayerStateExt.kt +3 -3
  9. package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/EnumExtensions.kt +5 -0
  10. package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/NumberExt.kt +13 -0
  11. package/android/src/main/java/com/{guichaguri → doublesymmetry}/trackplayer/model/MetadataAdapter.kt +20 -17
  12. package/android/src/main/java/com/doublesymmetry/trackplayer/model/NowPlayingMetadata.kt +16 -0
  13. package/android/src/main/java/com/{guichaguri/trackplayer/kotlinaudio/models → doublesymmetry/trackplayer/model}/PlaybackMetadata.kt +31 -28
  14. package/android/src/main/java/com/{guichaguri → doublesymmetry}/trackplayer/model/State.kt +1 -1
  15. package/android/src/main/java/com/doublesymmetry/trackplayer/model/Track.kt +67 -0
  16. package/android/src/main/java/com/doublesymmetry/trackplayer/model/TrackAudioItem.kt +18 -0
  17. package/android/src/main/java/com/doublesymmetry/trackplayer/model/TrackMetadata.kt +38 -0
  18. package/android/src/main/java/com/{guichaguri → doublesymmetry}/trackplayer/module/MusicEvents.kt +10 -9
  19. package/android/src/main/java/com/doublesymmetry/trackplayer/module/MusicModule.kt +778 -0
  20. package/android/src/main/java/com/doublesymmetry/trackplayer/service/MusicService.kt +1286 -0
  21. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/AppForegroundTracker.kt +35 -0
  22. package/android/src/main/java/com/{guichaguri/trackplayer/service → doublesymmetry/trackplayer/utils}/BundleUtils.kt +50 -20
  23. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/CoilBitmapLoader.kt +65 -0
  24. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/MediaItemBuilder.kt +41 -0
  25. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/RejectionException.kt +11 -0
  26. package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoView.kt +42 -0
  27. package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoViewManager.kt +18 -0
  28. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/event/EventHolder.kt +7 -7
  29. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/event/PlayerEventHolder.kt +22 -9
  30. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioContentType.kt +1 -1
  31. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItem.kt +118 -0
  32. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioItemTransitionReason.kt +3 -3
  33. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioPlayerState.kt +2 -2
  34. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/BufferConfig.kt +1 -1
  35. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/CacheConfig.kt +1 -1
  36. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/Capability.kt +1 -1
  37. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CustomButton.kt +19 -0
  38. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/FocusChangeData.kt +1 -1
  39. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/MediaSessionCallback.kt +1 -1
  40. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlayWhenReadyChangeData.kt +1 -3
  41. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlaybackEndedReason.kt +1 -1
  42. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlaybackError.kt +1 -1
  43. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlayerConfig.kt +8 -5
  44. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerOptions.kt +40 -0
  45. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PositionChangedReason.kt +1 -1
  46. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/RepeatMode.kt +16 -0
  47. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/WakeMode.kt +7 -0
  48. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/AudioPlayer.kt +756 -0
  49. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/ForwardingPlayer.java +1124 -0
  50. package/android/src/main/java/com/{guichaguri/trackplayer/kotlinaudio/players → lovegaoshi/kotlinaudio/player}/QueuedAudioPlayer.kt +68 -58
  51. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/APMRenderersFactory.kt +33 -0
  52. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Buffer.kt +34 -0
  53. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Cache.kt +27 -0
  54. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/FocusManager.kt +59 -0
  55. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/MediaFactory.kt +130 -0
  56. package/android/src/main/java/com/lovegaoshi/kotlinaudio/processors/TeeListener.kt +171 -0
  57. package/android/src/main/java/com/lovegaoshi/kotlinaudio/service/MusicService.kt +127 -0
  58. package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/FFT.java +99 -0
  59. package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/Utils.kt +113 -0
  60. package/android/src/main/res/drawable/baseline_repeat_24.xml +5 -0
  61. package/android/src/main/res/drawable/baseline_repeat_one_24.xml +5 -0
  62. package/android/src/main/res/drawable/forward.xml +5 -0
  63. package/android/src/main/res/drawable/heart_24px.xml +5 -0
  64. package/android/src/main/res/drawable/hearte_24px.xml +5 -0
  65. package/android/src/main/res/drawable/ifl_24px.xml +5 -0
  66. package/android/src/main/res/drawable/rewind.xml +5 -0
  67. package/android/src/main/res/drawable/shuffle_24px.xml +5 -0
  68. package/android/src/main/res/values/strings.xml +3 -4
  69. package/android/src/main/res/xml/automotive_app_desc.xml +3 -0
  70. package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/22AMillion.jpg +0 -0
  71. package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/Contents.json +21 -0
  72. package/ios/Example/SwiftAudio/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  73. package/ios/Example/SwiftAudio/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  74. package/ios/Example/SwiftAudio/Assets.xcassets/Contents.json +6 -0
  75. package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/Contents.json +21 -0
  76. package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/cover.jpg +0 -0
  77. package/ios/Example/SwiftAudio/AudioController.swift +46 -0
  78. package/ios/Example/SwiftAudio/Extensions.swift +22 -0
  79. package/ios/Example/SwiftAudio/PlayerView.swift +172 -0
  80. package/ios/Example/SwiftAudio/PlayerViewModel.swift +120 -0
  81. package/ios/Example/SwiftAudio/Preview Content/Preview Assets.xcassets/Contents.json +6 -0
  82. package/ios/Example/SwiftAudio/QueueView.swift +65 -0
  83. package/ios/{TrackPlayer.xcodeproj/xcuserdata/marco.xcuserdatad/xcschemes/xcschememanagement.plist → Example/SwiftAudio/SwiftAudio.entitlements} +6 -8
  84. package/ios/Example/SwiftAudio/SwiftAudioApp.swift +17 -0
  85. package/ios/Example/SwiftAudio.xcodeproj/project.pbxproj +412 -0
  86. package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/contents.xcworkspacedata +1 -1
  87. package/ios/RNTrackPlayer/Models/Capabilities.swift +39 -4
  88. package/ios/RNTrackPlayer/Models/MediaURL.swift +12 -6
  89. package/ios/RNTrackPlayer/Models/MetadataAdapter.swift +147 -0
  90. package/ios/RNTrackPlayer/Models/PitchAlgorithms.swift +13 -0
  91. package/ios/RNTrackPlayer/Models/SessionCategories.swift +106 -0
  92. package/ios/RNTrackPlayer/Models/State.swift +26 -0
  93. package/ios/RNTrackPlayer/Models/Track.swift +74 -54
  94. package/ios/RNTrackPlayer/RNTrackPlayer.swift +867 -406
  95. package/ios/RNTrackPlayer/Support/RNTrackPlayer-Bridging-Header.h +1 -0
  96. package/ios/RNTrackPlayer/TrackPlayer.h +14 -0
  97. package/ios/RNTrackPlayer/TrackPlayer.mm +249 -0
  98. package/ios/RNTrackPlayer/Utils/EventType.swift +45 -0
  99. package/ios/RNTrackPlayer/Utils/Metadata.swift +60 -0
  100. package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoView.swift +83 -0
  101. package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoViewManager.m +5 -0
  102. package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoViewManager.swift +17 -0
  103. package/ios/SwiftAudioEx/Package.swift +20 -0
  104. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapper.swift +531 -0
  105. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperDelegate.swift +27 -0
  106. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperProtocol.swift +69 -0
  107. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperState.swift +43 -0
  108. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioItem.swift +158 -0
  109. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayer.swift +459 -0
  110. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayerError.swift +26 -0
  111. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSession.swift +33 -0
  112. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSessionController.swift +135 -0
  113. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioTap.swift +96 -0
  114. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Event.swift +155 -0
  115. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/MediaItemProperty.swift +95 -0
  116. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoCenter.swift +17 -0
  117. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoController.swift +73 -0
  118. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoControllerProtocol.swift +26 -0
  119. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoKeyValue.swift +14 -0
  120. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoProperty.swift +234 -0
  121. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemNotificationObserver.swift +102 -0
  122. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemObserver.swift +136 -0
  123. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerObserver.swift +120 -0
  124. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerTimeObserver.swift +112 -0
  125. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueueManager.swift +356 -0
  126. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueuedAudioPlayer.swift +236 -0
  127. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommand.swift +170 -0
  128. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommandController.swift +206 -0
  129. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RepeatMode.swift +15 -0
  130. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/TimeEventFrequency.swift +26 -0
  131. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Utils/DispatchQueueType.swift +18 -0
  132. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/WaveformAudioTap.swift +159 -0
  133. package/lib/specs/NativeTrackPlayer.d.ts +134 -0
  134. package/lib/specs/NativeTrackPlayer.js +4 -0
  135. package/lib/src/TrackPlayerModule.web.d.ts +2 -0
  136. package/lib/src/TrackPlayerModule.web.js +2 -0
  137. package/lib/src/VideoView.d.ts +16 -0
  138. package/lib/src/VideoView.js +25 -0
  139. package/lib/src/constants/AndroidAudioContentType.d.ts +35 -0
  140. package/lib/src/constants/AndroidAudioContentType.js +36 -0
  141. package/lib/src/constants/AndroidAutoContentStyle.d.ts +10 -0
  142. package/lib/src/constants/AndroidAutoContentStyle.js +11 -0
  143. package/lib/src/constants/AppKilledPlaybackBehavior.d.ts +17 -0
  144. package/lib/src/constants/AppKilledPlaybackBehavior.js +18 -0
  145. package/lib/src/constants/Capability.d.ts +17 -0
  146. package/lib/src/constants/Capability.js +19 -0
  147. package/lib/src/constants/Event.d.ts +172 -0
  148. package/lib/src/constants/Event.js +173 -0
  149. package/lib/src/constants/IOSCategory.d.ts +36 -0
  150. package/lib/src/constants/IOSCategory.js +37 -0
  151. package/lib/src/constants/IOSCategoryMode.d.ts +47 -0
  152. package/lib/src/constants/IOSCategoryMode.js +48 -0
  153. package/lib/src/constants/IOSCategoryOptions.d.ts +44 -0
  154. package/lib/src/constants/IOSCategoryOptions.js +45 -0
  155. package/lib/src/constants/MediaItemPlayable.d.ts +4 -0
  156. package/lib/src/constants/MediaItemPlayable.js +5 -0
  157. package/lib/src/constants/PitchAlgorithm.d.ts +14 -0
  158. package/lib/src/constants/PitchAlgorithm.js +16 -0
  159. package/lib/src/constants/RatingType.d.ts +8 -0
  160. package/lib/src/constants/RatingType.js +10 -0
  161. package/lib/src/constants/RepeatMode.d.ts +8 -0
  162. package/lib/src/constants/RepeatMode.js +10 -0
  163. package/lib/src/constants/State.d.ts +34 -0
  164. package/lib/src/constants/State.js +35 -0
  165. package/lib/src/constants/TrackType.d.ts +6 -0
  166. package/lib/src/constants/TrackType.js +7 -0
  167. package/lib/src/constants/index.d.ts +14 -0
  168. package/lib/src/constants/index.js +14 -0
  169. package/lib/src/hooks/index.d.ts +6 -0
  170. package/lib/src/hooks/index.js +6 -0
  171. package/lib/src/hooks/useActiveTrack.d.ts +2 -0
  172. package/lib/src/hooks/useActiveTrack.js +28 -0
  173. package/lib/src/hooks/useAppIsInBackground.d.ts +1 -0
  174. package/lib/src/hooks/useAppIsInBackground.js +16 -0
  175. package/lib/src/hooks/useIsPlaying.d.ts +35 -0
  176. package/lib/src/hooks/useIsPlaying.js +50 -0
  177. package/lib/src/hooks/usePlayWhenReady.d.ts +1 -0
  178. package/lib/src/hooks/usePlayWhenReady.js +27 -0
  179. package/lib/src/hooks/usePlaybackState.d.ts +10 -0
  180. package/lib/src/hooks/usePlaybackState.js +35 -0
  181. package/lib/src/hooks/useProgress.d.ts +7 -0
  182. package/lib/src/hooks/useProgress.js +55 -0
  183. package/lib/src/hooks/useTrackPlayerEvents.d.ts +8 -0
  184. package/lib/src/hooks/useTrackPlayerEvents.js +30 -0
  185. package/lib/src/index.d.ts +6 -0
  186. package/lib/src/index.js +6 -0
  187. package/lib/src/interfaces/AndroidAutoBrowseTree.d.ts +5 -0
  188. package/lib/src/interfaces/AndroidAutoBrowseTree.js +1 -0
  189. package/lib/src/interfaces/AndroidOptions.d.ts +41 -0
  190. package/lib/src/interfaces/AndroidOptions.js +1 -0
  191. package/lib/src/interfaces/CustomButtons.d.ts +5 -0
  192. package/lib/src/interfaces/CustomButtons.js +1 -0
  193. package/lib/src/interfaces/FeedbackOptions.d.ts +6 -0
  194. package/lib/src/interfaces/FeedbackOptions.js +1 -0
  195. package/lib/src/interfaces/MediaItem.d.ts +18 -0
  196. package/lib/src/interfaces/MediaItem.js +1 -0
  197. package/lib/src/interfaces/MetadataOptions.d.ts +3 -0
  198. package/lib/src/interfaces/MetadataOptions.js +1 -0
  199. package/lib/src/interfaces/NowPlayingMetadata.d.ts +4 -0
  200. package/lib/src/interfaces/NowPlayingMetadata.js +1 -0
  201. package/lib/src/interfaces/PlaybackState.d.ts +8 -0
  202. package/lib/src/interfaces/PlaybackState.js +1 -0
  203. package/lib/src/interfaces/PlayerOptions.d.ts +132 -0
  204. package/lib/src/interfaces/PlayerOptions.js +1 -0
  205. package/lib/src/interfaces/Progress.d.ts +15 -0
  206. package/lib/src/interfaces/Progress.js +1 -0
  207. package/lib/src/interfaces/ResourceObject.d.ts +1 -0
  208. package/lib/src/interfaces/ResourceObject.js +1 -0
  209. package/lib/src/interfaces/ServiceHandler.d.ts +1 -0
  210. package/lib/src/interfaces/ServiceHandler.js +1 -0
  211. package/lib/src/interfaces/Track.d.ts +21 -0
  212. package/lib/src/interfaces/Track.js +1 -0
  213. package/lib/src/interfaces/TrackMetadataBase.d.ts +28 -0
  214. package/lib/src/interfaces/TrackMetadataBase.js +1 -0
  215. package/lib/src/interfaces/UpdateOptions.d.ts +52 -0
  216. package/lib/src/interfaces/UpdateOptions.js +1 -0
  217. package/lib/src/interfaces/events/AudioMetadataReceivedEvent.d.ts +33 -0
  218. package/lib/src/interfaces/events/AudioMetadataReceivedEvent.js +1 -0
  219. package/lib/src/interfaces/events/ControllerConnectedEvent.d.ts +8 -0
  220. package/lib/src/interfaces/events/ControllerConnectedEvent.js +1 -0
  221. package/lib/src/interfaces/events/EventPayloadByEvent.d.ts +77 -0
  222. package/lib/src/interfaces/events/EventPayloadByEvent.js +1 -0
  223. package/lib/src/interfaces/events/FFTUpdateEvent.d.ts +7 -0
  224. package/lib/src/interfaces/events/FFTUpdateEvent.js +1 -0
  225. package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.d.ts +24 -0
  226. package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.js +1 -0
  227. package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.d.ts +4 -0
  228. package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.js +1 -0
  229. package/lib/src/interfaces/events/PlaybackErrorEvent.d.ts +6 -0
  230. package/lib/src/interfaces/events/PlaybackErrorEvent.js +1 -0
  231. package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.d.ts +16 -0
  232. package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.js +1 -0
  233. package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.d.ts +4 -0
  234. package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.js +1 -0
  235. package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.d.ts +4 -0
  236. package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.js +1 -0
  237. package/lib/src/interfaces/events/PlaybackQueueEndedEvent.d.ts +9 -0
  238. package/lib/src/interfaces/events/PlaybackQueueEndedEvent.js +1 -0
  239. package/lib/src/interfaces/events/PlaybackResumeEvent.d.ts +3 -0
  240. package/lib/src/interfaces/events/PlaybackResumeEvent.js +1 -0
  241. package/lib/src/interfaces/events/PlaybackTrackChangedEvent.d.ts +11 -0
  242. package/lib/src/interfaces/events/PlaybackTrackChangedEvent.js +1 -0
  243. package/lib/src/interfaces/events/PlayerErrorEvent.d.ts +6 -0
  244. package/lib/src/interfaces/events/PlayerErrorEvent.js +1 -0
  245. package/lib/src/interfaces/events/RemoteBrowseEvent.d.ts +4 -0
  246. package/lib/src/interfaces/events/RemoteBrowseEvent.js +1 -0
  247. package/lib/src/interfaces/events/RemoteCustomActionEvent.d.ts +7 -0
  248. package/lib/src/interfaces/events/RemoteCustomActionEvent.js +1 -0
  249. package/lib/src/interfaces/events/RemoteDuckEvent.d.ts +13 -0
  250. package/lib/src/interfaces/events/RemoteDuckEvent.js +1 -0
  251. package/lib/src/interfaces/events/RemoteJumpBackwardEvent.d.ts +7 -0
  252. package/lib/src/interfaces/events/RemoteJumpBackwardEvent.js +1 -0
  253. package/lib/src/interfaces/events/RemoteJumpForwardEvent.d.ts +7 -0
  254. package/lib/src/interfaces/events/RemoteJumpForwardEvent.js +1 -0
  255. package/lib/src/interfaces/events/RemotePlayIdEvent.d.ts +4 -0
  256. package/lib/src/interfaces/events/RemotePlayIdEvent.js +1 -0
  257. package/lib/src/interfaces/events/RemotePlaySearchEvent.d.ts +9 -0
  258. package/lib/src/interfaces/events/RemotePlaySearchEvent.js +1 -0
  259. package/lib/src/interfaces/events/RemoteSearchEvent.d.ts +3 -0
  260. package/lib/src/interfaces/events/RemoteSearchEvent.js +1 -0
  261. package/lib/src/interfaces/events/RemoteSeekEvent.d.ts +4 -0
  262. package/lib/src/interfaces/events/RemoteSeekEvent.js +1 -0
  263. package/lib/src/interfaces/events/RemoteSetRatingEvent.d.ts +4 -0
  264. package/lib/src/interfaces/events/RemoteSetRatingEvent.js +1 -0
  265. package/lib/src/interfaces/events/RemoteSkipEvent.d.ts +3 -0
  266. package/lib/src/interfaces/events/RemoteSkipEvent.js +1 -0
  267. package/lib/src/interfaces/events/index.d.ts +20 -0
  268. package/lib/src/interfaces/events/index.js +20 -0
  269. package/lib/src/interfaces/index.d.ts +15 -0
  270. package/lib/src/interfaces/index.js +15 -0
  271. package/lib/src/resolveAssetSource.d.ts +2 -0
  272. package/lib/src/resolveAssetSource.js +3 -0
  273. package/lib/src/resolveAssetSource.web.d.ts +2 -0
  274. package/lib/src/resolveAssetSource.web.js +8 -0
  275. package/lib/src/trackPlayer.d.ts +371 -0
  276. package/lib/src/trackPlayer.js +627 -0
  277. package/lib/web/TrackPlayer/Player.d.ts +40 -0
  278. package/lib/web/TrackPlayer/Player.js +188 -0
  279. package/lib/web/TrackPlayer/PlaylistPlayer.d.ts +31 -0
  280. package/lib/web/TrackPlayer/PlaylistPlayer.js +181 -0
  281. package/lib/web/TrackPlayer/RepeatMode.d.ts +5 -0
  282. package/lib/web/TrackPlayer/RepeatMode.js +6 -0
  283. package/lib/web/TrackPlayer/SetupNotCalledError.d.ts +3 -0
  284. package/lib/web/TrackPlayer/SetupNotCalledError.js +5 -0
  285. package/lib/web/TrackPlayer/index.d.ts +3 -0
  286. package/lib/web/TrackPlayer/index.js +3 -0
  287. package/lib/web/TrackPlayerModule.d.ts +63 -0
  288. package/lib/web/TrackPlayerModule.js +153 -0
  289. package/lib/web/index.d.ts +3 -0
  290. package/lib/web/index.js +3 -0
  291. package/package.json +85 -6
  292. package/react-native-track-player.podspec +13 -13
  293. package/specs/NativeTrackPlayer.ts +153 -0
  294. package/src/TrackPlayerModule.web.ts +2 -0
  295. package/src/VideoView.tsx +51 -0
  296. package/src/constants/AndroidAudioContentType.ts +35 -0
  297. package/src/constants/AndroidAutoContentStyle.ts +10 -0
  298. package/src/constants/AppKilledPlaybackBehavior.ts +19 -0
  299. package/src/constants/Capability.ts +19 -0
  300. package/src/constants/Event.ts +173 -0
  301. package/src/constants/IOSCategory.ts +36 -0
  302. package/src/constants/IOSCategoryMode.ts +47 -0
  303. package/src/constants/IOSCategoryOptions.ts +44 -0
  304. package/src/constants/MediaItemPlayable.ts +4 -0
  305. package/src/constants/PitchAlgorithm.ts +16 -0
  306. package/src/constants/RatingType.ts +10 -0
  307. package/src/constants/RepeatMode.ts +10 -0
  308. package/src/constants/State.ts +34 -0
  309. package/src/constants/TrackType.ts +6 -0
  310. package/src/constants/index.ts +14 -0
  311. package/src/hooks/index.ts +6 -0
  312. package/src/hooks/useActiveTrack.ts +36 -0
  313. package/src/hooks/useAppIsInBackground.ts +20 -0
  314. package/src/hooks/useIsPlaying.ts +56 -0
  315. package/src/hooks/usePlayWhenReady.ts +37 -0
  316. package/src/hooks/usePlaybackState.ts +45 -0
  317. package/src/hooks/useProgress.ts +64 -0
  318. package/src/hooks/useTrackPlayerEvents.ts +48 -0
  319. package/src/index.ts +8 -0
  320. package/src/interfaces/AndroidAutoBrowseTree.ts +6 -0
  321. package/src/interfaces/AndroidOptions.ts +48 -0
  322. package/src/interfaces/CustomButtons.ts +6 -0
  323. package/src/interfaces/FeedbackOptions.ts +7 -0
  324. package/src/interfaces/MediaItem.ts +19 -0
  325. package/src/interfaces/MetadataOptions.ts +4 -0
  326. package/src/interfaces/NowPlayingMetadata.ts +5 -0
  327. package/src/interfaces/PlaybackState.ts +11 -0
  328. package/src/interfaces/PlayerOptions.ts +138 -0
  329. package/src/interfaces/Progress.ts +15 -0
  330. package/src/interfaces/ResourceObject.ts +1 -0
  331. package/src/interfaces/ServiceHandler.ts +1 -0
  332. package/src/interfaces/Track.ts +23 -0
  333. package/src/interfaces/TrackMetadataBase.ts +29 -0
  334. package/src/interfaces/UpdateOptions.ts +59 -0
  335. package/src/interfaces/events/AudioMetadataReceivedEvent.ts +37 -0
  336. package/src/interfaces/events/ControllerConnectedEvent.ts +9 -0
  337. package/src/interfaces/events/EventPayloadByEvent.ts +80 -0
  338. package/src/interfaces/events/FFTUpdateEvent.ts +9 -0
  339. package/src/interfaces/events/PlaybackActiveTrackChangedEvent.ts +29 -0
  340. package/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.ts +4 -0
  341. package/src/interfaces/events/PlaybackErrorEvent.ts +6 -0
  342. package/src/interfaces/events/PlaybackMetadataReceivedEvent.ts +16 -0
  343. package/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.ts +4 -0
  344. package/src/interfaces/events/PlaybackProgressUpdatedEvent.ts +5 -0
  345. package/src/interfaces/events/PlaybackQueueEndedEvent.ts +9 -0
  346. package/src/interfaces/events/PlaybackResumeEvent.ts +5 -0
  347. package/src/interfaces/events/PlaybackTrackChangedEvent.ts +11 -0
  348. package/src/interfaces/events/PlayerErrorEvent.ts +6 -0
  349. package/src/interfaces/events/RemoteBrowseEvent.ts +4 -0
  350. package/src/interfaces/events/RemoteCustomActionEvent.ts +7 -0
  351. package/src/interfaces/events/RemoteDuckEvent.ts +13 -0
  352. package/src/interfaces/events/RemoteJumpBackwardEvent.ts +7 -0
  353. package/src/interfaces/events/RemoteJumpForwardEvent.ts +7 -0
  354. package/src/interfaces/events/RemotePlayIdEvent.ts +4 -0
  355. package/src/interfaces/events/RemotePlaySearchEvent.ts +21 -0
  356. package/src/interfaces/events/RemoteSearchEvent.ts +3 -0
  357. package/src/interfaces/events/RemoteSeekEvent.ts +4 -0
  358. package/src/interfaces/events/RemoteSetRatingEvent.ts +5 -0
  359. package/src/interfaces/events/RemoteSkipEvent.ts +3 -0
  360. package/src/interfaces/events/index.ts +20 -0
  361. package/src/interfaces/index.ts +15 -0
  362. package/src/resolveAssetSource.ts +3 -0
  363. package/src/resolveAssetSource.web.ts +10 -0
  364. package/src/trackPlayer.ts +806 -0
  365. package/web/TrackPlayer/Player.ts +201 -0
  366. package/web/TrackPlayer/PlaylistPlayer.ts +215 -0
  367. package/web/TrackPlayer/RepeatMode.ts +6 -0
  368. package/web/TrackPlayer/SetupNotCalledError.ts +5 -0
  369. package/web/TrackPlayer/index.ts +3 -0
  370. package/web/TrackPlayerModule.ts +181 -0
  371. package/web/index.ts +4 -0
  372. package/CHANGELOG.md +0 -75
  373. package/android/react-native-music-control.iml +0 -139
  374. package/android/react-native-track-player.iml +0 -151
  375. package/android/src/main/ic_home-playstore.png +0 -0
  376. package/android/src/main/ic_repeat-playstore.png +0 -0
  377. package/android/src/main/ic_repeat_50-playstore.png +0 -0
  378. package/android/src/main/ic_shuffle-playstore.png +0 -0
  379. package/android/src/main/ic_shuffle_50-playstore.png +0 -0
  380. package/android/src/main/ic_shuffle_sm-playstore.png +0 -0
  381. package/android/src/main/ic_stop-playstore.png +0 -0
  382. package/android/src/main/ic_test-playstore.png +0 -0
  383. package/android/src/main/java/com/guichaguri/trackplayer/HeadlessJsMediaService.java +0 -225
  384. package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.kt +0 -25
  385. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/event/NotificationEventHolder.kt +0 -20
  386. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AAMediaSessionCallback.kt +0 -10
  387. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioItem.kt +0 -66
  388. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationConfig.kt +0 -43
  389. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationMetadata.kt +0 -8
  390. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationState.kt +0 -8
  391. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlayerOptions.kt +0 -9
  392. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/QueuedPlayerOptions.kt +0 -49
  393. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/notification/NotificationManager.kt +0 -678
  394. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/AudioPlayer.kt +0 -10
  395. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/BaseAudioPlayer.kt +0 -864
  396. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/MediaSourceExt.kt +0 -35
  397. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/PlayerCache.kt +0 -26
  398. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/utils/Utils.kt +0 -12
  399. package/android/src/main/java/com/guichaguri/trackplayer/model/Track.kt +0 -120
  400. package/android/src/main/java/com/guichaguri/trackplayer/model/TrackAudioItem.kt +0 -19
  401. package/android/src/main/java/com/guichaguri/trackplayer/model/TrackType.kt +0 -11
  402. package/android/src/main/java/com/guichaguri/trackplayer/module/AutoConnectionDetector.kt +0 -151
  403. package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.kt +0 -1177
  404. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.kt +0 -31
  405. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.kt +0 -347
  406. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.kt +0 -1254
  407. package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.kt +0 -228
  408. package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.kt +0 -141
  409. package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.kt +0 -396
  410. package/android/src/main/res/drawable-hdpi/ic_forward.png +0 -0
  411. package/android/src/main/res/drawable-hdpi/ic_home.png +0 -0
  412. package/android/src/main/res/drawable-hdpi/ic_next.png +0 -0
  413. package/android/src/main/res/drawable-hdpi/ic_pause.png +0 -0
  414. package/android/src/main/res/drawable-hdpi/ic_play.png +0 -0
  415. package/android/src/main/res/drawable-hdpi/ic_previous.png +0 -0
  416. package/android/src/main/res/drawable-hdpi/ic_rewind.png +0 -0
  417. package/android/src/main/res/drawable-hdpi/ic_stop.png +0 -0
  418. package/android/src/main/res/drawable-mdpi/ic_forward.png +0 -0
  419. package/android/src/main/res/drawable-mdpi/ic_home.png +0 -0
  420. package/android/src/main/res/drawable-mdpi/ic_next.png +0 -0
  421. package/android/src/main/res/drawable-mdpi/ic_pause.png +0 -0
  422. package/android/src/main/res/drawable-mdpi/ic_play.png +0 -0
  423. package/android/src/main/res/drawable-mdpi/ic_previous.png +0 -0
  424. package/android/src/main/res/drawable-mdpi/ic_rewind.png +0 -0
  425. package/android/src/main/res/drawable-mdpi/ic_stop.png +0 -0
  426. package/android/src/main/res/drawable-xhdpi/ic_forward.png +0 -0
  427. package/android/src/main/res/drawable-xhdpi/ic_home.png +0 -0
  428. package/android/src/main/res/drawable-xhdpi/ic_next.png +0 -0
  429. package/android/src/main/res/drawable-xhdpi/ic_pause.png +0 -0
  430. package/android/src/main/res/drawable-xhdpi/ic_play.png +0 -0
  431. package/android/src/main/res/drawable-xhdpi/ic_previous.png +0 -0
  432. package/android/src/main/res/drawable-xhdpi/ic_rewind.png +0 -0
  433. package/android/src/main/res/drawable-xhdpi/ic_stop.png +0 -0
  434. package/android/src/main/res/drawable-xxhdpi/ic_forward.png +0 -0
  435. package/android/src/main/res/drawable-xxhdpi/ic_home.png +0 -0
  436. package/android/src/main/res/drawable-xxhdpi/ic_next.png +0 -0
  437. package/android/src/main/res/drawable-xxhdpi/ic_pause.png +0 -0
  438. package/android/src/main/res/drawable-xxhdpi/ic_play.png +0 -0
  439. package/android/src/main/res/drawable-xxhdpi/ic_previous.png +0 -0
  440. package/android/src/main/res/drawable-xxhdpi/ic_rewind.png +0 -0
  441. package/android/src/main/res/drawable-xxhdpi/ic_stop.png +0 -0
  442. package/android/src/main/res/drawable-xxxhdpi/ic_forward.png +0 -0
  443. package/android/src/main/res/drawable-xxxhdpi/ic_home.png +0 -0
  444. package/android/src/main/res/drawable-xxxhdpi/ic_next.png +0 -0
  445. package/android/src/main/res/drawable-xxxhdpi/ic_pause.png +0 -0
  446. package/android/src/main/res/drawable-xxxhdpi/ic_play.png +0 -0
  447. package/android/src/main/res/drawable-xxxhdpi/ic_previous.png +0 -0
  448. package/android/src/main/res/drawable-xxxhdpi/ic_rewind.png +0 -0
  449. package/android/src/main/res/drawable-xxxhdpi/ic_stop.png +0 -0
  450. package/android/src/main/res/mipmap-hdpi/ic_arrow_down_circle_foreground.png +0 -0
  451. package/android/src/main/res/mipmap-hdpi/ic_clock_now_foreground.png +0 -0
  452. package/android/src/main/res/mipmap-hdpi/ic_close_foreground.png +0 -0
  453. package/android/src/main/res/mipmap-hdpi/ic_heart_foreground.png +0 -0
  454. package/android/src/main/res/mipmap-hdpi/ic_heart_outlined_foreground.png +0 -0
  455. package/android/src/main/res/mipmap-hdpi/ic_repeat_off_foreground.png +0 -0
  456. package/android/src/main/res/mipmap-hdpi/ic_repeat_on_foreground.png +0 -0
  457. package/android/src/main/res/mipmap-hdpi/ic_shuffle_off_foreground.png +0 -0
  458. package/android/src/main/res/mipmap-hdpi/ic_shuffle_on_foreground.png +0 -0
  459. package/android/src/main/res/mipmap-mdpi/ic_arrow_down_circle_foreground.png +0 -0
  460. package/android/src/main/res/mipmap-mdpi/ic_clock_now_foreground.png +0 -0
  461. package/android/src/main/res/mipmap-mdpi/ic_close_foreground.png +0 -0
  462. package/android/src/main/res/mipmap-mdpi/ic_heart_foreground.png +0 -0
  463. package/android/src/main/res/mipmap-mdpi/ic_heart_outlined_foreground.png +0 -0
  464. package/android/src/main/res/mipmap-mdpi/ic_repeat_off_foreground.png +0 -0
  465. package/android/src/main/res/mipmap-mdpi/ic_repeat_on_foreground.png +0 -0
  466. package/android/src/main/res/mipmap-mdpi/ic_shuffle_off_foreground.png +0 -0
  467. package/android/src/main/res/mipmap-mdpi/ic_shuffle_on_foreground.png +0 -0
  468. package/android/src/main/res/mipmap-xhdpi/ic_arrow_down_circle_foreground.png +0 -0
  469. package/android/src/main/res/mipmap-xhdpi/ic_clock_now_foreground.png +0 -0
  470. package/android/src/main/res/mipmap-xhdpi/ic_close_foreground.png +0 -0
  471. package/android/src/main/res/mipmap-xhdpi/ic_heart_foreground.png +0 -0
  472. package/android/src/main/res/mipmap-xhdpi/ic_heart_outlined_foreground.png +0 -0
  473. package/android/src/main/res/mipmap-xhdpi/ic_repeat_off_foreground.png +0 -0
  474. package/android/src/main/res/mipmap-xhdpi/ic_repeat_on_foreground.png +0 -0
  475. package/android/src/main/res/mipmap-xhdpi/ic_shuffle_off_foreground.png +0 -0
  476. package/android/src/main/res/mipmap-xhdpi/ic_shuffle_on_foreground.png +0 -0
  477. package/android/src/main/res/mipmap-xxhdpi/ic_arrow_down_circle_foreground.png +0 -0
  478. package/android/src/main/res/mipmap-xxhdpi/ic_clock_now_foreground.png +0 -0
  479. package/android/src/main/res/mipmap-xxhdpi/ic_close_foreground.png +0 -0
  480. package/android/src/main/res/mipmap-xxhdpi/ic_heart_foreground.png +0 -0
  481. package/android/src/main/res/mipmap-xxhdpi/ic_heart_outlined_foreground.png +0 -0
  482. package/android/src/main/res/mipmap-xxhdpi/ic_repeat_off_foreground.png +0 -0
  483. package/android/src/main/res/mipmap-xxhdpi/ic_repeat_on_foreground.png +0 -0
  484. package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_off_foreground.png +0 -0
  485. package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_on_foreground.png +0 -0
  486. package/android/src/main/res/mipmap-xxxhdpi/ic_arrow_down_circle_foreground.png +0 -0
  487. package/android/src/main/res/mipmap-xxxhdpi/ic_clock_now_foreground.png +0 -0
  488. package/android/src/main/res/mipmap-xxxhdpi/ic_close_foreground.png +0 -0
  489. package/android/src/main/res/mipmap-xxxhdpi/ic_heart_foreground.png +0 -0
  490. package/android/src/main/res/mipmap-xxxhdpi/ic_heart_outlined_foreground.png +0 -0
  491. package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_off_foreground.png +0 -0
  492. package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_on_foreground.png +0 -0
  493. package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_off_foreground.png +0 -0
  494. package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_on_foreground.png +0 -0
  495. package/android/src/main/res/raw/silent_5_seconds.mp3 +0 -0
  496. package/android/src/main/res/strings.xml +0 -6
  497. package/index.d.ts +0 -235
  498. package/index.js +0 -4
  499. package/ios/RNTrackPlayer/RNTrackPlayerBridge.h +0 -12
  500. package/ios/RNTrackPlayer/RNTrackPlayerBridge.m +0 -29
  501. package/ios/TrackPlayer.xcodeproj/project.pbxproj +0 -495
  502. package/ios/TrackPlayer.xcodeproj/project.xcworkspace/xcuserdata/marco.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  503. package/lib/ProgressComponent.js +0 -70
  504. package/lib/eventTypes.js +0 -28
  505. package/lib/hooks.js +0 -160
  506. package/lib/index.js +0 -178
  507. /package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
@@ -1,33 +1,57 @@
1
- package com.guichaguri.trackplayer.kotlinaudio.players
1
+ @file: OptIn(UnstableApi::class) package com.lovegaoshi.kotlinaudio.player
2
2
 
3
3
  import android.content.Context
4
- import android.util.Log
5
- import com.doublesymmetry.kotlinaudio.players.BaseAudioPlayer
6
- import com.google.android.exoplayer2.C
7
- import com.google.android.exoplayer2.IllegalSeekPositionException
8
- import com.google.android.exoplayer2.source.MediaSource
9
- import com.guichaguri.trackplayer.kotlinaudio.models.*
4
+ import androidx.annotation.OptIn
5
+ import androidx.media3.common.C
6
+ import androidx.media3.common.IllegalSeekPositionException
7
+ import androidx.media3.common.MediaItem
8
+ import androidx.media3.common.Player
9
+ import androidx.media3.common.util.UnstableApi
10
+ import com.lovegaoshi.kotlinaudio.models.*
10
11
  import java.util.*
11
12
  import kotlin.math.max
12
13
  import kotlin.math.min
13
14
 
14
15
  class QueuedAudioPlayer(
15
- context: Context,
16
- playerConfig: PlayerConfig = PlayerConfig(),
17
- bufferConfig: BufferConfig? = null,
18
- cacheConfig: CacheConfig? = null,
19
- mediaSessionCallback: AAMediaSessionCallBack
20
- ) : BaseAudioPlayer(context, playerConfig, bufferConfig, cacheConfig, mediaSessionCallback) {
21
- private val queue = LinkedList<MediaSource>()
22
- override val playerOptions = DefaultQueuedPlayerOptions(exoPlayer)
16
+ private val context: Context,
17
+ options: PlayerOptions = PlayerOptions()
18
+ ) : AudioPlayer(context, options) {
23
19
 
24
- // val currentIndex
25
- // get() = exoPlayer.currentMediaItemIndex
20
+ var parseEmbeddedArtwork: Boolean = false
26
21
 
27
- val currentIndex = 0
22
+ private val queue = LinkedList<MediaItem>()
23
+
24
+ private fun parseAudioItem(audioItem: AudioItem): MediaItem {
25
+ return audioItem2MediaItem(audioItem, if (parseEmbeddedArtwork) context else null)
26
+ }
27
+
28
+ var repeatMode: RepeatMode
29
+ get() {
30
+ return when (exoPlayer.repeatMode) {
31
+ Player.REPEAT_MODE_ALL -> RepeatMode.ALL
32
+ Player.REPEAT_MODE_ONE -> RepeatMode.ONE
33
+ else -> RepeatMode.OFF
34
+ }
35
+ }
36
+ set(value) {
37
+ when (value) {
38
+ RepeatMode.ALL -> players().forEach { p -> p.repeatMode = Player.REPEAT_MODE_ALL }
39
+ RepeatMode.ONE -> players().forEach { p -> p.repeatMode = Player.REPEAT_MODE_ONE }
40
+ RepeatMode.OFF -> players().forEach { p -> p.repeatMode = Player.REPEAT_MODE_OFF }
41
+ }
42
+ }
43
+
44
+ val currentIndex
45
+ get() = exoPlayer.currentMediaItemIndex
46
+
47
+ var shuffleMode
48
+ get() = exoPlayer.shuffleModeEnabled
49
+ set(v) {
50
+ players().forEach{ p -> p.shuffleModeEnabled = v }
51
+ }
28
52
 
29
53
  override val currentItem: AudioItem?
30
- get() = (queue.getOrNull(currentIndex)?.mediaItem?.localConfiguration?.tag as AudioItemHolder?)?.audioItem
54
+ get() = mediaItem2AudioItem(queue.getOrNull(currentIndex))
31
55
 
32
56
  val nextIndex: Int?
33
57
  get() {
@@ -42,26 +66,14 @@ class QueuedAudioPlayer(
42
66
  }
43
67
 
44
68
  val items: List<AudioItem>
45
- get() = queue.map { (it.mediaItem.localConfiguration?.tag as AudioItemHolder).audioItem }
46
-
47
- fun getQueueHead(): MediaSource? {
48
- return if (queue.isNotEmpty()) {
49
- queue.peek()
50
- } else {
51
- null
52
- }
53
- }
54
-
55
- fun getQueueSize(): Int {
56
- return queue.size
57
- }
69
+ get() = queue.map { mediaItem2AudioItem(it)!! }
58
70
 
59
71
  val previousItems: List<AudioItem>
60
72
  get() {
61
73
  return if (queue.isEmpty()) emptyList()
62
74
  else queue
63
75
  .subList(0, exoPlayer.currentMediaItemIndex)
64
- .map { (it.mediaItem.localConfiguration?.tag as AudioItemHolder).audioItem }
76
+ .map { mediaItem2AudioItem(it)!! }
65
77
  }
66
78
 
67
79
  val nextItems: List<AudioItem>
@@ -69,7 +81,7 @@ class QueuedAudioPlayer(
69
81
  return if (queue.isEmpty()) emptyList()
70
82
  else queue
71
83
  .subList(exoPlayer.currentMediaItemIndex, queue.lastIndex)
72
- .map { (it.mediaItem.localConfiguration?.tag as AudioItemHolder).audioItem }
84
+ .map { mediaItem2AudioItem(it)!! }
73
85
  }
74
86
 
75
87
  val nextItem: AudioItem?
@@ -79,18 +91,19 @@ class QueuedAudioPlayer(
79
91
  get() = items.getOrNull(currentIndex - 1)
80
92
 
81
93
  override fun load(item: AudioItem, playWhenReady: Boolean) {
82
- exoPlayer.playWhenReady = playWhenReady
83
94
  load(item)
95
+ exoPlayer.playWhenReady = playWhenReady
84
96
  }
85
97
 
86
98
  override fun load(item: AudioItem) {
87
99
  if (queue.isEmpty()) {
88
100
  add(item)
89
101
  } else {
90
- val mediaSource = getMediaSourceFromAudioItem(item)
91
- queue[currentIndex] = mediaSource
92
- exoPlayer.addMediaSource(currentIndex + 1, mediaSource)
93
- exoPlayer.removeMediaItem(currentIndex)
102
+ players().forEach { p ->
103
+ p.addMediaItem(currentIndex + 1, parseAudioItem(item))
104
+ p.removeMediaItem(currentIndex)
105
+ p.seekTo(currentIndex, C.TIME_UNSET)
106
+ }
94
107
  exoPlayer.prepare()
95
108
  }
96
109
  }
@@ -107,12 +120,11 @@ class QueuedAudioPlayer(
107
120
  /**
108
121
  * Add a single item to the queue. If the AudioPlayer has no item loaded, it will load the `item`.
109
122
  * @param item The [AudioItem] to add.
110
- * @param playWhenReady Whether playback starts automatically.
111
123
  */
112
124
  fun add(item: AudioItem) {
113
- val mediaSource = getMediaSourceFromAudioItem(item)
125
+ val mediaSource = parseAudioItem(item)
114
126
  queue.add(mediaSource)
115
- exoPlayer.addMediaSource(mediaSource)
127
+ players().forEach { p -> p.addMediaItem(mediaSource) }
116
128
  exoPlayer.prepare()
117
129
  }
118
130
 
@@ -131,21 +143,22 @@ class QueuedAudioPlayer(
131
143
  * @param items The [AudioItem]s to add.
132
144
  */
133
145
  fun add(items: List<AudioItem>) {
134
- val mediaSources = items.map { getMediaSourceFromAudioItem(it) }
146
+ val mediaSources = items.map { parseAudioItem(it) }
135
147
  queue.addAll(mediaSources)
136
- exoPlayer.addMediaSources(mediaSources)
148
+ players().forEach { p -> p.addMediaItems(mediaSources) }
137
149
  exoPlayer.prepare()
138
150
  }
139
151
 
152
+
140
153
  /**
141
154
  * Add multiple items to the queue.
142
155
  * @param items The [AudioItem]s to add.
143
156
  * @param atIndex Index to insert items at, if no items loaded this will not automatically start playback.
144
157
  */
145
158
  fun add(items: List<AudioItem>, atIndex: Int) {
146
- val mediaSources = items.map { getMediaSourceFromAudioItem(it) }
159
+ val mediaSources = items.map { parseAudioItem(it) }
147
160
  queue.addAll(atIndex, mediaSources)
148
- exoPlayer.addMediaSources(atIndex, mediaSources)
161
+ players().forEach { p -> p.addMediaItems(atIndex, mediaSources) }
149
162
  exoPlayer.prepare()
150
163
  }
151
164
 
@@ -155,7 +168,7 @@ class QueuedAudioPlayer(
155
168
  */
156
169
  fun remove(index: Int) {
157
170
  queue.removeAt(index)
158
- exoPlayer.removeMediaItem(index)
171
+ players().forEach { p -> p.removeMediaItem(index) }
159
172
  }
160
173
 
161
174
  /**
@@ -163,10 +176,10 @@ class QueuedAudioPlayer(
163
176
  * @param indexes The indexes of the items to remove.
164
177
  */
165
178
  fun remove(indexes: List<Int>) {
166
- var sorted = indexes.toList()
179
+ val sorted = indexes.toMutableList()
167
180
  // Sort the indexes in descending order so we can safely remove them one by one
168
181
  // without having the next index possibly newly pointing to another item than intended:
169
- Collections.sort(sorted, Collections.reverseOrder());
182
+ sorted.sortDescending()
170
183
  sorted.forEach {
171
184
  remove(it)
172
185
  }
@@ -196,8 +209,8 @@ class QueuedAudioPlayer(
196
209
  * @param toIndex The index to move the item to. If the index is larger than the size of the queue, the item is moved to the end of the queue instead.
197
210
  */
198
211
  fun move(fromIndex: Int, toIndex: Int) {
199
- exoPlayer.moveMediaItem(fromIndex, toIndex)
200
- var item = queue[fromIndex]
212
+ players().forEach { p -> p.moveMediaItem(fromIndex, toIndex) }
213
+ val item = queue[fromIndex]
201
214
  queue.removeAt(fromIndex)
202
215
  queue.add(max(0, min(items.size, if (toIndex > fromIndex) toIndex else toIndex - 1)), item)
203
216
  }
@@ -227,14 +240,11 @@ class QueuedAudioPlayer(
227
240
 
228
241
  /**
229
242
  * Replaces item at index in queue.
230
- * If updating current index, we update the notification metadata if [automaticallyUpdateNotificationMetadata] is true.
231
243
  */
232
244
  fun replaceItem(index: Int, item: AudioItem) {
233
- val mediaSource = getMediaSourceFromAudioItem(item)
245
+ val mediaSource = parseAudioItem(item)
234
246
  queue[index] = mediaSource
235
- if (index == currentIndex) {
236
- updateNotificationMetadataIfAutomatic(item)
237
- }
247
+ players().forEach { p -> p.replaceMediaItem(index, mediaSource) }
238
248
  }
239
249
 
240
250
  /**
@@ -245,7 +255,7 @@ class QueuedAudioPlayer(
245
255
  val lastIndex = queue.lastIndex + 1
246
256
  val fromIndex = currentIndex + 1
247
257
 
248
- exoPlayer.removeMediaItems(fromIndex, lastIndex)
258
+ players().forEach { p -> p.removeMediaItems(fromIndex, lastIndex) }
249
259
  queue.subList(fromIndex, lastIndex).clear()
250
260
  }
251
261
 
@@ -253,7 +263,7 @@ class QueuedAudioPlayer(
253
263
  * Removes all the previous items, if any (the ones returned by [previous]).
254
264
  */
255
265
  fun removePreviousItems() {
256
- exoPlayer.removeMediaItems(0, currentIndex)
266
+ players().forEach { p -> p.removeMediaItems(0, currentIndex) }
257
267
  queue.subList(0, currentIndex).clear()
258
268
  }
259
269
 
@@ -0,0 +1,33 @@
1
+ package com.lovegaoshi.kotlinaudio.player.components
2
+
3
+ import android.content.Context
4
+ import androidx.media3.common.util.UnstableApi
5
+ import androidx.media3.exoplayer.DefaultRenderersFactory
6
+ import androidx.media3.exoplayer.audio.AudioSink
7
+ import androidx.media3.exoplayer.audio.DefaultAudioSink
8
+ import androidx.media3.exoplayer.audio.TeeAudioProcessor
9
+ import com.lovegaoshi.kotlinaudio.processors.FFTEmitter
10
+ import com.lovegaoshi.kotlinaudio.processors.TeeListener
11
+
12
+ @UnstableApi
13
+ class APMRenderersFactory(
14
+ context: Context,
15
+ sampleRate: Int = 4096,
16
+ emitter: FFTEmitter?
17
+ ) : DefaultRenderersFactory(context) {
18
+ val teeProcessor = TeeAudioProcessor(TeeListener(sampleRate, emitter))
19
+
20
+
21
+ override fun buildAudioSink(
22
+ context: Context,
23
+ enableFloatOutput: Boolean,
24
+ enableAudioTrackPlaybackParams: Boolean
25
+ ): AudioSink? {
26
+ return DefaultAudioSink.Builder(context)
27
+ .setEnableFloatOutput(enableFloatOutput)
28
+ .setEnableAudioTrackPlaybackParams(enableAudioTrackPlaybackParams)
29
+ .setAudioProcessors(arrayOf(teeProcessor))
30
+ .build()
31
+ }
32
+
33
+ }
@@ -0,0 +1,34 @@
1
+ package com.lovegaoshi.kotlinaudio.player.components
2
+
3
+ import androidx.annotation.OptIn
4
+ import androidx.media3.common.util.UnstableApi
5
+ import androidx.media3.exoplayer.DefaultLoadControl
6
+ import androidx.media3.exoplayer.DefaultLoadControl.Builder
7
+ import androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_BACK_BUFFER_DURATION_MS
8
+ import androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS
9
+ import androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS
10
+ import androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_MAX_BUFFER_MS
11
+ import androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_MIN_BUFFER_MS
12
+ import com.lovegaoshi.kotlinaudio.models.BufferOptions
13
+
14
+
15
+ @OptIn(UnstableApi::class) fun setupBuffer(bufferConfig: BufferOptions): DefaultLoadControl {
16
+ bufferConfig.apply {
17
+ val multiplier =
18
+ DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS / DEFAULT_BUFFER_FOR_PLAYBACK_MS
19
+ val minBuffer =
20
+ if (minBuffer != null && minBuffer != 0) minBuffer else DEFAULT_MIN_BUFFER_MS
21
+ val maxBuffer =
22
+ if (maxBuffer != null && maxBuffer != 0) maxBuffer else DEFAULT_MAX_BUFFER_MS
23
+ val playBuffer =
24
+ if (playBuffer != null && playBuffer != 0) playBuffer else DEFAULT_BUFFER_FOR_PLAYBACK_MS
25
+ val backBuffer =
26
+ if (backBuffer != null && backBuffer != 0) backBuffer else DEFAULT_BACK_BUFFER_DURATION_MS
27
+
28
+ return Builder()
29
+ .setBufferDurationsMs(minBuffer, maxBuffer, playBuffer, playBuffer * multiplier)
30
+ .setBackBuffer(backBuffer, false)
31
+ .build()
32
+ }
33
+ }
34
+
@@ -0,0 +1,27 @@
1
+ package com.lovegaoshi.kotlinaudio.player.components
2
+
3
+ import android.content.Context
4
+ import androidx.media3.common.util.UnstableApi
5
+ import androidx.media3.database.DatabaseProvider
6
+ import androidx.media3.database.StandaloneDatabaseProvider
7
+ import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor
8
+ import androidx.media3.datasource.cache.SimpleCache
9
+ import java.io.File
10
+
11
+ @UnstableApi
12
+ object Cache {
13
+ @Volatile
14
+ private var instance: SimpleCache? = null
15
+
16
+ fun initCache(context: Context, size: Long): SimpleCache {
17
+ val db: DatabaseProvider = StandaloneDatabaseProvider(context)
18
+
19
+ instance ?: synchronized(this) {
20
+ instance ?: SimpleCache(
21
+ File(context.cacheDir, "APM"), LeastRecentlyUsedCacheEvictor(size), db)
22
+ .also { instance = it }
23
+ }
24
+
25
+ return instance!!
26
+ }
27
+ }
@@ -0,0 +1,59 @@
1
+ package com.lovegaoshi.kotlinaudio.player.components
2
+
3
+ import android.content.Context
4
+ import android.media.AudioManager
5
+ import androidx.core.content.ContextCompat
6
+ import androidx.media.AudioAttributesCompat
7
+ import androidx.media.AudioFocusRequestCompat
8
+ import androidx.media.AudioManagerCompat
9
+ import com.lovegaoshi.kotlinaudio.models.PlayerOptions
10
+
11
+ class FocusManager (
12
+ private val context: Context,
13
+ private val listener: AudioManager.OnAudioFocusChangeListener,
14
+ options: PlayerOptions
15
+ ) {
16
+ var hasAudioFocus = false
17
+ var alwaysPauseOnInterruption = options.alwaysPauseOnInterruption
18
+ private var focus: AudioFocusRequestCompat? = null
19
+
20
+ fun requestAudioFocus() {
21
+ if (hasAudioFocus) return
22
+
23
+ val manager = ContextCompat.getSystemService(context, AudioManager::class.java)
24
+
25
+ focus = AudioFocusRequestCompat.Builder(AudioManagerCompat.AUDIOFOCUS_GAIN)
26
+ .setOnAudioFocusChangeListener(listener)
27
+ .setAudioAttributes(
28
+ AudioAttributesCompat.Builder()
29
+ .setUsage(AudioAttributesCompat.USAGE_MEDIA)
30
+ .setContentType(AudioAttributesCompat.CONTENT_TYPE_MUSIC)
31
+ .build()
32
+ )
33
+ .setWillPauseWhenDucked(alwaysPauseOnInterruption)
34
+ .build()
35
+
36
+ val result: Int = if (manager != null && focus != null) {
37
+ AudioManagerCompat.requestAudioFocus(manager, focus!!)
38
+ } else {
39
+ AudioManager.AUDIOFOCUS_REQUEST_FAILED
40
+ }
41
+
42
+ hasAudioFocus = (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
43
+ }
44
+
45
+ fun abandonAudioFocusIfHeld() {
46
+ if (!hasAudioFocus) return
47
+
48
+ val manager = ContextCompat.getSystemService(context, AudioManager::class.java)
49
+
50
+ val result: Int = if (manager != null && focus != null) {
51
+ AudioManagerCompat.abandonAudioFocusRequest(manager, focus!!)
52
+ } else {
53
+ AudioManager.AUDIOFOCUS_REQUEST_FAILED
54
+ }
55
+
56
+ hasAudioFocus = (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
57
+ }
58
+
59
+ }
@@ -0,0 +1,130 @@
1
+ package com.lovegaoshi.kotlinaudio.player.components
2
+
3
+ import android.content.Context
4
+ import android.os.Build
5
+ import androidx.annotation.OptIn
6
+ import androidx.media3.common.MediaItem
7
+ import androidx.media3.common.util.UnstableApi
8
+ import androidx.media3.datasource.DataSource
9
+ import androidx.media3.datasource.DataSpec
10
+ import androidx.media3.datasource.DefaultDataSource
11
+ import androidx.media3.datasource.DefaultHttpDataSource
12
+ import androidx.media3.datasource.RawResourceDataSource
13
+ import androidx.media3.datasource.cache.CacheDataSource
14
+ import androidx.media3.datasource.cache.SimpleCache
15
+ import androidx.media3.exoplayer.dash.DashMediaSource
16
+ import androidx.media3.exoplayer.dash.DefaultDashChunkSource
17
+ import androidx.media3.exoplayer.drm.DrmSessionManagerProvider
18
+ import androidx.media3.exoplayer.hls.HlsMediaSource
19
+ import androidx.media3.exoplayer.smoothstreaming.DefaultSsChunkSource
20
+ import androidx.media3.exoplayer.smoothstreaming.SsMediaSource
21
+ import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
22
+ import androidx.media3.exoplayer.source.MediaSource
23
+ import androidx.media3.exoplayer.source.ProgressiveMediaSource
24
+ import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy
25
+ import androidx.media3.extractor.DefaultExtractorsFactory
26
+ import com.lovegaoshi.kotlinaudio.utils.isUriLocalFile
27
+ import androidx.core.net.toUri
28
+
29
+
30
+ @OptIn(UnstableApi::class)
31
+ class MediaFactory (
32
+ private val context: Context,
33
+ private val cache: SimpleCache?
34
+ ) : MediaSource.Factory{
35
+
36
+ private val mediaFactory = DefaultMediaSourceFactory(context)
37
+
38
+ override fun setDrmSessionManagerProvider(drmSessionManagerProvider: DrmSessionManagerProvider): MediaSource.Factory {
39
+ return mediaFactory.setDrmSessionManagerProvider(drmSessionManagerProvider)
40
+ }
41
+
42
+ override fun setLoadErrorHandlingPolicy(loadErrorHandlingPolicy: LoadErrorHandlingPolicy): MediaSource.Factory {
43
+ return mediaFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy)
44
+ }
45
+
46
+ override fun getSupportedTypes(): IntArray {
47
+ return mediaFactory.supportedTypes
48
+ }
49
+
50
+ override fun createMediaSource(mediaItem: MediaItem): MediaSource {
51
+
52
+ val userAgent = mediaItem.mediaMetadata.extras?.getString("user-agent")
53
+ val headers = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
54
+ mediaItem.mediaMetadata.extras?.getSerializable("headers", HashMap::class.java)
55
+ } else {
56
+ mediaItem.mediaMetadata.extras?.getSerializable("headers")
57
+ }
58
+ val resourceId = mediaItem.mediaMetadata.extras?.getInt("resource-id")
59
+ // HACK: why are these capitalized?
60
+ val resourceType = mediaItem.mediaMetadata.extras?.getString("type")?.lowercase()
61
+ val uri = mediaItem.mediaMetadata.extras?.getString("uri")!!.toUri()
62
+ val factory: DataSource.Factory = when {
63
+ resourceId != 0 && resourceId != null -> {
64
+ val raw = RawResourceDataSource(context)
65
+ raw.open(DataSpec(uri))
66
+ DataSource.Factory { raw }
67
+ }
68
+ isUriLocalFile(uri) -> {
69
+ DefaultDataSource.Factory(context)
70
+ }
71
+ else -> {
72
+ val tempFactory = DefaultHttpDataSource.Factory().apply {
73
+ setUserAgent(userAgent)
74
+ setAllowCrossProtocolRedirects(true)
75
+
76
+ headers?.let {
77
+ setDefaultRequestProperties(it as HashMap<String, String>)
78
+ }
79
+ }
80
+
81
+ enableCaching(tempFactory)
82
+ }
83
+ }
84
+
85
+ return when (resourceType) {
86
+ "dash" -> createDashSource(mediaItem, factory)
87
+ "hls" -> createHlsSource(mediaItem, factory)
88
+ "smoothstreaming" -> createSsSource(mediaItem, factory)
89
+ else -> createProgressiveSource(mediaItem, factory)
90
+ }
91
+ }
92
+
93
+ private fun createDashSource(mediaItem: MediaItem, factory: DataSource.Factory?): MediaSource {
94
+ return DashMediaSource.Factory(DefaultDashChunkSource.Factory(factory!!), factory)
95
+ .createMediaSource(mediaItem)
96
+ }
97
+
98
+ private fun createHlsSource(mediaItem: MediaItem, factory: DataSource.Factory?): MediaSource {
99
+ return HlsMediaSource.Factory(factory!!)
100
+ .createMediaSource(mediaItem)
101
+ }
102
+
103
+ private fun createSsSource(mediaItem: MediaItem, factory: DataSource.Factory?): MediaSource {
104
+ return SsMediaSource.Factory(DefaultSsChunkSource.Factory(factory!!), factory)
105
+ .createMediaSource(mediaItem)
106
+ }
107
+
108
+ private fun createProgressiveSource(
109
+ mediaItem: MediaItem,
110
+ factory: DataSource.Factory
111
+ ): ProgressiveMediaSource {
112
+ return ProgressiveMediaSource.Factory(
113
+ factory, DefaultExtractorsFactory()
114
+ .setConstantBitrateSeekingEnabled(true)
115
+ )
116
+ .createMediaSource(mediaItem)
117
+ }
118
+
119
+ private fun enableCaching(factory: DataSource.Factory): DataSource.Factory {
120
+ return if (cache == null) {
121
+ factory
122
+ } else {
123
+ CacheDataSource.Factory().apply {
124
+ setCache(cache!!)
125
+ setUpstreamDataSourceFactory(factory)
126
+ setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR)
127
+ }
128
+ }
129
+ }
130
+ }