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

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,864 +0,0 @@
1
- package com.doublesymmetry.kotlinaudio.players
2
-
3
- import android.content.Context
4
- import android.content.Intent
5
- import android.media.AudioManager
6
- import android.media.AudioManager.AUDIOFOCUS_LOSS
7
- import android.net.Uri
8
- import android.os.Bundle
9
- import android.os.ResultReceiver
10
- import android.support.v4.media.RatingCompat
11
- import android.support.v4.media.session.MediaSessionCompat
12
- import android.util.Log
13
- import android.view.KeyEvent
14
- import androidx.annotation.CallSuper
15
- import androidx.core.content.ContextCompat
16
- import androidx.media.AudioAttributesCompat
17
- import androidx.media.AudioAttributesCompat.CONTENT_TYPE_MUSIC
18
- import androidx.media.AudioAttributesCompat.USAGE_MEDIA
19
- import androidx.media.AudioFocusRequestCompat
20
- import androidx.media.AudioManagerCompat
21
- import androidx.media.AudioManagerCompat.AUDIOFOCUS_GAIN
22
- import com.guichaguri.trackplayer.kotlinaudio.event.EventHolder
23
- import com.guichaguri.trackplayer.kotlinaudio.event.NotificationEventHolder
24
- import com.guichaguri.trackplayer.kotlinaudio.event.PlayerEventHolder
25
- // import com.doublesymmetry.kotlinaudio.models.*
26
- import com.guichaguri.trackplayer.kotlinaudio.notification.NotificationManager
27
- import com.guichaguri.trackplayer.kotlinaudio.players.components.PlayerCache
28
- import com.guichaguri.trackplayer.kotlinaudio.utils.isUriLocal
29
- import com.google.android.exoplayer2.*
30
- import com.google.android.exoplayer2.DefaultLoadControl.*
31
- import com.google.android.exoplayer2.Player.Listener
32
- import com.google.android.exoplayer2.audio.AudioAttributes
33
- import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
34
- import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory
35
- import com.google.android.exoplayer2.metadata.Metadata
36
- import com.google.android.exoplayer2.source.MediaSource
37
- import com.google.android.exoplayer2.source.ProgressiveMediaSource
38
- import com.google.android.exoplayer2.source.dash.DashMediaSource
39
- import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource
40
- import com.google.android.exoplayer2.source.hls.HlsMediaSource
41
- import com.google.android.exoplayer2.source.smoothstreaming.DefaultSsChunkSource
42
- import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource
43
- import com.google.android.exoplayer2.upstream.*
44
- import com.google.android.exoplayer2.upstream.cache.CacheDataSource
45
- import com.google.android.exoplayer2.upstream.cache.SimpleCache
46
- import com.google.android.exoplayer2.util.Util
47
- import com.guichaguri.trackplayer.kotlinaudio.models.*
48
- import kotlinx.coroutines.MainScope
49
- import kotlinx.coroutines.launch
50
- import timber.log.Timber
51
- import java.util.*
52
- import java.util.concurrent.TimeUnit
53
-
54
- abstract class BaseAudioPlayer internal constructor(
55
- internal val context: Context,
56
- playerConfig: PlayerConfig,
57
- private val bufferConfig: BufferConfig?,
58
- private val cacheConfig: CacheConfig?,
59
- mediaSessionCallback: AAMediaSessionCallBack
60
- ) : AudioManager.OnAudioFocusChangeListener {
61
- protected val exoPlayer: ExoPlayer
62
-
63
- private var cache: SimpleCache? = null
64
- private val scope = MainScope()
65
- private var playerConfig: PlayerConfig = playerConfig
66
- var mediaSessionCallBack: AAMediaSessionCallBack = mediaSessionCallback
67
-
68
- val notificationManager: NotificationManager
69
-
70
- open val playerOptions: PlayerOptions = DefaultPlayerOptions()
71
-
72
- open val currentItem: AudioItem?
73
- get() = exoPlayer.currentMediaItem?.localConfiguration?.tag as AudioItem?
74
-
75
- var playbackError: PlaybackError? = null
76
- var playerState: AudioPlayerState = AudioPlayerState.IDLE
77
- private set(value) {
78
- if (value != field) {
79
- field = value
80
- playerEventHolder.updateAudioPlayerState(value)
81
- if (!playerConfig.handleAudioFocus) {
82
- when (value) {
83
- AudioPlayerState.IDLE,
84
- AudioPlayerState.ERROR -> abandonAudioFocusIfHeld()
85
- AudioPlayerState.READY -> requestAudioFocus()
86
- else -> {}
87
- }
88
- }
89
- }
90
- }
91
-
92
- var playWhenReady: Boolean
93
- get() = exoPlayer.playWhenReady
94
- set(value) {
95
- exoPlayer.playWhenReady = value
96
- }
97
-
98
- val duration: Long
99
- get() {
100
- return if (exoPlayer.duration == C.TIME_UNSET) 0
101
- else exoPlayer.duration
102
- }
103
-
104
- private var oldPosition = 0L
105
-
106
- val position: Long
107
- get() {
108
- return if (exoPlayer.currentPosition == C.POSITION_UNSET.toLong()) 0
109
- else exoPlayer.currentPosition
110
- }
111
-
112
- val bufferedPosition: Long
113
- get() {
114
- return if (exoPlayer.bufferedPosition == C.POSITION_UNSET.toLong()) 0
115
- else exoPlayer.bufferedPosition
116
- }
117
-
118
- var volume: Float
119
- get() = exoPlayer.volume
120
- set(value) {
121
- exoPlayer.volume = value * volumeMultiplier
122
- }
123
-
124
- var playbackSpeed: Float
125
- get() = exoPlayer.playbackParameters.speed
126
- set(value) {
127
- exoPlayer.setPlaybackSpeed(value)
128
- }
129
-
130
- var automaticallyUpdateNotificationMetadata: Boolean = true
131
-
132
- private var volumeMultiplier = 1f
133
- private set(value) {
134
- field = value
135
- volume = volume
136
- }
137
-
138
- val isPlaying
139
- get() = exoPlayer.isPlaying
140
-
141
- private val notificationEventHolder = NotificationEventHolder()
142
- private val playerEventHolder = PlayerEventHolder()
143
-
144
- var ratingType: Int = RatingCompat.RATING_NONE
145
- set(value) {
146
- field = value
147
-
148
- mediaSession.setRatingType(ratingType)
149
- mediaSessionConnector.setRatingCallback(object : MediaSessionConnector.RatingCallback {
150
- override fun onCommand(
151
- player: Player,
152
- command: String,
153
- extras: Bundle?,
154
- cb: ResultReceiver?
155
- ): Boolean {
156
- return true
157
- }
158
-
159
- override fun onSetRating(player: Player, rating: RatingCompat) {
160
- playerEventHolder.updateOnPlayerActionTriggeredExternally(
161
- MediaSessionCallback.RATING(
162
- rating,
163
- null
164
- )
165
- )
166
- }
167
-
168
- override fun onSetRating(player: Player, rating: RatingCompat, extras: Bundle?) {
169
- playerEventHolder.updateOnPlayerActionTriggeredExternally(
170
- MediaSessionCallback.RATING(
171
- rating,
172
- extras
173
- )
174
- )
175
- }
176
- })
177
- }
178
-
179
- val event = EventHolder(notificationEventHolder, playerEventHolder)
180
-
181
- private var focus: AudioFocusRequestCompat? = null
182
- private var hasAudioFocus = false
183
- private var wasDucking = false
184
-
185
- protected val mediaSession = MediaSessionCompat(context, "KotlinAudioPlayer")
186
- protected val mediaSessionConnector = MediaSessionConnector(mediaSession)
187
-
188
- init {
189
- if (cacheConfig != null) {
190
- cache = PlayerCache.getInstance(context, cacheConfig)
191
- }
192
-
193
- exoPlayer = ExoPlayer.Builder(context)
194
- .setHandleAudioBecomingNoisy(playerConfig.handleAudioBecomingNoisy)
195
- .apply {
196
- if (bufferConfig != null) setLoadControl(setupBuffer(bufferConfig))
197
- }
198
- .build()
199
-
200
- exoPlayer.pauseAtEndOfMediaItems = true
201
-
202
- mediaSession.isActive = true
203
-
204
- val playerToUse =
205
- if (playerConfig.interceptPlayerActionsTriggeredExternally) createForwardingPlayer() else exoPlayer
206
-
207
- mediaSession.setCallback(object: MediaSessionCompat.Callback() {
208
- // HACK: special for podverse that intercepts SkipNext and SkipPrevious and handles accordingly
209
- // as podverse does not enable these playback capabilities
210
- override fun onMediaButtonEvent(mediaButtonEvent: Intent?): Boolean {
211
- if (mediaButtonEvent?.action == Intent.ACTION_MEDIA_BUTTON) {
212
- val event = mediaButtonEvent.getParcelableExtra<KeyEvent>(Intent.EXTRA_KEY_EVENT)
213
- if (event != null && event.action == KeyEvent.ACTION_DOWN) {
214
- when (event.keyCode) {
215
- KeyEvent.KEYCODE_MEDIA_NEXT -> {
216
- this.onSkipToNext()
217
- return true
218
- }
219
- KeyEvent.KEYCODE_MEDIA_PREVIOUS -> {
220
- this.onSkipToPrevious()
221
- return true
222
- }
223
- KeyEvent.KEYCODE_MEDIA_FAST_FORWARD, KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD, KeyEvent.KEYCODE_MEDIA_STEP_FORWARD -> {
224
- this.onFastForward()
225
- }
226
- KeyEvent.KEYCODE_MEDIA_REWIND, KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD, KeyEvent.KEYCODE_MEDIA_STEP_BACKWARD -> {
227
- this.onRewind()
228
- }
229
- else -> {
230
- }
231
- }
232
- }
233
- }
234
- return super.onMediaButtonEvent(mediaButtonEvent)
235
- }
236
- override fun onPlayFromMediaId(mediaId: String?, extras: Bundle?) {
237
- Timber.tag("GVATest").d("playing from mediaID: %s", mediaId)
238
- mediaSessionCallback.handlePlayFromMediaId(mediaId, extras)
239
- }
240
-
241
- override fun onPlayFromSearch(query: String?, extras: Bundle?) {
242
- super.onPlayFromSearch(query, extras)
243
- Timber.tag("GVATest").d("playing from query: %s", query)
244
- mediaSessionCallback.handlePlayFromSearch(query, extras)
245
- }
246
- // https://stackoverflow.com/questions/53837783/selecting-media-item-in-android-auto-queue-does-nothing
247
- override fun onSkipToQueueItem(id: Long) {
248
- mediaSessionCallback.handleSkipToQueueItem(id)
249
- }
250
- // TODO: what's missing?
251
- override fun onPlay() {
252
- playerToUse.play()
253
- }
254
-
255
- override fun onPause() {
256
- playerToUse.pause()
257
- }
258
-
259
- override fun onSkipToNext() {
260
- playerToUse.seekToNext()
261
- }
262
-
263
- override fun onSkipToPrevious() {
264
- playerToUse.seekToPrevious()
265
- }
266
-
267
- override fun onFastForward() {
268
- playerToUse.seekForward()
269
- }
270
-
271
- override fun onRewind() {
272
- playerToUse.seekBack()
273
- }
274
-
275
- override fun onStop() {
276
- playerToUse.stop()
277
- }
278
-
279
- override fun onSeekTo(pos: Long) {
280
- playerToUse.seekTo(pos)
281
- }
282
-
283
- override fun onSetRating(rating: RatingCompat?) {
284
- if (rating == null) return
285
- playerEventHolder.updateOnPlayerActionTriggeredExternally(
286
- MediaSessionCallback.RATING(
287
- rating, null
288
- )
289
- )
290
- }
291
-
292
- override fun onSetRating(rating: RatingCompat?, extras: Bundle?) {
293
- if (rating == null) return
294
- playerEventHolder.updateOnPlayerActionTriggeredExternally(
295
- MediaSessionCallback.RATING(
296
- rating,
297
- extras
298
- )
299
- )
300
- }
301
- // see NotificationManager.kt. onRewind, onFastForward and onStop do not trigger.
302
- override fun onCustomAction(action: String?, extras: Bundle?) {
303
- when (action) {
304
- NotificationManager.REWIND -> playerToUse.seekBack()
305
- NotificationManager.FORWARD -> playerToUse.seekForward()
306
- NotificationManager.STOP-> playerToUse.stop()
307
- else -> playerEventHolder.updateOnPlayerActionTriggeredExternally(
308
- MediaSessionCallback.CUSTOMACTION(
309
- action ?: "NO_ACTION_CODE_PROVIDED"
310
- )
311
- )
312
- }
313
- }
314
- })
315
-
316
- notificationManager = NotificationManager(
317
- context,
318
- playerToUse,
319
- mediaSession,
320
- mediaSessionConnector,
321
- notificationEventHolder,
322
- playerEventHolder
323
- )
324
-
325
- exoPlayer.addListener(PlayerListener())
326
-
327
- scope.launch {
328
- // Whether ExoPlayer should manage audio focus for us automatically
329
- // see https://medium.com/google-exoplayer/easy-audio-focus-with-exoplayer-a2dcbbe4640e
330
- val audioAttributes = AudioAttributes.Builder()
331
- .setUsage(C.USAGE_MEDIA)
332
- .setContentType(
333
- when (playerConfig.audioContentType) {
334
- AudioContentType.MUSIC -> C.AUDIO_CONTENT_TYPE_MUSIC
335
- AudioContentType.SPEECH -> C.AUDIO_CONTENT_TYPE_SPEECH
336
- AudioContentType.SONIFICATION -> C.AUDIO_CONTENT_TYPE_SONIFICATION
337
- AudioContentType.MOVIE -> C.AUDIO_CONTENT_TYPE_MOVIE
338
- AudioContentType.UNKNOWN -> C.AUDIO_CONTENT_TYPE_UNKNOWN
339
- }
340
- )
341
- .build();
342
- exoPlayer.setAudioAttributes(audioAttributes, playerConfig.handleAudioFocus);
343
- mediaSessionConnector.setPlayer(playerToUse)
344
- mediaSessionConnector.setMediaMetadataProvider {
345
- notificationManager.getMediaMetadataCompat()
346
- }
347
- }
348
-
349
- playerEventHolder.updateAudioPlayerState(AudioPlayerState.IDLE)
350
- }
351
-
352
- public fun getMediaSessionToken(): MediaSessionCompat.Token {
353
- return mediaSession.sessionToken
354
- }
355
-
356
- private fun createForwardingPlayer(): ForwardingPlayer {
357
- return object : ForwardingPlayer(exoPlayer) {
358
- override fun play() {
359
- playerEventHolder.updateOnPlayerActionTriggeredExternally(MediaSessionCallback.PLAY)
360
- }
361
-
362
- override fun pause() {
363
- playerEventHolder.updateOnPlayerActionTriggeredExternally(MediaSessionCallback.PAUSE)
364
- }
365
-
366
- override fun seekToNext() {
367
- playerEventHolder.updateOnPlayerActionTriggeredExternally(MediaSessionCallback.NEXT)
368
- }
369
-
370
- override fun seekToPrevious() {
371
- playerEventHolder.updateOnPlayerActionTriggeredExternally(MediaSessionCallback.PREVIOUS)
372
- }
373
-
374
- override fun seekForward() {
375
- playerEventHolder.updateOnPlayerActionTriggeredExternally(MediaSessionCallback.FORWARD)
376
- }
377
-
378
- override fun seekBack() {
379
- playerEventHolder.updateOnPlayerActionTriggeredExternally(MediaSessionCallback.REWIND)
380
- }
381
-
382
- override fun stop() {
383
- playerEventHolder.updateOnPlayerActionTriggeredExternally(MediaSessionCallback.STOP)
384
- }
385
-
386
- override fun seekTo(mediaItemIndex: Int, positionMs: Long) {
387
- playerEventHolder.updateOnPlayerActionTriggeredExternally(
388
- MediaSessionCallback.SEEK(
389
- positionMs
390
- )
391
- )
392
- }
393
-
394
- override fun seekTo(positionMs: Long) {
395
- playerEventHolder.updateOnPlayerActionTriggeredExternally(
396
- MediaSessionCallback.SEEK(
397
- positionMs
398
- )
399
- )
400
- }
401
- }
402
- }
403
-
404
- internal fun updateNotificationMetadataIfAutomatic(overrideAudioItem: AudioItem? = null) {
405
- if (automaticallyUpdateNotificationMetadata) {
406
- notificationManager.notificationMetadata = NotificationMetadata(
407
- overrideAudioItem?.title ?: currentItem?.title,
408
- overrideAudioItem?.artist ?: currentItem?.artist,
409
- overrideAudioItem?.artwork ?: currentItem?.artwork,
410
- overrideAudioItem?.duration ?: currentItem?.duration
411
-
412
- )
413
- }
414
- }
415
-
416
- private fun setupBuffer(bufferConfig: BufferConfig): DefaultLoadControl {
417
- bufferConfig.apply {
418
- val multiplier =
419
- DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS / DEFAULT_BUFFER_FOR_PLAYBACK_MS
420
- val minBuffer =
421
- if (minBuffer != null && minBuffer != 0) minBuffer else DEFAULT_MIN_BUFFER_MS
422
- val maxBuffer =
423
- if (maxBuffer != null && maxBuffer != 0) maxBuffer else DEFAULT_MAX_BUFFER_MS
424
- val playBuffer =
425
- if (playBuffer != null && playBuffer != 0) playBuffer else DEFAULT_BUFFER_FOR_PLAYBACK_MS
426
- val backBuffer =
427
- if (backBuffer != null && backBuffer != 0) backBuffer else DEFAULT_BACK_BUFFER_DURATION_MS
428
-
429
- return Builder()
430
- .setBufferDurationsMs(minBuffer, maxBuffer, playBuffer, playBuffer * multiplier)
431
- .setBackBuffer(backBuffer, false)
432
- .build()
433
- }
434
- }
435
-
436
- /**
437
- * Will replace the current item with a new one and load it into the player.
438
- * @param item The [AudioItem] to replace the current one.
439
- * @param playWhenReady Whether playback starts automatically.
440
- */
441
- open fun load(item: AudioItem, playWhenReady: Boolean = true) {
442
- exoPlayer.playWhenReady = playWhenReady
443
- load(item)
444
- }
445
-
446
- /**
447
- * Will replace the current item with a new one and load it into the player.
448
- * @param item The [AudioItem] to replace the current one.
449
- */
450
- open fun load(item: AudioItem) {
451
- val mediaSource = getMediaSourceFromAudioItem(item)
452
- exoPlayer.addMediaSource(mediaSource)
453
- exoPlayer.prepare()
454
- }
455
-
456
- fun togglePlaying() {
457
- if (exoPlayer.isPlaying) {
458
- pause()
459
- } else {
460
- play()
461
- }
462
- }
463
-
464
- var skipSilence: Boolean
465
- get() = exoPlayer.skipSilenceEnabled
466
- set(value) {
467
- exoPlayer.skipSilenceEnabled = value;
468
- }
469
-
470
- fun play() {
471
- exoPlayer.play()
472
- Log.d("playTest", "playTest play")
473
- if (currentItem != null) {
474
- exoPlayer.prepare()
475
- }
476
- }
477
-
478
- fun prepare() {
479
- Log.d("playTest", "playTest prepare")
480
- if (currentItem != null) {
481
- exoPlayer.prepare()
482
- }
483
- }
484
-
485
- fun pause() {
486
- Log.d("playTest", "playTest pause")
487
- exoPlayer.pause()
488
- }
489
-
490
- /**
491
- * Stops playback, without clearing the active item. Calling this method will cause the playback
492
- * state to transition to AudioPlayerState.IDLE and the player will release the loaded media and
493
- * resources required for playback.
494
- */
495
- open fun stop() {
496
- playerState = AudioPlayerState.STOPPED
497
- exoPlayer.playWhenReady = false
498
- exoPlayer.stop()
499
- }
500
-
501
- open fun clear() {
502
- exoPlayer.clearMediaItems()
503
- }
504
-
505
- /**
506
- * Pause playback whenever an item plays to its end.
507
- */
508
- fun setPauseAtEndOfItem(pause: Boolean) {
509
- exoPlayer.setPauseAtEndOfMediaItems(pause)
510
- }
511
-
512
- /**
513
- * Stops and destroys the player. Only call this when you are finished using the player, otherwise use [pause].
514
- */
515
- @CallSuper
516
- open fun destroy() {
517
- abandonAudioFocusIfHeld()
518
- stop()
519
- notificationManager.destroy()
520
- exoPlayer.release()
521
- cache?.release()
522
- cache = null
523
- mediaSession.isActive = false
524
- mediaSession.release()
525
- }
526
-
527
- open fun seek(duration: Long, unit: TimeUnit) {
528
- Log.d("playTest", "playTest seek")
529
- val positionMs = TimeUnit.MILLISECONDS.convert(duration, unit)
530
- exoPlayer.seekTo(positionMs)
531
- }
532
-
533
- open fun seekBy(offset: Long, unit: TimeUnit) {
534
- val positionMs = exoPlayer.currentPosition + TimeUnit.MILLISECONDS.convert(offset, unit)
535
- exoPlayer.seekTo(positionMs)
536
- }
537
-
538
- private fun getMediaItemFromAudioItem(audioItem: AudioItem): MediaItem {
539
- return MediaItem.Builder().setUri(audioItem.audioUrl).setTag(AudioItemHolder(audioItem)).build()
540
- }
541
-
542
- protected fun getMediaSourceFromAudioItem(audioItem: AudioItem): MediaSource {
543
- val factory: DataSource.Factory
544
- val uri = Uri.parse(audioItem.audioUrl)
545
- val mediaItem = getMediaItemFromAudioItem(audioItem)
546
-
547
- Log.d("pcTest", "pcTest getMediaSource 1")
548
-
549
- val userAgent =
550
- if (audioItem.options == null || audioItem.options!!.userAgent.isNullOrBlank()) {
551
- Util.getUserAgent(context, APPLICATION_NAME)
552
- } else {
553
- audioItem.options!!.userAgent
554
- }
555
-
556
- Log.d("pcTest", "pcTest getMediaSource 2")
557
-
558
- factory = when {
559
- audioItem.options?.resourceId != null -> {
560
- Log.d("pcTest", "pcTest getMediaSource 2 1")
561
- val raw = RawResourceDataSource(context)
562
- Log.d("pcTest", "pcTest getMediaSource 2 1 uri: " + uri)
563
- raw.open(DataSpec(uri))
564
- Log.d("pcTest", "pcTest getMediaSource 2 2")
565
- DataSource.Factory { raw }
566
- }
567
- isUriLocal(uri) -> {
568
- Log.d("pcTest", "pcTest getMediaSource 2 3")
569
- DefaultDataSourceFactory(context, userAgent)
570
- }
571
- else -> {
572
- val tempFactory = DefaultHttpDataSource.Factory().apply {
573
- Log.d("pcTest", "pcTest getMediaSource 3")
574
- setUserAgent(userAgent)
575
- setAllowCrossProtocolRedirects(true)
576
- Log.d("pcTest", "pcTest getMediaSource 4")
577
-
578
- audioItem.options?.headers?.let {
579
- setDefaultRequestProperties(it.toMap())
580
- }
581
- Log.d("pcTest", "pcTest getMediaSource 5")
582
- }
583
-
584
- enableCaching(tempFactory)
585
- }
586
- }
587
-
588
- Log.d("pcTest", "pcTest getMediaSource 6")
589
-
590
- return when (audioItem.type) {
591
- MediaType.DASH -> createDashSource(mediaItem, factory)
592
- MediaType.HLS -> createHlsSource(mediaItem, factory)
593
- MediaType.SMOOTH_STREAMING -> createSsSource(mediaItem, factory)
594
- else -> createProgressiveSource(mediaItem, factory)
595
- }
596
- }
597
-
598
- private fun createDashSource(mediaItem: MediaItem, factory: DataSource.Factory?): MediaSource {
599
- return DashMediaSource.Factory(DefaultDashChunkSource.Factory(factory!!), factory)
600
- .createMediaSource(mediaItem)
601
- }
602
-
603
- private fun createHlsSource(mediaItem: MediaItem, factory: DataSource.Factory?): MediaSource {
604
- return HlsMediaSource.Factory(factory!!)
605
- .createMediaSource(mediaItem)
606
- }
607
-
608
- private fun createSsSource(mediaItem: MediaItem, factory: DataSource.Factory?): MediaSource {
609
- return SsMediaSource.Factory(DefaultSsChunkSource.Factory(factory!!), factory)
610
- .createMediaSource(mediaItem)
611
- }
612
-
613
- private fun createProgressiveSource(
614
- mediaItem: MediaItem,
615
- factory: DataSource.Factory
616
- ): ProgressiveMediaSource {
617
- return ProgressiveMediaSource.Factory(
618
- factory, DefaultExtractorsFactory()
619
- .setConstantBitrateSeekingEnabled(true)
620
- )
621
- .createMediaSource(mediaItem)
622
- }
623
-
624
- private fun enableCaching(factory: DataSource.Factory): DataSource.Factory {
625
- return if (cache == null || cacheConfig == null || (cacheConfig.maxCacheSize ?: 0) <= 0) {
626
- factory
627
- } else {
628
- CacheDataSource.Factory().apply {
629
- setCache(this@BaseAudioPlayer.cache!!)
630
- setUpstreamDataSourceFactory(factory)
631
- setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR)
632
- }
633
- }
634
- }
635
-
636
- private fun requestAudioFocus() {
637
- if (hasAudioFocus) return
638
- Timber.d("Requesting audio focus...")
639
-
640
- val manager = ContextCompat.getSystemService(context, AudioManager::class.java)
641
-
642
- focus = AudioFocusRequestCompat.Builder(AUDIOFOCUS_GAIN)
643
- .setOnAudioFocusChangeListener(this)
644
- .setAudioAttributes(
645
- AudioAttributesCompat.Builder()
646
- .setUsage(USAGE_MEDIA)
647
- .setContentType(CONTENT_TYPE_MUSIC)
648
- .build()
649
- )
650
- .setWillPauseWhenDucked(playerOptions.alwaysPauseOnInterruption)
651
- .build()
652
-
653
- val result: Int = if (manager != null && focus != null) {
654
- AudioManagerCompat.requestAudioFocus(manager, focus!!)
655
- } else {
656
- AudioManager.AUDIOFOCUS_REQUEST_FAILED
657
- }
658
-
659
- hasAudioFocus = (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
660
- }
661
-
662
- private fun abandonAudioFocusIfHeld() {
663
- if (!hasAudioFocus) return
664
- Timber.d("Abandoning audio focus...")
665
-
666
- val manager = ContextCompat.getSystemService(context, AudioManager::class.java)
667
-
668
- val result: Int = if (manager != null && focus != null) {
669
- AudioManagerCompat.abandonAudioFocusRequest(manager, focus!!)
670
- } else {
671
- AudioManager.AUDIOFOCUS_REQUEST_FAILED
672
- }
673
-
674
- hasAudioFocus = (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
675
- }
676
-
677
- override fun onAudioFocusChange(focusChange: Int) {
678
- Timber.d("Audio focus changed")
679
- var isPermanent = focusChange == AUDIOFOCUS_LOSS
680
- var isPaused = when (focusChange) {
681
- AUDIOFOCUS_LOSS, AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> true
682
- AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> playerOptions.alwaysPauseOnInterruption
683
- else -> false
684
- }
685
- if (!playerConfig.handleAudioFocus) {
686
- if (isPermanent) abandonAudioFocusIfHeld()
687
-
688
- var isDucking = focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
689
- && !playerOptions.alwaysPauseOnInterruption
690
- if (isDucking) {
691
- volumeMultiplier = 0.5f
692
- wasDucking = true
693
- } else if (wasDucking) {
694
- volumeMultiplier = 1f
695
- wasDucking = false
696
- }
697
- }
698
-
699
- playerEventHolder.updateOnAudioFocusChanged(isPaused, isPermanent)
700
- }
701
-
702
- companion object {
703
- const val APPLICATION_NAME = "react-native-track-player"
704
- }
705
-
706
- inner class PlayerListener : Listener {
707
- /**
708
- * Called when there is metadata associated with the current playback time.
709
- */
710
- override fun onMetadata(metadata: Metadata) {
711
- PlaybackMetadata.fromId3Metadata(metadata)
712
- ?.let { playerEventHolder.updateOnPlaybackMetadata(it) }
713
- PlaybackMetadata.fromIcy(metadata)
714
- ?.let { playerEventHolder.updateOnPlaybackMetadata(it) }
715
- PlaybackMetadata.fromVorbisComment(metadata)
716
- ?.let { playerEventHolder.updateOnPlaybackMetadata(it) }
717
- PlaybackMetadata.fromQuickTime(metadata)
718
- ?.let { playerEventHolder.updateOnPlaybackMetadata(it) }
719
- }
720
-
721
-
722
- /**
723
- * A position discontinuity occurs when the playing period changes, the playback position
724
- * jumps within the period currently being played, or when the playing period has been
725
- * skipped or removed.
726
- */
727
- override fun onPositionDiscontinuity(
728
- oldPosition: Player.PositionInfo,
729
- newPosition: Player.PositionInfo,
730
- reason: Int
731
- ) {
732
- this@BaseAudioPlayer.oldPosition = oldPosition.positionMs
733
-
734
- when (reason) {
735
- Player.DISCONTINUITY_REASON_AUTO_TRANSITION -> playerEventHolder.updatePositionChangedReason(
736
- PositionChangedReason.AUTO(oldPosition.positionMs, newPosition.positionMs)
737
- )
738
- Player.DISCONTINUITY_REASON_SEEK -> playerEventHolder.updatePositionChangedReason(
739
- PositionChangedReason.SEEK(oldPosition.positionMs, newPosition.positionMs)
740
- )
741
- Player.DISCONTINUITY_REASON_SEEK_ADJUSTMENT -> playerEventHolder.updatePositionChangedReason(
742
- PositionChangedReason.SEEK_FAILED(
743
- oldPosition.positionMs,
744
- newPosition.positionMs
745
- )
746
- )
747
- Player.DISCONTINUITY_REASON_REMOVE -> playerEventHolder.updatePositionChangedReason(
748
- PositionChangedReason.QUEUE_CHANGED(
749
- oldPosition.positionMs,
750
- newPosition.positionMs
751
- )
752
- )
753
- Player.DISCONTINUITY_REASON_SKIP -> playerEventHolder.updatePositionChangedReason(
754
- PositionChangedReason.SKIPPED_PERIOD(
755
- oldPosition.positionMs,
756
- newPosition.positionMs
757
- )
758
- )
759
- Player.DISCONTINUITY_REASON_INTERNAL -> playerEventHolder.updatePositionChangedReason(
760
- PositionChangedReason.UNKNOWN(oldPosition.positionMs, newPosition.positionMs)
761
- )
762
- }
763
- }
764
-
765
- /**
766
- * Called when playback transitions to a media item or starts repeating a media item
767
- * according to the current repeat mode. Note that this callback is also called when the
768
- * playlist becomes non-empty or empty as a consequence of a playlist change.
769
- */
770
- override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
771
- when (reason) {
772
- Player.MEDIA_ITEM_TRANSITION_REASON_AUTO -> playerEventHolder.updateAudioItemTransition(
773
- AudioItemTransitionReason.AUTO(oldPosition)
774
- )
775
- Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED -> playerEventHolder.updateAudioItemTransition(
776
- AudioItemTransitionReason.QUEUE_CHANGED(oldPosition)
777
- )
778
- Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT -> playerEventHolder.updateAudioItemTransition(
779
- AudioItemTransitionReason.REPEAT(oldPosition)
780
- )
781
- Player.MEDIA_ITEM_TRANSITION_REASON_SEEK -> playerEventHolder.updateAudioItemTransition(
782
- AudioItemTransitionReason.SEEK_TO_ANOTHER_AUDIO_ITEM(oldPosition)
783
- )
784
- }
785
-
786
- updateNotificationMetadataIfAutomatic()
787
- }
788
-
789
- /**
790
- * Called when the value returned from Player.getPlayWhenReady() changes.
791
- */
792
- override fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int) {
793
- val pausedBecauseReachedEnd = reason == Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM
794
- playerEventHolder.updatePlayWhenReadyChange(PlayWhenReadyChangeData(playWhenReady, pausedBecauseReachedEnd))
795
- }
796
-
797
- /**
798
- * The generic onEvents callback provides access to the Player object and specifies the set
799
- * of events that occurred together. It’s always called after the callbacks that correspond
800
- * to the individual events.
801
- */
802
- override fun onEvents(player: Player, events: Player.Events) {
803
- // Note that it is necessary to set `playerState` in order, since each mutation fires an
804
- // event.
805
- for (i in 0 until events.size()) {
806
- when (events[i]) {
807
- Player.EVENT_PLAYBACK_STATE_CHANGED -> {
808
- var state = when (player.playbackState) {
809
- Player.STATE_BUFFERING -> AudioPlayerState.BUFFERING
810
- Player.STATE_READY -> AudioPlayerState.READY
811
- Player.STATE_IDLE ->
812
- // Avoid transitioning to idle from error or stopped
813
- if (
814
- playerState == AudioPlayerState.ERROR ||
815
- playerState == AudioPlayerState.STOPPED
816
- )
817
- null
818
- else
819
- AudioPlayerState.IDLE
820
- Player.STATE_ENDED -> AudioPlayerState.ENDED
821
- else -> null // noop
822
- }
823
- if (state != null && state != playerState) {
824
- playerState = state
825
- }
826
- }
827
- Player.EVENT_MEDIA_ITEM_TRANSITION -> {
828
- playbackError = null
829
- if (currentItem != null) {
830
- playerState = AudioPlayerState.LOADING
831
- if (isPlaying) {
832
- playerState = AudioPlayerState.READY
833
- playerState = AudioPlayerState.PLAYING
834
- }
835
- }
836
- }
837
- Player.EVENT_PLAY_WHEN_READY_CHANGED -> {
838
- if (!player.playWhenReady && playerState != AudioPlayerState.STOPPED) {
839
- playerState = AudioPlayerState.PAUSED
840
- }
841
- }
842
- Player.EVENT_IS_PLAYING_CHANGED -> {
843
- if (player.isPlaying) {
844
- playerState = AudioPlayerState.PLAYING
845
- }
846
- }
847
- }
848
- }
849
- }
850
-
851
- override fun onPlayerError(error: PlaybackException) {
852
- var _playbackError = PlaybackError(
853
- error.errorCodeName
854
- .replace("ERROR_CODE_", "")
855
- .lowercase(Locale.getDefault())
856
- .replace("_", "-"),
857
- error.message
858
- )
859
- playerEventHolder.updatePlaybackError(_playbackError)
860
- playbackError = _playbackError
861
- playerState = AudioPlayerState.ERROR
862
- }
863
- }
864
- }