react-native-audio-browser 0.2.0-next.11 → 0.2.0-next.13

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 (416) hide show
  1. package/README.md +14 -4
  2. package/android/build.gradle +20 -1
  3. package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +115 -26
  4. package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +262 -188
  5. package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +23 -3
  6. package/android/src/main/java/com/audiobrowser/browser/InertStyleDiagnostic.kt +267 -0
  7. package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +95 -58
  8. package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +68 -26
  9. package/android/src/main/java/com/audiobrowser/browser/StyleResolver.kt +60 -0
  10. package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +19 -7
  11. package/android/src/main/java/com/audiobrowser/extension/TappedTrack.kt +20 -0
  12. package/android/src/main/java/com/audiobrowser/extension/TrackIdentity.kt +15 -0
  13. package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +1 -1
  14. package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +120 -67
  15. package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +21 -24
  16. package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +109 -74
  17. package/android/src/main/java/com/audiobrowser/player/Player.kt +51 -30
  18. package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +2 -15
  19. package/android/src/main/java/com/audiobrowser/player/ShuffleOrderLedBy.kt +30 -0
  20. package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +44 -40
  21. package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +28 -23
  22. package/android/src/main/java/com/audiobrowser/util/StyleWire.kt +108 -0
  23. package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +52 -53
  24. package/android/src/test/java/com/audiobrowser/TestFixtures.kt +74 -41
  25. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerFavoritesTest.kt +153 -0
  26. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +229 -50
  27. package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +38 -0
  28. package/android/src/test/java/com/audiobrowser/browser/InertStyleDiagnosticTest.kt +277 -0
  29. package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +1 -1
  30. package/android/src/test/java/com/audiobrowser/browser/JsonStyleTest.kt +147 -0
  31. package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +128 -53
  32. package/android/src/test/java/com/audiobrowser/browser/StyleResolverTest.kt +154 -0
  33. package/android/src/test/java/com/audiobrowser/extension/TappedTrackTest.kt +43 -0
  34. package/android/src/test/java/com/audiobrowser/extension/TrackIdentityTest.kt +41 -0
  35. package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +1 -2
  36. package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +42 -2
  37. package/android/src/test/java/com/audiobrowser/player/PlaybackStateStoreTrackJsonTest.kt +55 -0
  38. package/android/src/test/java/com/audiobrowser/player/ShuffleOrderLedByTest.kt +79 -0
  39. package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +41 -16
  40. package/android/src/test/java/com/audiobrowser/util/MediaExtrasBuilderTest.kt +161 -0
  41. package/android/src/test/java/com/audiobrowser/util/TrackFactoryMediaIdTest.kt +7 -7
  42. package/ios/Browser/BrowserConfig.swift +102 -5
  43. package/ios/Browser/BrowserManager+URLResolution.swift +18 -14
  44. package/ios/Browser/BrowserManager.swift +229 -180
  45. package/ios/Browser/BrowserPathHelper.swift +44 -44
  46. package/ios/Browser/InertStyleDiagnostic.swift +279 -0
  47. package/ios/Browser/JsonModels.swift +258 -106
  48. package/ios/Browser/SearchDrillIn.swift +6 -6
  49. package/ios/Browser/SectionPresentation.swift +64 -0
  50. package/ios/Browser/SectionScope.swift +58 -24
  51. package/ios/Browser/StyleResolver.swift +58 -0
  52. package/ios/Browser/TabBarEntries.swift +9 -3
  53. package/ios/Browser/TrackIdTemplate.swift +37 -0
  54. package/ios/CarPlay/CarPlayArtworkResolver.swift +8 -7
  55. package/ios/CarPlay/CarPlayController.swift +227 -85
  56. package/ios/CarPlay/CarPlayImageLoader.swift +38 -18
  57. package/ios/CarPlay/CarPlayListItemFactory.swift +289 -84
  58. package/ios/CarPlay/CarPlayNowPlayingManager.swift +15 -12
  59. package/ios/Extension/Capability+RemoteCommand.swift +1 -1
  60. package/ios/Extension/PlayerCapabilities+Favorite.swift +1 -15
  61. package/ios/Extension/ResolvedTrack+Copying.swift +11 -15
  62. package/ios/Extension/Section+Copying.swift +31 -0
  63. package/ios/Extension/Track+Copying.swift +6 -12
  64. package/ios/Extension/Track+Identity.swift +18 -0
  65. package/ios/Extension/UIApplication+ActiveScene.swift +27 -0
  66. package/ios/Http/HttpClient.swift +8 -2
  67. package/ios/HybridAudioBrowser.swift +166 -45
  68. package/ios/Model/NitroTypeStubs.swift +106 -21
  69. package/ios/Model/PlayerUpdateOptions.swift +7 -0
  70. package/ios/Player/MediaIntentCriteria.swift +13 -5
  71. package/ios/Player/MediaLoader.swift +33 -9
  72. package/ios/Player/NowPlayingUpdater.swift +54 -6
  73. package/ios/Player/PlaybackCoordinator.swift +13 -6
  74. package/ios/Player/PlaybackTimer.swift +8 -2
  75. package/ios/Player/QueueManager.swift +36 -10
  76. package/ios/Player/RetryManager.swift +4 -3
  77. package/ios/Player/ShuffleOrder.swift +23 -0
  78. package/ios/Player/SleepTimerHandling.swift +13 -0
  79. package/ios/RemoteCommand/RemoteCommandController.swift +53 -18
  80. package/ios/Tests/BrowserPathHelperTests.swift +50 -20
  81. package/ios/Tests/CarPlayArtworkResolverTests.swift +24 -41
  82. package/ios/Tests/InertStyleDiagnosticTests.swift +200 -0
  83. package/ios/Tests/JsonModelsTests.swift +150 -1
  84. package/ios/Tests/PlaybackStateStoreTests.swift +4 -3
  85. package/ios/Tests/QueueManagerTests.swift +72 -6
  86. package/ios/Tests/RemoteCommandControllerTests.swift +16 -0
  87. package/ios/Tests/ResolvedTrackCopyingTests.swift +37 -35
  88. package/ios/Tests/SearchDrillInTests.swift +16 -16
  89. package/ios/Tests/SectionPresentationTests.swift +90 -0
  90. package/ios/Tests/SectionScopeTests.swift +87 -55
  91. package/ios/Tests/StyleResolverTests.swift +127 -0
  92. package/ios/Tests/Support/TestTypes.swift +7 -0
  93. package/ios/Tests/TabBarEntriesTests.swift +18 -18
  94. package/ios/Tests/TrackIdTemplateTests.swift +67 -0
  95. package/ios/Tests/TrackIdentityTests.swift +20 -0
  96. package/ios/Tests/TrackSelectorTests.swift +168 -33
  97. package/ios/TrackPlayer.swift +57 -34
  98. package/ios/TrackSelector.swift +45 -30
  99. package/ios/Util/ArtworkImageFetcher.swift +16 -1
  100. package/ios/Util/NetworkMonitor.swift +43 -26
  101. package/ios/Util/SFSymbolRenderer.swift +24 -2
  102. package/ios/Util/SVGProcessor.swift +9 -2
  103. package/lib/commonjs/AudioBrowser.js +11 -0
  104. package/lib/commonjs/AudioBrowser.js.map +1 -1
  105. package/lib/commonjs/features/browser-config.js +11 -8
  106. package/lib/commonjs/features/browser-config.js.map +1 -1
  107. package/lib/commonjs/features/browser.js +2 -2
  108. package/lib/commonjs/features/favorites.js +13 -10
  109. package/lib/commonjs/features/favorites.js.map +1 -1
  110. package/lib/commonjs/features/playback/controls.js +4 -2
  111. package/lib/commonjs/features/playback/controls.js.map +1 -1
  112. package/lib/commonjs/features/playback/progress.js +2 -1
  113. package/lib/commonjs/features/playback/progress.js.map +1 -1
  114. package/lib/commonjs/features/playback/rate.js +8 -1
  115. package/lib/commonjs/features/playback/rate.js.map +1 -1
  116. package/lib/commonjs/features/playback/state.js +2 -3
  117. package/lib/commonjs/features/playback/state.js.map +1 -1
  118. package/lib/commonjs/features/player/options.js.map +1 -1
  119. package/lib/commonjs/features/player/setup.js +3 -1
  120. package/lib/commonjs/features/player/setup.js.map +1 -1
  121. package/lib/commonjs/features/player/validateOptions.js +2 -0
  122. package/lib/commonjs/features/player/validateOptions.js.map +1 -1
  123. package/lib/commonjs/features/queue/activeTrack.js +14 -3
  124. package/lib/commonjs/features/queue/activeTrack.js.map +1 -1
  125. package/lib/commonjs/features/queue/queue.js +11 -4
  126. package/lib/commonjs/features/queue/queue.js.map +1 -1
  127. package/lib/commonjs/utils/LazyNativeEmitter.js +21 -10
  128. package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -1
  129. package/lib/commonjs/utils/NativeUpdatedValue.js +31 -13
  130. package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -1
  131. package/lib/commonjs/utils/getTrackIdentity.js +24 -0
  132. package/lib/commonjs/utils/getTrackIdentity.js.map +1 -0
  133. package/lib/commonjs/utils/useNativeValueRefreshedBy.js +33 -0
  134. package/lib/commonjs/utils/useNativeValueRefreshedBy.js.map +1 -0
  135. package/lib/commonjs/web/NativeAudioBrowser.js +32 -24
  136. package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
  137. package/lib/commonjs/web/TrackPlayer/QueueManager.js +14 -0
  138. package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +1 -1
  139. package/lib/commonjs/web/browser/BrowserManager.js +144 -87
  140. package/lib/commonjs/web/browser/BrowserManager.js.map +1 -1
  141. package/lib/commonjs/web/browser/FavoriteManager.js +30 -21
  142. package/lib/commonjs/web/browser/FavoriteManager.js.map +1 -1
  143. package/lib/commonjs/web/browser/assertBrowsePageShape.js +2 -2
  144. package/lib/commonjs/web/browser/assertBrowsePageShape.js.map +1 -1
  145. package/lib/commonjs/web/browser/classifyTrackNavigation.js +9 -9
  146. package/lib/commonjs/web/browser/classifyTrackNavigation.js.map +1 -1
  147. package/lib/commonjs/web/browser/sections.js +89 -0
  148. package/lib/commonjs/web/browser/sections.js.map +1 -0
  149. package/lib/commonjs/web/player/NowPlayingManager.js +4 -3
  150. package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -1
  151. package/lib/commonjs/web/util/BrowserPathHelper.js +56 -11
  152. package/lib/commonjs/web/util/BrowserPathHelper.js.map +1 -1
  153. package/lib/module/AudioBrowser.js +1 -0
  154. package/lib/module/AudioBrowser.js.map +1 -1
  155. package/lib/module/features/browser-config.js +11 -8
  156. package/lib/module/features/browser-config.js.map +1 -1
  157. package/lib/module/features/browser.js +2 -2
  158. package/lib/module/features/favorites.js +13 -10
  159. package/lib/module/features/favorites.js.map +1 -1
  160. package/lib/module/features/playback/controls.js +4 -2
  161. package/lib/module/features/playback/controls.js.map +1 -1
  162. package/lib/module/features/playback/progress.js +2 -1
  163. package/lib/module/features/playback/progress.js.map +1 -1
  164. package/lib/module/features/playback/rate.js +8 -1
  165. package/lib/module/features/playback/rate.js.map +1 -1
  166. package/lib/module/features/playback/state.js +2 -3
  167. package/lib/module/features/playback/state.js.map +1 -1
  168. package/lib/module/features/player/options.js.map +1 -1
  169. package/lib/module/features/player/setup.js +3 -1
  170. package/lib/module/features/player/setup.js.map +1 -1
  171. package/lib/module/features/player/validateOptions.js +2 -0
  172. package/lib/module/features/player/validateOptions.js.map +1 -1
  173. package/lib/module/features/queue/activeTrack.js +14 -3
  174. package/lib/module/features/queue/activeTrack.js.map +1 -1
  175. package/lib/module/features/queue/queue.js +11 -4
  176. package/lib/module/features/queue/queue.js.map +1 -1
  177. package/lib/module/utils/LazyNativeEmitter.js +21 -10
  178. package/lib/module/utils/LazyNativeEmitter.js.map +1 -1
  179. package/lib/module/utils/NativeUpdatedValue.js +31 -13
  180. package/lib/module/utils/NativeUpdatedValue.js.map +1 -1
  181. package/lib/module/utils/getTrackIdentity.js +20 -0
  182. package/lib/module/utils/getTrackIdentity.js.map +1 -0
  183. package/lib/module/utils/useNativeValueRefreshedBy.js +29 -0
  184. package/lib/module/utils/useNativeValueRefreshedBy.js.map +1 -0
  185. package/lib/module/web/NativeAudioBrowser.js +32 -24
  186. package/lib/module/web/NativeAudioBrowser.js.map +1 -1
  187. package/lib/module/web/TrackPlayer/QueueManager.js +14 -0
  188. package/lib/module/web/TrackPlayer/QueueManager.js.map +1 -1
  189. package/lib/module/web/browser/BrowserManager.js +144 -87
  190. package/lib/module/web/browser/BrowserManager.js.map +1 -1
  191. package/lib/module/web/browser/FavoriteManager.js +31 -21
  192. package/lib/module/web/browser/FavoriteManager.js.map +1 -1
  193. package/lib/module/web/browser/assertBrowsePageShape.js +2 -2
  194. package/lib/module/web/browser/assertBrowsePageShape.js.map +1 -1
  195. package/lib/module/web/browser/classifyTrackNavigation.js +9 -9
  196. package/lib/module/web/browser/classifyTrackNavigation.js.map +1 -1
  197. package/lib/module/web/browser/sections.js +83 -0
  198. package/lib/module/web/browser/sections.js.map +1 -0
  199. package/lib/module/web/player/NowPlayingManager.js +4 -3
  200. package/lib/module/web/player/NowPlayingManager.js.map +1 -1
  201. package/lib/module/web/util/BrowserPathHelper.js +56 -11
  202. package/lib/module/web/util/BrowserPathHelper.js.map +1 -1
  203. package/lib/typescript/src/AudioBrowser.d.ts +1 -0
  204. package/lib/typescript/src/AudioBrowser.d.ts.map +1 -1
  205. package/lib/typescript/src/features/browser-config.d.ts.map +1 -1
  206. package/lib/typescript/src/features/browser.d.ts +2 -2
  207. package/lib/typescript/src/features/favorites.d.ts +13 -10
  208. package/lib/typescript/src/features/favorites.d.ts.map +1 -1
  209. package/lib/typescript/src/features/playback/controls.d.ts +4 -2
  210. package/lib/typescript/src/features/playback/controls.d.ts.map +1 -1
  211. package/lib/typescript/src/features/playback/progress.d.ts.map +1 -1
  212. package/lib/typescript/src/features/playback/rate.d.ts +8 -1
  213. package/lib/typescript/src/features/playback/rate.d.ts.map +1 -1
  214. package/lib/typescript/src/features/playback/state.d.ts +2 -3
  215. package/lib/typescript/src/features/playback/state.d.ts.map +1 -1
  216. package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts +1 -1
  217. package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts.map +1 -1
  218. package/lib/typescript/src/features/player/options.d.ts +21 -19
  219. package/lib/typescript/src/features/player/options.d.ts.map +1 -1
  220. package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
  221. package/lib/typescript/src/features/player/validateOptions.d.ts +1 -8
  222. package/lib/typescript/src/features/player/validateOptions.d.ts.map +1 -1
  223. package/lib/typescript/src/features/queue/activeTrack.d.ts +8 -1
  224. package/lib/typescript/src/features/queue/activeTrack.d.ts.map +1 -1
  225. package/lib/typescript/src/features/queue/queue.d.ts +5 -2
  226. package/lib/typescript/src/features/queue/queue.d.ts.map +1 -1
  227. package/lib/typescript/src/types/browser-native.d.ts +2 -2
  228. package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
  229. package/lib/typescript/src/types/browser-nodes.d.ts +361 -126
  230. package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
  231. package/lib/typescript/src/types/browser.d.ts +33 -53
  232. package/lib/typescript/src/types/browser.d.ts.map +1 -1
  233. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +16 -17
  234. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -1
  235. package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +24 -19
  236. package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -1
  237. package/lib/typescript/src/utils/getTrackIdentity.d.ts +18 -0
  238. package/lib/typescript/src/utils/getTrackIdentity.d.ts.map +1 -0
  239. package/lib/typescript/src/utils/useNativeValueRefreshedBy.d.ts +21 -0
  240. package/lib/typescript/src/utils/useNativeValueRefreshedBy.d.ts.map +1 -0
  241. package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +0 -1
  242. package/nitrogen/generated/android/c++/{JFavoritesMatchMode.hpp → JArtworkRendering.hpp} +15 -15
  243. package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +8 -3
  244. package/nitrogen/generated/android/c++/JBrowseResult.hpp +16 -4
  245. package/nitrogen/generated/android/c++/JCarPlayPlayingIndicatorLocation.hpp +58 -0
  246. package/nitrogen/generated/android/c++/JCardImage.hpp +58 -0
  247. package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +8 -3
  248. package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +8 -3
  249. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +8 -3
  250. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +8 -3
  251. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +8 -3
  252. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +8 -3
  253. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +8 -2
  254. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +8 -2
  255. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.hpp +16 -4
  256. package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +8 -3
  257. package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +2 -5
  258. package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +8 -3
  259. package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +15 -3
  260. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +8 -2
  261. package/nitrogen/generated/android/c++/JGridTile.hpp +61 -0
  262. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +33 -14
  263. package/nitrogen/generated/android/c++/JIOSOptions.hpp +9 -3
  264. package/nitrogen/generated/android/c++/JImageShape.hpp +58 -0
  265. package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +8 -3
  266. package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +22 -10
  267. package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +14 -2
  268. package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +10 -7
  269. package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +2 -5
  270. package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +9 -3
  271. package/nitrogen/generated/android/c++/JOptions.hpp +2 -5
  272. package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +8 -3
  273. package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +5 -11
  274. package/nitrogen/generated/android/c++/JResolvedTrack.hpp +55 -51
  275. package/nitrogen/generated/android/c++/JSection.hpp +120 -0
  276. package/nitrogen/generated/android/c++/JSectionStyle.hpp +96 -0
  277. package/nitrogen/generated/android/c++/JStyleDisplay.hpp +58 -0
  278. package/nitrogen/generated/android/c++/JTrack.hpp +23 -48
  279. package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +8 -2
  280. package/nitrogen/generated/android/c++/JTrackStyle.hpp +46 -18
  281. package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +16 -4
  282. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoritesMatchMode.kt → ArtworkRendering.kt} +5 -5
  283. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayPlayingIndicatorLocation.kt +23 -0
  284. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CardImage.kt +23 -0
  285. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/GridTile.kt +24 -0
  286. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSOptions.kt +6 -3
  287. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageShape.kt +23 -0
  288. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +5 -5
  289. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +6 -3
  290. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +2 -2
  291. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +12 -18
  292. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoriteConfig.kt → Section.kt} +18 -6
  293. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SectionStyle.kt +59 -0
  294. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StyleDisplay.kt +23 -0
  295. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +6 -15
  296. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +35 -5
  297. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +158 -82
  298. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +25 -10
  299. package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +25 -10
  300. package/nitrogen/generated/ios/swift/ArtworkRendering.swift +40 -0
  301. package/nitrogen/generated/ios/swift/CarPlayPlayingIndicatorLocation.swift +40 -0
  302. package/nitrogen/generated/ios/swift/CardImage.swift +40 -0
  303. package/nitrogen/generated/ios/swift/GridTile.swift +44 -0
  304. package/nitrogen/generated/ios/swift/IOSOptions.swift +7 -2
  305. package/nitrogen/generated/ios/swift/ImageShape.swift +40 -0
  306. package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +5 -5
  307. package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +12 -1
  308. package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +8 -27
  309. package/nitrogen/generated/ios/swift/ResolvedTrack.swift +54 -83
  310. package/nitrogen/generated/ios/swift/Section.swift +100 -0
  311. package/nitrogen/generated/ios/swift/SectionStyle.swift +133 -0
  312. package/nitrogen/generated/ios/swift/StyleDisplay.swift +40 -0
  313. package/nitrogen/generated/ios/swift/Track.swift +20 -73
  314. package/nitrogen/generated/ios/swift/TrackStyle.swift +86 -22
  315. package/nitrogen/generated/shared/c++/{FavoritesMatchMode.hpp → ArtworkRendering.hpp} +17 -17
  316. package/nitrogen/generated/shared/c++/CarPlayPlayingIndicatorLocation.hpp +76 -0
  317. package/nitrogen/generated/shared/c++/CardImage.hpp +76 -0
  318. package/nitrogen/generated/shared/c++/GridTile.hpp +80 -0
  319. package/nitrogen/generated/shared/c++/IOSOptions.hpp +9 -2
  320. package/nitrogen/generated/shared/c++/ImageShape.hpp +76 -0
  321. package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +6 -6
  322. package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +9 -2
  323. package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +6 -9
  324. package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +30 -38
  325. package/nitrogen/generated/shared/c++/Section.hpp +106 -0
  326. package/nitrogen/generated/shared/c++/SectionStyle.hpp +126 -0
  327. package/nitrogen/generated/shared/c++/StyleDisplay.hpp +76 -0
  328. package/nitrogen/generated/shared/c++/Track.hpp +15 -31
  329. package/nitrogen/generated/shared/c++/TrackStyle.hpp +73 -34
  330. package/package.json +7 -2
  331. package/src/AudioBrowser.ts +1 -0
  332. package/src/features/browser-config.test.ts +21 -6
  333. package/src/features/browser-config.ts +11 -8
  334. package/src/features/browser.test.ts +1 -1
  335. package/src/features/browser.ts +2 -2
  336. package/src/features/favorites.ts +13 -10
  337. package/src/features/hook-wiring.test.ts +63 -15
  338. package/src/features/playback/controls.ts +4 -2
  339. package/src/features/playback/progress.ts +2 -1
  340. package/src/features/playback/rate.ts +8 -1
  341. package/src/features/playback/state.ts +2 -3
  342. package/src/features/playback/trackPlaybackTime.ts +1 -1
  343. package/src/features/player/options.ts +27 -19
  344. package/src/features/player/setup.test.ts +12 -3
  345. package/src/features/player/setup.ts +3 -1
  346. package/src/features/player/validateOptions.ts +2 -0
  347. package/src/features/queue/activeTrack.ts +14 -3
  348. package/src/features/queue/queue.ts +11 -4
  349. package/src/nitro-stub-drift.test.ts +40 -0
  350. package/src/public-surface.test.ts +40 -0
  351. package/src/specs/audio-browser.nitro.ts +4 -3
  352. package/src/style-resolution.test.ts +210 -0
  353. package/src/types/browser-native.ts +2 -2
  354. package/src/types/browser-nodes.ts +377 -135
  355. package/src/types/browser.ts +34 -55
  356. package/src/utils/LazyNativeEmitter.ts +20 -10
  357. package/src/utils/NativeUpdatedValue.ts +29 -13
  358. package/src/utils/getTrackIdentity.ts +20 -0
  359. package/src/utils/useNativeValueRefreshedBy.ts +38 -0
  360. package/src/web/NativeAudioBrowser.ts +37 -22
  361. package/src/web/TrackPlayer/QueueManager.test.ts +29 -0
  362. package/src/web/TrackPlayer/QueueManager.ts +14 -0
  363. package/src/web/browser/BrowserManager.ts +176 -95
  364. package/src/web/browser/FavoriteManager.test.ts +84 -0
  365. package/src/web/browser/FavoriteManager.ts +28 -23
  366. package/src/web/browser/assertBrowsePageShape.test.ts +1 -1
  367. package/src/web/browser/assertBrowsePageShape.ts +5 -3
  368. package/src/web/browser/classifyTrackNavigation.test.ts +10 -8
  369. package/src/web/browser/classifyTrackNavigation.ts +9 -9
  370. package/src/web/browser/parseSearchResponse.test.ts +8 -2
  371. package/src/web/browser/sections.test.ts +91 -0
  372. package/src/web/browser/sections.ts +72 -0
  373. package/src/web/player/NowPlayingManager.ts +4 -3
  374. package/src/web/util/BrowserPathHelper.test.ts +52 -0
  375. package/src/web/util/BrowserPathHelper.ts +61 -13
  376. package/website/guide/android-auto.md +114 -0
  377. package/website/guide/android-certificates.md +409 -0
  378. package/website/guide/artwork.md +255 -0
  379. package/website/guide/audio-output.md +135 -0
  380. package/website/guide/automotive.md +86 -0
  381. package/website/guide/basic-usage.md +151 -0
  382. package/website/guide/battery.md +115 -0
  383. package/website/guide/browser.md +581 -0
  384. package/website/guide/carplay.md +620 -0
  385. package/website/guide/configuration.md +173 -0
  386. package/website/guide/equalizer.md +231 -0
  387. package/website/guide/errors.md +310 -0
  388. package/website/guide/favorites.md +154 -0
  389. package/website/guide/gate.md +143 -0
  390. package/website/guide/getting-started.md +46 -0
  391. package/website/guide/hooks.md +238 -0
  392. package/website/guide/live-streams.md +125 -0
  393. package/website/guide/metadata.md +239 -0
  394. package/website/guide/migrating-from-track-player.md +244 -0
  395. package/website/guide/native-callback-fetch.md +127 -0
  396. package/website/guide/network.md +86 -0
  397. package/website/guide/now-playing.md +175 -0
  398. package/website/guide/playback.md +328 -0
  399. package/website/guide/queue.md +300 -0
  400. package/website/guide/remote-controls.md +256 -0
  401. package/website/guide/search.md +255 -0
  402. package/website/guide/sleep-timer.md +268 -0
  403. package/website/guide/track.md +246 -0
  404. package/ios/CarPlay/ImageRowItem+CarPlay.swift +0 -19
  405. package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +0 -58
  406. package/nitrogen/generated/android/c++/JImageRowItem.hpp +0 -105
  407. package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.cpp +0 -26
  408. package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.hpp +0 -71
  409. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +0 -68
  410. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_FavoriteConfig.kt +0 -53
  411. package/nitrogen/generated/ios/swift/FavoriteConfig.swift +0 -29
  412. package/nitrogen/generated/ios/swift/FavoritesMatchMode.swift +0 -40
  413. package/nitrogen/generated/ios/swift/ImageRowItem.swift +0 -195
  414. package/nitrogen/generated/ios/swift/Variant_Bool_FavoriteConfig.swift +0 -18
  415. package/nitrogen/generated/shared/c++/FavoriteConfig.hpp +0 -84
  416. package/nitrogen/generated/shared/c++/ImageRowItem.hpp +0 -129
