@capgo/native-audio 7.1.7 → 7.3.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 +56 -8
- package/android/build.gradle +14 -5
- package/android/src/main/java/ee/forgr/audio/AudioAsset.java +276 -133
- package/android/src/main/java/ee/forgr/audio/AudioCompletionListener.java +1 -1
- package/android/src/main/java/ee/forgr/audio/AudioDispatcher.java +168 -182
- package/android/src/main/java/ee/forgr/audio/Constant.java +20 -21
- package/android/src/main/java/ee/forgr/audio/NativeAudio.java +596 -506
- package/android/src/main/java/ee/forgr/audio/RemoteAudioAsset.java +599 -166
- package/android/src/main/java/ee/forgr/audio/StreamAudioAsset.java +499 -0
- package/dist/docs.json +96 -3
- package/dist/esm/definitions.d.ts +33 -2
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +4 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/web.d.ts +4 -3
- package/dist/esm/web.js +23 -20
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +22 -19
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +22 -19
- package/dist/plugin.js.map +1 -1
- package/ios/Plugin/AudioAsset.swift +200 -94
- package/ios/Plugin/Plugin.swift +56 -50
- package/ios/Plugin/RemoteAudioAsset.swift +217 -62
- package/package.json +18 -20
@@ -15,192 +15,178 @@ import android.os.Build;
|
|
15
15
|
import android.util.Log;
|
16
16
|
|
17
17
|
public class AudioDispatcher
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
MediaPlayer
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
.
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
}
|
50
|
-
|
51
|
-
public void setOwner(AudioAsset asset) {
|
52
|
-
owner = asset;
|
53
|
-
}
|
54
|
-
|
55
|
-
public double getDuration() {
|
56
|
-
return mediaPlayer.getDuration() / 1000.0;
|
57
|
-
}
|
58
|
-
|
59
|
-
public void setCurrentPosition(double time) {
|
60
|
-
if (mediaState == PLAYING || mediaState == PAUSE) {
|
61
|
-
mediaPlayer.seekTo((int) (time * 1000));
|
62
|
-
}
|
63
|
-
}
|
64
|
-
|
65
|
-
public double getCurrentPosition() {
|
66
|
-
return mediaPlayer.getCurrentPosition() / 1000.0;
|
67
|
-
}
|
68
|
-
|
69
|
-
public void play(Double time) throws Exception {
|
70
|
-
invokePlay(time);
|
71
|
-
}
|
72
|
-
|
73
|
-
public boolean pause() throws Exception {
|
74
|
-
if (mediaPlayer.isPlaying()) {
|
75
|
-
mediaPlayer.pause();
|
76
|
-
mediaState = PAUSE;
|
77
|
-
return true;
|
78
|
-
}
|
79
|
-
|
80
|
-
return false;
|
81
|
-
}
|
82
|
-
|
83
|
-
public void resume() throws Exception {
|
84
|
-
mediaPlayer.start();
|
85
|
-
}
|
86
|
-
|
87
|
-
public void stop() throws Exception {
|
88
|
-
if (mediaPlayer.isPlaying()) {
|
89
|
-
mediaState = INVALID;
|
90
|
-
mediaPlayer.pause();
|
91
|
-
mediaPlayer.seekTo(0);
|
92
|
-
}
|
93
|
-
}
|
94
|
-
|
95
|
-
public void setVolume(float volume) throws Exception {
|
96
|
-
mediaPlayer.setVolume(volume, volume);
|
97
|
-
}
|
98
|
-
|
99
|
-
public void setRate(float rate) throws Exception {
|
100
|
-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
101
|
-
return;
|
102
|
-
}
|
103
|
-
mediaPlayer.setPlaybackParams(
|
104
|
-
mediaPlayer.getPlaybackParams().setSpeed(rate)
|
105
|
-
);
|
106
|
-
}
|
107
|
-
|
108
|
-
public void loop() throws Exception {
|
109
|
-
mediaPlayer.setLooping(true);
|
110
|
-
mediaPlayer.start();
|
111
|
-
}
|
112
|
-
|
113
|
-
public void unload() throws Exception {
|
114
|
-
this.stop();
|
115
|
-
mediaPlayer.release();
|
116
|
-
}
|
117
|
-
|
118
|
-
@Override
|
119
|
-
public void onCompletion(MediaPlayer mp) {
|
120
|
-
try {
|
121
|
-
if (mediaState != LOOPING) {
|
122
|
-
this.mediaState = INVALID;
|
18
|
+
implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnSeekCompleteListener {
|
19
|
+
|
20
|
+
private final String TAG = "AudioDispatcher";
|
21
|
+
private final MediaPlayer mediaPlayer;
|
22
|
+
private int mediaState;
|
23
|
+
private AudioAsset owner;
|
24
|
+
|
25
|
+
public AudioDispatcher(AssetFileDescriptor assetFileDescriptor, float volume) throws Exception {
|
26
|
+
mediaState = INVALID;
|
27
|
+
|
28
|
+
mediaPlayer = new MediaPlayer();
|
29
|
+
mediaPlayer.setOnCompletionListener(this);
|
30
|
+
mediaPlayer.setOnPreparedListener(this);
|
31
|
+
mediaPlayer.setDataSource(
|
32
|
+
assetFileDescriptor.getFileDescriptor(),
|
33
|
+
assetFileDescriptor.getStartOffset(),
|
34
|
+
assetFileDescriptor.getLength()
|
35
|
+
);
|
36
|
+
mediaPlayer.setOnSeekCompleteListener(this);
|
37
|
+
mediaPlayer.setAudioAttributes(
|
38
|
+
new AudioAttributes.Builder()
|
39
|
+
.setUsage(AudioAttributes.USAGE_MEDIA)
|
40
|
+
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
41
|
+
.build()
|
42
|
+
);
|
43
|
+
mediaPlayer.setVolume(volume, volume);
|
44
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
45
|
+
mediaPlayer.setPlaybackParams(mediaPlayer.getPlaybackParams().setSpeed(1.0f));
|
46
|
+
}
|
47
|
+
mediaPlayer.prepare();
|
48
|
+
}
|
123
49
|
|
124
|
-
|
50
|
+
public void setOwner(AudioAsset asset) {
|
51
|
+
owner = asset;
|
52
|
+
}
|
53
|
+
|
54
|
+
public double getDuration() {
|
55
|
+
return mediaPlayer.getDuration() / 1000.0;
|
56
|
+
}
|
57
|
+
|
58
|
+
public void setCurrentPosition(double time) {
|
59
|
+
if (mediaState == PLAYING || mediaState == PAUSE) {
|
60
|
+
mediaPlayer.seekTo((int) (time * 1000));
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
public double getCurrentPosition() {
|
65
|
+
return mediaPlayer.getCurrentPosition() / 1000.0;
|
66
|
+
}
|
67
|
+
|
68
|
+
public void play(Double time) throws Exception {
|
69
|
+
invokePlay(time);
|
70
|
+
}
|
71
|
+
|
72
|
+
public boolean pause() throws Exception {
|
73
|
+
if (mediaPlayer.isPlaying()) {
|
74
|
+
mediaPlayer.pause();
|
75
|
+
mediaState = PAUSE;
|
76
|
+
return true;
|
77
|
+
}
|
78
|
+
|
79
|
+
return false;
|
80
|
+
}
|
81
|
+
|
82
|
+
public void resume() throws Exception {
|
83
|
+
mediaPlayer.start();
|
84
|
+
}
|
85
|
+
|
86
|
+
public void stop() throws Exception {
|
87
|
+
if (mediaPlayer.isPlaying()) {
|
88
|
+
mediaState = INVALID;
|
89
|
+
mediaPlayer.pause();
|
90
|
+
mediaPlayer.seekTo(0);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
public void setVolume(float volume) throws Exception {
|
95
|
+
mediaPlayer.setVolume(volume, volume);
|
96
|
+
}
|
125
97
|
|
126
|
-
|
127
|
-
|
98
|
+
public void setRate(float rate) throws Exception {
|
99
|
+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
100
|
+
return;
|
128
101
|
}
|
129
|
-
|
130
|
-
}
|
131
|
-
|
132
|
-
|
133
|
-
"Caught exception while listening for onCompletion: " +
|
134
|
-
ex.getLocalizedMessage()
|
135
|
-
);
|
136
|
-
}
|
137
|
-
}
|
138
|
-
|
139
|
-
@Override
|
140
|
-
public void onPrepared(MediaPlayer mp) {
|
141
|
-
try {
|
142
|
-
if (mediaState == PENDING_PLAY) {
|
143
|
-
mediaPlayer.setLooping(false);
|
144
|
-
} else if (mediaState == PENDING_LOOP) {
|
102
|
+
mediaPlayer.setPlaybackParams(mediaPlayer.getPlaybackParams().setSpeed(rate));
|
103
|
+
}
|
104
|
+
|
105
|
+
public void loop() throws Exception {
|
145
106
|
mediaPlayer.setLooping(true);
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
107
|
+
mediaPlayer.start();
|
108
|
+
}
|
109
|
+
|
110
|
+
public void unload() throws Exception {
|
111
|
+
this.stop();
|
112
|
+
mediaPlayer.release();
|
113
|
+
}
|
114
|
+
|
115
|
+
@Override
|
116
|
+
public void onCompletion(MediaPlayer mp) {
|
117
|
+
try {
|
118
|
+
if (mediaState != LOOPING) {
|
119
|
+
this.mediaState = INVALID;
|
120
|
+
|
121
|
+
this.stop();
|
122
|
+
|
123
|
+
if (this.owner != null) {
|
124
|
+
this.owner.notifyCompletion();
|
125
|
+
}
|
126
|
+
}
|
127
|
+
} catch (Exception ex) {
|
128
|
+
Log.d(TAG, "Caught exception while listening for onCompletion: " + ex.getLocalizedMessage());
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
@Override
|
133
|
+
public void onPrepared(MediaPlayer mp) {
|
134
|
+
try {
|
135
|
+
if (mediaState == PENDING_PLAY) {
|
136
|
+
mediaPlayer.setLooping(false);
|
137
|
+
} else if (mediaState == PENDING_LOOP) {
|
138
|
+
mediaPlayer.setLooping(true);
|
139
|
+
} else {
|
140
|
+
mediaState = PREPARED;
|
141
|
+
}
|
142
|
+
} catch (Exception ex) {
|
143
|
+
Log.d(TAG, "Caught exception while listening for onPrepared: " + ex.getLocalizedMessage());
|
144
|
+
}
|
145
|
+
}
|
146
|
+
|
147
|
+
private void seek(Double time) {
|
148
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
149
|
+
mediaPlayer.seekTo((int) (time * 1000), MediaPlayer.SEEK_NEXT_SYNC);
|
180
150
|
} else {
|
181
|
-
|
182
|
-
|
183
|
-
|
151
|
+
mediaPlayer.seekTo((int) (time * 1000));
|
152
|
+
}
|
153
|
+
}
|
154
|
+
|
155
|
+
private void invokePlay(Double time) {
|
156
|
+
try {
|
157
|
+
boolean playing = mediaPlayer.isPlaying();
|
158
|
+
|
159
|
+
if (playing) {
|
160
|
+
mediaPlayer.pause();
|
161
|
+
mediaPlayer.setLooping(false);
|
162
|
+
mediaState = PENDING_PLAY;
|
163
|
+
seek(time);
|
164
|
+
} else {
|
165
|
+
if (mediaState == PREPARED) {
|
166
|
+
mediaState = (PENDING_PLAY);
|
167
|
+
onPrepared(mediaPlayer);
|
168
|
+
seek(time);
|
169
|
+
} else {
|
170
|
+
mediaState = (PENDING_PLAY);
|
171
|
+
mediaPlayer.setLooping(false);
|
172
|
+
seek(time);
|
173
|
+
}
|
174
|
+
}
|
175
|
+
} catch (Exception ex) {
|
176
|
+
Log.d(TAG, "Caught exception while invoking audio: " + ex.getLocalizedMessage());
|
184
177
|
}
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
mediaState = PLAYING;
|
200
|
-
}
|
201
|
-
}
|
202
|
-
|
203
|
-
public boolean isPlaying() throws Exception {
|
204
|
-
return mediaPlayer.isPlaying();
|
205
|
-
}
|
178
|
+
}
|
179
|
+
|
180
|
+
@Override
|
181
|
+
public void onSeekComplete(MediaPlayer mp) {
|
182
|
+
if (mediaState == PENDING_PLAY || mediaState == PENDING_LOOP) {
|
183
|
+
Log.w("AudioDispatcher", "play " + mediaState);
|
184
|
+
mediaPlayer.start();
|
185
|
+
mediaState = PLAYING;
|
186
|
+
}
|
187
|
+
}
|
188
|
+
|
189
|
+
public boolean isPlaying() throws Exception {
|
190
|
+
return mediaPlayer.isPlaying();
|
191
|
+
}
|
206
192
|
}
|
@@ -2,26 +2,25 @@ package ee.forgr.audio;
|
|
2
2
|
|
3
3
|
public class Constant {
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
"Audio Asset
|
8
|
-
|
9
|
-
|
10
|
-
public static final String ERROR_ASSET_NOT_LOADED = "Asset is not loaded";
|
5
|
+
public static final String ERROR_AUDIO_ID_MISSING = "Audio Id is missing";
|
6
|
+
public static final String ERROR_AUDIO_ASSET_MISSING = "Audio Asset is missing";
|
7
|
+
public static final String ERROR_AUDIO_EXISTS = "Audio Asset already exists";
|
8
|
+
public static final String ERROR_ASSET_PATH_MISSING = "Asset Path is missing";
|
9
|
+
public static final String ERROR_ASSET_NOT_LOADED = "Asset is not loaded";
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
11
|
+
public static final String ASSET_ID = "assetId";
|
12
|
+
public static final String ASSET_PATH = "assetPath";
|
13
|
+
public static final String OPT_FADE_MUSIC = "fade";
|
14
|
+
public static final String OPT_FOCUS_AUDIO = "focus";
|
15
|
+
public static final String VOLUME = "volume";
|
16
|
+
public static final String RATE = "rate";
|
17
|
+
public static final String AUDIO_CHANNEL_NUM = "audioChannelNum";
|
18
|
+
public static final String LOOP = "loop";
|
19
|
+
public static final int INVALID = 0;
|
20
|
+
public static final int PREPARED = 1;
|
21
|
+
public static final int PENDING_PLAY = 2;
|
22
|
+
public static final int PLAYING = 3;
|
23
|
+
public static final int PENDING_LOOP = 4;
|
24
|
+
public static final int LOOPING = 5;
|
25
|
+
public static final int PAUSE = 6;
|
27
26
|
}
|