react-native-mp3-player 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/LICENSE +205 -0
  2. package/README.md +88 -0
  3. package/android/build.gradle +114 -0
  4. package/android/proguard-rules.txt +0 -0
  5. package/android/src/main/AndroidManifest.xml +27 -0
  6. package/android/src/main/java/com/doublesymmetry/trackplayer/HeadlessJsMediaService.kt +199 -0
  7. package/android/src/main/java/com/doublesymmetry/trackplayer/TrackPlayer.kt +30 -0
  8. package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/AudioPlayerStateExt.kt +19 -0
  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/doublesymmetry/trackplayer/model/MetadataAdapter.kt +227 -0
  12. package/android/src/main/java/com/doublesymmetry/trackplayer/model/NowPlayingMetadata.kt +16 -0
  13. package/android/src/main/java/com/doublesymmetry/trackplayer/model/PlaybackMetadata.kt +203 -0
  14. package/android/src/main/java/com/doublesymmetry/trackplayer/model/State.kt +13 -0
  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/doublesymmetry/trackplayer/module/MusicEvents.kt +65 -0
  19. package/android/src/main/java/com/doublesymmetry/trackplayer/module/MusicModule.kt +775 -0
  20. package/android/src/main/java/com/doublesymmetry/trackplayer/service/MusicService.kt +1251 -0
  21. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/AppForegroundTracker.kt +35 -0
  22. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/BundleUtils.kt +147 -0
  23. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/CoilBitmapLoader.kt +64 -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/lovegaoshi/kotlinaudio/event/EventHolder.kt +30 -0
  27. package/android/src/main/java/com/lovegaoshi/kotlinaudio/event/PlayerEventHolder.kt +124 -0
  28. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioContentType.kt +10 -0
  29. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItem.kt +133 -0
  30. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItemTransitionReason.kt +33 -0
  31. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioPlayerState.kt +30 -0
  32. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/BufferConfig.kt +8 -0
  33. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CacheConfig.kt +17 -0
  34. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/Capability.kt +19 -0
  35. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CustomButton.kt +19 -0
  36. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/FocusChangeData.kt +3 -0
  37. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/MediaSessionCallback.kt +17 -0
  38. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayWhenReadyChangeData.kt +3 -0
  39. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlaybackEndedReason.kt +5 -0
  40. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlaybackError.kt +6 -0
  41. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerConfig.kt +36 -0
  42. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerOptions.kt +39 -0
  43. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PositionChangedReason.kt +39 -0
  44. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/RepeatMode.kt +16 -0
  45. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/WakeMode.kt +7 -0
  46. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/AudioPlayer.kt +689 -0
  47. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/ForwardingPlayer.java +1124 -0
  48. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/QueuedAudioPlayer.kt +295 -0
  49. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Buffer.kt +34 -0
  50. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Cache.kt +47 -0
  51. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/FocusManager.kt +59 -0
  52. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/MediaFactory.kt +165 -0
  53. package/android/src/main/java/com/lovegaoshi/kotlinaudio/service/MusicService.kt +127 -0
  54. package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/Utils.kt +113 -0
  55. package/android/src/main/res/drawable/baseline_repeat_24.xml +5 -0
  56. package/android/src/main/res/drawable/baseline_repeat_one_24.xml +5 -0
  57. package/android/src/main/res/drawable/forward.xml +5 -0
  58. package/android/src/main/res/drawable/heart_24px.xml +5 -0
  59. package/android/src/main/res/drawable/hearte_24px.xml +5 -0
  60. package/android/src/main/res/drawable/ifl_24px.xml +5 -0
  61. package/android/src/main/res/drawable/rewind.xml +5 -0
  62. package/android/src/main/res/drawable/shuffle_24px.xml +5 -0
  63. package/android/src/main/res/values/strings.xml +5 -0
  64. package/android/src/main/res/xml/automotive_app_desc.xml +3 -0
  65. package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/22AMillion.jpg +0 -0
  66. package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/Contents.json +21 -0
  67. package/ios/Example/SwiftAudio/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  68. package/ios/Example/SwiftAudio/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  69. package/ios/Example/SwiftAudio/Assets.xcassets/Contents.json +6 -0
  70. package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/Contents.json +21 -0
  71. package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/cover.jpg +0 -0
  72. package/ios/Example/SwiftAudio/AudioController.swift +46 -0
  73. package/ios/Example/SwiftAudio/Extensions.swift +22 -0
  74. package/ios/Example/SwiftAudio/PlayerView.swift +172 -0
  75. package/ios/Example/SwiftAudio/PlayerViewModel.swift +120 -0
  76. package/ios/Example/SwiftAudio/Preview Content/Preview Assets.xcassets/Contents.json +6 -0
  77. package/ios/Example/SwiftAudio/QueueView.swift +65 -0
  78. package/ios/Example/SwiftAudio/SwiftAudio.entitlements +12 -0
  79. package/ios/Example/SwiftAudio/SwiftAudioApp.swift +17 -0
  80. package/ios/Example/SwiftAudio.xcodeproj/project.pbxproj +412 -0
  81. package/ios/Example/SwiftAudio.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  82. package/ios/Example/SwiftAudio.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  83. package/ios/RNTrackPlayer/Models/Capabilities.swift +52 -0
  84. package/ios/RNTrackPlayer/Models/MediaURL.swift +38 -0
  85. package/ios/RNTrackPlayer/Models/MetadataAdapter.swift +147 -0
  86. package/ios/RNTrackPlayer/Models/PitchAlgorithms.swift +13 -0
  87. package/ios/RNTrackPlayer/Models/SessionCategories.swift +106 -0
  88. package/ios/RNTrackPlayer/Models/State.swift +26 -0
  89. package/ios/RNTrackPlayer/Models/Track.swift +140 -0
  90. package/ios/RNTrackPlayer/RNTrackPlayer.swift +941 -0
  91. package/ios/RNTrackPlayer/Support/RNTrackPlayer-Bridging-Header.h +7 -0
  92. package/ios/RNTrackPlayer/TrackPlayer.h +14 -0
  93. package/ios/RNTrackPlayer/TrackPlayer.mm +246 -0
  94. package/ios/RNTrackPlayer/Utils/EventType.swift +44 -0
  95. package/ios/RNTrackPlayer/Utils/Metadata.swift +60 -0
  96. package/ios/SwiftAudioEx/Package.swift +20 -0
  97. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapper.swift +521 -0
  98. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperDelegate.swift +27 -0
  99. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperProtocol.swift +69 -0
  100. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperState.swift +43 -0
  101. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioItem.swift +158 -0
  102. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayer.swift +459 -0
  103. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayerError.swift +26 -0
  104. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSession.swift +33 -0
  105. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSessionController.swift +135 -0
  106. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioTap.swift +99 -0
  107. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Event.swift +155 -0
  108. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/MediaItemProperty.swift +95 -0
  109. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoCenter.swift +17 -0
  110. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoController.swift +73 -0
  111. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoControllerProtocol.swift +26 -0
  112. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoKeyValue.swift +14 -0
  113. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoProperty.swift +234 -0
  114. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemNotificationObserver.swift +102 -0
  115. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemObserver.swift +136 -0
  116. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerObserver.swift +120 -0
  117. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerTimeObserver.swift +112 -0
  118. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueueManager.swift +356 -0
  119. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueuedAudioPlayer.swift +236 -0
  120. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommand.swift +170 -0
  121. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommandController.swift +206 -0
  122. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RepeatMode.swift +15 -0
  123. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/TimeEventFrequency.swift +26 -0
  124. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Utils/DispatchQueueType.swift +18 -0
  125. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/WaveformAudioTap.swift +159 -0
  126. package/lib/specs/NativeTrackPlayer.d.ts +129 -0
  127. package/lib/specs/NativeTrackPlayer.js +4 -0
  128. package/lib/src/constants/AndroidAudioContentType.d.ts +35 -0
  129. package/lib/src/constants/AndroidAudioContentType.js +36 -0
  130. package/lib/src/constants/AndroidAutoContentStyle.d.ts +10 -0
  131. package/lib/src/constants/AndroidAutoContentStyle.js +11 -0
  132. package/lib/src/constants/AppKilledPlaybackBehavior.d.ts +17 -0
  133. package/lib/src/constants/AppKilledPlaybackBehavior.js +18 -0
  134. package/lib/src/constants/Capability.d.ts +17 -0
  135. package/lib/src/constants/Capability.js +19 -0
  136. package/lib/src/constants/Event.d.ts +163 -0
  137. package/lib/src/constants/Event.js +164 -0
  138. package/lib/src/constants/IOSCategory.d.ts +36 -0
  139. package/lib/src/constants/IOSCategory.js +37 -0
  140. package/lib/src/constants/IOSCategoryMode.d.ts +47 -0
  141. package/lib/src/constants/IOSCategoryMode.js +48 -0
  142. package/lib/src/constants/IOSCategoryOptions.d.ts +44 -0
  143. package/lib/src/constants/IOSCategoryOptions.js +45 -0
  144. package/lib/src/constants/MediaItemPlayable.d.ts +4 -0
  145. package/lib/src/constants/MediaItemPlayable.js +5 -0
  146. package/lib/src/constants/PitchAlgorithm.d.ts +14 -0
  147. package/lib/src/constants/PitchAlgorithm.js +16 -0
  148. package/lib/src/constants/RatingType.d.ts +8 -0
  149. package/lib/src/constants/RatingType.js +10 -0
  150. package/lib/src/constants/RepeatMode.d.ts +8 -0
  151. package/lib/src/constants/RepeatMode.js +10 -0
  152. package/lib/src/constants/State.d.ts +34 -0
  153. package/lib/src/constants/State.js +35 -0
  154. package/lib/src/constants/TrackType.d.ts +6 -0
  155. package/lib/src/constants/TrackType.js +7 -0
  156. package/lib/src/constants/index.d.ts +14 -0
  157. package/lib/src/constants/index.js +14 -0
  158. package/lib/src/hooks/index.d.ts +6 -0
  159. package/lib/src/hooks/index.js +6 -0
  160. package/lib/src/hooks/useActiveTrack.d.ts +2 -0
  161. package/lib/src/hooks/useActiveTrack.js +28 -0
  162. package/lib/src/hooks/useAppIsInBackground.d.ts +1 -0
  163. package/lib/src/hooks/useAppIsInBackground.js +16 -0
  164. package/lib/src/hooks/useIsPlaying.d.ts +35 -0
  165. package/lib/src/hooks/useIsPlaying.js +50 -0
  166. package/lib/src/hooks/usePlayWhenReady.d.ts +1 -0
  167. package/lib/src/hooks/usePlayWhenReady.js +27 -0
  168. package/lib/src/hooks/usePlaybackState.d.ts +10 -0
  169. package/lib/src/hooks/usePlaybackState.js +35 -0
  170. package/lib/src/hooks/useProgress.d.ts +7 -0
  171. package/lib/src/hooks/useProgress.js +55 -0
  172. package/lib/src/hooks/useTrackPlayerEvents.d.ts +8 -0
  173. package/lib/src/hooks/useTrackPlayerEvents.js +30 -0
  174. package/lib/src/index.d.ts +5 -0
  175. package/lib/src/index.js +5 -0
  176. package/lib/src/interfaces/AndroidAutoBrowseTree.d.ts +5 -0
  177. package/lib/src/interfaces/AndroidAutoBrowseTree.js +1 -0
  178. package/lib/src/interfaces/AndroidOptions.d.ts +41 -0
  179. package/lib/src/interfaces/AndroidOptions.js +1 -0
  180. package/lib/src/interfaces/CustomButtons.d.ts +5 -0
  181. package/lib/src/interfaces/CustomButtons.js +1 -0
  182. package/lib/src/interfaces/FeedbackOptions.d.ts +6 -0
  183. package/lib/src/interfaces/FeedbackOptions.js +1 -0
  184. package/lib/src/interfaces/MediaItem.d.ts +18 -0
  185. package/lib/src/interfaces/MediaItem.js +1 -0
  186. package/lib/src/interfaces/MetadataOptions.d.ts +3 -0
  187. package/lib/src/interfaces/MetadataOptions.js +1 -0
  188. package/lib/src/interfaces/NowPlayingMetadata.d.ts +4 -0
  189. package/lib/src/interfaces/NowPlayingMetadata.js +1 -0
  190. package/lib/src/interfaces/PlaybackState.d.ts +8 -0
  191. package/lib/src/interfaces/PlaybackState.js +1 -0
  192. package/lib/src/interfaces/PlayerOptions.d.ts +127 -0
  193. package/lib/src/interfaces/PlayerOptions.js +1 -0
  194. package/lib/src/interfaces/Progress.d.ts +15 -0
  195. package/lib/src/interfaces/Progress.js +1 -0
  196. package/lib/src/interfaces/ResourceObject.d.ts +1 -0
  197. package/lib/src/interfaces/ResourceObject.js +1 -0
  198. package/lib/src/interfaces/ServiceHandler.d.ts +1 -0
  199. package/lib/src/interfaces/ServiceHandler.js +1 -0
  200. package/lib/src/interfaces/Track.d.ts +21 -0
  201. package/lib/src/interfaces/Track.js +1 -0
  202. package/lib/src/interfaces/TrackMetadataBase.d.ts +28 -0
  203. package/lib/src/interfaces/TrackMetadataBase.js +1 -0
  204. package/lib/src/interfaces/UpdateOptions.d.ts +52 -0
  205. package/lib/src/interfaces/UpdateOptions.js +1 -0
  206. package/lib/src/interfaces/events/AudioMetadataReceivedEvent.d.ts +33 -0
  207. package/lib/src/interfaces/events/AudioMetadataReceivedEvent.js +1 -0
  208. package/lib/src/interfaces/events/ControllerConnectedEvent.d.ts +8 -0
  209. package/lib/src/interfaces/events/ControllerConnectedEvent.js +1 -0
  210. package/lib/src/interfaces/events/EventPayloadByEvent.d.ts +73 -0
  211. package/lib/src/interfaces/events/EventPayloadByEvent.js +1 -0
  212. package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.d.ts +24 -0
  213. package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.js +1 -0
  214. package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.d.ts +4 -0
  215. package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.js +1 -0
  216. package/lib/src/interfaces/events/PlaybackErrorEvent.d.ts +6 -0
  217. package/lib/src/interfaces/events/PlaybackErrorEvent.js +1 -0
  218. package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.d.ts +16 -0
  219. package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.js +1 -0
  220. package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.d.ts +4 -0
  221. package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.js +1 -0
  222. package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.d.ts +4 -0
  223. package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.js +1 -0
  224. package/lib/src/interfaces/events/PlaybackQueueEndedEvent.d.ts +9 -0
  225. package/lib/src/interfaces/events/PlaybackQueueEndedEvent.js +1 -0
  226. package/lib/src/interfaces/events/PlaybackResumeEvent.d.ts +3 -0
  227. package/lib/src/interfaces/events/PlaybackResumeEvent.js +1 -0
  228. package/lib/src/interfaces/events/PlaybackTrackChangedEvent.d.ts +11 -0
  229. package/lib/src/interfaces/events/PlaybackTrackChangedEvent.js +1 -0
  230. package/lib/src/interfaces/events/PlayerErrorEvent.d.ts +6 -0
  231. package/lib/src/interfaces/events/PlayerErrorEvent.js +1 -0
  232. package/lib/src/interfaces/events/RemoteBrowseEvent.d.ts +4 -0
  233. package/lib/src/interfaces/events/RemoteBrowseEvent.js +1 -0
  234. package/lib/src/interfaces/events/RemoteCustomActionEvent.d.ts +7 -0
  235. package/lib/src/interfaces/events/RemoteCustomActionEvent.js +1 -0
  236. package/lib/src/interfaces/events/RemoteDuckEvent.d.ts +13 -0
  237. package/lib/src/interfaces/events/RemoteDuckEvent.js +1 -0
  238. package/lib/src/interfaces/events/RemoteJumpBackwardEvent.d.ts +8 -0
  239. package/lib/src/interfaces/events/RemoteJumpBackwardEvent.js +1 -0
  240. package/lib/src/interfaces/events/RemoteJumpForwardEvent.d.ts +8 -0
  241. package/lib/src/interfaces/events/RemoteJumpForwardEvent.js +1 -0
  242. package/lib/src/interfaces/events/RemotePlayIdEvent.d.ts +4 -0
  243. package/lib/src/interfaces/events/RemotePlayIdEvent.js +1 -0
  244. package/lib/src/interfaces/events/RemotePlaySearchEvent.d.ts +9 -0
  245. package/lib/src/interfaces/events/RemotePlaySearchEvent.js +1 -0
  246. package/lib/src/interfaces/events/RemoteSeekEvent.d.ts +4 -0
  247. package/lib/src/interfaces/events/RemoteSeekEvent.js +1 -0
  248. package/lib/src/interfaces/events/RemoteSetRatingEvent.d.ts +4 -0
  249. package/lib/src/interfaces/events/RemoteSetRatingEvent.js +1 -0
  250. package/lib/src/interfaces/events/RemoteSkipEvent.d.ts +3 -0
  251. package/lib/src/interfaces/events/RemoteSkipEvent.js +1 -0
  252. package/lib/src/interfaces/events/index.d.ts +18 -0
  253. package/lib/src/interfaces/events/index.js +18 -0
  254. package/lib/src/interfaces/index.d.ts +15 -0
  255. package/lib/src/interfaces/index.js +15 -0
  256. package/lib/src/resolveAssetSource.d.ts +2 -0
  257. package/lib/src/resolveAssetSource.js +3 -0
  258. package/lib/src/trackPlayer.d.ts +347 -0
  259. package/lib/src/trackPlayer.js +592 -0
  260. package/package.json +94 -0
  261. package/react-native-mp3-player.podspec +22 -0
  262. package/specs/NativeTrackPlayer.ts +148 -0
  263. package/src/constants/AndroidAudioContentType.ts +35 -0
  264. package/src/constants/AndroidAutoContentStyle.ts +10 -0
  265. package/src/constants/AppKilledPlaybackBehavior.ts +19 -0
  266. package/src/constants/Capability.ts +19 -0
  267. package/src/constants/Event.ts +164 -0
  268. package/src/constants/IOSCategory.ts +36 -0
  269. package/src/constants/IOSCategoryMode.ts +47 -0
  270. package/src/constants/IOSCategoryOptions.ts +44 -0
  271. package/src/constants/MediaItemPlayable.ts +4 -0
  272. package/src/constants/PitchAlgorithm.ts +16 -0
  273. package/src/constants/RatingType.ts +10 -0
  274. package/src/constants/RepeatMode.ts +10 -0
  275. package/src/constants/State.ts +34 -0
  276. package/src/constants/TrackType.ts +6 -0
  277. package/src/constants/index.ts +14 -0
  278. package/src/hooks/index.ts +6 -0
  279. package/src/hooks/useActiveTrack.ts +36 -0
  280. package/src/hooks/useAppIsInBackground.ts +20 -0
  281. package/src/hooks/useIsPlaying.ts +56 -0
  282. package/src/hooks/usePlayWhenReady.ts +37 -0
  283. package/src/hooks/usePlaybackState.ts +45 -0
  284. package/src/hooks/useProgress.ts +64 -0
  285. package/src/hooks/useTrackPlayerEvents.ts +48 -0
  286. package/src/index.ts +7 -0
  287. package/src/interfaces/AndroidAutoBrowseTree.ts +6 -0
  288. package/src/interfaces/AndroidOptions.ts +48 -0
  289. package/src/interfaces/CustomButtons.ts +6 -0
  290. package/src/interfaces/FeedbackOptions.ts +7 -0
  291. package/src/interfaces/MediaItem.ts +19 -0
  292. package/src/interfaces/MetadataOptions.ts +4 -0
  293. package/src/interfaces/NowPlayingMetadata.ts +5 -0
  294. package/src/interfaces/PlaybackState.ts +11 -0
  295. package/src/interfaces/PlayerOptions.ts +133 -0
  296. package/src/interfaces/Progress.ts +15 -0
  297. package/src/interfaces/ResourceObject.ts +1 -0
  298. package/src/interfaces/ServiceHandler.ts +1 -0
  299. package/src/interfaces/Track.ts +23 -0
  300. package/src/interfaces/TrackMetadataBase.ts +29 -0
  301. package/src/interfaces/UpdateOptions.ts +59 -0
  302. package/src/interfaces/events/AudioMetadataReceivedEvent.ts +37 -0
  303. package/src/interfaces/events/ControllerConnectedEvent.ts +9 -0
  304. package/src/interfaces/events/EventPayloadByEvent.ts +76 -0
  305. package/src/interfaces/events/PlaybackActiveTrackChangedEvent.ts +29 -0
  306. package/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.ts +4 -0
  307. package/src/interfaces/events/PlaybackErrorEvent.ts +6 -0
  308. package/src/interfaces/events/PlaybackMetadataReceivedEvent.ts +16 -0
  309. package/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.ts +4 -0
  310. package/src/interfaces/events/PlaybackProgressUpdatedEvent.ts +5 -0
  311. package/src/interfaces/events/PlaybackQueueEndedEvent.ts +9 -0
  312. package/src/interfaces/events/PlaybackResumeEvent.ts +5 -0
  313. package/src/interfaces/events/PlaybackTrackChangedEvent.ts +11 -0
  314. package/src/interfaces/events/PlayerErrorEvent.ts +6 -0
  315. package/src/interfaces/events/RemoteBrowseEvent.ts +4 -0
  316. package/src/interfaces/events/RemoteCustomActionEvent.ts +7 -0
  317. package/src/interfaces/events/RemoteDuckEvent.ts +13 -0
  318. package/src/interfaces/events/RemoteJumpBackwardEvent.ts +8 -0
  319. package/src/interfaces/events/RemoteJumpForwardEvent.ts +8 -0
  320. package/src/interfaces/events/RemotePlayIdEvent.ts +4 -0
  321. package/src/interfaces/events/RemotePlaySearchEvent.ts +21 -0
  322. package/src/interfaces/events/RemoteSeekEvent.ts +4 -0
  323. package/src/interfaces/events/RemoteSetRatingEvent.ts +5 -0
  324. package/src/interfaces/events/RemoteSkipEvent.ts +3 -0
  325. package/src/interfaces/events/index.ts +18 -0
  326. package/src/interfaces/index.ts +15 -0
  327. package/src/resolveAssetSource.ts +3 -0
  328. package/src/trackPlayer.ts +768 -0
