react-native-nitro-player 0.3.0-alpha.9 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +444 -4
- package/android/build.gradle +4 -1
- package/android/src/main/AndroidManifest.xml +16 -1
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAndroidAutoMediaLibrary.kt +2 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAudioDevices.kt +8 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridDownloadManager.kt +225 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridEqualizer.kt +105 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridPlayerQueue.kt +6 -6
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +37 -12
- package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +970 -213
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadDatabase.kt +475 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadFileManager.kt +159 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadManagerCore.kt +489 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadWorker.kt +209 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/equalizer/EqualizerCore.kt +486 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaBrowserService.kt +3 -1
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaSessionManager.kt +14 -6
- package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/PlaylistManager.kt +27 -0
- package/ios/HybridDownloadManager.swift +226 -0
- package/ios/HybridEqualizer.swift +111 -0
- package/ios/HybridTrackPlayer.swift +36 -8
- package/ios/core/TrackPlayerCore.swift +998 -276
- package/ios/download/DownloadDatabase.swift +493 -0
- package/ios/download/DownloadFileManager.swift +241 -0
- package/ios/download/DownloadManagerCore.swift +923 -0
- package/ios/equalizer/EqualizerCore.swift +685 -0
- package/ios/media/MediaSessionManager.swift +40 -28
- package/ios/playlist/PlaylistManager.swift +40 -9
- package/ios/queue/HybridPlayerQueue.swift +33 -13
- package/lib/hooks/downloadCallbackManager.d.ts +36 -0
- package/lib/hooks/downloadCallbackManager.js +108 -0
- package/lib/hooks/equalizerCallbackManager.d.ts +37 -0
- package/lib/hooks/equalizerCallbackManager.js +109 -0
- package/lib/hooks/index.d.ts +16 -0
- package/lib/hooks/index.js +10 -0
- package/lib/hooks/useActualQueue.d.ts +48 -0
- package/lib/hooks/useActualQueue.js +98 -0
- package/lib/hooks/useDownloadActions.d.ts +26 -0
- package/lib/hooks/useDownloadActions.js +117 -0
- package/lib/hooks/useDownloadProgress.d.ts +25 -0
- package/lib/hooks/useDownloadProgress.js +79 -0
- package/lib/hooks/useDownloadStorage.d.ts +19 -0
- package/lib/hooks/useDownloadStorage.js +60 -0
- package/lib/hooks/useDownloadedTracks.d.ts +25 -0
- package/lib/hooks/useDownloadedTracks.js +69 -0
- package/lib/hooks/useEqualizer.d.ts +25 -0
- package/lib/hooks/useEqualizer.js +124 -0
- package/lib/hooks/useEqualizerPresets.d.ts +22 -0
- package/lib/hooks/useEqualizerPresets.js +96 -0
- package/lib/hooks/useNowPlaying.js +3 -2
- package/lib/hooks/useOnChangeTrack.js +15 -12
- package/lib/hooks/useOnPlaybackStateChange.js +16 -13
- package/lib/hooks/usePlaylist.d.ts +48 -0
- package/lib/hooks/usePlaylist.js +136 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.js +6 -0
- package/lib/specs/DownloadManager.nitro.d.ts +152 -0
- package/lib/specs/DownloadManager.nitro.js +1 -0
- package/lib/specs/Equalizer.nitro.d.ts +43 -0
- package/lib/specs/Equalizer.nitro.js +1 -0
- package/lib/specs/TrackPlayer.nitro.d.ts +6 -2
- package/lib/types/DownloadTypes.d.ts +110 -0
- package/lib/types/DownloadTypes.js +1 -0
- package/lib/types/EqualizerTypes.d.ts +52 -0
- package/lib/types/EqualizerTypes.js +1 -0
- package/lib/types/PlayerQueue.d.ts +4 -0
- package/nitro.json +8 -0
- package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +10 -1
- package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +32 -2
- package/nitrogen/generated/android/c++/JCurrentPlayingType.hpp +65 -0
- package/nitrogen/generated/android/c++/JDownloadConfig.hpp +92 -0
- package/nitrogen/generated/android/c++/JDownloadError.hpp +71 -0
- package/nitrogen/generated/android/c++/JDownloadErrorReason.hpp +74 -0
- package/nitrogen/generated/android/c++/JDownloadProgress.hpp +79 -0
- package/nitrogen/generated/android/c++/JDownloadQueueStatus.hpp +81 -0
- package/nitrogen/generated/android/c++/JDownloadState.hpp +71 -0
- package/nitrogen/generated/android/c++/JDownloadStorageInfo.hpp +73 -0
- package/nitrogen/generated/android/c++/JDownloadTask.hpp +108 -0
- package/nitrogen/generated/android/c++/JDownloadedPlaylist.hpp +111 -0
- package/nitrogen/generated/android/c++/JDownloadedTrack.hpp +92 -0
- package/nitrogen/generated/android/c++/JEqualizerBand.hpp +69 -0
- package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +78 -0
- package/nitrogen/generated/android/c++/JEqualizerState.hpp +91 -0
- package/nitrogen/generated/android/c++/JFunc_void_DownloadProgress.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_DownloadedTrack.hpp +89 -0
- package/nitrogen/generated/android/c++/JFunc_void_TrackItem_std__optional_Reason_.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__std__string__.hpp +81 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_Playlist_std__optional_QueueOperation_.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError_.hpp +83 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +97 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Playlist__std__optional_QueueOperation_.hpp +2 -0
- package/nitrogen/generated/android/c++/JGainRange.hpp +61 -0
- package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.cpp +470 -0
- package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.hpp +99 -0
- package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +204 -0
- package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +82 -0
- package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.cpp +2 -0
- package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +117 -15
- package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +6 -2
- package/nitrogen/generated/android/c++/JPlaybackSource.hpp +62 -0
- package/nitrogen/generated/android/c++/JPlayerState.hpp +11 -3
- package/nitrogen/generated/android/c++/JPlaylist.hpp +2 -0
- package/nitrogen/generated/android/c++/JPresetType.hpp +59 -0
- package/nitrogen/generated/android/c++/JStorageLocation.hpp +59 -0
- package/nitrogen/generated/android/c++/JTrackItem.hpp +9 -3
- package/nitrogen/generated/android/c++/JTrackPlayerState.hpp +3 -3
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.hpp +74 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.hpp +84 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.hpp +85 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.hpp +80 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.hpp +2 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.hpp +2 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/CurrentPlayingType.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadConfig.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadError.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadErrorReason.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadProgress.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadQueueStatus.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadState.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadStorageInfo.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadTask.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedPlaylist.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedTrack.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerBand.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerPreset.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerState.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadProgress.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadedTrack.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__optional_std__variant_nitro__NullType__std__string__.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/GainRange.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridDownloadManagerSpec.kt +210 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridEqualizerSpec.kt +141 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +19 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlaybackSource.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerState.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PresetType.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/StorageLocation.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackItem.kt +7 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackPlayerState.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_Double.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadError.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadTask.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedPlaylist.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedTrack.kt +59 -0
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +138 -8
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +1046 -121
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +66 -0
- package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +16 -0
- package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +30 -0
- package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.hpp +386 -0
- package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +223 -0
- package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.hpp +1 -0
- package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +46 -6
- package/nitrogen/generated/ios/swift/CurrentPlayingType.swift +48 -0
- package/nitrogen/generated/ios/swift/DownloadConfig.swift +270 -0
- package/nitrogen/generated/ios/swift/DownloadError.swift +69 -0
- package/nitrogen/generated/ios/swift/DownloadErrorReason.swift +60 -0
- package/nitrogen/generated/ios/swift/DownloadProgress.swift +91 -0
- package/nitrogen/generated/ios/swift/DownloadQueueStatus.swift +102 -0
- package/nitrogen/generated/ios/swift/DownloadState.swift +56 -0
- package/nitrogen/generated/ios/swift/DownloadStorageInfo.swift +80 -0
- package/nitrogen/generated/ios/swift/DownloadTask.swift +315 -0
- package/nitrogen/generated/ios/swift/DownloadedPlaylist.swift +103 -0
- package/nitrogen/generated/ios/swift/DownloadedTrack.swift +147 -0
- package/nitrogen/generated/ios/swift/EqualizerBand.swift +69 -0
- package/nitrogen/generated/ios/swift/EqualizerPreset.swift +70 -0
- package/nitrogen/generated/ios/swift/EqualizerState.swift +115 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_DownloadProgress.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_DownloadStorageInfo.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_DownloadedTrack.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_PlayerState.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__std__string__.swift +66 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +47 -0
- package/nitrogen/generated/ios/swift/GainRange.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec.swift +90 -0
- package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec_cxx.swift +705 -0
- package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +73 -0
- package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +396 -0
- package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +6 -2
- package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +105 -8
- package/nitrogen/generated/ios/swift/PlaybackSource.swift +44 -0
- package/nitrogen/generated/ios/swift/PlayerState.swift +13 -2
- package/nitrogen/generated/ios/swift/PresetType.swift +40 -0
- package/nitrogen/generated/ios/swift/StorageLocation.swift +40 -0
- package/nitrogen/generated/ios/swift/TrackItem.swift +31 -1
- package/nitrogen/generated/ios/swift/TrackPlayerState.swift +4 -4
- package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadError.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadTask.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedPlaylist.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedTrack.swift +18 -0
- package/nitrogen/generated/shared/c++/CurrentPlayingType.hpp +84 -0
- package/nitrogen/generated/shared/c++/DownloadConfig.hpp +108 -0
- package/nitrogen/generated/shared/c++/DownloadError.hpp +89 -0
- package/nitrogen/generated/shared/c++/DownloadErrorReason.hpp +96 -0
- package/nitrogen/generated/shared/c++/DownloadProgress.hpp +97 -0
- package/nitrogen/generated/shared/c++/DownloadQueueStatus.hpp +99 -0
- package/nitrogen/generated/shared/c++/DownloadState.hpp +92 -0
- package/nitrogen/generated/shared/c++/DownloadStorageInfo.hpp +91 -0
- package/nitrogen/generated/shared/c++/DownloadTask.hpp +122 -0
- package/nitrogen/generated/shared/c++/DownloadedPlaylist.hpp +101 -0
- package/nitrogen/generated/shared/c++/DownloadedTrack.hpp +107 -0
- package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
- package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +86 -0
- package/nitrogen/generated/shared/c++/EqualizerState.hpp +89 -0
- package/nitrogen/generated/shared/c++/GainRange.hpp +79 -0
- package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.cpp +55 -0
- package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.hpp +134 -0
- package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +38 -0
- package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +95 -0
- package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +4 -0
- package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +11 -5
- package/nitrogen/generated/shared/c++/PlaybackSource.hpp +80 -0
- package/nitrogen/generated/shared/c++/PlayerState.hpp +9 -2
- package/nitrogen/generated/shared/c++/PresetType.hpp +76 -0
- package/nitrogen/generated/shared/c++/StorageLocation.hpp +76 -0
- package/nitrogen/generated/shared/c++/TrackItem.hpp +7 -2
- package/nitrogen/generated/shared/c++/TrackPlayerState.hpp +5 -5
- package/package.json +1 -1
- package/src/hooks/downloadCallbackManager.ts +149 -0
- package/src/hooks/equalizerCallbackManager.ts +138 -0
- package/src/hooks/index.ts +23 -0
- package/src/hooks/useActualQueue.ts +116 -0
- package/src/hooks/useDownloadActions.ts +179 -0
- package/src/hooks/useDownloadProgress.ts +126 -0
- package/src/hooks/useDownloadStorage.ts +84 -0
- package/src/hooks/useDownloadedTracks.ts +138 -0
- package/src/hooks/useEqualizer.ts +173 -0
- package/src/hooks/useEqualizerPresets.ts +140 -0
- package/src/hooks/useNowPlaying.ts +3 -2
- package/src/hooks/useOnChangeTrack.ts +15 -11
- package/src/hooks/useOnPlaybackStateChange.ts +19 -15
- package/src/hooks/usePlaylist.ts +161 -0
- package/src/index.ts +12 -0
- package/src/specs/DownloadManager.nitro.ts +203 -0
- package/src/specs/Equalizer.nitro.ts +69 -0
- package/src/specs/TrackPlayer.nitro.ts +6 -2
- package/src/types/DownloadTypes.ts +135 -0
- package/src/types/EqualizerTypes.ts +72 -0
- package/src/types/PlayerQueue.ts +9 -0
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
package com.margelo.nitro.nitroplayer.equalizer
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.content.SharedPreferences
|
|
5
|
+
import android.media.audiofx.Equalizer
|
|
6
|
+
import android.util.Log
|
|
7
|
+
import com.margelo.nitro.core.NullType
|
|
8
|
+
import com.margelo.nitro.nitroplayer.EqualizerBand
|
|
9
|
+
import com.margelo.nitro.nitroplayer.EqualizerPreset
|
|
10
|
+
import com.margelo.nitro.nitroplayer.EqualizerState
|
|
11
|
+
import com.margelo.nitro.nitroplayer.GainRange
|
|
12
|
+
import com.margelo.nitro.nitroplayer.PresetType
|
|
13
|
+
import com.margelo.nitro.nitroplayer.Variant_NullType_String
|
|
14
|
+
import org.json.JSONArray
|
|
15
|
+
import org.json.JSONObject
|
|
16
|
+
import java.lang.ref.WeakReference
|
|
17
|
+
import java.util.Collections
|
|
18
|
+
|
|
19
|
+
class EqualizerCore private constructor(
|
|
20
|
+
private val context: Context,
|
|
21
|
+
) {
|
|
22
|
+
private var equalizer: Equalizer? = null
|
|
23
|
+
private var audioSessionId: Int = 0
|
|
24
|
+
private var isUsingFallbackSession: Boolean = false // Track if using fallback session 0
|
|
25
|
+
private var isEqualizerEnabled: Boolean = false
|
|
26
|
+
private var currentPresetName: String? = null
|
|
27
|
+
|
|
28
|
+
// Standard 5-band frequencies: 60Hz, 230Hz, 910Hz, 3.6kHz, 14kHz
|
|
29
|
+
private val targetFrequencies = intArrayOf(60000, 230000, 910000, 3600000, 14000000) // milliHz
|
|
30
|
+
private val frequencyLabels = arrayOf("60 Hz", "230 Hz", "910 Hz", "3.6 kHz", "14 kHz")
|
|
31
|
+
private val frequencies = intArrayOf(60, 230, 910, 3600, 14000)
|
|
32
|
+
private var bandMapping = IntArray(5) // Maps our 5 bands to actual EQ bands
|
|
33
|
+
|
|
34
|
+
private val prefs: SharedPreferences =
|
|
35
|
+
context.getSharedPreferences("equalizer_settings", Context.MODE_PRIVATE)
|
|
36
|
+
|
|
37
|
+
// Weak callback wrapper for auto-cleanup
|
|
38
|
+
private data class WeakCallbackBox<T>(
|
|
39
|
+
private val ownerRef: WeakReference<Any>,
|
|
40
|
+
val callback: T,
|
|
41
|
+
) {
|
|
42
|
+
val isAlive: Boolean get() = ownerRef.get() != null
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Event listeners
|
|
46
|
+
private val onEnabledChangeListeners =
|
|
47
|
+
Collections.synchronizedList(mutableListOf<WeakCallbackBox<(Boolean) -> Unit>>())
|
|
48
|
+
private val onBandChangeListeners =
|
|
49
|
+
Collections.synchronizedList(mutableListOf<WeakCallbackBox<(Array<EqualizerBand>) -> Unit>>())
|
|
50
|
+
private val onPresetChangeListeners =
|
|
51
|
+
Collections.synchronizedList(mutableListOf<WeakCallbackBox<(Variant_NullType_String?) -> Unit>>())
|
|
52
|
+
|
|
53
|
+
companion object {
|
|
54
|
+
private const val TAG = "EqualizerCore"
|
|
55
|
+
|
|
56
|
+
@Volatile
|
|
57
|
+
private var INSTANCE: EqualizerCore? = null
|
|
58
|
+
|
|
59
|
+
fun getInstance(context: Context): EqualizerCore =
|
|
60
|
+
INSTANCE ?: synchronized(this) {
|
|
61
|
+
INSTANCE ?: EqualizerCore(context).also { INSTANCE = it }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Built-in presets: name -> [60Hz, 230Hz, 910Hz, 3.6kHz, 14kHz] in dB
|
|
65
|
+
private val BUILT_IN_PRESETS =
|
|
66
|
+
mapOf(
|
|
67
|
+
"Flat" to doubleArrayOf(0.0, 0.0, 0.0, 0.0, 0.0),
|
|
68
|
+
"Bass Boost" to doubleArrayOf(6.0, 4.0, 0.0, 0.0, 0.0),
|
|
69
|
+
"Bass Reducer" to doubleArrayOf(-6.0, -4.0, 0.0, 0.0, 0.0),
|
|
70
|
+
"Treble Boost" to doubleArrayOf(0.0, 0.0, 0.0, 4.0, 6.0),
|
|
71
|
+
"Treble Reducer" to doubleArrayOf(0.0, 0.0, 0.0, -4.0, -6.0),
|
|
72
|
+
"Vocal Boost" to doubleArrayOf(-2.0, 0.0, 4.0, 2.0, 0.0),
|
|
73
|
+
"Rock" to doubleArrayOf(5.0, 3.0, -1.0, 3.0, 5.0),
|
|
74
|
+
"Pop" to doubleArrayOf(-1.0, 2.0, 4.0, 2.0, -1.0),
|
|
75
|
+
"Jazz" to doubleArrayOf(3.0, 1.0, -2.0, 2.0, 4.0),
|
|
76
|
+
"Classical" to doubleArrayOf(4.0, 2.0, -1.0, 2.0, 3.0),
|
|
77
|
+
"Hip Hop" to doubleArrayOf(6.0, 4.0, 0.0, 1.0, 3.0),
|
|
78
|
+
"Electronic" to doubleArrayOf(5.0, 3.0, 0.0, 2.0, 5.0),
|
|
79
|
+
"Acoustic" to doubleArrayOf(4.0, 2.0, 1.0, 3.0, 3.0),
|
|
80
|
+
"R&B" to doubleArrayOf(3.0, 6.0, 2.0, -1.0, 2.0),
|
|
81
|
+
"Loudness" to doubleArrayOf(6.0, 3.0, -1.0, 3.0, 6.0),
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Initialize equalizer with audio session from ExoPlayer
|
|
87
|
+
* Must be called after TrackPlayerCore is initialized
|
|
88
|
+
*/
|
|
89
|
+
fun initialize(audioSessionId: Int) {
|
|
90
|
+
this.audioSessionId = audioSessionId
|
|
91
|
+
this.isUsingFallbackSession = (audioSessionId == 0)
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
equalizer?.release()
|
|
95
|
+
equalizer =
|
|
96
|
+
Equalizer(0, audioSessionId).apply {
|
|
97
|
+
enabled = false
|
|
98
|
+
}
|
|
99
|
+
setupBandMapping()
|
|
100
|
+
restoreSettings()
|
|
101
|
+
} catch (e: Exception) {
|
|
102
|
+
Log.e(TAG, "Failed to initialize equalizer: ${e.message}")
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Ensure equalizer is initialized, using audio session 0 (global output mix) if needed
|
|
108
|
+
* This allows the equalizer to work even before TrackPlayer is used
|
|
109
|
+
*/
|
|
110
|
+
fun ensureInitialized() {
|
|
111
|
+
if (equalizer == null) {
|
|
112
|
+
initialize(0)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private fun setupBandMapping() {
|
|
117
|
+
val eq = equalizer ?: return
|
|
118
|
+
val numBands = eq.numberOfBands.toInt()
|
|
119
|
+
|
|
120
|
+
// Map each target frequency to the closest available band
|
|
121
|
+
for (i in targetFrequencies.indices) {
|
|
122
|
+
var closestBand = 0
|
|
123
|
+
var closestDiff = Int.MAX_VALUE
|
|
124
|
+
|
|
125
|
+
for (band in 0 until numBands) {
|
|
126
|
+
val bandFreq = eq.getCenterFreq(band.toShort())
|
|
127
|
+
val diff = kotlin.math.abs(bandFreq - targetFrequencies[i])
|
|
128
|
+
if (diff < closestDiff) {
|
|
129
|
+
closestDiff = diff
|
|
130
|
+
closestBand = band
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
bandMapping[i] = closestBand
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
fun setEnabled(enabled: Boolean): Boolean {
|
|
138
|
+
val eq = equalizer ?: return false
|
|
139
|
+
|
|
140
|
+
return try {
|
|
141
|
+
eq.enabled = enabled
|
|
142
|
+
isEqualizerEnabled = enabled
|
|
143
|
+
notifyEnabledChange(enabled)
|
|
144
|
+
saveEnabled(enabled)
|
|
145
|
+
true
|
|
146
|
+
} catch (e: Exception) {
|
|
147
|
+
Log.e(TAG, "Failed to set enabled: ${e.message}")
|
|
148
|
+
false
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
fun isEnabled(): Boolean = isEqualizerEnabled
|
|
153
|
+
|
|
154
|
+
fun getBands(): Array<EqualizerBand> {
|
|
155
|
+
val eq = equalizer ?: return emptyArray()
|
|
156
|
+
|
|
157
|
+
return (0 until 5)
|
|
158
|
+
.map { i ->
|
|
159
|
+
val actualBand = bandMapping[i].toShort()
|
|
160
|
+
val gainMb =
|
|
161
|
+
try {
|
|
162
|
+
eq.getBandLevel(actualBand)
|
|
163
|
+
} catch (e: Exception) {
|
|
164
|
+
0.toShort()
|
|
165
|
+
}
|
|
166
|
+
val gainDb = gainMb / 100.0 // convert millibels to dB
|
|
167
|
+
|
|
168
|
+
EqualizerBand(
|
|
169
|
+
index = i.toDouble(),
|
|
170
|
+
centerFrequency = frequencies[i].toDouble(),
|
|
171
|
+
gainDb = gainDb,
|
|
172
|
+
frequencyLabel = frequencyLabels[i],
|
|
173
|
+
)
|
|
174
|
+
}.toTypedArray()
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
fun setBandGain(
|
|
178
|
+
bandIndex: Int,
|
|
179
|
+
gainDb: Double,
|
|
180
|
+
): Boolean {
|
|
181
|
+
if (bandIndex !in 0..4) return false
|
|
182
|
+
|
|
183
|
+
val eq = equalizer ?: return false
|
|
184
|
+
val clampedGain = gainDb.coerceIn(-12.0, 12.0)
|
|
185
|
+
val gainMb = (clampedGain * 100).toInt().toShort() // convert dB to millibels
|
|
186
|
+
|
|
187
|
+
return try {
|
|
188
|
+
eq.setBandLevel(bandMapping[bandIndex].toShort(), gainMb)
|
|
189
|
+
currentPresetName = null // Custom settings
|
|
190
|
+
notifyBandChange(getBands())
|
|
191
|
+
notifyPresetChange(null)
|
|
192
|
+
saveBandGains(getAllGains())
|
|
193
|
+
saveCurrentPreset(null)
|
|
194
|
+
true
|
|
195
|
+
} catch (e: Exception) {
|
|
196
|
+
false
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
fun setAllBandGains(gains: DoubleArray): Boolean {
|
|
201
|
+
if (gains.size != 5) return false
|
|
202
|
+
|
|
203
|
+
val eq = equalizer ?: return false
|
|
204
|
+
|
|
205
|
+
return try {
|
|
206
|
+
gains.forEachIndexed { i, gain ->
|
|
207
|
+
val clampedGain = gain.coerceIn(-12.0, 12.0)
|
|
208
|
+
val gainMb = (clampedGain * 100).toInt().toShort()
|
|
209
|
+
eq.setBandLevel(bandMapping[i].toShort(), gainMb)
|
|
210
|
+
}
|
|
211
|
+
notifyBandChange(getBands())
|
|
212
|
+
saveBandGains(gains.toList())
|
|
213
|
+
true
|
|
214
|
+
} catch (e: Exception) {
|
|
215
|
+
false
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
private fun getAllGains(): List<Double> {
|
|
220
|
+
val eq = equalizer ?: return listOf(0.0, 0.0, 0.0, 0.0, 0.0)
|
|
221
|
+
return (0 until 5).map { i ->
|
|
222
|
+
try {
|
|
223
|
+
eq.getBandLevel(bandMapping[i].toShort()) / 100.0
|
|
224
|
+
} catch (e: Exception) {
|
|
225
|
+
0.0
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
fun getBandRange(): GainRange {
|
|
231
|
+
val eq = equalizer
|
|
232
|
+
return if (eq != null) {
|
|
233
|
+
val range = eq.bandLevelRange
|
|
234
|
+
GainRange(
|
|
235
|
+
min = (range[0] / 100.0).coerceAtLeast(-12.0),
|
|
236
|
+
max = (range[1] / 100.0).coerceAtMost(12.0),
|
|
237
|
+
)
|
|
238
|
+
} else {
|
|
239
|
+
GainRange(min = -12.0, max = 12.0)
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
fun getPresets(): Array<EqualizerPreset> {
|
|
244
|
+
val builtIn = getBuiltInPresets()
|
|
245
|
+
val custom = getCustomPresets()
|
|
246
|
+
return builtIn + custom
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
fun getBuiltInPresets(): Array<EqualizerPreset> =
|
|
250
|
+
BUILT_IN_PRESETS
|
|
251
|
+
.map { (name, gains) ->
|
|
252
|
+
EqualizerPreset(
|
|
253
|
+
name = name,
|
|
254
|
+
gains = gains,
|
|
255
|
+
type = PresetType.BUILT_IN,
|
|
256
|
+
)
|
|
257
|
+
}.toTypedArray()
|
|
258
|
+
|
|
259
|
+
fun getCustomPresets(): Array<EqualizerPreset> {
|
|
260
|
+
val customPresetsJson = prefs.getString("custom_presets", null) ?: return emptyArray()
|
|
261
|
+
return try {
|
|
262
|
+
val json = JSONObject(customPresetsJson)
|
|
263
|
+
json
|
|
264
|
+
.keys()
|
|
265
|
+
.asSequence()
|
|
266
|
+
.map { name ->
|
|
267
|
+
val gainsArray = json.getJSONArray(name)
|
|
268
|
+
val gains = DoubleArray(5) { gainsArray.getDouble(it) }
|
|
269
|
+
EqualizerPreset(
|
|
270
|
+
name = name,
|
|
271
|
+
gains = gains,
|
|
272
|
+
type = PresetType.CUSTOM,
|
|
273
|
+
)
|
|
274
|
+
}.toList()
|
|
275
|
+
.toTypedArray()
|
|
276
|
+
} catch (e: Exception) {
|
|
277
|
+
emptyArray()
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
fun applyPreset(presetName: String): Boolean {
|
|
282
|
+
// Try built-in preset first
|
|
283
|
+
val gains =
|
|
284
|
+
BUILT_IN_PRESETS[presetName]
|
|
285
|
+
?: getCustomPresetGains(presetName)
|
|
286
|
+
?: return false
|
|
287
|
+
|
|
288
|
+
if (setAllBandGains(gains)) {
|
|
289
|
+
currentPresetName = presetName
|
|
290
|
+
notifyPresetChange(presetName)
|
|
291
|
+
saveCurrentPreset(presetName)
|
|
292
|
+
return true
|
|
293
|
+
}
|
|
294
|
+
return false
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
private fun getCustomPresetGains(name: String): DoubleArray? {
|
|
298
|
+
val customPresetsJson = prefs.getString("custom_presets", null) ?: return null
|
|
299
|
+
return try {
|
|
300
|
+
val json = JSONObject(customPresetsJson)
|
|
301
|
+
if (json.has(name)) {
|
|
302
|
+
val gainsArray = json.getJSONArray(name)
|
|
303
|
+
DoubleArray(5) { gainsArray.getDouble(it) }
|
|
304
|
+
} else {
|
|
305
|
+
null
|
|
306
|
+
}
|
|
307
|
+
} catch (e: Exception) {
|
|
308
|
+
null
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
fun getCurrentPresetName(): String? = currentPresetName
|
|
313
|
+
|
|
314
|
+
fun saveCustomPreset(name: String): Boolean =
|
|
315
|
+
try {
|
|
316
|
+
val currentGains = getAllGains()
|
|
317
|
+
val customPresetsJson = prefs.getString("custom_presets", null)
|
|
318
|
+
val json = if (customPresetsJson != null) JSONObject(customPresetsJson) else JSONObject()
|
|
319
|
+
|
|
320
|
+
val gainsArray = JSONArray()
|
|
321
|
+
currentGains.forEach { gainsArray.put(it) }
|
|
322
|
+
json.put(name, gainsArray)
|
|
323
|
+
|
|
324
|
+
prefs.edit().putString("custom_presets", json.toString()).apply()
|
|
325
|
+
currentPresetName = name
|
|
326
|
+
notifyPresetChange(name)
|
|
327
|
+
saveCurrentPreset(name)
|
|
328
|
+
true
|
|
329
|
+
} catch (e: Exception) {
|
|
330
|
+
false
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
fun deleteCustomPreset(name: String): Boolean {
|
|
334
|
+
return try {
|
|
335
|
+
val customPresetsJson = prefs.getString("custom_presets", null) ?: return false
|
|
336
|
+
val json = JSONObject(customPresetsJson)
|
|
337
|
+
|
|
338
|
+
if (json.has(name)) {
|
|
339
|
+
json.remove(name)
|
|
340
|
+
prefs.edit().putString("custom_presets", json.toString()).apply()
|
|
341
|
+
|
|
342
|
+
if (currentPresetName == name) {
|
|
343
|
+
currentPresetName = null
|
|
344
|
+
notifyPresetChange(null)
|
|
345
|
+
saveCurrentPreset(null)
|
|
346
|
+
}
|
|
347
|
+
return true
|
|
348
|
+
}
|
|
349
|
+
false
|
|
350
|
+
} catch (e: Exception) {
|
|
351
|
+
false
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
fun getState(): EqualizerState =
|
|
356
|
+
EqualizerState(
|
|
357
|
+
enabled = isEqualizerEnabled,
|
|
358
|
+
bands = getBands(),
|
|
359
|
+
currentPreset =
|
|
360
|
+
currentPresetName?.let { Variant_NullType_String.create(it) }
|
|
361
|
+
?: Variant_NullType_String.create(NullType.NULL),
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
fun reset() {
|
|
365
|
+
setAllBandGains(doubleArrayOf(0.0, 0.0, 0.0, 0.0, 0.0))
|
|
366
|
+
currentPresetName = "Flat"
|
|
367
|
+
notifyPresetChange("Flat")
|
|
368
|
+
saveCurrentPreset("Flat")
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// === Persistence ===
|
|
372
|
+
|
|
373
|
+
private fun saveEnabled(enabled: Boolean) {
|
|
374
|
+
prefs.edit().putBoolean("eq_enabled", enabled).apply()
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
private fun saveBandGains(gains: List<Double>) {
|
|
378
|
+
val json = JSONArray()
|
|
379
|
+
gains.forEach { json.put(it) }
|
|
380
|
+
prefs.edit().putString("eq_band_gains", json.toString()).apply()
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
private fun saveCurrentPreset(name: String?) {
|
|
384
|
+
if (name != null) {
|
|
385
|
+
prefs.edit().putString("eq_current_preset", name).apply()
|
|
386
|
+
} else {
|
|
387
|
+
prefs.edit().remove("eq_current_preset").apply()
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
private fun restoreSettings() {
|
|
392
|
+
val enabled = prefs.getBoolean("eq_enabled", false)
|
|
393
|
+
val gainsJson = prefs.getString("eq_band_gains", null)
|
|
394
|
+
val presetName = prefs.getString("eq_current_preset", null)
|
|
395
|
+
|
|
396
|
+
if (gainsJson != null) {
|
|
397
|
+
try {
|
|
398
|
+
val arr = JSONArray(gainsJson)
|
|
399
|
+
val gains = DoubleArray(5) { arr.getDouble(it) }
|
|
400
|
+
setAllBandGains(gains)
|
|
401
|
+
} catch (e: Exception) {
|
|
402
|
+
// Ignore
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
currentPresetName = presetName
|
|
407
|
+
isEqualizerEnabled = enabled
|
|
408
|
+
|
|
409
|
+
try {
|
|
410
|
+
equalizer?.enabled = enabled
|
|
411
|
+
} catch (e: Exception) {
|
|
412
|
+
// Ignore
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// === Callback management ===
|
|
417
|
+
|
|
418
|
+
fun addOnEnabledChangeListener(callback: (Boolean) -> Unit) {
|
|
419
|
+
val box = WeakCallbackBox(WeakReference(callback as Any), callback)
|
|
420
|
+
onEnabledChangeListeners.add(box)
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
fun addOnBandChangeListener(callback: (Array<EqualizerBand>) -> Unit) {
|
|
424
|
+
val box = WeakCallbackBox(WeakReference(callback as Any), callback)
|
|
425
|
+
synchronized(onBandChangeListeners) {
|
|
426
|
+
@Suppress("UNCHECKED_CAST")
|
|
427
|
+
(onBandChangeListeners as MutableList<WeakCallbackBox<(Array<EqualizerBand>) -> Unit>>).add(box)
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
fun addOnPresetChangeListener(callback: (Variant_NullType_String?) -> Unit) {
|
|
432
|
+
val box = WeakCallbackBox(WeakReference(callback as Any), callback)
|
|
433
|
+
onPresetChangeListeners.add(box)
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
private fun notifyEnabledChange(enabled: Boolean) {
|
|
437
|
+
synchronized(onEnabledChangeListeners) {
|
|
438
|
+
onEnabledChangeListeners.removeAll { !it.isAlive }
|
|
439
|
+
onEnabledChangeListeners.forEach { box ->
|
|
440
|
+
try {
|
|
441
|
+
box.callback(enabled)
|
|
442
|
+
} catch (e: Exception) {
|
|
443
|
+
// Ignore callback errors
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
private fun notifyBandChange(bands: Array<EqualizerBand>) {
|
|
450
|
+
synchronized(onBandChangeListeners) {
|
|
451
|
+
@Suppress("UNCHECKED_CAST")
|
|
452
|
+
val listeners = onBandChangeListeners as MutableList<WeakCallbackBox<(Array<EqualizerBand>) -> Unit>>
|
|
453
|
+
listeners.removeAll { !it.isAlive }
|
|
454
|
+
listeners.forEach { box ->
|
|
455
|
+
try {
|
|
456
|
+
box.callback(bands)
|
|
457
|
+
} catch (e: Exception) {
|
|
458
|
+
// Ignore callback errors
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
private fun notifyPresetChange(presetName: String?) {
|
|
465
|
+
synchronized(onPresetChangeListeners) {
|
|
466
|
+
onPresetChangeListeners.removeAll { !it.isAlive }
|
|
467
|
+
onPresetChangeListeners.forEach { box ->
|
|
468
|
+
try {
|
|
469
|
+
val variant = presetName?.let { Variant_NullType_String.create(it) }
|
|
470
|
+
box.callback(variant)
|
|
471
|
+
} catch (e: Exception) {
|
|
472
|
+
// Ignore callback errors
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
fun release() {
|
|
479
|
+
try {
|
|
480
|
+
equalizer?.release()
|
|
481
|
+
equalizer = null
|
|
482
|
+
} catch (e: Exception) {
|
|
483
|
+
// Ignore
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
@@ -50,7 +50,9 @@ class NitroPlayerMediaBrowserService : MediaBrowserServiceCompat() {
|
|
|
50
50
|
val session = mediaSessionManager?.mediaSession
|
|
51
51
|
if (session != null) {
|
|
52
52
|
// Convert Media3 MediaSession to MediaSessionCompat for MediaBrowserService
|
|
53
|
-
sessionToken =
|
|
53
|
+
sessionToken =
|
|
54
|
+
android.support.v4.media.session.MediaSessionCompat.Token
|
|
55
|
+
.fromToken(session.platformToken)
|
|
54
56
|
println("🎵 NitroPlayerMediaBrowserService: MediaSession token set successfully")
|
|
55
57
|
} else {
|
|
56
58
|
println("⚠️ NitroPlayerMediaBrowserService: MediaSession not available yet")
|
|
@@ -10,6 +10,7 @@ import android.graphics.Bitmap
|
|
|
10
10
|
import android.graphics.BitmapFactory
|
|
11
11
|
import android.net.Uri
|
|
12
12
|
import android.os.Build
|
|
13
|
+
import android.util.Log
|
|
13
14
|
import androidx.core.app.NotificationCompat
|
|
14
15
|
import androidx.media3.common.MediaItem
|
|
15
16
|
import androidx.media3.common.MediaMetadata
|
|
@@ -379,12 +380,19 @@ class MediaSessionManager(
|
|
|
379
380
|
.setShowWhen(false)
|
|
380
381
|
.setPriority(NotificationCompat.PRIORITY_LOW)
|
|
381
382
|
.setCategory(NotificationCompat.CATEGORY_TRANSPORT)
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
383
|
+
try {
|
|
384
|
+
val compatToken =
|
|
385
|
+
android.support.v4.media.session.MediaSessionCompat.Token
|
|
386
|
+
.fromToken(mediaSession.platformToken)
|
|
387
|
+
builder.setStyle(
|
|
388
|
+
androidx.media.app.NotificationCompat
|
|
389
|
+
.MediaStyle()
|
|
390
|
+
.setMediaSession(compatToken)
|
|
391
|
+
.setShowActionsInCompactView(0, 1, 2),
|
|
392
|
+
)
|
|
393
|
+
} catch (e: Exception) {
|
|
394
|
+
Log.w("MediaSessionManager", "Failed to set media session token: ${e.message}")
|
|
395
|
+
}
|
|
388
396
|
|
|
389
397
|
// Add action buttons
|
|
390
398
|
builder.addAction(
|
|
@@ -13,6 +13,8 @@ import org.json.JSONObject
|
|
|
13
13
|
import java.util.UUID
|
|
14
14
|
import java.util.concurrent.CopyOnWriteArrayList
|
|
15
15
|
|
|
16
|
+
import com.margelo.nitro.core.AnyMap
|
|
17
|
+
|
|
16
18
|
/**
|
|
17
19
|
* Manages multiple playlists using ExoPlayer's native playlist functionality
|
|
18
20
|
* Based on: https://developer.android.com/media/media3/exoplayer/playlists
|
|
@@ -381,6 +383,12 @@ class PlaylistManager private constructor(
|
|
|
381
383
|
put("duration", track.duration)
|
|
382
384
|
put("url", track.url)
|
|
383
385
|
track.artwork?.let { put("artwork", it) }
|
|
386
|
+
// Serialize extraPayload to JSON for persistence
|
|
387
|
+
track.extraPayload?.let { payload ->
|
|
388
|
+
val extraPayloadMap = payload.toHashMap()
|
|
389
|
+
val extraPayloadJson = JSONObject(extraPayloadMap)
|
|
390
|
+
put("extraPayload", extraPayloadJson)
|
|
391
|
+
}
|
|
384
392
|
},
|
|
385
393
|
)
|
|
386
394
|
}
|
|
@@ -420,6 +428,24 @@ class PlaylistManager private constructor(
|
|
|
420
428
|
} else {
|
|
421
429
|
null
|
|
422
430
|
}
|
|
431
|
+
// Deserialize extraPayload from JSON
|
|
432
|
+
val extraPayload: AnyMap? =
|
|
433
|
+
if (trackObj.has("extraPayload")) {
|
|
434
|
+
val extraPayloadJson = trackObj.getJSONObject("extraPayload")
|
|
435
|
+
val map = AnyMap()
|
|
436
|
+
val keyIterator = extraPayloadJson.keys()
|
|
437
|
+
while (keyIterator.hasNext()) {
|
|
438
|
+
val key = keyIterator.next()
|
|
439
|
+
when (val value = extraPayloadJson.get(key)) {
|
|
440
|
+
is String -> map.setString(key, value)
|
|
441
|
+
is Number -> map.setDouble(key, value.toDouble())
|
|
442
|
+
is Boolean -> map.setBoolean(key, value)
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
map
|
|
446
|
+
} else {
|
|
447
|
+
null
|
|
448
|
+
}
|
|
423
449
|
tracks.add(
|
|
424
450
|
TrackItem(
|
|
425
451
|
id = trackObj.getString("id"),
|
|
@@ -429,6 +455,7 @@ class PlaylistManager private constructor(
|
|
|
429
455
|
duration = trackObj.getDouble("duration"),
|
|
430
456
|
url = trackObj.getString("url"),
|
|
431
457
|
artwork = artwork,
|
|
458
|
+
extraPayload = extraPayload,
|
|
432
459
|
),
|
|
433
460
|
)
|
|
434
461
|
}
|