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.
- package/README.md +14 -4
- package/android/build.gradle +20 -1
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +115 -26
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +262 -188
- package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +23 -3
- package/android/src/main/java/com/audiobrowser/browser/InertStyleDiagnostic.kt +267 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +95 -58
- package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +68 -26
- package/android/src/main/java/com/audiobrowser/browser/StyleResolver.kt +60 -0
- package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +19 -7
- package/android/src/main/java/com/audiobrowser/extension/TappedTrack.kt +20 -0
- package/android/src/main/java/com/audiobrowser/extension/TrackIdentity.kt +15 -0
- package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +1 -1
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +120 -67
- package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +21 -24
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +109 -74
- package/android/src/main/java/com/audiobrowser/player/Player.kt +51 -30
- package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +2 -15
- package/android/src/main/java/com/audiobrowser/player/ShuffleOrderLedBy.kt +30 -0
- package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +44 -40
- package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +28 -23
- package/android/src/main/java/com/audiobrowser/util/StyleWire.kt +108 -0
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +52 -53
- package/android/src/test/java/com/audiobrowser/TestFixtures.kt +74 -41
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerFavoritesTest.kt +153 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +229 -50
- package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +38 -0
- package/android/src/test/java/com/audiobrowser/browser/InertStyleDiagnosticTest.kt +277 -0
- package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +1 -1
- package/android/src/test/java/com/audiobrowser/browser/JsonStyleTest.kt +147 -0
- package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +128 -53
- package/android/src/test/java/com/audiobrowser/browser/StyleResolverTest.kt +154 -0
- package/android/src/test/java/com/audiobrowser/extension/TappedTrackTest.kt +43 -0
- package/android/src/test/java/com/audiobrowser/extension/TrackIdentityTest.kt +41 -0
- package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +1 -2
- package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +42 -2
- package/android/src/test/java/com/audiobrowser/player/PlaybackStateStoreTrackJsonTest.kt +55 -0
- package/android/src/test/java/com/audiobrowser/player/ShuffleOrderLedByTest.kt +79 -0
- package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +41 -16
- package/android/src/test/java/com/audiobrowser/util/MediaExtrasBuilderTest.kt +161 -0
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryMediaIdTest.kt +7 -7
- package/ios/Browser/BrowserConfig.swift +102 -5
- package/ios/Browser/BrowserManager+URLResolution.swift +18 -14
- package/ios/Browser/BrowserManager.swift +229 -180
- package/ios/Browser/BrowserPathHelper.swift +44 -44
- package/ios/Browser/InertStyleDiagnostic.swift +279 -0
- package/ios/Browser/JsonModels.swift +258 -106
- package/ios/Browser/SearchDrillIn.swift +6 -6
- package/ios/Browser/SectionPresentation.swift +64 -0
- package/ios/Browser/SectionScope.swift +58 -24
- package/ios/Browser/StyleResolver.swift +58 -0
- package/ios/Browser/TabBarEntries.swift +9 -3
- package/ios/Browser/TrackIdTemplate.swift +37 -0
- package/ios/CarPlay/CarPlayArtworkResolver.swift +8 -7
- package/ios/CarPlay/CarPlayController.swift +227 -85
- package/ios/CarPlay/CarPlayImageLoader.swift +38 -18
- package/ios/CarPlay/CarPlayListItemFactory.swift +289 -84
- package/ios/CarPlay/CarPlayNowPlayingManager.swift +15 -12
- package/ios/Extension/Capability+RemoteCommand.swift +1 -1
- package/ios/Extension/PlayerCapabilities+Favorite.swift +1 -15
- package/ios/Extension/ResolvedTrack+Copying.swift +11 -15
- package/ios/Extension/Section+Copying.swift +31 -0
- package/ios/Extension/Track+Copying.swift +6 -12
- package/ios/Extension/Track+Identity.swift +18 -0
- package/ios/Extension/UIApplication+ActiveScene.swift +27 -0
- package/ios/Http/HttpClient.swift +8 -2
- package/ios/HybridAudioBrowser.swift +166 -45
- package/ios/Model/NitroTypeStubs.swift +106 -21
- package/ios/Model/PlayerUpdateOptions.swift +7 -0
- package/ios/Player/MediaIntentCriteria.swift +13 -5
- package/ios/Player/MediaLoader.swift +33 -9
- package/ios/Player/NowPlayingUpdater.swift +54 -6
- package/ios/Player/PlaybackCoordinator.swift +13 -6
- package/ios/Player/PlaybackTimer.swift +8 -2
- package/ios/Player/QueueManager.swift +36 -10
- package/ios/Player/RetryManager.swift +4 -3
- package/ios/Player/ShuffleOrder.swift +23 -0
- package/ios/Player/SleepTimerHandling.swift +13 -0
- package/ios/RemoteCommand/RemoteCommandController.swift +53 -18
- package/ios/Tests/BrowserPathHelperTests.swift +50 -20
- package/ios/Tests/CarPlayArtworkResolverTests.swift +24 -41
- package/ios/Tests/InertStyleDiagnosticTests.swift +200 -0
- package/ios/Tests/JsonModelsTests.swift +150 -1
- package/ios/Tests/PlaybackStateStoreTests.swift +4 -3
- package/ios/Tests/QueueManagerTests.swift +72 -6
- package/ios/Tests/RemoteCommandControllerTests.swift +16 -0
- package/ios/Tests/ResolvedTrackCopyingTests.swift +37 -35
- package/ios/Tests/SearchDrillInTests.swift +16 -16
- package/ios/Tests/SectionPresentationTests.swift +90 -0
- package/ios/Tests/SectionScopeTests.swift +87 -55
- package/ios/Tests/StyleResolverTests.swift +127 -0
- package/ios/Tests/Support/TestTypes.swift +7 -0
- package/ios/Tests/TabBarEntriesTests.swift +18 -18
- package/ios/Tests/TrackIdTemplateTests.swift +67 -0
- package/ios/Tests/TrackIdentityTests.swift +20 -0
- package/ios/Tests/TrackSelectorTests.swift +168 -33
- package/ios/TrackPlayer.swift +57 -34
- package/ios/TrackSelector.swift +45 -30
- package/ios/Util/ArtworkImageFetcher.swift +16 -1
- package/ios/Util/NetworkMonitor.swift +43 -26
- package/ios/Util/SFSymbolRenderer.swift +24 -2
- package/ios/Util/SVGProcessor.swift +9 -2
- package/lib/commonjs/AudioBrowser.js +11 -0
- package/lib/commonjs/AudioBrowser.js.map +1 -1
- package/lib/commonjs/features/browser-config.js +11 -8
- package/lib/commonjs/features/browser-config.js.map +1 -1
- package/lib/commonjs/features/browser.js +2 -2
- package/lib/commonjs/features/favorites.js +13 -10
- package/lib/commonjs/features/favorites.js.map +1 -1
- package/lib/commonjs/features/playback/controls.js +4 -2
- package/lib/commonjs/features/playback/controls.js.map +1 -1
- package/lib/commonjs/features/playback/progress.js +2 -1
- package/lib/commonjs/features/playback/progress.js.map +1 -1
- package/lib/commonjs/features/playback/rate.js +8 -1
- package/lib/commonjs/features/playback/rate.js.map +1 -1
- package/lib/commonjs/features/playback/state.js +2 -3
- package/lib/commonjs/features/playback/state.js.map +1 -1
- package/lib/commonjs/features/player/options.js.map +1 -1
- package/lib/commonjs/features/player/setup.js +3 -1
- package/lib/commonjs/features/player/setup.js.map +1 -1
- package/lib/commonjs/features/player/validateOptions.js +2 -0
- package/lib/commonjs/features/player/validateOptions.js.map +1 -1
- package/lib/commonjs/features/queue/activeTrack.js +14 -3
- package/lib/commonjs/features/queue/activeTrack.js.map +1 -1
- package/lib/commonjs/features/queue/queue.js +11 -4
- package/lib/commonjs/features/queue/queue.js.map +1 -1
- package/lib/commonjs/utils/LazyNativeEmitter.js +21 -10
- package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/commonjs/utils/NativeUpdatedValue.js +31 -13
- package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/commonjs/utils/getTrackIdentity.js +24 -0
- package/lib/commonjs/utils/getTrackIdentity.js.map +1 -0
- package/lib/commonjs/utils/useNativeValueRefreshedBy.js +33 -0
- package/lib/commonjs/utils/useNativeValueRefreshedBy.js.map +1 -0
- package/lib/commonjs/web/NativeAudioBrowser.js +32 -24
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/QueueManager.js +14 -0
- package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +1 -1
- package/lib/commonjs/web/browser/BrowserManager.js +144 -87
- package/lib/commonjs/web/browser/BrowserManager.js.map +1 -1
- package/lib/commonjs/web/browser/FavoriteManager.js +30 -21
- package/lib/commonjs/web/browser/FavoriteManager.js.map +1 -1
- package/lib/commonjs/web/browser/assertBrowsePageShape.js +2 -2
- package/lib/commonjs/web/browser/assertBrowsePageShape.js.map +1 -1
- package/lib/commonjs/web/browser/classifyTrackNavigation.js +9 -9
- package/lib/commonjs/web/browser/classifyTrackNavigation.js.map +1 -1
- package/lib/commonjs/web/browser/sections.js +89 -0
- package/lib/commonjs/web/browser/sections.js.map +1 -0
- package/lib/commonjs/web/player/NowPlayingManager.js +4 -3
- package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -1
- package/lib/commonjs/web/util/BrowserPathHelper.js +56 -11
- package/lib/commonjs/web/util/BrowserPathHelper.js.map +1 -1
- package/lib/module/AudioBrowser.js +1 -0
- package/lib/module/AudioBrowser.js.map +1 -1
- package/lib/module/features/browser-config.js +11 -8
- package/lib/module/features/browser-config.js.map +1 -1
- package/lib/module/features/browser.js +2 -2
- package/lib/module/features/favorites.js +13 -10
- package/lib/module/features/favorites.js.map +1 -1
- package/lib/module/features/playback/controls.js +4 -2
- package/lib/module/features/playback/controls.js.map +1 -1
- package/lib/module/features/playback/progress.js +2 -1
- package/lib/module/features/playback/progress.js.map +1 -1
- package/lib/module/features/playback/rate.js +8 -1
- package/lib/module/features/playback/rate.js.map +1 -1
- package/lib/module/features/playback/state.js +2 -3
- package/lib/module/features/playback/state.js.map +1 -1
- package/lib/module/features/player/options.js.map +1 -1
- package/lib/module/features/player/setup.js +3 -1
- package/lib/module/features/player/setup.js.map +1 -1
- package/lib/module/features/player/validateOptions.js +2 -0
- package/lib/module/features/player/validateOptions.js.map +1 -1
- package/lib/module/features/queue/activeTrack.js +14 -3
- package/lib/module/features/queue/activeTrack.js.map +1 -1
- package/lib/module/features/queue/queue.js +11 -4
- package/lib/module/features/queue/queue.js.map +1 -1
- package/lib/module/utils/LazyNativeEmitter.js +21 -10
- package/lib/module/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/module/utils/NativeUpdatedValue.js +31 -13
- package/lib/module/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/module/utils/getTrackIdentity.js +20 -0
- package/lib/module/utils/getTrackIdentity.js.map +1 -0
- package/lib/module/utils/useNativeValueRefreshedBy.js +29 -0
- package/lib/module/utils/useNativeValueRefreshedBy.js.map +1 -0
- package/lib/module/web/NativeAudioBrowser.js +32 -24
- package/lib/module/web/NativeAudioBrowser.js.map +1 -1
- package/lib/module/web/TrackPlayer/QueueManager.js +14 -0
- package/lib/module/web/TrackPlayer/QueueManager.js.map +1 -1
- package/lib/module/web/browser/BrowserManager.js +144 -87
- package/lib/module/web/browser/BrowserManager.js.map +1 -1
- package/lib/module/web/browser/FavoriteManager.js +31 -21
- package/lib/module/web/browser/FavoriteManager.js.map +1 -1
- package/lib/module/web/browser/assertBrowsePageShape.js +2 -2
- package/lib/module/web/browser/assertBrowsePageShape.js.map +1 -1
- package/lib/module/web/browser/classifyTrackNavigation.js +9 -9
- package/lib/module/web/browser/classifyTrackNavigation.js.map +1 -1
- package/lib/module/web/browser/sections.js +83 -0
- package/lib/module/web/browser/sections.js.map +1 -0
- package/lib/module/web/player/NowPlayingManager.js +4 -3
- package/lib/module/web/player/NowPlayingManager.js.map +1 -1
- package/lib/module/web/util/BrowserPathHelper.js +56 -11
- package/lib/module/web/util/BrowserPathHelper.js.map +1 -1
- package/lib/typescript/src/AudioBrowser.d.ts +1 -0
- package/lib/typescript/src/AudioBrowser.d.ts.map +1 -1
- package/lib/typescript/src/features/browser-config.d.ts.map +1 -1
- package/lib/typescript/src/features/browser.d.ts +2 -2
- package/lib/typescript/src/features/favorites.d.ts +13 -10
- package/lib/typescript/src/features/favorites.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/controls.d.ts +4 -2
- package/lib/typescript/src/features/playback/controls.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/progress.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/rate.d.ts +8 -1
- package/lib/typescript/src/features/playback/rate.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/state.d.ts +2 -3
- package/lib/typescript/src/features/playback/state.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts +1 -1
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts.map +1 -1
- package/lib/typescript/src/features/player/options.d.ts +21 -19
- package/lib/typescript/src/features/player/options.d.ts.map +1 -1
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
- package/lib/typescript/src/features/player/validateOptions.d.ts +1 -8
- package/lib/typescript/src/features/player/validateOptions.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/activeTrack.d.ts +8 -1
- package/lib/typescript/src/features/queue/activeTrack.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/queue.d.ts +5 -2
- package/lib/typescript/src/features/queue/queue.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-native.d.ts +2 -2
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-nodes.d.ts +361 -126
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
- package/lib/typescript/src/types/browser.d.ts +33 -53
- package/lib/typescript/src/types/browser.d.ts.map +1 -1
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +16 -17
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -1
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +24 -19
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -1
- package/lib/typescript/src/utils/getTrackIdentity.d.ts +18 -0
- package/lib/typescript/src/utils/getTrackIdentity.d.ts.map +1 -0
- package/lib/typescript/src/utils/useNativeValueRefreshedBy.d.ts +21 -0
- package/lib/typescript/src/utils/useNativeValueRefreshedBy.d.ts.map +1 -0
- package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +0 -1
- package/nitrogen/generated/android/c++/{JFavoritesMatchMode.hpp → JArtworkRendering.hpp} +15 -15
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +8 -3
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +16 -4
- package/nitrogen/generated/android/c++/JCarPlayPlayingIndicatorLocation.hpp +58 -0
- package/nitrogen/generated/android/c++/JCardImage.hpp +58 -0
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +8 -2
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +8 -2
- 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
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +2 -5
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +15 -3
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +8 -2
- package/nitrogen/generated/android/c++/JGridTile.hpp +61 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +33 -14
- package/nitrogen/generated/android/c++/JIOSOptions.hpp +9 -3
- package/nitrogen/generated/android/c++/JImageShape.hpp +58 -0
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +8 -3
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +22 -10
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +14 -2
- package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +10 -7
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +2 -5
- package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +9 -3
- package/nitrogen/generated/android/c++/JOptions.hpp +2 -5
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +5 -11
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +55 -51
- package/nitrogen/generated/android/c++/JSection.hpp +120 -0
- package/nitrogen/generated/android/c++/JSectionStyle.hpp +96 -0
- package/nitrogen/generated/android/c++/JStyleDisplay.hpp +58 -0
- package/nitrogen/generated/android/c++/JTrack.hpp +23 -48
- package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +8 -2
- package/nitrogen/generated/android/c++/JTrackStyle.hpp +46 -18
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +16 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoritesMatchMode.kt → ArtworkRendering.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayPlayingIndicatorLocation.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CardImage.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/GridTile.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSOptions.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageShape.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +12 -18
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoriteConfig.kt → Section.kt} +18 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SectionStyle.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StyleDisplay.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +6 -15
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +35 -5
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +158 -82
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +25 -10
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +25 -10
- package/nitrogen/generated/ios/swift/ArtworkRendering.swift +40 -0
- package/nitrogen/generated/ios/swift/CarPlayPlayingIndicatorLocation.swift +40 -0
- package/nitrogen/generated/ios/swift/CardImage.swift +40 -0
- package/nitrogen/generated/ios/swift/GridTile.swift +44 -0
- package/nitrogen/generated/ios/swift/IOSOptions.swift +7 -2
- package/nitrogen/generated/ios/swift/ImageShape.swift +40 -0
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +5 -5
- package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +12 -1
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +8 -27
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +54 -83
- package/nitrogen/generated/ios/swift/Section.swift +100 -0
- package/nitrogen/generated/ios/swift/SectionStyle.swift +133 -0
- package/nitrogen/generated/ios/swift/StyleDisplay.swift +40 -0
- package/nitrogen/generated/ios/swift/Track.swift +20 -73
- package/nitrogen/generated/ios/swift/TrackStyle.swift +86 -22
- package/nitrogen/generated/shared/c++/{FavoritesMatchMode.hpp → ArtworkRendering.hpp} +17 -17
- package/nitrogen/generated/shared/c++/CarPlayPlayingIndicatorLocation.hpp +76 -0
- package/nitrogen/generated/shared/c++/CardImage.hpp +76 -0
- package/nitrogen/generated/shared/c++/GridTile.hpp +80 -0
- package/nitrogen/generated/shared/c++/IOSOptions.hpp +9 -2
- package/nitrogen/generated/shared/c++/ImageShape.hpp +76 -0
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +6 -6
- package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +9 -2
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +6 -9
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +30 -38
- package/nitrogen/generated/shared/c++/Section.hpp +106 -0
- package/nitrogen/generated/shared/c++/SectionStyle.hpp +126 -0
- package/nitrogen/generated/shared/c++/StyleDisplay.hpp +76 -0
- package/nitrogen/generated/shared/c++/Track.hpp +15 -31
- package/nitrogen/generated/shared/c++/TrackStyle.hpp +73 -34
- package/package.json +7 -2
- package/src/AudioBrowser.ts +1 -0
- package/src/features/browser-config.test.ts +21 -6
- package/src/features/browser-config.ts +11 -8
- package/src/features/browser.test.ts +1 -1
- package/src/features/browser.ts +2 -2
- package/src/features/favorites.ts +13 -10
- package/src/features/hook-wiring.test.ts +63 -15
- package/src/features/playback/controls.ts +4 -2
- package/src/features/playback/progress.ts +2 -1
- package/src/features/playback/rate.ts +8 -1
- package/src/features/playback/state.ts +2 -3
- package/src/features/playback/trackPlaybackTime.ts +1 -1
- package/src/features/player/options.ts +27 -19
- package/src/features/player/setup.test.ts +12 -3
- package/src/features/player/setup.ts +3 -1
- package/src/features/player/validateOptions.ts +2 -0
- package/src/features/queue/activeTrack.ts +14 -3
- package/src/features/queue/queue.ts +11 -4
- package/src/nitro-stub-drift.test.ts +40 -0
- package/src/public-surface.test.ts +40 -0
- package/src/specs/audio-browser.nitro.ts +4 -3
- package/src/style-resolution.test.ts +210 -0
- package/src/types/browser-native.ts +2 -2
- package/src/types/browser-nodes.ts +377 -135
- package/src/types/browser.ts +34 -55
- package/src/utils/LazyNativeEmitter.ts +20 -10
- package/src/utils/NativeUpdatedValue.ts +29 -13
- package/src/utils/getTrackIdentity.ts +20 -0
- package/src/utils/useNativeValueRefreshedBy.ts +38 -0
- package/src/web/NativeAudioBrowser.ts +37 -22
- package/src/web/TrackPlayer/QueueManager.test.ts +29 -0
- package/src/web/TrackPlayer/QueueManager.ts +14 -0
- package/src/web/browser/BrowserManager.ts +176 -95
- package/src/web/browser/FavoriteManager.test.ts +84 -0
- package/src/web/browser/FavoriteManager.ts +28 -23
- package/src/web/browser/assertBrowsePageShape.test.ts +1 -1
- package/src/web/browser/assertBrowsePageShape.ts +5 -3
- package/src/web/browser/classifyTrackNavigation.test.ts +10 -8
- package/src/web/browser/classifyTrackNavigation.ts +9 -9
- package/src/web/browser/parseSearchResponse.test.ts +8 -2
- package/src/web/browser/sections.test.ts +91 -0
- package/src/web/browser/sections.ts +72 -0
- package/src/web/player/NowPlayingManager.ts +4 -3
- package/src/web/util/BrowserPathHelper.test.ts +52 -0
- package/src/web/util/BrowserPathHelper.ts +61 -13
- package/website/guide/android-auto.md +114 -0
- package/website/guide/android-certificates.md +409 -0
- package/website/guide/artwork.md +255 -0
- package/website/guide/audio-output.md +135 -0
- package/website/guide/automotive.md +86 -0
- package/website/guide/basic-usage.md +151 -0
- package/website/guide/battery.md +115 -0
- package/website/guide/browser.md +581 -0
- package/website/guide/carplay.md +620 -0
- package/website/guide/configuration.md +173 -0
- package/website/guide/equalizer.md +231 -0
- package/website/guide/errors.md +310 -0
- package/website/guide/favorites.md +154 -0
- package/website/guide/gate.md +143 -0
- package/website/guide/getting-started.md +46 -0
- package/website/guide/hooks.md +238 -0
- package/website/guide/live-streams.md +125 -0
- package/website/guide/metadata.md +239 -0
- package/website/guide/migrating-from-track-player.md +244 -0
- package/website/guide/native-callback-fetch.md +127 -0
- package/website/guide/network.md +86 -0
- package/website/guide/now-playing.md +175 -0
- package/website/guide/playback.md +328 -0
- package/website/guide/queue.md +300 -0
- package/website/guide/remote-controls.md +256 -0
- package/website/guide/search.md +255 -0
- package/website/guide/sleep-timer.md +268 -0
- package/website/guide/track.md +246 -0
- package/ios/CarPlay/ImageRowItem+CarPlay.swift +0 -19
- package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +0 -58
- package/nitrogen/generated/android/c++/JImageRowItem.hpp +0 -105
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.hpp +0 -71
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +0 -68
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_FavoriteConfig.kt +0 -53
- package/nitrogen/generated/ios/swift/FavoriteConfig.swift +0 -29
- package/nitrogen/generated/ios/swift/FavoritesMatchMode.swift +0 -40
- package/nitrogen/generated/ios/swift/ImageRowItem.swift +0 -195
- package/nitrogen/generated/ios/swift/Variant_Bool_FavoriteConfig.swift +0 -18
- package/nitrogen/generated/shared/c++/FavoriteConfig.hpp +0 -84
- 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.
|