@@ -0,0 +1,173 @@
1
+ ---
2
+ description: 'The whole options surface — setupPlayer, updateOptions, and getOptions — mapped to the feature guide that covers each area in depth.'
3
+ ---
4
+
5
+ # Configuration
6
+
7
+ Everything about how the player behaves is set through three functions:
8
+
9
+ - [`setupPlayer(options?)`](/api/features/player/#setupplayer) — the one
10
+ declarative call that initializes the player, run once at startup.
11
+ - [`updateOptions(options)`](/api/features/player/#updateoptions) — change a
12
+ subset of options later, at runtime.
13
+ - [`getOptions()`](/api/features/player/#getoptions) /
14
+ [`useOptions()`](/api/features/player/#useoptions) — read the current,
15
+ resolved options.
16
+
17
+ This page maps the whole options surface and links to the feature guide that
18
+ covers each area in depth.
19
+
20
+ ## `setupPlayer`
21
+
22
+ Call it once at startup. It's `async`, and applies all options atomically — the
23
+ player never exists without its configuration:
24
+
25
+ ```ts
26
+ import { setupPlayer } from 'react-native-audio-browser'
27
+
28
+ await setupPlayer({
29
+ playWhenReady: true,
30
+ repeatMode: 'queue',
31
+ capabilities: { favorite: true },
32
+ progressUpdateEventInterval: 0.5,
33
+ android: { audioContentType: 'music' },
34
+ ios: { category: 'playback' }
35
+ })
36
+ ```
37
+
38
+ Calling `setupPlayer` again **reconfigures in place**: the fields you pass are
39
+ merged over the previous ones, and the audio engine is only rebuilt when a
40
+ construction-bound field (buffers, wake mode, …) actually changed. This is also
41
+ how you change a [setup-only option](#setup-only-vs-updatable) after launch.
42
+
43
+ ## `updateOptions`
44
+
45
+ Use it to change runtime options after setup. Every field is optional — pass only
46
+ what changes; the values you provide are **merged** over the current ones.
47
+
48
+ ```ts
49
+ import { updateOptions } from 'react-native-audio-browser'
50
+
51
+ updateOptions({ capabilities: { shuffleMode: false } })
52
+ updateOptions({ progressUpdateEventInterval: null }) // disable progress events
53
+ updateOptions({ ios: { carPlayNowPlayingButtons: ['repeat'] } })
54
+ ```
55
+
56
+ `null` is meaningful on exactly two fields, where it turns the feature off:
57
+ `progressUpdateEventInterval: null` disables progress events, and
58
+ `android.remoteButtonLayout: null` empties the layout (deriving it from
59
+ capabilities). Elsewhere, just omit a field to leave it unchanged.
60
+
61
+ ## Setup-only vs updatable
62
+
63
+ `updateOptions` can change only a subset. The rest are set in `setupPlayer`
64
+ (call it again to change them later).
65
+
66
+ | Option | `setupPlayer` | `updateOptions` |
67
+ | ---------------------------------------------------------------------------------------- | :-----------: | :-------------: |
68
+ | `capabilities` | ✓ | ✓ |
69
+ | `forwardJumpInterval` / `backwardJumpInterval` | ✓ | ✓ |
70
+ | `progressUpdateEventInterval` | ✓ | ✓ |
71
+ | `android.appKilledPlaybackBehavior` / `skipSilence` / `remoteButtonLayout` | ✓ | ✓ |
72
+ | `ios.playbackRates` / `carPlayUpNextButton` / `carPlayNowPlayingButtons` | ✓ | ✓ |
73
+ | `nowPlaying` (metadata formatter) | ✓ | — |
74
+ | `playWhenReady`, `repeatMode` (initial values) | ✓ | — |
75
+ | `retry`, `keepSessionAliveOnError` | ✓ | — |
76
+ | `android` / `ios` audio engine & session (`audioContentType`, `wakeMode`, `category`, …) | ✓ | — |
77
+
78
+ `playWhenReady` and `repeatMode` set the _initial_ state; change them at runtime
79
+ with [`setPlayWhenReady`](/guide/playback#play-when-ready) /
80
+ [`setRepeatMode`](/guide/queue#repeat-and-shuffle), not `updateOptions`.
81
+
82
+ ## Capabilities
83
+
84
+ `capabilities` controls which transport controls the system surfaces (lock
85
+ screen, notification, CarPlay, Android Auto) expose. **All default to `true`
86
+ except `jumpForward`, `jumpBackward`, and `favorite`, which default to `false`.**
87
+ Capabilities **merge** — list only the ones you want to change, and the rest keep
88
+ their current value:
89
+
90
+ ```ts
91
+ updateOptions({
92
+ capabilities: { jumpForward: true, jumpBackward: true } // podcast controls
93
+ })
94
+ ```
95
+
96
+ | Capability | Default | Notes |
97
+ | ------------------------------- | ------- | ---------------------------------------------- |
98
+ | `play` / `pause` / `stop` | `true` | Core transport. |
99
+ | `seekTo` | `true` | Scrub the timeline. |
100
+ | `skipToNext` / `skipToPrevious` | `true` | Move between queue items. |
101
+ | `jumpForward` / `jumpBackward` | `false` | Podcast/audiobook seek by interval. |
102
+ | `playbackRate` | `true` | Speed control (Control Center / CarPlay). |
103
+ | `shuffleMode` / `repeatMode` | `true` | Shuffle / repeat toggles. |
104
+ | `favorite` | `false` | The heart — see [Favorites](/guide/favorites). |
105
+
106
+ ## Controls & progress
107
+
108
+ | Option | Default | What |
109
+ | ----------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ |
110
+ | `forwardJumpInterval` | `15` | Seconds for the jump-forward control. |
111
+ | `backwardJumpInterval` | `15` | Seconds for the jump-backward control. |
112
+ | `progressUpdateEventInterval` | `null` | Seconds between progress events; `null` disables them — see [Playback → Progress](/guide/playback#progress). |
113
+
114
+ ## Now Playing
115
+
116
+ `nowPlaying` controls what's published to the now-playing surfaces:
117
+
118
+ - `true` (default) — publish the track's own title / artist.
119
+ - `false` — don't manage now-playing metadata.
120
+ - a formatter callback — render every line yourself.
121
+
122
+ It's **setup-only** (a function can't cross `updateOptions`). See
123
+ [Now Playing → the formatter](/guide/now-playing#the-formatter-derived-continuous).
124
+
125
+ ## Android options (`android`)
126
+
127
+ | Option | Default | What |
128
+ | --------------------------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
129
+ | `appKilledPlaybackBehavior` | `'continue-playback'` | What happens when the app is swiped away (`continue-playback` / `pause-playback` / `stop-playback-and-remove-notification`). |
130
+ | `skipSilence` | `false` | Skip silent segments during playback. |
131
+ | `remoteButtonLayout` | `null` | Explicit button placement (`back` / `forward` / `overflow`); `null` derives it from capabilities — see [Button layout](/guide/remote-controls#button-layout-android). |
132
+ | `audioContentType` | `'music'` | Audio attributes content type (setup-only). |
133
+ | `wakeMode` | `'none'` | CPU/network wake lock during playback (setup-only). |
134
+
135
+ ## iOS options (`ios`)
136
+
137
+ | Option | Default | What |
138
+ | -------------------------- | ---------------------- | ----------------------------------------------------------------------------------------------------- |
139
+ | `playbackRates` | `[0.5, 1.0, 1.5, 2.0]` | Rates offered by the rate control. |
140
+ | `carPlayUpNextButton` | `true` | Show the "Up Next" button on CarPlay (auto-hidden when the queue has one track). |
141
+ | `carPlayNowPlayingButtons` | `[]` | Buttons on the CarPlay now-playing screen (max **5**, left-to-right) — see [CarPlay](/guide/carplay). |
142
+ | `category` | _(none)_ | iOS audio session category (setup-only). |
143
+
144
+ ## Reading the current options
145
+
146
+ [`getOptions()`](/api/features/player/#getoptions) returns the resolved
147
+ [`Options`](/api/features/player/#options) (capabilities, intervals,
148
+ `progressUpdateEventInterval`, and the `android` / `ios` blocks for the current
149
+ platform). [`useOptions()`](/api/features/player/#useoptions) is the reactive
150
+ hook; [`onOptionsChanged`](/api/features/player/#onoptionschanged) is the
151
+ subscription.
152
+
153
+ ```tsx
154
+ import { useOptions } from 'react-native-audio-browser'
155
+
156
+ function JumpInterval() {
157
+ const { forwardJumpInterval } = useOptions()
158
+ return <Text>Jump {forwardJumpInterval}s</Text>
159
+ }
160
+ ```
161
+
162
+ `getOptions` reports the _runtime_ options above — it doesn't echo back the
163
+ setup-only `nowPlaying` / `playWhenReady` / `repeatMode` (read those via their
164
+ own getters/hooks, e.g. [`useRepeatMode`](/guide/queue#repeat-and-shuffle)).
165
+
166
+ ## API summary
167
+
168
+ | API | Purpose |
169
+ | ------------------------------- | ------------------------------------------------------------------------------------------------------ |
170
+ | `setupPlayer(options?)` | Initialize (and reconfigure) the player; `async`, once at startup. |
171
+ | `updateOptions(options)` | Change runtime options later (merged over current); `null` disables on the two fields that support it. |
172
+ | `getOptions()` / `useOptions()` | Read the resolved runtime options. |
173
+ | `onOptionsChanged` | Subscribe to options changes outside React. |
@@ -0,0 +1,231 @@
1
+ ---
2
+ description: 'Shape playback tone with the Android system equalizer: named presets, custom band levels, and handling its absence on iOS.'
3
+ ---
4
+
5
+ # Equalizer
6
+
7
+ The equalizer lets you shape playback tone — boost the bass, tame the treble —
8
+ either by applying a named **preset** (e.g. "Rock", "Jazz") or by setting
9
+ **custom band levels** yourself. It wraps the system equalizer effect.
10
+
11
+ ::: warning Android only
12
+ The equalizer is **Android-only**. Every getter returns `undefined` and every
13
+ setter is a no-op on iOS — Apple exposes no equivalent system equalizer. Always
14
+ treat the settings as possibly-absent (see [Availability](#availability)).
15
+ :::
16
+
17
+ The UI snippets below import `View` / `Text` / `Button` from `react-native` and
18
+ `Slider` from `@react-native-community/slider`; those import lines are omitted
19
+ for brevity. Everything else comes from `react-native-audio-browser`.
20
+
21
+ ## Availability
22
+
23
+ [`getEqualizerSettings()`](/api/features/equalizer/#getequalizersettings)
24
+ returns [`EqualizerSettings | undefined`](/api/features/equalizer/#equalizersettings).
25
+ It's `undefined` whenever the equalizer isn't available — on iOS, and **on
26
+ Android until the player has an audio session**, which only exists once playback
27
+ has started. A settings screen opened before anything has played may see
28
+ `undefined`; use the reactive hook so it fills in when playback begins.
29
+
30
+ ## Reading the settings
31
+
32
+ [`useEqualizerSettings()`](/api/features/equalizer/#useequalizersettings) returns
33
+ the current settings and re-renders when they change:
34
+
35
+ ```tsx
36
+ import { useEqualizerSettings } from 'react-native-audio-browser'
37
+
38
+ function EqualizerStatus() {
39
+ const eq = useEqualizerSettings()
40
+ if (!eq) return <Text>Equalizer unavailable</Text>
41
+ return (
42
+ <Text>
43
+ {eq.enabled ? 'On' : 'Off'} · {eq.bandCount} bands
44
+ </Text>
45
+ )
46
+ }
47
+ ```
48
+
49
+ The [`EqualizerSettings`](/api/features/equalizer/#equalizersettings) object:
50
+
51
+ | Field | Type | Meaning |
52
+ | ----------------------- | --------------------- | ----------------------------------------------------- |
53
+ | `enabled` | `boolean` | Whether the effect is currently applied. |
54
+ | `bandCount` | `number` | Number of frequency bands. |
55
+ | `bandLevels` | `number[]` | Current level per band, in **millibels**. |
56
+ | `centerBandFrequencies` | `number[]` | Center frequency per band, in **milliHertz**. |
57
+ | `lowerBandLevelLimit` | `number` | Minimum level (millibels) any band accepts. |
58
+ | `upperBandLevelLimit` | `number` | Maximum level (millibels) any band accepts. |
59
+ | `presets` | `string[]` | Available preset names. |
60
+ | `activePreset` | `string \| undefined` | The applied preset, or `undefined` for custom levels. |
61
+
62
+ See [the units note](#a-note-on-units) — both level and frequency values use
63
+ "milli" units.
64
+
65
+ Outside React, read a snapshot with `getEqualizerSettings()` or subscribe with
66
+ [`onEqualizerChanged`](/api/features/equalizer/#onequalizerchanged).
67
+
68
+ All the `setEqualizer*` calls below are fire-and-forget — they return `void`.
69
+ The updated settings come back through `useEqualizerSettings` /
70
+ `onEqualizerChanged`, not as a return value.
71
+
72
+ ## Turning it on
73
+
74
+ The effect does nothing audible until it's enabled. Toggle it with
75
+ [`setEqualizerEnabled`](/api/features/equalizer/#setequalizerenabled):
76
+
77
+ ```ts
78
+ import { setEqualizerEnabled } from 'react-native-audio-browser'
79
+
80
+ setEqualizerEnabled(true)
81
+ ```
82
+
83
+ ## Applying a preset
84
+
85
+ [`setEqualizerPreset`](/api/features/equalizer/#setequalizerpreset) takes one of
86
+ the names from `settings.presets`. The match is case-insensitive; an unknown
87
+ name is ignored (a warning is logged), so drive your UI from the actual
88
+ `presets` list rather than hard-coded strings:
89
+
90
+ ```tsx
91
+ import {
92
+ setEqualizerPreset,
93
+ useEqualizerSettings
94
+ } from 'react-native-audio-browser'
95
+
96
+ function PresetPicker() {
97
+ const eq = useEqualizerSettings()
98
+ if (!eq) return null
99
+ return (
100
+ <View>
101
+ {eq.presets.map((preset) => (
102
+ <Button
103
+ key={preset}
104
+ title={preset}
105
+ onPress={() => setEqualizerPreset(preset)}
106
+ />
107
+ ))}
108
+ </View>
109
+ )
110
+ }
111
+ ```
112
+
113
+ After applying a preset, `activePreset` reflects it. Available presets come from
114
+ the device's system equalizer, so the exact list varies by device.
115
+
116
+ ## Custom band levels
117
+
118
+ [`setEqualizerLevels`](/api/features/equalizer/#setequalizerlevels) sets every
119
+ band at once, in **millibels**. The array length **must equal `bandCount`** — a
120
+ mismatched array is ignored — and each value should fall within
121
+ `lowerBandLevelLimit … upperBandLevelLimit`:
122
+
123
+ ```ts
124
+ import { setEqualizerLevels } from 'react-native-audio-browser'
125
+
126
+ // Flatten all bands to 0, then boost the lowest band by 6 dB (600 mB).
127
+ const flat = new Array(eq.bandCount).fill(0)
128
+ flat[0] = 600
129
+ setEqualizerLevels(flat)
130
+ ```
131
+
132
+ Setting custom levels clears `activePreset` (it becomes `undefined`) — you're no
133
+ longer on a named preset. To go back, apply a preset again.
134
+
135
+ Whichever you choose, the settings persist across track and audio-session
136
+ changes: a preset wins over custom levels, and the enabled state always carries
137
+ over.
138
+
139
+ ## A complete equalizer screen
140
+
141
+ Guard for availability, then render an enable toggle, the device presets, and a
142
+ slider per band:
143
+
144
+ ```tsx
145
+ import { View, Text, Button } from 'react-native'
146
+ import Slider from '@react-native-community/slider'
147
+ import {
148
+ useEqualizerSettings,
149
+ setEqualizerEnabled,
150
+ setEqualizerPreset,
151
+ setEqualizerLevels
152
+ } from 'react-native-audio-browser'
153
+
154
+ // Center frequencies are milliHertz; levels are millibels (1/100 dB).
155
+ const formatHz = (mHz: number) => {
156
+ const hz = mHz / 1000
157
+ if (hz < 1000) return `${hz.toFixed(0)} Hz`
158
+ return `${(hz / 1000).toFixed(hz >= 10000 ? 0 : 1)} kHz`
159
+ }
160
+
161
+ function EqualizerScreen() {
162
+ const eq = useEqualizerSettings()
163
+ if (!eq) return <Text>Equalizer not available</Text>
164
+
165
+ const setBand = (index: number, millibels: number) => {
166
+ const next = [...eq.bandLevels]
167
+ next[index] = millibels
168
+ setEqualizerLevels(next)
169
+ }
170
+
171
+ return (
172
+ <View>
173
+ <Button
174
+ title={eq.enabled ? 'Disable' : 'Enable'}
175
+ onPress={() => setEqualizerEnabled(!eq.enabled)}
176
+ />
177
+
178
+ {eq.presets.map((preset) => (
179
+ <Button
180
+ key={preset}
181
+ title={preset === eq.activePreset ? `• ${preset}` : preset}
182
+ onPress={() => setEqualizerPreset(preset)}
183
+ />
184
+ ))}
185
+
186
+ {eq.bandLevels.map((level, index) => (
187
+ <View key={eq.centerBandFrequencies[index]}>
188
+ <Text>
189
+ {formatHz(eq.centerBandFrequencies[index])}:{' '}
190
+ {(level / 100).toFixed(1)} dB
191
+ </Text>
192
+ <Slider
193
+ minimumValue={eq.lowerBandLevelLimit}
194
+ maximumValue={eq.upperBandLevelLimit}
195
+ value={level}
196
+ // Commit on release; onValueChange fires continuously.
197
+ onSlidingComplete={(millibels) => setBand(index, millibels)}
198
+ />
199
+ </View>
200
+ ))}
201
+ </View>
202
+ )
203
+ }
204
+ ```
205
+
206
+ Note: `@react-native-community/slider`'s `value` is the _initial_ value only —
207
+ the slider keeps its own state after mounting. That's fine here, but if you want
208
+ the thumbs to jump when a preset is applied, give each `Slider` a
209
+ `key={eq.activePreset}` so it remounts with the new levels.
210
+
211
+ ## A note on units
212
+
213
+ The system equalizer works in "milli" units, so convert for display:
214
+
215
+ - **Levels** (`bandLevels`, the limits, and what you pass to
216
+ `setEqualizerLevels`) are in **millibels** — hundredths of a decibel. `600`
217
+ mB = 6 dB; divide by 100 for dB.
218
+ - **Center frequencies** (`centerBandFrequencies`) are in **milliHertz**.
219
+ `60000` = 60 Hz; divide by 1000 for Hz.
220
+
221
+ ## API summary
222
+
223
+ | API | Purpose |
224
+ | --------------------------------------------------- | --------------------------------------------- |
225
+ | `useEqualizerSettings()` / `getEqualizerSettings()` | Read settings (`undefined` if unavailable). |
226
+ | `onEqualizerChanged` | Subscribe to settings changes outside React. |
227
+ | `setEqualizerEnabled(bool)` | Turn the effect on or off. |
228
+ | `setEqualizerPreset(name)` | Apply a preset from `settings.presets`. |
229
+ | `setEqualizerLevels(millibels[])` | Set all bands; length must equal `bandCount`. |
230
+
231
+ All are **Android-only** — no-ops / `undefined` on iOS.