@@ -0,0 +1,521 @@
1
+ //
2
+ // AVPlayerWrapper.swift
3
+ // SwiftAudio
4
+ //
5
+ // Created by Jørgen Henrichsen on 06/03/2018.
6
+ // Copyright © 2018 Jørgen Henrichsen. All rights reserved.
7
+ //
8
+
9
+ import Foundation
10
+ import AVFoundation
11
+ import MediaPlayer
12
+
13
+ public enum PlaybackEndedReason: String {
14
+ case playedUntilEnd
15
+ case playerStopped
16
+ case skippedToNext
17
+ case skippedToPrevious
18
+ case jumpedToIndex
19
+ case cleared
20
+ case failed
21
+ }
22
+
23
+ class AVPlayerWrapper: AVPlayerWrapperProtocol {
24
+ // MARK: - Properties
25
+
26
+ fileprivate var avPlayer = AVPlayer()
27
+ internal var audioTap: AudioTap? = nil
28
+ private let playerObserver = AVPlayerObserver()
29
+ internal let playerTimeObserver: AVPlayerTimeObserver
30
+ private let playerItemNotificationObserver = AVPlayerItemNotificationObserver()
31
+ private let playerItemObserver = AVPlayerItemObserver()
32
+ fileprivate var timeToSeekToAfterLoading: TimeInterval?
33
+ fileprivate var asset: AVAsset? = nil
34
+ fileprivate var item: AVPlayerItem? = nil
35
+ fileprivate var url: URL? = nil
36
+ fileprivate var urlOptions: [String: Any]? = nil
37
+ fileprivate let stateQueue = DispatchQueue(
38
+ label: "AVPlayerWrapper.stateQueue",
39
+ attributes: .concurrent
40
+ )
41
+
42
+ public init() {
43
+ playerTimeObserver = AVPlayerTimeObserver(periodicObserverTimeInterval: timeEventFrequency.getTime())
44
+
45
+ playerObserver.delegate = self
46
+ playerTimeObserver.delegate = self
47
+ playerItemNotificationObserver.delegate = self
48
+ playerItemObserver.delegate = self
49
+
50
+ setupAVPlayer();
51
+ }
52
+
53
+ // MARK: - AVPlayerWrapperProtocol
54
+
55
+ fileprivate(set) var playbackError: AudioPlayerError.PlaybackError? = nil
56
+
57
+ var _state: AVPlayerWrapperState = AVPlayerWrapperState.idle
58
+ var state: AVPlayerWrapperState {
59
+ get {
60
+ var state: AVPlayerWrapperState!
61
+ stateQueue.sync {
62
+ state = _state
63
+ }
64
+
65
+ return state
66
+ }
67
+ set {
68
+ stateQueue.async(flags: .barrier) { [weak self] in
69
+ guard let self = self else { return }
70
+ let currentState = self._state
71
+ if (currentState != newValue) {
72
+ self._state = newValue
73
+ self.delegate?.AVWrapper(didChangeState: newValue)
74
+ }
75
+ }
76
+ }
77
+ }
78
+
79
+ fileprivate(set) var lastPlayerTimeControlStatus: AVPlayer.TimeControlStatus = AVPlayer.TimeControlStatus.paused
80
+
81
+ /**
82
+ Whether AVPlayer should start playing automatically when the item is ready.
83
+ */
84
+ public var playWhenReady: Bool = false {
85
+ didSet {
86
+ if (playWhenReady == true && (state == .failed || state == .stopped)) {
87
+ reload(startFromCurrentTime: state == .failed)
88
+ }
89
+
90
+ applyAVPlayerRate()
91
+
92
+ if oldValue != playWhenReady {
93
+ delegate?.AVWrapper(didChangePlayWhenReady: playWhenReady)
94
+ }
95
+ }
96
+ }
97
+
98
+ var currentItem: AVPlayerItem? {
99
+ avPlayer.currentItem
100
+ }
101
+
102
+ var playbackActive: Bool {
103
+ switch state {
104
+ case .idle, .stopped, .ended, .failed:
105
+ return false
106
+ default: return true
107
+ }
108
+ }
109
+
110
+ var currentTime: TimeInterval {
111
+ let seconds = avPlayer.currentTime().seconds
112
+ return seconds.isNaN ? 0 : seconds
113
+ }
114
+
115
+ var duration: TimeInterval {
116
+ if let seconds = currentItem?.asset.duration.seconds, !seconds.isNaN {
117
+ return seconds
118
+ }
119
+ else if let seconds = currentItem?.duration.seconds, !seconds.isNaN {
120
+ return seconds
121
+ }
122
+ else if let seconds = currentItem?.seekableTimeRanges.last?.timeRangeValue.duration.seconds,
123
+ !seconds.isNaN {
124
+ return seconds
125
+ }
126
+ return 0.0
127
+ }
128
+
129
+ var bufferedPosition: TimeInterval {
130
+ currentItem?.loadedTimeRanges.last?.timeRangeValue.end.seconds ?? 0
131
+ }
132
+
133
+ var reasonForWaitingToPlay: AVPlayer.WaitingReason? {
134
+ avPlayer.reasonForWaitingToPlay
135
+ }
136
+
137
+ private var _rate: Float = 1.0;
138
+ var rate: Float {
139
+ get { _rate }
140
+ set {
141
+ _rate = newValue
142
+ applyAVPlayerRate()
143
+ }
144
+ }
145
+
146
+ weak var delegate: AVPlayerWrapperDelegate? = nil
147
+
148
+ var bufferDuration: TimeInterval = 0
149
+
150
+ var timeEventFrequency: TimeEventFrequency = .everySecond {
151
+ didSet {
152
+ playerTimeObserver.periodicObserverTimeInterval = timeEventFrequency.getTime()
153
+ }
154
+ }
155
+
156
+ var volume: Float {
157
+ get { avPlayer.volume }
158
+ set { avPlayer.volume = newValue }
159
+ }
160
+
161
+ var isMuted: Bool {
162
+ get { avPlayer.isMuted }
163
+ set { avPlayer.isMuted = newValue }
164
+ }
165
+
166
+ var automaticallyWaitsToMinimizeStalling: Bool {
167
+ get { avPlayer.automaticallyWaitsToMinimizeStalling }
168
+ set { avPlayer.automaticallyWaitsToMinimizeStalling = newValue }
169
+ }
170
+
171
+ func play() {
172
+ playWhenReady = true
173
+ }
174
+
175
+ func pause() {
176
+ playWhenReady = false
177
+ }
178
+
179
+ func togglePlaying() {
180
+ switch avPlayer.timeControlStatus {
181
+ case .playing, .waitingToPlayAtSpecifiedRate:
182
+ pause()
183
+ case .paused:
184
+ play()
185
+ @unknown default:
186
+ fatalError("Unknown AVPlayer.timeControlStatus")
187
+ }
188
+ }
189
+
190
+ func stop() {
191
+ state = .stopped
192
+ clearCurrentItem()
193
+ playWhenReady = false
194
+ }
195
+
196
+ func seek(to seconds: TimeInterval) {
197
+ // if the player is loading then we need to defer seeking until it's ready.
198
+ if (avPlayer.currentItem == nil) {
199
+ timeToSeekToAfterLoading = seconds
200
+ } else {
201
+ let time = CMTimeMakeWithSeconds(seconds, preferredTimescale: 1000)
202
+ avPlayer.seek(to: time, toleranceBefore: CMTime.zero, toleranceAfter: CMTime.zero) { (finished) in
203
+ self.delegate?.AVWrapper(seekTo: Double(seconds), didFinish: finished)
204
+ }
205
+ }
206
+ }
207
+
208
+ func seek(by seconds: TimeInterval) {
209
+ if let currentItem = avPlayer.currentItem {
210
+ let time = currentItem.currentTime().seconds + seconds
211
+ avPlayer.seek(
212
+ to: CMTimeMakeWithSeconds(time, preferredTimescale: 1000)
213
+ ) { (finished) in
214
+ self.delegate?.AVWrapper(seekTo: Double(time), didFinish: finished)
215
+ }
216
+ } else {
217
+ if let timeToSeekToAfterLoading = timeToSeekToAfterLoading {
218
+ self.timeToSeekToAfterLoading = timeToSeekToAfterLoading + seconds
219
+ } else {
220
+ timeToSeekToAfterLoading = seconds
221
+ }
222
+ }
223
+ }
224
+
225
+ private func playbackFailed(error: AudioPlayerError.PlaybackError) {
226
+ state = .failed
227
+ self.playbackError = error
228
+ self.delegate?.AVWrapper(failedWithError: error)
229
+ }
230
+
231
+ func load() {
232
+ if (state == .failed) {
233
+ recreateAVPlayer()
234
+ } else {
235
+ clearCurrentItem()
236
+ }
237
+ if let url = url {
238
+ let pendingAsset = AVURLAsset(url: url, options: urlOptions)
239
+ asset = pendingAsset
240
+ state = .loading
241
+
242
+ // Load metadata keys asynchronously and separate from playable, to allow that to execute as quickly as it can
243
+ let metdataKeys = ["commonMetadata", "availableChapterLocales", "availableMetadataFormats"]
244
+ pendingAsset.loadValuesAsynchronously(forKeys: metdataKeys, completionHandler: { [weak self] in
245
+ guard let self = self else { return }
246
+ if (pendingAsset != self.asset) { return; }
247
+
248
+ let commonData = pendingAsset.commonMetadata
249
+ if (!commonData.isEmpty) {
250
+ self.delegate?.AVWrapper(didReceiveCommonMetadata: commonData)
251
+ }
252
+
253
+ if pendingAsset.availableChapterLocales.count > 0 {
254
+ for locale in pendingAsset.availableChapterLocales {
255
+ let chapters = pendingAsset.chapterMetadataGroups(withTitleLocale: locale, containingItemsWithCommonKeys: nil)
256
+ self.delegate?.AVWrapper(didReceiveChapterMetadata: chapters)
257
+ }
258
+ } else {
259
+ for format in pendingAsset.availableMetadataFormats {
260
+ let timeRange = CMTimeRange(start: CMTime(seconds: 0, preferredTimescale: 1000), end: pendingAsset.duration)
261
+ let group = AVTimedMetadataGroup(items: pendingAsset.metadata(forFormat: format), timeRange: timeRange)
262
+ self.delegate?.AVWrapper(didReceiveTimedMetadata: [group])
263
+ }
264
+ }
265
+ })
266
+
267
+ // Load playable portion of the track and commence when ready
268
+ let playableKeys = ["playable"]
269
+ pendingAsset.loadValuesAsynchronously(forKeys: playableKeys, completionHandler: { [weak self] in
270
+ guard let self = self else { return }
271
+
272
+ DispatchQueue.main.async {
273
+ if (pendingAsset != self.asset) { return; }
274
+
275
+ for key in playableKeys {
276
+ var error: NSError?
277
+ let keyStatus = pendingAsset.statusOfValue(forKey: key, error: &error)
278
+ switch keyStatus {
279
+ case .failed:
280
+ self.playbackFailed(error: AudioPlayerError.PlaybackError.failedToLoadKeyValue)
281
+ return
282
+ case .cancelled, .loading, .unknown:
283
+ return
284
+ case .loaded:
285
+ break
286
+ default: break
287
+ }
288
+ }
289
+
290
+ if (!pendingAsset.isPlayable) {
291
+ self.playbackFailed(error: AudioPlayerError.PlaybackError.itemWasUnplayable)
292
+ return;
293
+ }
294
+
295
+ let item = AVPlayerItem(
296
+ asset: pendingAsset,
297
+ automaticallyLoadedAssetKeys: playableKeys
298
+ )
299
+ self.item = item;
300
+ item.preferredForwardBufferDuration = self.bufferDuration
301
+ self.avPlayer.replaceCurrentItem(with: item)
302
+ self.startObservingAVPlayer(item: item)
303
+ self.applyAVPlayerRate()
304
+
305
+ if let initialTime = self.timeToSeekToAfterLoading {
306
+ self.timeToSeekToAfterLoading = nil
307
+ self.seek(to: initialTime)
308
+ }
309
+ }
310
+ })
311
+ }
312
+ }
313
+
314
+ func load(from url: URL, playWhenReady: Bool, options: [String: Any]? = nil) {
315
+ self.playWhenReady = playWhenReady
316
+ self.url = url
317
+ self.urlOptions = options
318
+ self.load()
319
+ }
320
+
321
+ func load(
322
+ from url: URL,
323
+ playWhenReady: Bool,
324
+ initialTime: TimeInterval? = nil,
325
+ options: [String : Any]? = nil
326
+ ) {
327
+ self.load(from: url, playWhenReady: playWhenReady, options: options)
328
+ if let initialTime = initialTime {
329
+ self.seek(to: initialTime)
330
+ }
331
+ }
332
+
333
+ func load(
334
+ from url: String,
335
+ type: SourceType = .stream,
336
+ playWhenReady: Bool = false,
337
+ initialTime: TimeInterval? = nil,
338
+ options: [String : Any]? = nil
339
+ ) {
340
+ if let itemUrl = type == .file
341
+ ? URL(fileURLWithPath: url)
342
+ : URL(string: url)
343
+ {
344
+ self.load(from: itemUrl, playWhenReady: playWhenReady, options: options)
345
+ if let initialTime = initialTime {
346
+ self.seek(to: initialTime)
347
+ }
348
+ } else {
349
+ clearCurrentItem()
350
+ playbackFailed(error: AudioPlayerError.PlaybackError.invalidSourceUrl(url))
351
+ }
352
+ }
353
+
354
+ func unload() {
355
+ clearCurrentItem()
356
+ state = .idle
357
+ }
358
+
359
+ func reload(startFromCurrentTime: Bool) {
360
+ var time : Double? = nil
361
+ if (startFromCurrentTime) {
362
+ if let currentItem = currentItem {
363
+ if (!currentItem.duration.isIndefinite) {
364
+ time = currentItem.currentTime().seconds
365
+ }
366
+ }
367
+ }
368
+ load()
369
+ if let time = time {
370
+ seek(to: time)
371
+ }
372
+ }
373
+
374
+ // MARK: - Util
375
+
376
+ private func clearCurrentItem() {
377
+ guard let asset = asset else { return }
378
+ stopObservingAVPlayerItem()
379
+
380
+ asset.cancelLoading()
381
+ self.asset = nil
382
+
383
+ avPlayer.replaceCurrentItem(with: nil)
384
+ }
385
+
386
+ private func startObservingAVPlayer(item: AVPlayerItem) {
387
+ playerItemObserver.startObserving(item: item)
388
+ playerItemNotificationObserver.startObserving(item: item)
389
+ attachTap(audioTap, to: item)
390
+ }
391
+
392
+ private func stopObservingAVPlayerItem() {
393
+ playerItemObserver.stopObservingCurrentItem()
394
+ playerItemNotificationObserver.stopObservingCurrentItem()
395
+ }
396
+
397
+ private func recreateAVPlayer() {
398
+ playbackError = nil
399
+ playerTimeObserver.unregisterForBoundaryTimeEvents()
400
+ playerTimeObserver.unregisterForPeriodicEvents()
401
+ playerObserver.stopObserving()
402
+ stopObservingAVPlayerItem()
403
+ clearCurrentItem()
404
+
405
+ avPlayer = AVPlayer();
406
+ setupAVPlayer()
407
+
408
+ delegate?.AVWrapperDidRecreateAVPlayer()
409
+ }
410
+
411
+ private func setupAVPlayer() {
412
+ // disabled since we're not making use of video playback
413
+ avPlayer.allowsExternalPlayback = false;
414
+
415
+ playerObserver.player = avPlayer
416
+ playerObserver.startObserving()
417
+
418
+ playerTimeObserver.player = avPlayer
419
+ playerTimeObserver.registerForBoundaryTimeEvents()
420
+ playerTimeObserver.registerForPeriodicTimeEvents()
421
+
422
+ applyAVPlayerRate()
423
+ }
424
+
425
+ private func applyAVPlayerRate() {
426
+ avPlayer.rate = playWhenReady ? _rate : 0
427
+ }
428
+ }
429
+
430
+ extension AVPlayerWrapper: AVPlayerObserverDelegate {
431
+
432
+ // MARK: - AVPlayerObserverDelegate
433
+
434
+ func player(didChangeTimeControlStatus status: AVPlayer.TimeControlStatus) {
435
+ switch status {
436
+ case .paused:
437
+ let state = self.state
438
+ if self.asset == nil && state != .stopped {
439
+ self.state = .idle
440
+ } else if (state != .failed && state != .stopped) {
441
+ // Playback may have become paused externally for example due to a bluetooth device disconnecting:
442
+ if (self.playWhenReady) {
443
+ // Only if we are not on the boundaries of the track, otherwise itemDidPlayToEndTime will handle it instead.
444
+ if (self.currentTime > 0 && self.currentTime < self.duration) {
445
+ self.playWhenReady = false;
446
+ }
447
+ } else {
448
+ self.state = .paused
449
+ }
450
+ }
451
+ case .waitingToPlayAtSpecifiedRate:
452
+ if self.asset != nil {
453
+ self.state = .buffering
454
+ }
455
+ case .playing:
456
+ self.state = .playing
457
+ @unknown default:
458
+ break
459
+ }
460
+ }
461
+
462
+ func player(statusDidChange status: AVPlayer.Status) {
463
+ if (status == .failed) {
464
+ let error = item!.error as NSError?
465
+ playbackFailed(error: error?.code == URLError.notConnectedToInternet.rawValue
466
+ ? AudioPlayerError.PlaybackError.notConnectedToInternet
467
+ : AudioPlayerError.PlaybackError.playbackFailed
468
+ )
469
+ }
470
+ }
471
+ }
472
+
473
+ extension AVPlayerWrapper: AVPlayerTimeObserverDelegate {
474
+
475
+ // MARK: - AVPlayerTimeObserverDelegate
476
+
477
+ func audioDidStart() {
478
+ state = .playing
479
+ }
480
+
481
+ func timeEvent(time: CMTime) {
482
+ delegate?.AVWrapper(secondsElapsed: time.seconds)
483
+ }
484
+
485
+ }
486
+
487
+ extension AVPlayerWrapper: AVPlayerItemNotificationObserverDelegate {
488
+ // MARK: - AVPlayerItemNotificationObserverDelegate
489
+
490
+ func itemFailedToPlayToEndTime() {
491
+ playbackFailed(error: AudioPlayerError.PlaybackError.playbackFailed)
492
+ delegate?.AVWrapperItemFailedToPlayToEndTime()
493
+ }
494
+
495
+ func itemPlaybackStalled() {
496
+ delegate?.AVWrapperItemPlaybackStalled()
497
+ }
498
+
499
+ func itemDidPlayToEndTime() {
500
+ delegate?.AVWrapperItemDidPlayToEndTime()
501
+ }
502
+
503
+ }
504
+
505
+ extension AVPlayerWrapper: AVPlayerItemObserverDelegate {
506
+ // MARK: - AVPlayerItemObserverDelegate
507
+
508
+ func item(didUpdatePlaybackLikelyToKeepUp playbackLikelyToKeepUp: Bool) {
509
+ if (playbackLikelyToKeepUp && state != .playing) {
510
+ state = .ready
511
+ }
512
+ }
513
+
514
+ func item(didUpdateDuration duration: Double) {
515
+ delegate?.AVWrapper(didUpdateDuration: duration)
516
+ }
517
+
518
+ func item(didReceiveTimedMetadata metadata: [AVTimedMetadataGroup]) {
519
+ delegate?.AVWrapper(didReceiveTimedMetadata: metadata)
520
+ }
521
+ }
@@ -0,0 +1,27 @@
1
+ //
2
+ // AVPlayerWrapperDelegate.swift
3
+ // SwiftAudio
4
+ //
5
+ // Created by Jørgen Henrichsen on 26/10/2018.
6
+ //
7
+
8
+ import Foundation
9
+ import MediaPlayer
10
+
11
+
12
+ protocol AVPlayerWrapperDelegate: AnyObject {
13
+
14
+ func AVWrapper(didChangeState state: AVPlayerWrapperState)
15
+ func AVWrapper(secondsElapsed seconds: Double)
16
+ func AVWrapper(failedWithError error: Error?)
17
+ func AVWrapper(seekTo seconds: Double, didFinish: Bool)
18
+ func AVWrapper(didUpdateDuration duration: Double)
19
+ func AVWrapper(didReceiveCommonMetadata metadata: [AVMetadataItem])
20
+ func AVWrapper(didReceiveChapterMetadata metadata: [AVTimedMetadataGroup])
21
+ func AVWrapper(didReceiveTimedMetadata metadata: [AVTimedMetadataGroup])
22
+ func AVWrapper(didChangePlayWhenReady playWhenReady: Bool)
23
+ func AVWrapperItemDidPlayToEndTime()
24
+ func AVWrapperItemFailedToPlayToEndTime()
25
+ func AVWrapperItemPlaybackStalled()
26
+ func AVWrapperDidRecreateAVPlayer()
27
+ }
@@ -0,0 +1,69 @@
1
+ //
2
+ // AVPlayerWrapperProtocol.swift
3
+ // SwiftAudio
4
+ //
5
+ // Created by Jørgen Henrichsen on 26/10/2018.
6
+ //
7
+
8
+ import Foundation
9
+ import AVFoundation
10
+
11
+
12
+ protocol AVPlayerWrapperProtocol: AnyObject {
13
+
14
+ var audioTap: AudioTap? { get set }
15
+
16
+ var state: AVPlayerWrapperState { get set }
17
+
18
+ var playWhenReady: Bool { get set }
19
+
20
+ var currentItem: AVPlayerItem? { get }
21
+
22
+ var playbackActive: Bool { get }
23
+
24
+ var currentTime: TimeInterval { get }
25
+
26
+ var duration: TimeInterval { get }
27
+
28
+ var bufferedPosition: TimeInterval { get }
29
+
30
+ var reasonForWaitingToPlay: AVPlayer.WaitingReason? { get }
31
+
32
+ var playbackError: AudioPlayerError.PlaybackError? { get }
33
+
34
+ var rate: Float { get set }
35
+
36
+ var delegate: AVPlayerWrapperDelegate? { get set }
37
+
38
+ var bufferDuration: TimeInterval { get set }
39
+
40
+ var timeEventFrequency: TimeEventFrequency { get set }
41
+
42
+ var volume: Float { get set }
43
+
44
+ var isMuted: Bool { get set }
45
+
46
+ var automaticallyWaitsToMinimizeStalling: Bool { get set }
47
+
48
+ func play()
49
+
50
+ func pause()
51
+
52
+ func togglePlaying()
53
+
54
+ func stop()
55
+
56
+ func seek(to seconds: TimeInterval)
57
+
58
+ func seek(by offset: TimeInterval)
59
+
60
+ func load(from url: URL, playWhenReady: Bool, options: [String: Any]?)
61
+
62
+ func load(from url: URL, playWhenReady: Bool, initialTime: TimeInterval?, options: [String: Any]?)
63
+
64
+ func load(from url: String, type: SourceType, playWhenReady: Bool, initialTime: TimeInterval?, options: [String: Any]?)
65
+
66
+ func unload()
67
+
68
+ func reload(startFromCurrentTime: Bool)
69
+ }
@@ -0,0 +1,43 @@
1
+ //
2
+ // AVPlayerWrapperState.swift
3
+ // SwiftAudio
4
+ //
5
+ // Created by Jørgen Henrichsen on 10/03/2018.
6
+ // Copyright © 2018 Jørgen Henrichsen. All rights reserved.
7
+ //
8
+
9
+ import Foundation
10
+
11
+
12
+ /**
13
+ The current state of the AudioPlayer.
14
+ */
15
+ public enum AVPlayerWrapperState: String {
16
+
17
+ /// An asset is being loaded for playback.
18
+ case loading
19
+
20
+ /// The current item is loaded, and the player is ready to start playing.
21
+ case ready
22
+
23
+ /// The current item is playing, but are currently buffering.
24
+ case buffering
25
+
26
+ /// The player is paused.
27
+ case paused
28
+
29
+ /// The player is stopped.
30
+ case stopped
31
+
32
+ /// The player is playing.
33
+ case playing
34
+
35
+ /// No item loaded, the player is stopped.
36
+ case idle
37
+
38
+ /// Failed
39
+ case failed
40
+
41
+ /// Playback has reached the end.
42
+ case ended
43
+ }