react-native-nitro-player 0.5.5 → 0.5.7
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 +2 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +43 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/core/NitroPlayerLogger.kt +8 -2
- package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +345 -4
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadDatabase.kt +43 -10
- package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/PlaylistManager.kt +76 -7
- package/android/src/main/java/com/margelo/nitro/nitroplayer/storage/NitroPlayerStorage.kt +9 -2
- package/ios/HybridTrackPlayer.swift +54 -1
- package/ios/core/TrackPlayerCore.swift +254 -2
- package/ios/download/DownloadDatabase.swift +79 -2
- package/ios/download/DownloadManagerCore.swift +81 -2
- package/ios/playlist/PlaylistManager.swift +68 -0
- package/lib/specs/TrackPlayer.nitro.d.ts +47 -0
- package/lib/types/PlayerQueue.d.ts +5 -0
- package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_TrackItem__double.hpp +104 -0
- package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +160 -0
- package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +8 -0
- package/nitrogen/generated/android/c++/JPlayerConfig.hpp +7 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_TrackItem__double.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +37 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerConfig.kt +6 -3
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +16 -0
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +65 -0
- package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +62 -0
- package/nitrogen/generated/ios/swift/Func_void_double.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem__double.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +8 -0
- package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +173 -0
- package/nitrogen/generated/ios/swift/PlayerConfig.swift +24 -1
- package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +8 -0
- package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +8 -0
- package/nitrogen/generated/shared/c++/PlayerConfig.hpp +6 -2
- package/package.json +1 -1
- package/src/specs/TrackPlayer.nitro.ts +57 -0
- package/src/types/PlayerQueue.ts +5 -0
package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt
CHANGED
|
@@ -154,6 +154,43 @@ abstract class HybridTrackPlayerSpec: HybridObject() {
|
|
|
154
154
|
@DoNotStrip
|
|
155
155
|
@Keep
|
|
156
156
|
abstract fun setVolume(volume: Double): Boolean
|
|
157
|
+
|
|
158
|
+
@DoNotStrip
|
|
159
|
+
@Keep
|
|
160
|
+
abstract fun updateTracks(tracks: Array<TrackItem>): Promise<Unit>
|
|
161
|
+
|
|
162
|
+
@DoNotStrip
|
|
163
|
+
@Keep
|
|
164
|
+
abstract fun getTracksById(trackIds: Array<String>): Promise<Array<TrackItem>>
|
|
165
|
+
|
|
166
|
+
@DoNotStrip
|
|
167
|
+
@Keep
|
|
168
|
+
abstract fun getTracksNeedingUrls(): Promise<Array<TrackItem>>
|
|
169
|
+
|
|
170
|
+
@DoNotStrip
|
|
171
|
+
@Keep
|
|
172
|
+
abstract fun getNextTracks(count: Double): Promise<Array<TrackItem>>
|
|
173
|
+
|
|
174
|
+
@DoNotStrip
|
|
175
|
+
@Keep
|
|
176
|
+
abstract fun getCurrentTrackIndex(): Promise<Double>
|
|
177
|
+
|
|
178
|
+
abstract fun onTracksNeedUpdate(callback: (tracks: Array<TrackItem>, lookahead: Double) -> Unit): Unit
|
|
179
|
+
|
|
180
|
+
@DoNotStrip
|
|
181
|
+
@Keep
|
|
182
|
+
private fun onTracksNeedUpdate_cxx(callback: Func_void_std__vector_TrackItem__double): Unit {
|
|
183
|
+
val __result = onTracksNeedUpdate(callback)
|
|
184
|
+
return __result
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
@DoNotStrip
|
|
188
|
+
@Keep
|
|
189
|
+
abstract fun setPlaybackSpeed(speed: Double): Promise<Unit>
|
|
190
|
+
|
|
191
|
+
@DoNotStrip
|
|
192
|
+
@Keep
|
|
193
|
+
abstract fun getPlaybackSpeed(): Promise<Double>
|
|
157
194
|
|
|
158
195
|
private external fun initHybrid(): HybridData
|
|
159
196
|
|
|
@@ -25,7 +25,10 @@ data class PlayerConfig(
|
|
|
25
25
|
val carPlayEnabled: Boolean?,
|
|
26
26
|
@DoNotStrip
|
|
27
27
|
@Keep
|
|
28
|
-
val showInNotification: Boolean
|
|
28
|
+
val showInNotification: Boolean?,
|
|
29
|
+
@DoNotStrip
|
|
30
|
+
@Keep
|
|
31
|
+
val lookaheadCount: Double?
|
|
29
32
|
) {
|
|
30
33
|
/* primary constructor */
|
|
31
34
|
|
|
@@ -37,8 +40,8 @@ data class PlayerConfig(
|
|
|
37
40
|
@Keep
|
|
38
41
|
@Suppress("unused")
|
|
39
42
|
@JvmStatic
|
|
40
|
-
private fun fromCpp(androidAutoEnabled: Boolean?, carPlayEnabled: Boolean?, showInNotification: Boolean?): PlayerConfig {
|
|
41
|
-
return PlayerConfig(androidAutoEnabled, carPlayEnabled, showInNotification)
|
|
43
|
+
private fun fromCpp(androidAutoEnabled: Boolean?, carPlayEnabled: Boolean?, showInNotification: Boolean?, lookaheadCount: Double?): PlayerConfig {
|
|
44
|
+
return PlayerConfig(androidAutoEnabled, carPlayEnabled, showInNotification, lookaheadCount)
|
|
42
45
|
}
|
|
43
46
|
}
|
|
44
47
|
}
|
|
@@ -234,6 +234,22 @@ namespace margelo::nitro::nitroplayer::bridge::swift {
|
|
|
234
234
|
};
|
|
235
235
|
}
|
|
236
236
|
|
|
237
|
+
// pragma MARK: std::function<void(double /* result */)>
|
|
238
|
+
Func_void_double create_Func_void_double(void* NON_NULL swiftClosureWrapper) noexcept {
|
|
239
|
+
auto swiftClosure = NitroPlayer::Func_void_double::fromUnsafe(swiftClosureWrapper);
|
|
240
|
+
return [swiftClosure = std::move(swiftClosure)](double result) mutable -> void {
|
|
241
|
+
swiftClosure.call(result);
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// pragma MARK: std::function<void(const std::vector<TrackItem>& /* tracks */, double /* lookahead */)>
|
|
246
|
+
Func_void_std__vector_TrackItem__double create_Func_void_std__vector_TrackItem__double(void* NON_NULL swiftClosureWrapper) noexcept {
|
|
247
|
+
auto swiftClosure = NitroPlayer::Func_void_std__vector_TrackItem__double::fromUnsafe(swiftClosureWrapper);
|
|
248
|
+
return [swiftClosure = std::move(swiftClosure)](const std::vector<TrackItem>& tracks, double lookahead) mutable -> void {
|
|
249
|
+
swiftClosure.call(tracks, lookahead);
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
|
|
237
253
|
// pragma MARK: std::shared_ptr<HybridTrackPlayerSpec>
|
|
238
254
|
std::shared_ptr<HybridTrackPlayerSpec> create_std__shared_ptr_HybridTrackPlayerSpec_(void* NON_NULL swiftUnsafePointer) noexcept {
|
|
239
255
|
NitroPlayer::HybridTrackPlayerSpec_cxx swiftPart = NitroPlayer::HybridTrackPlayerSpec_cxx::fromUnsafe(swiftUnsafePointer);
|
|
@@ -1417,6 +1417,62 @@ namespace margelo::nitro::nitroplayer::bridge::swift {
|
|
|
1417
1417
|
return Func_void_double_double_std__optional_bool__Wrapper(std::move(value));
|
|
1418
1418
|
}
|
|
1419
1419
|
|
|
1420
|
+
// pragma MARK: std::shared_ptr<Promise<double>>
|
|
1421
|
+
/**
|
|
1422
|
+
* Specialized version of `std::shared_ptr<Promise<double>>`.
|
|
1423
|
+
*/
|
|
1424
|
+
using std__shared_ptr_Promise_double__ = std::shared_ptr<Promise<double>>;
|
|
1425
|
+
inline std::shared_ptr<Promise<double>> create_std__shared_ptr_Promise_double__() noexcept {
|
|
1426
|
+
return Promise<double>::create();
|
|
1427
|
+
}
|
|
1428
|
+
inline PromiseHolder<double> wrap_std__shared_ptr_Promise_double__(std::shared_ptr<Promise<double>> promise) noexcept {
|
|
1429
|
+
return PromiseHolder<double>(std::move(promise));
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
// pragma MARK: std::function<void(double /* result */)>
|
|
1433
|
+
/**
|
|
1434
|
+
* Specialized version of `std::function<void(double)>`.
|
|
1435
|
+
*/
|
|
1436
|
+
using Func_void_double = std::function<void(double /* result */)>;
|
|
1437
|
+
/**
|
|
1438
|
+
* Wrapper class for a `std::function<void(double / * result * /)>`, this can be used from Swift.
|
|
1439
|
+
*/
|
|
1440
|
+
class Func_void_double_Wrapper final {
|
|
1441
|
+
public:
|
|
1442
|
+
explicit Func_void_double_Wrapper(std::function<void(double /* result */)>&& func): _function(std::make_unique<std::function<void(double /* result */)>>(std::move(func))) {}
|
|
1443
|
+
inline void call(double result) const noexcept {
|
|
1444
|
+
_function->operator()(result);
|
|
1445
|
+
}
|
|
1446
|
+
private:
|
|
1447
|
+
std::unique_ptr<std::function<void(double /* result */)>> _function;
|
|
1448
|
+
} SWIFT_NONCOPYABLE;
|
|
1449
|
+
Func_void_double create_Func_void_double(void* NON_NULL swiftClosureWrapper) noexcept;
|
|
1450
|
+
inline Func_void_double_Wrapper wrap_Func_void_double(Func_void_double value) noexcept {
|
|
1451
|
+
return Func_void_double_Wrapper(std::move(value));
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
// pragma MARK: std::function<void(const std::vector<TrackItem>& /* tracks */, double /* lookahead */)>
|
|
1455
|
+
/**
|
|
1456
|
+
* Specialized version of `std::function<void(const std::vector<TrackItem>&, double)>`.
|
|
1457
|
+
*/
|
|
1458
|
+
using Func_void_std__vector_TrackItem__double = std::function<void(const std::vector<TrackItem>& /* tracks */, double /* lookahead */)>;
|
|
1459
|
+
/**
|
|
1460
|
+
* Wrapper class for a `std::function<void(const std::vector<TrackItem>& / * tracks * /, double / * lookahead * /)>`, this can be used from Swift.
|
|
1461
|
+
*/
|
|
1462
|
+
class Func_void_std__vector_TrackItem__double_Wrapper final {
|
|
1463
|
+
public:
|
|
1464
|
+
explicit Func_void_std__vector_TrackItem__double_Wrapper(std::function<void(const std::vector<TrackItem>& /* tracks */, double /* lookahead */)>&& func): _function(std::make_unique<std::function<void(const std::vector<TrackItem>& /* tracks */, double /* lookahead */)>>(std::move(func))) {}
|
|
1465
|
+
inline void call(std::vector<TrackItem> tracks, double lookahead) const noexcept {
|
|
1466
|
+
_function->operator()(tracks, lookahead);
|
|
1467
|
+
}
|
|
1468
|
+
private:
|
|
1469
|
+
std::unique_ptr<std::function<void(const std::vector<TrackItem>& /* tracks */, double /* lookahead */)>> _function;
|
|
1470
|
+
} SWIFT_NONCOPYABLE;
|
|
1471
|
+
Func_void_std__vector_TrackItem__double create_Func_void_std__vector_TrackItem__double(void* NON_NULL swiftClosureWrapper) noexcept;
|
|
1472
|
+
inline Func_void_std__vector_TrackItem__double_Wrapper wrap_Func_void_std__vector_TrackItem__double(Func_void_std__vector_TrackItem__double value) noexcept {
|
|
1473
|
+
return Func_void_std__vector_TrackItem__double_Wrapper(std::move(value));
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1420
1476
|
// pragma MARK: std::shared_ptr<HybridTrackPlayerSpec>
|
|
1421
1477
|
/**
|
|
1422
1478
|
* Specialized version of `std::shared_ptr<HybridTrackPlayerSpec>`.
|
|
@@ -1464,5 +1520,14 @@ namespace margelo::nitro::nitroplayer::bridge::swift {
|
|
|
1464
1520
|
inline Result_RepeatMode_ create_Result_RepeatMode_(const std::exception_ptr& error) noexcept {
|
|
1465
1521
|
return Result<RepeatMode>::withError(error);
|
|
1466
1522
|
}
|
|
1523
|
+
|
|
1524
|
+
// pragma MARK: Result<std::shared_ptr<Promise<double>>>
|
|
1525
|
+
using Result_std__shared_ptr_Promise_double___ = Result<std::shared_ptr<Promise<double>>>;
|
|
1526
|
+
inline Result_std__shared_ptr_Promise_double___ create_Result_std__shared_ptr_Promise_double___(const std::shared_ptr<Promise<double>>& value) noexcept {
|
|
1527
|
+
return Result<std::shared_ptr<Promise<double>>>::withValue(value);
|
|
1528
|
+
}
|
|
1529
|
+
inline Result_std__shared_ptr_Promise_double___ create_Result_std__shared_ptr_Promise_double___(const std::exception_ptr& error) noexcept {
|
|
1530
|
+
return Result<std::shared_ptr<Promise<double>>>::withError(error);
|
|
1531
|
+
}
|
|
1467
1532
|
|
|
1468
1533
|
} // namespace margelo::nitro::nitroplayer::bridge::swift
|
|
@@ -233,6 +233,68 @@ namespace margelo::nitro::nitroplayer {
|
|
|
233
233
|
auto __value = std::move(__result.value());
|
|
234
234
|
return __value;
|
|
235
235
|
}
|
|
236
|
+
inline std::shared_ptr<Promise<void>> updateTracks(const std::vector<TrackItem>& tracks) override {
|
|
237
|
+
auto __result = _swiftPart.updateTracks(tracks);
|
|
238
|
+
if (__result.hasError()) [[unlikely]] {
|
|
239
|
+
std::rethrow_exception(__result.error());
|
|
240
|
+
}
|
|
241
|
+
auto __value = std::move(__result.value());
|
|
242
|
+
return __value;
|
|
243
|
+
}
|
|
244
|
+
inline std::shared_ptr<Promise<std::vector<TrackItem>>> getTracksById(const std::vector<std::string>& trackIds) override {
|
|
245
|
+
auto __result = _swiftPart.getTracksById(trackIds);
|
|
246
|
+
if (__result.hasError()) [[unlikely]] {
|
|
247
|
+
std::rethrow_exception(__result.error());
|
|
248
|
+
}
|
|
249
|
+
auto __value = std::move(__result.value());
|
|
250
|
+
return __value;
|
|
251
|
+
}
|
|
252
|
+
inline std::shared_ptr<Promise<std::vector<TrackItem>>> getTracksNeedingUrls() override {
|
|
253
|
+
auto __result = _swiftPart.getTracksNeedingUrls();
|
|
254
|
+
if (__result.hasError()) [[unlikely]] {
|
|
255
|
+
std::rethrow_exception(__result.error());
|
|
256
|
+
}
|
|
257
|
+
auto __value = std::move(__result.value());
|
|
258
|
+
return __value;
|
|
259
|
+
}
|
|
260
|
+
inline std::shared_ptr<Promise<std::vector<TrackItem>>> getNextTracks(double count) override {
|
|
261
|
+
auto __result = _swiftPart.getNextTracks(std::forward<decltype(count)>(count));
|
|
262
|
+
if (__result.hasError()) [[unlikely]] {
|
|
263
|
+
std::rethrow_exception(__result.error());
|
|
264
|
+
}
|
|
265
|
+
auto __value = std::move(__result.value());
|
|
266
|
+
return __value;
|
|
267
|
+
}
|
|
268
|
+
inline std::shared_ptr<Promise<double>> getCurrentTrackIndex() override {
|
|
269
|
+
auto __result = _swiftPart.getCurrentTrackIndex();
|
|
270
|
+
if (__result.hasError()) [[unlikely]] {
|
|
271
|
+
std::rethrow_exception(__result.error());
|
|
272
|
+
}
|
|
273
|
+
auto __value = std::move(__result.value());
|
|
274
|
+
return __value;
|
|
275
|
+
}
|
|
276
|
+
inline void onTracksNeedUpdate(const std::function<void(const std::vector<TrackItem>& /* tracks */, double /* lookahead */)>& callback) override {
|
|
277
|
+
auto __result = _swiftPart.onTracksNeedUpdate(callback);
|
|
278
|
+
if (__result.hasError()) [[unlikely]] {
|
|
279
|
+
std::rethrow_exception(__result.error());
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
inline std::shared_ptr<Promise<void>> setPlaybackSpeed(double speed) override {
|
|
283
|
+
auto __result = _swiftPart.setPlaybackSpeed(std::forward<decltype(speed)>(speed));
|
|
284
|
+
if (__result.hasError()) [[unlikely]] {
|
|
285
|
+
std::rethrow_exception(__result.error());
|
|
286
|
+
}
|
|
287
|
+
auto __value = std::move(__result.value());
|
|
288
|
+
return __value;
|
|
289
|
+
}
|
|
290
|
+
inline std::shared_ptr<Promise<double>> getPlaybackSpeed() override {
|
|
291
|
+
auto __result = _swiftPart.getPlaybackSpeed();
|
|
292
|
+
if (__result.hasError()) [[unlikely]] {
|
|
293
|
+
std::rethrow_exception(__result.error());
|
|
294
|
+
}
|
|
295
|
+
auto __value = std::move(__result.value());
|
|
296
|
+
return __value;
|
|
297
|
+
}
|
|
236
298
|
|
|
237
299
|
private:
|
|
238
300
|
NitroPlayer::HybridTrackPlayerSpec_cxx _swiftPart;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// Func_void_double.swift
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © 2026 Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import NitroModules
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Wraps a Swift `(_ value: Double) -> Void` as a class.
|
|
13
|
+
* This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`.
|
|
14
|
+
*/
|
|
15
|
+
public final class Func_void_double {
|
|
16
|
+
public typealias bridge = margelo.nitro.nitroplayer.bridge.swift
|
|
17
|
+
|
|
18
|
+
private let closure: (_ value: Double) -> Void
|
|
19
|
+
|
|
20
|
+
public init(_ closure: @escaping (_ value: Double) -> Void) {
|
|
21
|
+
self.closure = closure
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@inline(__always)
|
|
25
|
+
public func call(value: Double) -> Void {
|
|
26
|
+
self.closure(value)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Casts this instance to a retained unsafe raw pointer.
|
|
31
|
+
* This acquires one additional strong reference on the object!
|
|
32
|
+
*/
|
|
33
|
+
@inline(__always)
|
|
34
|
+
public func toUnsafe() -> UnsafeMutableRawPointer {
|
|
35
|
+
return Unmanaged.passRetained(self).toOpaque()
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Casts an unsafe pointer to a `Func_void_double`.
|
|
40
|
+
* The pointer has to be a retained opaque `Unmanaged<Func_void_double>`.
|
|
41
|
+
* This removes one strong reference from the object!
|
|
42
|
+
*/
|
|
43
|
+
@inline(__always)
|
|
44
|
+
public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void_double {
|
|
45
|
+
return Unmanaged<Func_void_double>.fromOpaque(pointer).takeRetainedValue()
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// Func_void_std__vector_TrackItem__double.swift
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © 2026 Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import NitroModules
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Wraps a Swift `(_ tracks: [TrackItem], _ lookahead: Double) -> Void` as a class.
|
|
13
|
+
* This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`.
|
|
14
|
+
*/
|
|
15
|
+
public final class Func_void_std__vector_TrackItem__double {
|
|
16
|
+
public typealias bridge = margelo.nitro.nitroplayer.bridge.swift
|
|
17
|
+
|
|
18
|
+
private let closure: (_ tracks: [TrackItem], _ lookahead: Double) -> Void
|
|
19
|
+
|
|
20
|
+
public init(_ closure: @escaping (_ tracks: [TrackItem], _ lookahead: Double) -> Void) {
|
|
21
|
+
self.closure = closure
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@inline(__always)
|
|
25
|
+
public func call(tracks: bridge.std__vector_TrackItem_, lookahead: Double) -> Void {
|
|
26
|
+
self.closure(tracks.map({ __item in __item }), lookahead)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Casts this instance to a retained unsafe raw pointer.
|
|
31
|
+
* This acquires one additional strong reference on the object!
|
|
32
|
+
*/
|
|
33
|
+
@inline(__always)
|
|
34
|
+
public func toUnsafe() -> UnsafeMutableRawPointer {
|
|
35
|
+
return Unmanaged.passRetained(self).toOpaque()
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Casts an unsafe pointer to a `Func_void_std__vector_TrackItem__double`.
|
|
40
|
+
* The pointer has to be a retained opaque `Unmanaged<Func_void_std__vector_TrackItem__double>`.
|
|
41
|
+
* This removes one strong reference from the object!
|
|
42
|
+
*/
|
|
43
|
+
@inline(__always)
|
|
44
|
+
public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void_std__vector_TrackItem__double {
|
|
45
|
+
return Unmanaged<Func_void_std__vector_TrackItem__double>.fromOpaque(pointer).takeRetainedValue()
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -35,6 +35,14 @@ public protocol HybridTrackPlayerSpec_protocol: HybridObject {
|
|
|
35
35
|
func onAndroidAutoConnectionChange(callback: @escaping (_ connected: Bool) -> Void) throws -> Void
|
|
36
36
|
func isAndroidAutoConnected() throws -> Bool
|
|
37
37
|
func setVolume(volume: Double) throws -> Bool
|
|
38
|
+
func updateTracks(tracks: [TrackItem]) throws -> Promise<Void>
|
|
39
|
+
func getTracksById(trackIds: [String]) throws -> Promise<[TrackItem]>
|
|
40
|
+
func getTracksNeedingUrls() throws -> Promise<[TrackItem]>
|
|
41
|
+
func getNextTracks(count: Double) throws -> Promise<[TrackItem]>
|
|
42
|
+
func getCurrentTrackIndex() throws -> Promise<Double>
|
|
43
|
+
func onTracksNeedUpdate(callback: @escaping (_ tracks: [TrackItem], _ lookahead: Double) -> Void) throws -> Void
|
|
44
|
+
func setPlaybackSpeed(speed: Double) throws -> Promise<Void>
|
|
45
|
+
func getPlaybackSpeed() throws -> Promise<Double>
|
|
38
46
|
}
|
|
39
47
|
|
|
40
48
|
public extension HybridTrackPlayerSpec_protocol {
|
|
@@ -455,4 +455,177 @@ open class HybridTrackPlayerSpec_cxx {
|
|
|
455
455
|
return bridge.create_Result_bool_(__exceptionPtr)
|
|
456
456
|
}
|
|
457
457
|
}
|
|
458
|
+
|
|
459
|
+
@inline(__always)
|
|
460
|
+
public final func updateTracks(tracks: bridge.std__vector_TrackItem_) -> bridge.Result_std__shared_ptr_Promise_void___ {
|
|
461
|
+
do {
|
|
462
|
+
let __result = try self.__implementation.updateTracks(tracks: tracks.map({ __item in __item }))
|
|
463
|
+
let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in
|
|
464
|
+
let __promise = bridge.create_std__shared_ptr_Promise_void__()
|
|
465
|
+
let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise)
|
|
466
|
+
__result
|
|
467
|
+
.then({ __result in __promiseHolder.resolve() })
|
|
468
|
+
.catch({ __error in __promiseHolder.reject(__error.toCpp()) })
|
|
469
|
+
return __promise
|
|
470
|
+
}()
|
|
471
|
+
return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp)
|
|
472
|
+
} catch (let __error) {
|
|
473
|
+
let __exceptionPtr = __error.toCpp()
|
|
474
|
+
return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr)
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
@inline(__always)
|
|
479
|
+
public final func getTracksById(trackIds: bridge.std__vector_std__string_) -> bridge.Result_std__shared_ptr_Promise_std__vector_TrackItem____ {
|
|
480
|
+
do {
|
|
481
|
+
let __result = try self.__implementation.getTracksById(trackIds: trackIds.map({ __item in String(__item) }))
|
|
482
|
+
let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__vector_TrackItem___ in
|
|
483
|
+
let __promise = bridge.create_std__shared_ptr_Promise_std__vector_TrackItem___()
|
|
484
|
+
let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__vector_TrackItem___(__promise)
|
|
485
|
+
__result
|
|
486
|
+
.then({ __result in __promiseHolder.resolve({ () -> bridge.std__vector_TrackItem_ in
|
|
487
|
+
var __vector = bridge.create_std__vector_TrackItem_(__result.count)
|
|
488
|
+
for __item in __result {
|
|
489
|
+
__vector.push_back(__item)
|
|
490
|
+
}
|
|
491
|
+
return __vector
|
|
492
|
+
}()) })
|
|
493
|
+
.catch({ __error in __promiseHolder.reject(__error.toCpp()) })
|
|
494
|
+
return __promise
|
|
495
|
+
}()
|
|
496
|
+
return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__resultCpp)
|
|
497
|
+
} catch (let __error) {
|
|
498
|
+
let __exceptionPtr = __error.toCpp()
|
|
499
|
+
return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__exceptionPtr)
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
@inline(__always)
|
|
504
|
+
public final func getTracksNeedingUrls() -> bridge.Result_std__shared_ptr_Promise_std__vector_TrackItem____ {
|
|
505
|
+
do {
|
|
506
|
+
let __result = try self.__implementation.getTracksNeedingUrls()
|
|
507
|
+
let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__vector_TrackItem___ in
|
|
508
|
+
let __promise = bridge.create_std__shared_ptr_Promise_std__vector_TrackItem___()
|
|
509
|
+
let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__vector_TrackItem___(__promise)
|
|
510
|
+
__result
|
|
511
|
+
.then({ __result in __promiseHolder.resolve({ () -> bridge.std__vector_TrackItem_ in
|
|
512
|
+
var __vector = bridge.create_std__vector_TrackItem_(__result.count)
|
|
513
|
+
for __item in __result {
|
|
514
|
+
__vector.push_back(__item)
|
|
515
|
+
}
|
|
516
|
+
return __vector
|
|
517
|
+
}()) })
|
|
518
|
+
.catch({ __error in __promiseHolder.reject(__error.toCpp()) })
|
|
519
|
+
return __promise
|
|
520
|
+
}()
|
|
521
|
+
return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__resultCpp)
|
|
522
|
+
} catch (let __error) {
|
|
523
|
+
let __exceptionPtr = __error.toCpp()
|
|
524
|
+
return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__exceptionPtr)
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
@inline(__always)
|
|
529
|
+
public final func getNextTracks(count: Double) -> bridge.Result_std__shared_ptr_Promise_std__vector_TrackItem____ {
|
|
530
|
+
do {
|
|
531
|
+
let __result = try self.__implementation.getNextTracks(count: count)
|
|
532
|
+
let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__vector_TrackItem___ in
|
|
533
|
+
let __promise = bridge.create_std__shared_ptr_Promise_std__vector_TrackItem___()
|
|
534
|
+
let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__vector_TrackItem___(__promise)
|
|
535
|
+
__result
|
|
536
|
+
.then({ __result in __promiseHolder.resolve({ () -> bridge.std__vector_TrackItem_ in
|
|
537
|
+
var __vector = bridge.create_std__vector_TrackItem_(__result.count)
|
|
538
|
+
for __item in __result {
|
|
539
|
+
__vector.push_back(__item)
|
|
540
|
+
}
|
|
541
|
+
return __vector
|
|
542
|
+
}()) })
|
|
543
|
+
.catch({ __error in __promiseHolder.reject(__error.toCpp()) })
|
|
544
|
+
return __promise
|
|
545
|
+
}()
|
|
546
|
+
return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__resultCpp)
|
|
547
|
+
} catch (let __error) {
|
|
548
|
+
let __exceptionPtr = __error.toCpp()
|
|
549
|
+
return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__exceptionPtr)
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
@inline(__always)
|
|
554
|
+
public final func getCurrentTrackIndex() -> bridge.Result_std__shared_ptr_Promise_double___ {
|
|
555
|
+
do {
|
|
556
|
+
let __result = try self.__implementation.getCurrentTrackIndex()
|
|
557
|
+
let __resultCpp = { () -> bridge.std__shared_ptr_Promise_double__ in
|
|
558
|
+
let __promise = bridge.create_std__shared_ptr_Promise_double__()
|
|
559
|
+
let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_double__(__promise)
|
|
560
|
+
__result
|
|
561
|
+
.then({ __result in __promiseHolder.resolve(__result) })
|
|
562
|
+
.catch({ __error in __promiseHolder.reject(__error.toCpp()) })
|
|
563
|
+
return __promise
|
|
564
|
+
}()
|
|
565
|
+
return bridge.create_Result_std__shared_ptr_Promise_double___(__resultCpp)
|
|
566
|
+
} catch (let __error) {
|
|
567
|
+
let __exceptionPtr = __error.toCpp()
|
|
568
|
+
return bridge.create_Result_std__shared_ptr_Promise_double___(__exceptionPtr)
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
@inline(__always)
|
|
573
|
+
public final func onTracksNeedUpdate(callback: bridge.Func_void_std__vector_TrackItem__double) -> bridge.Result_void_ {
|
|
574
|
+
do {
|
|
575
|
+
try self.__implementation.onTracksNeedUpdate(callback: { () -> ([TrackItem], Double) -> Void in
|
|
576
|
+
let __wrappedFunction = bridge.wrap_Func_void_std__vector_TrackItem__double(callback)
|
|
577
|
+
return { (__tracks: [TrackItem], __lookahead: Double) -> Void in
|
|
578
|
+
__wrappedFunction.call({ () -> bridge.std__vector_TrackItem_ in
|
|
579
|
+
var __vector = bridge.create_std__vector_TrackItem_(__tracks.count)
|
|
580
|
+
for __item in __tracks {
|
|
581
|
+
__vector.push_back(__item)
|
|
582
|
+
}
|
|
583
|
+
return __vector
|
|
584
|
+
}(), __lookahead)
|
|
585
|
+
}
|
|
586
|
+
}())
|
|
587
|
+
return bridge.create_Result_void_()
|
|
588
|
+
} catch (let __error) {
|
|
589
|
+
let __exceptionPtr = __error.toCpp()
|
|
590
|
+
return bridge.create_Result_void_(__exceptionPtr)
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
@inline(__always)
|
|
595
|
+
public final func setPlaybackSpeed(speed: Double) -> bridge.Result_std__shared_ptr_Promise_void___ {
|
|
596
|
+
do {
|
|
597
|
+
let __result = try self.__implementation.setPlaybackSpeed(speed: speed)
|
|
598
|
+
let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in
|
|
599
|
+
let __promise = bridge.create_std__shared_ptr_Promise_void__()
|
|
600
|
+
let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise)
|
|
601
|
+
__result
|
|
602
|
+
.then({ __result in __promiseHolder.resolve() })
|
|
603
|
+
.catch({ __error in __promiseHolder.reject(__error.toCpp()) })
|
|
604
|
+
return __promise
|
|
605
|
+
}()
|
|
606
|
+
return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp)
|
|
607
|
+
} catch (let __error) {
|
|
608
|
+
let __exceptionPtr = __error.toCpp()
|
|
609
|
+
return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr)
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
@inline(__always)
|
|
614
|
+
public final func getPlaybackSpeed() -> bridge.Result_std__shared_ptr_Promise_double___ {
|
|
615
|
+
do {
|
|
616
|
+
let __result = try self.__implementation.getPlaybackSpeed()
|
|
617
|
+
let __resultCpp = { () -> bridge.std__shared_ptr_Promise_double__ in
|
|
618
|
+
let __promise = bridge.create_std__shared_ptr_Promise_double__()
|
|
619
|
+
let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_double__(__promise)
|
|
620
|
+
__result
|
|
621
|
+
.then({ __result in __promiseHolder.resolve(__result) })
|
|
622
|
+
.catch({ __error in __promiseHolder.reject(__error.toCpp()) })
|
|
623
|
+
return __promise
|
|
624
|
+
}()
|
|
625
|
+
return bridge.create_Result_std__shared_ptr_Promise_double___(__resultCpp)
|
|
626
|
+
} catch (let __error) {
|
|
627
|
+
let __exceptionPtr = __error.toCpp()
|
|
628
|
+
return bridge.create_Result_std__shared_ptr_Promise_double___(__exceptionPtr)
|
|
629
|
+
}
|
|
630
|
+
}
|
|
458
631
|
}
|
|
@@ -19,7 +19,7 @@ public extension PlayerConfig {
|
|
|
19
19
|
/**
|
|
20
20
|
* Create a new instance of `PlayerConfig`.
|
|
21
21
|
*/
|
|
22
|
-
init(androidAutoEnabled: Bool?, carPlayEnabled: Bool?, showInNotification: Bool?) {
|
|
22
|
+
init(androidAutoEnabled: Bool?, carPlayEnabled: Bool?, showInNotification: Bool?, lookaheadCount: Double?) {
|
|
23
23
|
self.init({ () -> bridge.std__optional_bool_ in
|
|
24
24
|
if let __unwrappedValue = androidAutoEnabled {
|
|
25
25
|
return bridge.create_std__optional_bool_(__unwrappedValue)
|
|
@@ -38,6 +38,12 @@ public extension PlayerConfig {
|
|
|
38
38
|
} else {
|
|
39
39
|
return .init()
|
|
40
40
|
}
|
|
41
|
+
}(), { () -> bridge.std__optional_double_ in
|
|
42
|
+
if let __unwrappedValue = lookaheadCount {
|
|
43
|
+
return bridge.create_std__optional_double_(__unwrappedValue)
|
|
44
|
+
} else {
|
|
45
|
+
return .init()
|
|
46
|
+
}
|
|
41
47
|
}())
|
|
42
48
|
}
|
|
43
49
|
|
|
@@ -112,4 +118,21 @@ public extension PlayerConfig {
|
|
|
112
118
|
}()
|
|
113
119
|
}
|
|
114
120
|
}
|
|
121
|
+
|
|
122
|
+
var lookaheadCount: Double? {
|
|
123
|
+
@inline(__always)
|
|
124
|
+
get {
|
|
125
|
+
return self.__lookaheadCount.value
|
|
126
|
+
}
|
|
127
|
+
@inline(__always)
|
|
128
|
+
set {
|
|
129
|
+
self.__lookaheadCount = { () -> bridge.std__optional_double_ in
|
|
130
|
+
if let __unwrappedValue = newValue {
|
|
131
|
+
return bridge.create_std__optional_double_(__unwrappedValue)
|
|
132
|
+
} else {
|
|
133
|
+
return .init()
|
|
134
|
+
}
|
|
135
|
+
}()
|
|
136
|
+
}
|
|
137
|
+
}
|
|
115
138
|
}
|
|
@@ -35,6 +35,14 @@ namespace margelo::nitro::nitroplayer {
|
|
|
35
35
|
prototype.registerHybridMethod("onAndroidAutoConnectionChange", &HybridTrackPlayerSpec::onAndroidAutoConnectionChange);
|
|
36
36
|
prototype.registerHybridMethod("isAndroidAutoConnected", &HybridTrackPlayerSpec::isAndroidAutoConnected);
|
|
37
37
|
prototype.registerHybridMethod("setVolume", &HybridTrackPlayerSpec::setVolume);
|
|
38
|
+
prototype.registerHybridMethod("updateTracks", &HybridTrackPlayerSpec::updateTracks);
|
|
39
|
+
prototype.registerHybridMethod("getTracksById", &HybridTrackPlayerSpec::getTracksById);
|
|
40
|
+
prototype.registerHybridMethod("getTracksNeedingUrls", &HybridTrackPlayerSpec::getTracksNeedingUrls);
|
|
41
|
+
prototype.registerHybridMethod("getNextTracks", &HybridTrackPlayerSpec::getNextTracks);
|
|
42
|
+
prototype.registerHybridMethod("getCurrentTrackIndex", &HybridTrackPlayerSpec::getCurrentTrackIndex);
|
|
43
|
+
prototype.registerHybridMethod("onTracksNeedUpdate", &HybridTrackPlayerSpec::onTracksNeedUpdate);
|
|
44
|
+
prototype.registerHybridMethod("setPlaybackSpeed", &HybridTrackPlayerSpec::setPlaybackSpeed);
|
|
45
|
+
prototype.registerHybridMethod("getPlaybackSpeed", &HybridTrackPlayerSpec::getPlaybackSpeed);
|
|
38
46
|
});
|
|
39
47
|
}
|
|
40
48
|
|
|
@@ -90,6 +90,14 @@ namespace margelo::nitro::nitroplayer {
|
|
|
90
90
|
virtual void onAndroidAutoConnectionChange(const std::function<void(bool /* connected */)>& callback) = 0;
|
|
91
91
|
virtual bool isAndroidAutoConnected() = 0;
|
|
92
92
|
virtual bool setVolume(double volume) = 0;
|
|
93
|
+
virtual std::shared_ptr<Promise<void>> updateTracks(const std::vector<TrackItem>& tracks) = 0;
|
|
94
|
+
virtual std::shared_ptr<Promise<std::vector<TrackItem>>> getTracksById(const std::vector<std::string>& trackIds) = 0;
|
|
95
|
+
virtual std::shared_ptr<Promise<std::vector<TrackItem>>> getTracksNeedingUrls() = 0;
|
|
96
|
+
virtual std::shared_ptr<Promise<std::vector<TrackItem>>> getNextTracks(double count) = 0;
|
|
97
|
+
virtual std::shared_ptr<Promise<double>> getCurrentTrackIndex() = 0;
|
|
98
|
+
virtual void onTracksNeedUpdate(const std::function<void(const std::vector<TrackItem>& /* tracks */, double /* lookahead */)>& callback) = 0;
|
|
99
|
+
virtual std::shared_ptr<Promise<void>> setPlaybackSpeed(double speed) = 0;
|
|
100
|
+
virtual std::shared_ptr<Promise<double>> getPlaybackSpeed() = 0;
|
|
93
101
|
|
|
94
102
|
protected:
|
|
95
103
|
// Hybrid Setup
|
|
@@ -37,10 +37,11 @@ namespace margelo::nitro::nitroplayer {
|
|
|
37
37
|
std::optional<bool> androidAutoEnabled SWIFT_PRIVATE;
|
|
38
38
|
std::optional<bool> carPlayEnabled SWIFT_PRIVATE;
|
|
39
39
|
std::optional<bool> showInNotification SWIFT_PRIVATE;
|
|
40
|
+
std::optional<double> lookaheadCount SWIFT_PRIVATE;
|
|
40
41
|
|
|
41
42
|
public:
|
|
42
43
|
PlayerConfig() = default;
|
|
43
|
-
explicit PlayerConfig(std::optional<bool> androidAutoEnabled, std::optional<bool> carPlayEnabled, std::optional<bool> showInNotification): androidAutoEnabled(androidAutoEnabled), carPlayEnabled(carPlayEnabled), showInNotification(showInNotification) {}
|
|
44
|
+
explicit PlayerConfig(std::optional<bool> androidAutoEnabled, std::optional<bool> carPlayEnabled, std::optional<bool> showInNotification, std::optional<double> lookaheadCount): androidAutoEnabled(androidAutoEnabled), carPlayEnabled(carPlayEnabled), showInNotification(showInNotification), lookaheadCount(lookaheadCount) {}
|
|
44
45
|
};
|
|
45
46
|
|
|
46
47
|
} // namespace margelo::nitro::nitroplayer
|
|
@@ -55,7 +56,8 @@ namespace margelo::nitro {
|
|
|
55
56
|
return margelo::nitro::nitroplayer::PlayerConfig(
|
|
56
57
|
JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "androidAutoEnabled")),
|
|
57
58
|
JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "carPlayEnabled")),
|
|
58
|
-
JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "showInNotification"))
|
|
59
|
+
JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "showInNotification")),
|
|
60
|
+
JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "lookaheadCount"))
|
|
59
61
|
);
|
|
60
62
|
}
|
|
61
63
|
static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::nitroplayer::PlayerConfig& arg) {
|
|
@@ -63,6 +65,7 @@ namespace margelo::nitro {
|
|
|
63
65
|
obj.setProperty(runtime, "androidAutoEnabled", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.androidAutoEnabled));
|
|
64
66
|
obj.setProperty(runtime, "carPlayEnabled", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.carPlayEnabled));
|
|
65
67
|
obj.setProperty(runtime, "showInNotification", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.showInNotification));
|
|
68
|
+
obj.setProperty(runtime, "lookaheadCount", JSIConverter<std::optional<double>>::toJSI(runtime, arg.lookaheadCount));
|
|
66
69
|
return obj;
|
|
67
70
|
}
|
|
68
71
|
static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
|
|
@@ -76,6 +79,7 @@ namespace margelo::nitro {
|
|
|
76
79
|
if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "androidAutoEnabled"))) return false;
|
|
77
80
|
if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "carPlayEnabled"))) return false;
|
|
78
81
|
if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "showInNotification"))) return false;
|
|
82
|
+
if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "lookaheadCount"))) return false;
|
|
79
83
|
return true;
|
|
80
84
|
}
|
|
81
85
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-nitro-player",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.7",
|
|
4
4
|
"description": "A powerful audio player library for React Native with playlist management, playback controls, and support for Android Auto and CarPlay",
|
|
5
5
|
"main": "lib/index",
|
|
6
6
|
"module": "lib/index",
|