react-native-nitro-player 0.0.1
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/NitroPlayer.podspec +31 -0
- package/README.md +610 -0
- package/android/CMakeLists.txt +29 -0
- package/android/build.gradle +147 -0
- package/android/fix-prefab.gradle +51 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/cpp-adapter.cpp +7 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAndroidAutoMediaLibrary.kt +29 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAudioDevices.kt +116 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridPlayerQueue.kt +167 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +93 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/NitroPlayerPackage.kt +21 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/connection/AndroidAutoConnectionDetector.kt +171 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +639 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaBrowserService.kt +352 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaLibrary.kt +58 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaLibraryManager.kt +77 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaLibraryParser.kt +73 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaSessionManager.kt +506 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/Playlist.kt +21 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/PlaylistManager.kt +454 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/queue/Queue.kt +94 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/queue/QueueManager.kt +143 -0
- package/ios/HybridAudioRoutePicker.swift +53 -0
- package/ios/HybridTrackPlayer.swift +100 -0
- package/ios/core/TrackPlayerCore.swift +1040 -0
- package/ios/media/MediaSessionManager.swift +230 -0
- package/ios/playlist/PlaylistManager.swift +446 -0
- package/ios/playlist/PlaylistModel.swift +49 -0
- package/ios/queue/HybridPlayerQueue.swift +95 -0
- package/ios/queue/Queue.swift +126 -0
- package/ios/queue/QueueManager.swift +157 -0
- package/lib/hooks/index.d.ts +6 -0
- package/lib/hooks/index.js +6 -0
- package/lib/hooks/useAndroidAutoConnection.d.ts +13 -0
- package/lib/hooks/useAndroidAutoConnection.js +26 -0
- package/lib/hooks/useAudioDevices.d.ts +26 -0
- package/lib/hooks/useAudioDevices.js +55 -0
- package/lib/hooks/useOnChangeTrack.d.ts +9 -0
- package/lib/hooks/useOnChangeTrack.js +17 -0
- package/lib/hooks/useOnPlaybackProgressChange.d.ts +9 -0
- package/lib/hooks/useOnPlaybackProgressChange.js +19 -0
- package/lib/hooks/useOnPlaybackStateChange.d.ts +9 -0
- package/lib/hooks/useOnPlaybackStateChange.js +17 -0
- package/lib/hooks/useOnSeek.d.ts +8 -0
- package/lib/hooks/useOnSeek.js +17 -0
- package/lib/index.d.ts +14 -0
- package/lib/index.js +24 -0
- package/lib/specs/AndroidAutoMediaLibrary.nitro.d.ts +21 -0
- package/lib/specs/AndroidAutoMediaLibrary.nitro.js +1 -0
- package/lib/specs/AudioDevices.nitro.d.ts +24 -0
- package/lib/specs/AudioDevices.nitro.js +1 -0
- package/lib/specs/AudioRoutePicker.nitro.d.ts +10 -0
- package/lib/specs/AudioRoutePicker.nitro.js +1 -0
- package/lib/specs/TrackPlayer.nitro.d.ts +39 -0
- package/lib/specs/TrackPlayer.nitro.js +1 -0
- package/lib/types/AndroidAutoMediaLibrary.d.ts +44 -0
- package/lib/types/AndroidAutoMediaLibrary.js +1 -0
- package/lib/types/PlayerQueue.d.ts +32 -0
- package/lib/types/PlayerQueue.js +1 -0
- package/lib/utils/androidAutoMediaLibrary.d.ts +47 -0
- package/lib/utils/androidAutoMediaLibrary.js +62 -0
- package/nitro.json +31 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +91 -0
- package/nitrogen/generated/android/NitroPlayer+autolinking.gradle +27 -0
- package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +88 -0
- package/nitrogen/generated/android/NitroPlayerOnLoad.hpp +25 -0
- package/nitrogen/generated/android/c++/JFunc_void_TrackItem_std__optional_Reason_.hpp +85 -0
- package/nitrogen/generated/android/c++/JFunc_void_TrackPlayerState_std__optional_Reason_.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_double_double.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_double_double_std__optional_bool_.hpp +76 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_Playlist_std__optional_QueueOperation_.hpp +88 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Playlist__std__optional_QueueOperation_.hpp +106 -0
- package/nitrogen/generated/android/c++/JHybridAndroidAutoMediaLibrarySpec.cpp +55 -0
- package/nitrogen/generated/android/c++/JHybridAndroidAutoMediaLibrarySpec.hpp +66 -0
- package/nitrogen/generated/android/c++/JHybridAudioDevicesSpec.cpp +70 -0
- package/nitrogen/generated/android/c++/JHybridAudioDevicesSpec.hpp +66 -0
- package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.cpp +143 -0
- package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.hpp +77 -0
- package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +137 -0
- package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +78 -0
- package/nitrogen/generated/android/c++/JPlayerConfig.hpp +65 -0
- package/nitrogen/generated/android/c++/JPlayerState.hpp +87 -0
- package/nitrogen/generated/android/c++/JPlaylist.hpp +99 -0
- package/nitrogen/generated/android/c++/JQueueOperation.hpp +65 -0
- package/nitrogen/generated/android/c++/JReason.hpp +65 -0
- package/nitrogen/generated/android/c++/JTAudioDevice.hpp +69 -0
- package/nitrogen/generated/android/c++/JTrackItem.hpp +86 -0
- package/nitrogen/generated/android/c++/JTrackPlayerState.hpp +62 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.hpp +77 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_String.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +70 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.hpp +74 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_TrackItem_std__optional_Reason_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_TrackPlayerState_std__optional_Reason_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_bool.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_double_double.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_double_double_std__optional_bool_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__string_Playlist_std__optional_QueueOperation_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_Playlist__std__optional_QueueOperation_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridAndroidAutoMediaLibrarySpec.kt +61 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridAudioDevicesSpec.kt +61 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridPlayerQueueSpec.kt +116 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +134 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/NitroPlayerOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerConfig.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerState.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Playlist.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/QueueOperation.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Reason.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TAudioDevice.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackItem.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackPlayerState.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_Playlist.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_String.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_TrackItem.kt +59 -0
- package/nitrogen/generated/ios/NitroPlayer+autolinking.rb +60 -0
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +123 -0
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +531 -0
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +80 -0
- package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +49 -0
- package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +55 -0
- package/nitrogen/generated/ios/c++/HybridAudioRoutePickerSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridAudioRoutePickerSpecSwift.hpp +74 -0
- package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.hpp +167 -0
- package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +174 -0
- package/nitrogen/generated/ios/swift/Func_void_TrackItem_std__optional_Reason_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_TrackPlayerState_std__optional_Reason_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_double_double.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_double_double_std__optional_bool_.swift +54 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string_Playlist_std__optional_QueueOperation_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_Playlist__std__optional_QueueOperation_.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridAudioRoutePickerSpec.swift +56 -0
- package/nitrogen/generated/ios/swift/HybridAudioRoutePickerSpec_cxx.swift +130 -0
- package/nitrogen/generated/ios/swift/HybridPlayerQueueSpec.swift +68 -0
- package/nitrogen/generated/ios/swift/HybridPlayerQueueSpec_cxx.swift +349 -0
- package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +69 -0
- package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +325 -0
- package/nitrogen/generated/ios/swift/PlayerConfig.swift +115 -0
- package/nitrogen/generated/ios/swift/PlayerState.swift +181 -0
- package/nitrogen/generated/ios/swift/Playlist.swift +182 -0
- package/nitrogen/generated/ios/swift/QueueOperation.swift +48 -0
- package/nitrogen/generated/ios/swift/Reason.swift +48 -0
- package/nitrogen/generated/ios/swift/TrackItem.swift +147 -0
- package/nitrogen/generated/ios/swift/TrackPlayerState.swift +44 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_Playlist.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_TrackItem.swift +18 -0
- package/nitrogen/generated/shared/c++/HybridAndroidAutoMediaLibrarySpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridAndroidAutoMediaLibrarySpec.hpp +63 -0
- package/nitrogen/generated/shared/c++/HybridAudioDevicesSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridAudioDevicesSpec.hpp +65 -0
- package/nitrogen/generated/shared/c++/HybridAudioRoutePickerSpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridAudioRoutePickerSpec.hpp +62 -0
- package/nitrogen/generated/shared/c++/HybridPlayerQueueSpec.cpp +33 -0
- package/nitrogen/generated/shared/c++/HybridPlayerQueueSpec.hpp +87 -0
- package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +34 -0
- package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +91 -0
- package/nitrogen/generated/shared/c++/PlayerConfig.hpp +83 -0
- package/nitrogen/generated/shared/c++/PlayerState.hpp +103 -0
- package/nitrogen/generated/shared/c++/Playlist.hpp +97 -0
- package/nitrogen/generated/shared/c++/QueueOperation.hpp +84 -0
- package/nitrogen/generated/shared/c++/Reason.hpp +84 -0
- package/nitrogen/generated/shared/c++/TAudioDevice.hpp +87 -0
- package/nitrogen/generated/shared/c++/TrackItem.hpp +102 -0
- package/nitrogen/generated/shared/c++/TrackPlayerState.hpp +80 -0
- package/package.json +172 -0
- package/react-native.config.js +16 -0
- package/src/hooks/index.ts +6 -0
- package/src/hooks/useAndroidAutoConnection.ts +30 -0
- package/src/hooks/useAudioDevices.ts +64 -0
- package/src/hooks/useOnChangeTrack.ts +24 -0
- package/src/hooks/useOnPlaybackProgressChange.ts +30 -0
- package/src/hooks/useOnPlaybackStateChange.ts +24 -0
- package/src/hooks/useOnSeek.ts +25 -0
- package/src/index.ts +47 -0
- package/src/specs/AndroidAutoMediaLibrary.nitro.ts +22 -0
- package/src/specs/AudioDevices.nitro.ts +25 -0
- package/src/specs/AudioRoutePicker.nitro.ts +9 -0
- package/src/specs/TrackPlayer.nitro.ts +81 -0
- package/src/types/AndroidAutoMediaLibrary.ts +58 -0
- package/src/types/PlayerQueue.ts +38 -0
- package/src/utils/androidAutoMediaLibrary.ts +66 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
|
|
3
|
+
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
|
+
|
|
5
|
+
Pod::Spec.new do |s|
|
|
6
|
+
s.name = "NitroPlayer"
|
|
7
|
+
s.version = package["version"]
|
|
8
|
+
s.summary = package["description"]
|
|
9
|
+
s.homepage = package["homepage"]
|
|
10
|
+
s.license = package["license"]
|
|
11
|
+
s.authors = package["author"]
|
|
12
|
+
|
|
13
|
+
s.platforms = { :ios => min_ios_version_supported, :visionos => 1.0 }
|
|
14
|
+
s.source = { :git => "https://github.com/mrousavy/nitro.git", :tag => "#{s.version}" }
|
|
15
|
+
|
|
16
|
+
s.source_files = [
|
|
17
|
+
# Implementation (Swift)
|
|
18
|
+
"ios/**/*.{swift}",
|
|
19
|
+
# Autolinking/Registration (Objective-C++)
|
|
20
|
+
"ios/**/*.{m,mm}",
|
|
21
|
+
# Implementation (C++ objects)
|
|
22
|
+
"cpp/**/*.{hpp,cpp}",
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
load 'nitrogen/generated/ios/NitroPlayer+autolinking.rb'
|
|
26
|
+
add_nitrogen_files(s)
|
|
27
|
+
|
|
28
|
+
s.dependency 'React-jsi'
|
|
29
|
+
s.dependency 'React-callinvoker'
|
|
30
|
+
install_modules_dependencies(s)
|
|
31
|
+
end
|
package/README.md
ADDED
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
# React Native Nitro Player
|
|
2
|
+
|
|
3
|
+
A powerful audio player library for React Native with playlist management, playback controls, and support for Android Auto and CarPlay.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install react-native-nitro-player
|
|
9
|
+
# or
|
|
10
|
+
yarn add react-native-nitro-player
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Peer Dependencies
|
|
14
|
+
|
|
15
|
+
Make sure you have these installed:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install react-native-nitro-modules
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
### 1. Configure the Player
|
|
24
|
+
|
|
25
|
+
Configure the player before using it in your app:
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { TrackPlayer } from 'react-native-nitro-player'
|
|
29
|
+
|
|
30
|
+
TrackPlayer.configure({
|
|
31
|
+
androidAutoEnabled: true,
|
|
32
|
+
carPlayEnabled: false,
|
|
33
|
+
showInNotification: true,
|
|
34
|
+
})
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 2. Create Playlists
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { PlayerQueue } from 'react-native-nitro-player'
|
|
41
|
+
import type { TrackItem } from 'react-native-nitro-player'
|
|
42
|
+
|
|
43
|
+
const tracks: TrackItem[] = [
|
|
44
|
+
{
|
|
45
|
+
id: '1',
|
|
46
|
+
title: 'Song Title',
|
|
47
|
+
artist: 'Artist Name',
|
|
48
|
+
album: 'Album Name',
|
|
49
|
+
duration: 180.0, // in seconds
|
|
50
|
+
url: 'https://example.com/song.mp3',
|
|
51
|
+
artwork: 'https://example.com/artwork.jpg',
|
|
52
|
+
},
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
// Create a playlist
|
|
56
|
+
const playlistId = PlayerQueue.createPlaylist(
|
|
57
|
+
'My Playlist',
|
|
58
|
+
'Playlist description',
|
|
59
|
+
'https://example.com/playlist-artwork.jpg'
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
// Add tracks to the playlist
|
|
63
|
+
PlayerQueue.addTracksToPlaylist(playlistId, tracks)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 3. Play Music
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import { TrackPlayer, PlayerQueue } from 'react-native-nitro-player'
|
|
70
|
+
|
|
71
|
+
// Load and play a playlist
|
|
72
|
+
PlayerQueue.loadPlaylist(playlistId)
|
|
73
|
+
|
|
74
|
+
// Or play a specific song
|
|
75
|
+
TrackPlayer.playSong('song-id', playlistId)
|
|
76
|
+
|
|
77
|
+
// Basic controls
|
|
78
|
+
TrackPlayer.play()
|
|
79
|
+
TrackPlayer.pause()
|
|
80
|
+
TrackPlayer.skipToNext()
|
|
81
|
+
TrackPlayer.skipToPrevious()
|
|
82
|
+
TrackPlayer.seek(30) // Seek to 30 seconds
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Core Concepts
|
|
86
|
+
|
|
87
|
+
### PlayerQueue
|
|
88
|
+
|
|
89
|
+
Manages playlists and tracks. Use it to:
|
|
90
|
+
|
|
91
|
+
- Create, update, and delete playlists
|
|
92
|
+
- Add or remove tracks from playlists
|
|
93
|
+
- Load playlists for playback
|
|
94
|
+
- Listen to playlist changes
|
|
95
|
+
|
|
96
|
+
### TrackPlayer
|
|
97
|
+
|
|
98
|
+
Controls playback. Use it to:
|
|
99
|
+
|
|
100
|
+
- Play, pause, and seek
|
|
101
|
+
- Skip tracks
|
|
102
|
+
- Get current player state
|
|
103
|
+
- Listen to playback events
|
|
104
|
+
|
|
105
|
+
## React Hooks
|
|
106
|
+
|
|
107
|
+
The library provides React hooks for reactive state management. These hooks automatically update your components when player state changes.
|
|
108
|
+
|
|
109
|
+
### `useOnChangeTrack()`
|
|
110
|
+
|
|
111
|
+
Returns the current track and the reason why it changed.
|
|
112
|
+
|
|
113
|
+
**Returns:**
|
|
114
|
+
|
|
115
|
+
- `track: TrackItem | undefined` - The current track, or `undefined` if no track is playing
|
|
116
|
+
- `reason: Reason | undefined` - The reason for the track change (`'user_action'`, `'skip'`, `'end'`, or `'error'`)
|
|
117
|
+
|
|
118
|
+
### `useOnPlaybackStateChange()`
|
|
119
|
+
|
|
120
|
+
Returns the current playback state and the reason for the state change.
|
|
121
|
+
|
|
122
|
+
**Returns:**
|
|
123
|
+
|
|
124
|
+
- `state: TrackPlayerState | undefined` - Current playback state (`'playing'`, `'paused'`, or `'stopped'`)
|
|
125
|
+
- `reason: Reason | undefined` - The reason for the state change
|
|
126
|
+
|
|
127
|
+
### `useOnPlaybackProgressChange()`
|
|
128
|
+
|
|
129
|
+
Returns real-time playback progress updates.
|
|
130
|
+
|
|
131
|
+
**Returns:**
|
|
132
|
+
|
|
133
|
+
- `position: number` - Current playback position in seconds
|
|
134
|
+
- `totalDuration: number` - Total duration of the current track in seconds
|
|
135
|
+
- `isManuallySeeked: boolean | undefined` - `true` if the user manually seeked, `undefined` otherwise
|
|
136
|
+
|
|
137
|
+
### `useOnSeek()`
|
|
138
|
+
|
|
139
|
+
Returns information about the last seek event.
|
|
140
|
+
|
|
141
|
+
**Returns:**
|
|
142
|
+
|
|
143
|
+
- `position: number | undefined` - The position where the user seeked to, or `undefined` if no seek has occurred
|
|
144
|
+
- `totalDuration: number | undefined` - The total duration at the time of seek, or `undefined` if no seek has occurred
|
|
145
|
+
|
|
146
|
+
### `useAndroidAutoConnection()`
|
|
147
|
+
|
|
148
|
+
Monitors Android Auto connection status.
|
|
149
|
+
|
|
150
|
+
**Returns:**
|
|
151
|
+
|
|
152
|
+
- `isConnected: boolean` - `true` if connected to Android Auto, `false` otherwise
|
|
153
|
+
|
|
154
|
+
### `useAudioDevices()` (Android only)
|
|
155
|
+
|
|
156
|
+
Automatically polls for audio device changes every 2 seconds.
|
|
157
|
+
|
|
158
|
+
**Returns:**
|
|
159
|
+
|
|
160
|
+
- `devices: TAudioDevice[]` - Array of available audio devices
|
|
161
|
+
|
|
162
|
+
## Audio Device APIs
|
|
163
|
+
|
|
164
|
+
### `AudioDevices` (Android only)
|
|
165
|
+
|
|
166
|
+
Android-specific API for managing audio output devices.
|
|
167
|
+
|
|
168
|
+
#### `getAudioDevices(): TAudioDevice[]`
|
|
169
|
+
|
|
170
|
+
Returns the list of available audio output devices.
|
|
171
|
+
|
|
172
|
+
**Returns:** Array of `TAudioDevice` objects with:
|
|
173
|
+
|
|
174
|
+
- `id: number` - Unique device ID
|
|
175
|
+
- `name: string` - Device name (e.g., "Built-in Speaker", "Bluetooth")
|
|
176
|
+
- `type: number` - Device type constant
|
|
177
|
+
- `isActive: boolean` - Whether this device is currently active
|
|
178
|
+
|
|
179
|
+
**Example:**
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
import { AudioDevices } from 'react-native-nitro-player'
|
|
183
|
+
|
|
184
|
+
if (AudioDevices) {
|
|
185
|
+
const devices = AudioDevices.getAudioDevices()
|
|
186
|
+
devices.forEach((device) => {
|
|
187
|
+
console.log(`${device.name} - Active: ${device.isActive}`)
|
|
188
|
+
})
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
#### `setAudioDevice(deviceId: number): boolean`
|
|
193
|
+
|
|
194
|
+
Sets the active audio output device.
|
|
195
|
+
|
|
196
|
+
**Parameters:**
|
|
197
|
+
|
|
198
|
+
- `deviceId: number` - The ID of the device to activate
|
|
199
|
+
|
|
200
|
+
**Returns:** `true` if successful, `false` otherwise
|
|
201
|
+
|
|
202
|
+
**Example:**
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
import { AudioDevices } from 'react-native-nitro-player'
|
|
206
|
+
|
|
207
|
+
if (AudioDevices) {
|
|
208
|
+
const success = AudioDevices.setAudioDevice(deviceId)
|
|
209
|
+
console.log(`Device switch: ${success ? 'success' : 'failed'}`)
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### `AudioRoutePicker` (iOS only)
|
|
214
|
+
|
|
215
|
+
iOS-specific API for displaying the native audio route picker (AirPlay menu).
|
|
216
|
+
|
|
217
|
+
#### `showRoutePicker(): void`
|
|
218
|
+
|
|
219
|
+
Shows the native AVRoutePickerView for selecting audio output routes like AirPlay, Bluetooth, etc.
|
|
220
|
+
|
|
221
|
+
**Example:**
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
import { AudioRoutePicker } from 'react-native-nitro-player'
|
|
225
|
+
|
|
226
|
+
if (AudioRoutePicker) {
|
|
227
|
+
AudioRoutePicker.showRoutePicker()
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Usage Examples
|
|
232
|
+
|
|
233
|
+
### Using React Hooks
|
|
234
|
+
|
|
235
|
+
The library provides convenient React hooks for reactive state management:
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
import {
|
|
239
|
+
useOnChangeTrack,
|
|
240
|
+
useOnPlaybackStateChange,
|
|
241
|
+
useOnPlaybackProgressChange,
|
|
242
|
+
useOnSeek,
|
|
243
|
+
useAndroidAutoConnection,
|
|
244
|
+
} from 'react-native-nitro-player'
|
|
245
|
+
|
|
246
|
+
function PlayerComponent() {
|
|
247
|
+
// Get current track
|
|
248
|
+
const { track, reason } = useOnChangeTrack()
|
|
249
|
+
|
|
250
|
+
// Get playback state (playing, paused, stopped)
|
|
251
|
+
const { state, reason: stateReason } = useOnPlaybackStateChange()
|
|
252
|
+
|
|
253
|
+
// Get playback progress
|
|
254
|
+
const { position, totalDuration, isManuallySeeked } = useOnPlaybackProgressChange()
|
|
255
|
+
|
|
256
|
+
// Get seek events
|
|
257
|
+
const { position: seekPosition, totalDuration: seekDuration } = useOnSeek()
|
|
258
|
+
|
|
259
|
+
// Check Android Auto connection
|
|
260
|
+
const { isConnected } = useAndroidAutoConnection()
|
|
261
|
+
|
|
262
|
+
return (
|
|
263
|
+
<View>
|
|
264
|
+
{track && (
|
|
265
|
+
<Text>Now Playing: {track.title} by {track.artist}</Text>
|
|
266
|
+
)}
|
|
267
|
+
<Text>State: {state}</Text>
|
|
268
|
+
<Text>Progress: {position} / {totalDuration}</Text>
|
|
269
|
+
</View>
|
|
270
|
+
)
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Managing Playlists
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
import { PlayerQueue } from 'react-native-nitro-player'
|
|
278
|
+
import type { TrackItem, Playlist } from 'react-native-nitro-player'
|
|
279
|
+
|
|
280
|
+
// Get all playlists
|
|
281
|
+
const playlists = PlayerQueue.getAllPlaylists()
|
|
282
|
+
|
|
283
|
+
// Get a specific playlist
|
|
284
|
+
const playlist = PlayerQueue.getPlaylist(playlistId)
|
|
285
|
+
|
|
286
|
+
// Get current playing playlist
|
|
287
|
+
const currentPlaylistId = PlayerQueue.getCurrentPlaylistId()
|
|
288
|
+
|
|
289
|
+
// Update playlist metadata
|
|
290
|
+
PlayerQueue.updatePlaylist(playlistId, {
|
|
291
|
+
name: 'Updated Name',
|
|
292
|
+
description: 'New description',
|
|
293
|
+
artwork: 'https://example.com/new-artwork.jpg',
|
|
294
|
+
})
|
|
295
|
+
|
|
296
|
+
// Add a single track
|
|
297
|
+
PlayerQueue.addTrackToPlaylist(playlistId, newTrack)
|
|
298
|
+
|
|
299
|
+
// Add multiple tracks
|
|
300
|
+
PlayerQueue.addTracksToPlaylist(playlistId, [track1, track2, track3])
|
|
301
|
+
|
|
302
|
+
// Remove a track
|
|
303
|
+
PlayerQueue.removeTrackFromPlaylist(playlistId, trackId)
|
|
304
|
+
|
|
305
|
+
// Reorder tracks
|
|
306
|
+
PlayerQueue.reorderTrackInPlaylist(playlistId, trackId, newIndex)
|
|
307
|
+
|
|
308
|
+
// Delete a playlist
|
|
309
|
+
PlayerQueue.deletePlaylist(playlistId)
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Listening to Events
|
|
313
|
+
|
|
314
|
+
```typescript
|
|
315
|
+
import { PlayerQueue, TrackPlayer } from 'react-native-nitro-player'
|
|
316
|
+
|
|
317
|
+
// Listen to playlist changes
|
|
318
|
+
PlayerQueue.onPlaylistsChanged((playlists, operation) => {
|
|
319
|
+
console.log('Playlists updated:', operation)
|
|
320
|
+
// operation can be: 'add', 'remove', 'clear', 'update'
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
// Listen to specific playlist changes
|
|
324
|
+
PlayerQueue.onPlaylistChanged((playlistId, playlist, operation) => {
|
|
325
|
+
console.log('Playlist changed:', playlistId, operation)
|
|
326
|
+
})
|
|
327
|
+
|
|
328
|
+
// Listen to track changes
|
|
329
|
+
TrackPlayer.onChangeTrack((track, reason) => {
|
|
330
|
+
console.log('Track changed:', track.title, reason)
|
|
331
|
+
// reason can be: 'user_action', 'skip', 'end', 'error'
|
|
332
|
+
})
|
|
333
|
+
|
|
334
|
+
// Listen to playback state changes
|
|
335
|
+
TrackPlayer.onPlaybackStateChange((state, reason) => {
|
|
336
|
+
console.log('State changed:', state, reason)
|
|
337
|
+
})
|
|
338
|
+
|
|
339
|
+
// Listen to seek events
|
|
340
|
+
TrackPlayer.onSeek((position, totalDuration) => {
|
|
341
|
+
console.log('Seeked to:', position)
|
|
342
|
+
})
|
|
343
|
+
|
|
344
|
+
// Listen to playback progress
|
|
345
|
+
TrackPlayer.onPlaybackProgressChange(
|
|
346
|
+
(position, totalDuration, isManuallySeeked) => {
|
|
347
|
+
console.log('Progress:', position, '/', totalDuration)
|
|
348
|
+
}
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
// Listen to Android Auto connection changes
|
|
352
|
+
TrackPlayer.onAndroidAutoConnectionChange((connected) => {
|
|
353
|
+
console.log('Android Auto:', connected ? 'Connected' : 'Disconnected')
|
|
354
|
+
})
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Getting Player State
|
|
358
|
+
|
|
359
|
+
```typescript
|
|
360
|
+
import { TrackPlayer } from 'react-native-nitro-player'
|
|
361
|
+
|
|
362
|
+
const state = TrackPlayer.getState()
|
|
363
|
+
|
|
364
|
+
console.log(state.currentState) // 'playing' | 'paused' | 'stopped'
|
|
365
|
+
console.log(state.currentPosition) // current position in seconds
|
|
366
|
+
console.log(state.totalDuration) // total duration in seconds
|
|
367
|
+
console.log(state.currentTrack) // current TrackItem or null
|
|
368
|
+
console.log(state.currentPlaylistId) // current playlist ID or null
|
|
369
|
+
console.log(state.currentIndex) // current track index in playlist
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## Track Item Structure
|
|
373
|
+
|
|
374
|
+
Each track must follow this structure:
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
interface TrackItem {
|
|
378
|
+
id: string // Unique identifier
|
|
379
|
+
title: string // Track title
|
|
380
|
+
artist: string // Artist name
|
|
381
|
+
album: string // Album name
|
|
382
|
+
duration: number // Duration in seconds
|
|
383
|
+
url: string // Audio file URL
|
|
384
|
+
artwork?: string | null // Optional artwork URL
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
## Playlist Structure
|
|
389
|
+
|
|
390
|
+
```typescript
|
|
391
|
+
interface Playlist {
|
|
392
|
+
id: string // Unique identifier
|
|
393
|
+
name: string // Playlist name
|
|
394
|
+
description?: string | null // Optional description
|
|
395
|
+
artwork?: string | null // Optional artwork URL
|
|
396
|
+
tracks: TrackItem[] // Array of tracks
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
## Android Auto Customization
|
|
401
|
+
|
|
402
|
+
Customize how your music library appears in Android Auto with a custom folder structure.
|
|
403
|
+
|
|
404
|
+
### Basic Setup
|
|
405
|
+
|
|
406
|
+
By default, all playlists are shown in Android Auto. You can create a custom structure:
|
|
407
|
+
|
|
408
|
+
```typescript
|
|
409
|
+
import { AndroidAutoMediaLibraryHelper } from 'react-native-nitro-player'
|
|
410
|
+
import type { MediaLibrary } from 'react-native-nitro-player'
|
|
411
|
+
|
|
412
|
+
// Check if available (Android only)
|
|
413
|
+
if (AndroidAutoMediaLibraryHelper.isAvailable()) {
|
|
414
|
+
const mediaLibrary: MediaLibrary = {
|
|
415
|
+
layoutType: 'grid', // 'grid' or 'list'
|
|
416
|
+
rootItems: [
|
|
417
|
+
{
|
|
418
|
+
id: 'my_music',
|
|
419
|
+
title: '🎵 My Music',
|
|
420
|
+
subtitle: 'Your music collection',
|
|
421
|
+
mediaType: 'folder',
|
|
422
|
+
isPlayable: false,
|
|
423
|
+
layoutType: 'grid',
|
|
424
|
+
children: [
|
|
425
|
+
{
|
|
426
|
+
id: 'favorites',
|
|
427
|
+
title: 'Favorites',
|
|
428
|
+
subtitle: '10 tracks',
|
|
429
|
+
mediaType: 'playlist',
|
|
430
|
+
playlistId: 'my-playlist-id', // References a playlist created with PlayerQueue
|
|
431
|
+
isPlayable: false,
|
|
432
|
+
},
|
|
433
|
+
],
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
id: 'recent',
|
|
437
|
+
title: '🕐 Recently Played',
|
|
438
|
+
mediaType: 'folder',
|
|
439
|
+
isPlayable: false,
|
|
440
|
+
children: [
|
|
441
|
+
// More playlist references...
|
|
442
|
+
],
|
|
443
|
+
},
|
|
444
|
+
],
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
AndroidAutoMediaLibraryHelper.set(mediaLibrary)
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// Reset to default (show all playlists)
|
|
451
|
+
AndroidAutoMediaLibraryHelper.clear()
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### MediaLibrary Structure
|
|
455
|
+
|
|
456
|
+
```typescript
|
|
457
|
+
interface MediaLibrary {
|
|
458
|
+
layoutType: 'grid' | 'list' // Default layout for items
|
|
459
|
+
rootItems: MediaItem[] // Top-level items
|
|
460
|
+
appName?: string // Optional app name
|
|
461
|
+
appIconUrl?: string // Optional app icon
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
interface MediaItem {
|
|
465
|
+
id: string // Unique identifier
|
|
466
|
+
title: string // Display title
|
|
467
|
+
subtitle?: string // Optional subtitle
|
|
468
|
+
iconUrl?: string // Optional icon/artwork URL
|
|
469
|
+
isPlayable: boolean // Whether item can be played
|
|
470
|
+
mediaType: 'folder' | 'audio' | 'playlist' // Type of item
|
|
471
|
+
playlistId?: string // Reference to playlist (for playlist items)
|
|
472
|
+
children?: MediaItem[] // Child items (for folders)
|
|
473
|
+
layoutType?: 'grid' | 'list' // Override default layout
|
|
474
|
+
}
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
### Example: Organizing Playlists by Genre
|
|
478
|
+
|
|
479
|
+
```typescript
|
|
480
|
+
import {
|
|
481
|
+
PlayerQueue,
|
|
482
|
+
AndroidAutoMediaLibraryHelper,
|
|
483
|
+
} from 'react-native-nitro-player'
|
|
484
|
+
|
|
485
|
+
// Create playlists first
|
|
486
|
+
const rockPlaylistId = PlayerQueue.createPlaylist('Rock Classics')
|
|
487
|
+
const jazzPlaylistId = PlayerQueue.createPlaylist('Jazz Essentials')
|
|
488
|
+
const popPlaylistId = PlayerQueue.createPlaylist('Pop Hits')
|
|
489
|
+
|
|
490
|
+
// Add tracks to playlists...
|
|
491
|
+
PlayerQueue.addTracksToPlaylist(rockPlaylistId, rockTracks)
|
|
492
|
+
PlayerQueue.addTracksToPlaylist(jazzPlaylistId, jazzTracks)
|
|
493
|
+
PlayerQueue.addTracksToPlaylist(popPlaylistId, popTracks)
|
|
494
|
+
|
|
495
|
+
// Create custom Android Auto structure
|
|
496
|
+
AndroidAutoMediaLibraryHelper.set({
|
|
497
|
+
layoutType: 'list',
|
|
498
|
+
rootItems: [
|
|
499
|
+
{
|
|
500
|
+
id: 'genres',
|
|
501
|
+
title: '🎸 By Genre',
|
|
502
|
+
mediaType: 'folder',
|
|
503
|
+
isPlayable: false,
|
|
504
|
+
layoutType: 'grid',
|
|
505
|
+
children: [
|
|
506
|
+
{
|
|
507
|
+
id: 'rock',
|
|
508
|
+
title: 'Rock',
|
|
509
|
+
mediaType: 'playlist',
|
|
510
|
+
playlistId: rockPlaylistId,
|
|
511
|
+
isPlayable: false,
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
id: 'jazz',
|
|
515
|
+
title: 'Jazz',
|
|
516
|
+
mediaType: 'playlist',
|
|
517
|
+
playlistId: jazzPlaylistId,
|
|
518
|
+
isPlayable: false,
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
id: 'pop',
|
|
522
|
+
title: 'Pop',
|
|
523
|
+
mediaType: 'playlist',
|
|
524
|
+
playlistId: popPlaylistId,
|
|
525
|
+
isPlayable: false,
|
|
526
|
+
},
|
|
527
|
+
],
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
id: 'all_music',
|
|
531
|
+
title: '📀 All Music',
|
|
532
|
+
mediaType: 'folder',
|
|
533
|
+
isPlayable: false,
|
|
534
|
+
children: [
|
|
535
|
+
{
|
|
536
|
+
id: 'all_rock',
|
|
537
|
+
title: 'Rock Classics',
|
|
538
|
+
mediaType: 'playlist',
|
|
539
|
+
playlistId: rockPlaylistId,
|
|
540
|
+
isPlayable: false,
|
|
541
|
+
},
|
|
542
|
+
{
|
|
543
|
+
id: 'all_jazz',
|
|
544
|
+
title: 'Jazz Essentials',
|
|
545
|
+
mediaType: 'playlist',
|
|
546
|
+
playlistId: jazzPlaylistId,
|
|
547
|
+
isPlayable: false,
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
id: 'all_pop',
|
|
551
|
+
title: 'Pop Hits',
|
|
552
|
+
mediaType: 'playlist',
|
|
553
|
+
playlistId: popPlaylistId,
|
|
554
|
+
isPlayable: false,
|
|
555
|
+
},
|
|
556
|
+
],
|
|
557
|
+
},
|
|
558
|
+
],
|
|
559
|
+
})
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
### Notes
|
|
563
|
+
|
|
564
|
+
- The `playlistId` field must reference a playlist created with `PlayerQueue.createPlaylist()`
|
|
565
|
+
- Changes are immediately reflected in Android Auto
|
|
566
|
+
- Use folders to organize playlists hierarchically
|
|
567
|
+
- Grid layout is best for album/playlist browsing
|
|
568
|
+
- List layout is best for song lists
|
|
569
|
+
- Only available on Android (use `isAvailable()` to check)
|
|
570
|
+
|
|
571
|
+
## Features
|
|
572
|
+
|
|
573
|
+
- ✅ **Playlist Management**: Create, update, and manage multiple playlists
|
|
574
|
+
- ✅ **Playback Controls**: Play, pause, seek, skip tracks
|
|
575
|
+
- ✅ **React Hooks**: Built-in hooks for reactive state management
|
|
576
|
+
- ✅ **Event Listeners**: Listen to track changes, state changes, and more
|
|
577
|
+
- ✅ **Android Auto Support**: Control playback from Android Auto with customizable UI
|
|
578
|
+
- ✅ **CarPlay Support**: Control playback from CarPlay (iOS)
|
|
579
|
+
- ✅ **Notification Controls**: Show playback controls in notifications
|
|
580
|
+
- ✅ **Progress Tracking**: Real-time playback progress updates
|
|
581
|
+
|
|
582
|
+
## TypeScript Support
|
|
583
|
+
|
|
584
|
+
The library is written in TypeScript and includes full type definitions. All types are exported for your convenience:
|
|
585
|
+
|
|
586
|
+
```typescript
|
|
587
|
+
import type {
|
|
588
|
+
TrackItem,
|
|
589
|
+
Playlist,
|
|
590
|
+
PlayerState,
|
|
591
|
+
TrackPlayerState,
|
|
592
|
+
QueueOperation,
|
|
593
|
+
Reason,
|
|
594
|
+
PlayerConfig,
|
|
595
|
+
MediaLibrary,
|
|
596
|
+
MediaItem,
|
|
597
|
+
LayoutType,
|
|
598
|
+
MediaType,
|
|
599
|
+
} from 'react-native-nitro-player'
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
## Platform Support
|
|
603
|
+
|
|
604
|
+
- ✅ **iOS**: Full support with CarPlay integration
|
|
605
|
+
- ✅ **Android**: Full support with Android Auto integration
|
|
606
|
+
- 🎯 **Android Auto Media Library**: Android-only feature for customizing the Android Auto UI
|
|
607
|
+
|
|
608
|
+
## License
|
|
609
|
+
|
|
610
|
+
MIT
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
project(NitroPlayer)
|
|
2
|
+
cmake_minimum_required(VERSION 3.9.0)
|
|
3
|
+
|
|
4
|
+
set (PACKAGE_NAME NitroPlayer)
|
|
5
|
+
set (CMAKE_VERBOSE_MAKEFILE ON)
|
|
6
|
+
set (CMAKE_CXX_STANDARD 20)
|
|
7
|
+
|
|
8
|
+
# Define C++ library and add all sources
|
|
9
|
+
add_library(${PACKAGE_NAME} SHARED
|
|
10
|
+
src/main/cpp/cpp-adapter.cpp
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
# Add Nitrogen specs :)
|
|
14
|
+
include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/NitroPlayer+autolinking.cmake)
|
|
15
|
+
|
|
16
|
+
# Set up local includes
|
|
17
|
+
include_directories(
|
|
18
|
+
"src/main/cpp"
|
|
19
|
+
"../cpp"
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
find_library(LOG_LIB log)
|
|
23
|
+
|
|
24
|
+
# Link all libraries together
|
|
25
|
+
target_link_libraries(
|
|
26
|
+
${PACKAGE_NAME}
|
|
27
|
+
${LOG_LIB}
|
|
28
|
+
android # <-- Android core
|
|
29
|
+
)
|