react-native-audio-api 0.5.6 → 0.6.0-rc.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/RNAudioAPI.podspec +1 -1
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +0 -20
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +0 -2
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt +13 -0
- package/android/src/main/java/com/swmansion/audioapi/AudioManagerModule.kt +59 -0
- package/android/src/oldarch/NativeAudioManagerModuleSpec.java +99 -0
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +2 -6
- package/common/cpp/audioapi/core/AudioContext.cpp +1 -12
- package/common/cpp/audioapi/core/AudioContext.h +0 -1
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +1 -1
- package/common/cpp/audioapi/libs/signalsmith-stretch/fft-accelerate.h +326 -0
- package/common/cpp/audioapi/libs/signalsmith-stretch/fft.h +1257 -413
- package/common/cpp/audioapi/libs/signalsmith-stretch/signalsmith-stretch.h +398 -232
- package/common/cpp/audioapi/libs/signalsmith-stretch/stft.h +625 -0
- package/ios/audioapi/ios/AudioAPIModule.mm +2 -3
- package/ios/audioapi/ios/AudioManagerModule.h +18 -0
- package/ios/audioapi/ios/AudioManagerModule.mm +92 -0
- package/ios/audioapi/ios/core/AudioPlayer.h +4 -12
- package/ios/audioapi/ios/core/AudioPlayer.m +26 -108
- package/ios/audioapi/ios/core/IOSAudioPlayer.h +1 -3
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +4 -28
- package/ios/audioapi/ios/system/AudioEngine.h +23 -0
- package/ios/audioapi/ios/system/AudioEngine.mm +137 -0
- package/ios/audioapi/ios/system/AudioSessionManager.h +22 -0
- package/ios/audioapi/ios/system/AudioSessionManager.mm +183 -0
- package/ios/audioapi/ios/system/LockScreenManager.h +23 -0
- package/ios/audioapi/ios/system/LockScreenManager.mm +299 -0
- package/ios/audioapi/ios/system/NotificationManager.h +16 -0
- package/ios/audioapi/ios/system/NotificationManager.mm +151 -0
- package/lib/module/api.js +1 -0
- package/lib/module/api.js.map +1 -1
- package/lib/module/core/AudioContext.js +2 -1
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/specs/NativeAudioManagerModule.js +31 -0
- package/lib/module/specs/NativeAudioManagerModule.js.map +1 -0
- package/lib/module/specs/index.js +6 -0
- package/lib/module/specs/index.js.map +1 -0
- package/lib/module/system/AudioManager.js +66 -0
- package/lib/module/system/AudioManager.js.map +1 -0
- package/lib/module/system/index.js +4 -0
- package/lib/module/system/index.js.map +1 -0
- package/lib/module/system/types.js +2 -0
- package/lib/module/system/types.js.map +1 -0
- package/lib/typescript/api.d.ts +1 -0
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioManagerModule.d.ts +13 -0
- package/lib/typescript/specs/NativeAudioManagerModule.d.ts.map +1 -0
- package/lib/typescript/specs/index.d.ts +4 -0
- package/lib/typescript/specs/index.d.ts.map +1 -0
- package/lib/typescript/system/AudioManager.d.ts +12 -0
- package/lib/typescript/system/AudioManager.d.ts.map +1 -0
- package/lib/typescript/system/index.d.ts +2 -0
- package/lib/typescript/system/index.d.ts.map +1 -0
- package/lib/typescript/system/types.d.ts +28 -0
- package/lib/typescript/system/types.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/api.ts +1 -0
- package/src/core/AudioContext.ts +6 -1
- package/src/specs/NativeAudioManagerModule.ts +51 -0
- package/src/specs/index.ts +6 -0
- package/src/system/AudioManager.ts +122 -0
- package/src/system/index.ts +1 -0
- package/src/system/types.ts +68 -0
- package/common/cpp/audioapi/libs/signalsmith-stretch/delay.h +0 -715
- package/common/cpp/audioapi/libs/signalsmith-stretch/perf.h +0 -82
- package/common/cpp/audioapi/libs/signalsmith-stretch/spectral.h +0 -493
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import BaseAudioContext from "./BaseAudioContext.js";
|
|
4
|
+
import AudioManager from "../system/index.js";
|
|
4
5
|
import { NotSupportedError } from "../errors/index.js";
|
|
5
6
|
export default class AudioContext extends BaseAudioContext {
|
|
6
7
|
constructor(options) {
|
|
7
8
|
if (options && (options.sampleRate < 8000 || options.sampleRate > 96000)) {
|
|
8
9
|
throw new NotSupportedError(`The provided sampleRate is not supported: ${options.sampleRate}`);
|
|
9
10
|
}
|
|
10
|
-
super(global.createAudioContext(options?.sampleRate));
|
|
11
|
+
super(global.createAudioContext(options?.sampleRate || AudioManager.getDevicePreferredSampleRate()));
|
|
11
12
|
}
|
|
12
13
|
async close() {
|
|
13
14
|
await this.context.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseAudioContext","NotSupportedError","AudioContext","constructor","options","sampleRate","global","createAudioContext","close","context","resume","suspend"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;AACA,OAAOA,gBAAgB,MAAM,uBAAoB;
|
|
1
|
+
{"version":3,"names":["BaseAudioContext","AudioManager","NotSupportedError","AudioContext","constructor","options","sampleRate","global","createAudioContext","getDevicePreferredSampleRate","close","context","resume","suspend"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;AACA,OAAOA,gBAAgB,MAAM,uBAAoB;AACjD,OAAOC,YAAY,MAAM,oBAAW;AAEpC,SAASC,iBAAiB,QAAQ,oBAAW;AAE7C,eAAe,MAAMC,YAAY,SAASH,gBAAgB,CAAC;EACzDI,WAAWA,CAACC,OAA6B,EAAE;IACzC,IAAIA,OAAO,KAAKA,OAAO,CAACC,UAAU,GAAG,IAAI,IAAID,OAAO,CAACC,UAAU,GAAG,KAAK,CAAC,EAAE;MACxE,MAAM,IAAIJ,iBAAiB,CACzB,6CAA6CG,OAAO,CAACC,UAAU,EACjE,CAAC;IACH;IAEA,KAAK,CACHC,MAAM,CAACC,kBAAkB,CACvBH,OAAO,EAAEC,UAAU,IAAIL,YAAY,CAACQ,4BAA4B,CAAC,CACnE,CACF,CAAC;EACH;EAEA,MAAMC,KAAKA,CAAA,EAAuB;IAChC,MAAO,IAAI,CAACC,OAAO,CAAmBD,KAAK,CAAC,CAAC;EAC/C;EAEA,MAAME,MAAMA,CAAA,EAAuB;IACjC,MAAO,IAAI,CAACD,OAAO,CAAmBC,MAAM,CAAC,CAAC;EAChD;EAEA,MAAMC,OAAOA,CAAA,EAAuB;IAClC,MAAO,IAAI,CAACF,OAAO,CAAmBE,OAAO,CAAC,CAAC;EACjD;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NativeModules, DeviceEventEmitter, NativeEventEmitter, Platform } from 'react-native';
|
|
4
|
+
const NativeAudioManagerModule = NativeModules.AudioManagerModule;
|
|
5
|
+
const eventEmitter = Platform.select({
|
|
6
|
+
ios: new NativeEventEmitter(NativeModules.AudioManagerModule),
|
|
7
|
+
android: DeviceEventEmitter
|
|
8
|
+
});
|
|
9
|
+
if (!NativeAudioManagerModule || !eventEmitter) {
|
|
10
|
+
throw new Error(`Failed to install react-native-audio-api: The native module could not be found.`);
|
|
11
|
+
}
|
|
12
|
+
const AudioManagerModule = {
|
|
13
|
+
setLockScreenInfo(info) {
|
|
14
|
+
NativeAudioManagerModule.setLockScreenInfo(info);
|
|
15
|
+
},
|
|
16
|
+
resetLockScreenInfo() {
|
|
17
|
+
NativeAudioManagerModule.resetLockScreenInfo();
|
|
18
|
+
},
|
|
19
|
+
enableRemoteCommand(name, enabled) {
|
|
20
|
+
NativeAudioManagerModule.enableRemoteCommand(name, enabled);
|
|
21
|
+
},
|
|
22
|
+
// audio session
|
|
23
|
+
setAudioSessionOptions(category, mode, options, active) {
|
|
24
|
+
NativeAudioManagerModule.setAudioSessionOptions(category, mode, options, active);
|
|
25
|
+
},
|
|
26
|
+
getDevicePreferredSampleRate() {
|
|
27
|
+
return NativeAudioManagerModule.getDevicePreferredSampleRate();
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
export { eventEmitter, AudioManagerModule };
|
|
31
|
+
//# sourceMappingURL=NativeAudioManagerModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeModules","DeviceEventEmitter","NativeEventEmitter","Platform","NativeAudioManagerModule","AudioManagerModule","eventEmitter","select","ios","android","Error","setLockScreenInfo","info","resetLockScreenInfo","enableRemoteCommand","name","enabled","setAudioSessionOptions","category","mode","options","active","getDevicePreferredSampleRate"],"sourceRoot":"../../../src","sources":["specs/NativeAudioManagerModule.ts"],"mappings":";;AAAA,SACEA,aAAa,EACbC,kBAAkB,EAClBC,kBAAkB,EAClBC,QAAQ,QACH,cAAc;AAErB,MAAMC,wBAAwB,GAAGJ,aAAa,CAACK,kBAAkB;AACjE,MAAMC,YAAY,GAAGH,QAAQ,CAACI,MAAM,CAAC;EACnCC,GAAG,EAAE,IAAIN,kBAAkB,CAACF,aAAa,CAACK,kBAAkB,CAAC;EAC7DI,OAAO,EAAER;AACX,CAAC,CAAC;AAEF,IAAI,CAACG,wBAAwB,IAAI,CAACE,YAAY,EAAE;EAC9C,MAAM,IAAII,KAAK,CACb,iFACF,CAAC;AACH;AAEA,MAAML,kBAAkB,GAAG;EACzBM,iBAAiBA,CAACC,IAEjB,EAAQ;IACPR,wBAAwB,CAACO,iBAAiB,CAACC,IAAI,CAAC;EAClD,CAAC;EACDC,mBAAmBA,CAAA,EAAS;IAC1BT,wBAAwB,CAACS,mBAAmB,CAAC,CAAC;EAChD,CAAC;EACDC,mBAAmBA,CAACC,IAAY,EAAEC,OAAgB,EAAQ;IACxDZ,wBAAwB,CAACU,mBAAmB,CAACC,IAAI,EAAEC,OAAO,CAAC;EAC7D,CAAC;EACD;EACAC,sBAAsBA,CACpBC,QAAgB,EAChBC,IAAY,EACZC,OAAsB,EACtBC,MAAe,EACT;IACNjB,wBAAwB,CAACa,sBAAsB,CAC7CC,QAAQ,EACRC,IAAI,EACJC,OAAO,EACPC,MACF,CAAC;EACH,CAAC;EACDC,4BAA4BA,CAAA,EAAW;IACrC,OAAOlB,wBAAwB,CAACkB,4BAA4B,CAAC,CAAC;EAChE;AACF,CAAC;AAED,SAAShB,YAAY,EAAED,kBAAkB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeAudioAPIModule","AudioManagerModule","eventEmitter"],"sourceRoot":"../../../src","sources":["specs/index.ts"],"mappings":"AAAA,YAAY;;AAEZ,OAAOA,oBAAoB,MAAM,2BAAwB;AACzD,SAASC,kBAAkB,EAAEC,YAAY,QAAQ,+BAA4B;AAE7E,SAASF,oBAAoB,EAAEC,kBAAkB,EAAEC,YAAY","ignoreList":[]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { AudioManagerModule, eventEmitter } from "../specs/index.js";
|
|
4
|
+
class AudioManager {
|
|
5
|
+
setLockScreenInfo(info) {
|
|
6
|
+
AudioManagerModule.setLockScreenInfo(info);
|
|
7
|
+
}
|
|
8
|
+
resetLockScreenInfo() {
|
|
9
|
+
AudioManagerModule.resetLockScreenInfo();
|
|
10
|
+
}
|
|
11
|
+
setAudioSessionOptions(options) {
|
|
12
|
+
AudioManagerModule.setAudioSessionOptions(options.iosCategory ?? '', options.iosMode ?? '', options.iosOptions ?? [], options.active ?? true);
|
|
13
|
+
}
|
|
14
|
+
getDevicePreferredSampleRate() {
|
|
15
|
+
return AudioManagerModule.getDevicePreferredSampleRate();
|
|
16
|
+
}
|
|
17
|
+
enableRemoteCommand(name, enabled, callback) {
|
|
18
|
+
AudioManagerModule.enableRemoteCommand(name, enabled);
|
|
19
|
+
let subscription = null;
|
|
20
|
+
if (enabled && callback) {
|
|
21
|
+
switch (name) {
|
|
22
|
+
case 'play':
|
|
23
|
+
subscription = eventEmitter.addListener('onRemotePlay', callback);
|
|
24
|
+
break;
|
|
25
|
+
case 'pause':
|
|
26
|
+
subscription = eventEmitter.addListener('onRemotePause', callback);
|
|
27
|
+
break;
|
|
28
|
+
case 'stop':
|
|
29
|
+
subscription = eventEmitter.addListener('onRemoteStop', callback);
|
|
30
|
+
break;
|
|
31
|
+
case 'togglePlayPause':
|
|
32
|
+
subscription = eventEmitter.addListener('onRemoteTogglePlayPause', callback);
|
|
33
|
+
break;
|
|
34
|
+
case 'changePlaybackRate':
|
|
35
|
+
subscription = eventEmitter.addListener('onRemoteChangePlaybackRate', callback);
|
|
36
|
+
break;
|
|
37
|
+
case 'nextTrack':
|
|
38
|
+
subscription = eventEmitter.addListener('onRemoteNextTrack', callback);
|
|
39
|
+
break;
|
|
40
|
+
case 'previousTrack':
|
|
41
|
+
subscription = eventEmitter.addListener('onRemotePreviousTrack', callback);
|
|
42
|
+
break;
|
|
43
|
+
case 'skipForward':
|
|
44
|
+
subscription = eventEmitter.addListener('onRemoteSkipForward', callback);
|
|
45
|
+
break;
|
|
46
|
+
case 'skipBackward':
|
|
47
|
+
subscription = eventEmitter.addListener('onRemoteSkipBackward', callback);
|
|
48
|
+
break;
|
|
49
|
+
case 'seekForward':
|
|
50
|
+
subscription = eventEmitter.addListener('onRemoteSeekForward', callback);
|
|
51
|
+
break;
|
|
52
|
+
case 'seekBackward':
|
|
53
|
+
subscription = eventEmitter.addListener('onRemoteSeekBackward', callback);
|
|
54
|
+
break;
|
|
55
|
+
case 'changePlaybackPosition':
|
|
56
|
+
subscription = eventEmitter.addListener('onRemoteChangePlaybackPosition', callback);
|
|
57
|
+
break;
|
|
58
|
+
default:
|
|
59
|
+
console.error('Unsupported RemoteControl action:', name);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return subscription;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export default new AudioManager();
|
|
66
|
+
//# sourceMappingURL=AudioManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AudioManagerModule","eventEmitter","AudioManager","setLockScreenInfo","info","resetLockScreenInfo","setAudioSessionOptions","options","iosCategory","iosMode","iosOptions","active","getDevicePreferredSampleRate","enableRemoteCommand","name","enabled","callback","subscription","addListener","console","error"],"sourceRoot":"../../../src","sources":["system/AudioManager.ts"],"mappings":";;AACA,SAASA,kBAAkB,EAAEC,YAAY,QAAQ,mBAAU;AAG3D,MAAMC,YAAY,CAAC;EACjBC,iBAAiBA,CAACC,IAAoB,EAAE;IACtCJ,kBAAkB,CAACG,iBAAiB,CAACC,IAAI,CAAC;EAC5C;EAEAC,mBAAmBA,CAAA,EAAG;IACpBL,kBAAkB,CAACK,mBAAmB,CAAC,CAAC;EAC1C;EAEAC,sBAAsBA,CAACC,OAAuB,EAAE;IAC9CP,kBAAkB,CAACM,sBAAsB,CACvCC,OAAO,CAACC,WAAW,IAAI,EAAE,EACzBD,OAAO,CAACE,OAAO,IAAI,EAAE,EACrBF,OAAO,CAACG,UAAU,IAAI,EAAE,EACxBH,OAAO,CAACI,MAAM,IAAI,IACpB,CAAC;EACH;EAEAC,4BAA4BA,CAAA,EAAW;IACrC,OAAOZ,kBAAkB,CAACY,4BAA4B,CAAC,CAAC;EAC1D;EAEAC,mBAAmBA,CACjBC,IAAmB,EACnBC,OAAgB,EAChBC,QAAmC,EACP;IAC5BhB,kBAAkB,CAACa,mBAAmB,CAACC,IAAI,EAAEC,OAAO,CAAC;IAErD,IAAIE,YAAY,GAAG,IAAI;IAEvB,IAAIF,OAAO,IAAIC,QAAQ,EAAE;MACvB,QAAQF,IAAI;QACV,KAAK,MAAM;UACTG,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CAAC,cAAc,EAAEF,QAAQ,CAAC;UAClE;QAEF,KAAK,OAAO;UACVC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CAAC,eAAe,EAAEF,QAAQ,CAAC;UACnE;QAEF,KAAK,MAAM;UACTC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CAAC,cAAc,EAAEF,QAAQ,CAAC;UAClE;QAEF,KAAK,iBAAiB;UACpBC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CACtC,yBAAyB,EACzBF,QACF,CAAC;UACD;QAEF,KAAK,oBAAoB;UACvBC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CACtC,4BAA4B,EAC5BF,QACF,CAAC;UACD;QAEF,KAAK,WAAW;UACdC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CACtC,mBAAmB,EACnBF,QACF,CAAC;UACD;QAEF,KAAK,eAAe;UAClBC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CACtC,uBAAuB,EACvBF,QACF,CAAC;UACD;QAEF,KAAK,aAAa;UAChBC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CACtC,qBAAqB,EACrBF,QACF,CAAC;UACD;QAEF,KAAK,cAAc;UACjBC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CACtC,sBAAsB,EACtBF,QACF,CAAC;UACD;QAEF,KAAK,aAAa;UAChBC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CACtC,qBAAqB,EACrBF,QACF,CAAC;UACD;QAEF,KAAK,cAAc;UACjBC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CACtC,sBAAsB,EACtBF,QACF,CAAC;UACD;QAEF,KAAK,wBAAwB;UAC3BC,YAAY,GAAGhB,YAAY,CAAEiB,WAAW,CACtC,gCAAgC,EAChCF,QACF,CAAC;UACD;QAEF;UACEG,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEN,IAAI,CAAC;MAC5D;IACF;IAEA,OAAOG,YAAY;EACrB;AACF;AAEA,eAAe,IAAIf,YAAY,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["default"],"sourceRoot":"../../../src","sources":["system/index.ts"],"mappings":";;AAAA,SAASA,OAAO,QAAQ,mBAAgB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["system/types.ts"],"mappings":"","ignoreList":[]}
|
package/lib/typescript/api.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export { default as BiquadFilterNode } from './core/BiquadFilterNode';
|
|
|
17
17
|
export { default as GainNode } from './core/GainNode';
|
|
18
18
|
export { default as OscillatorNode } from './core/OscillatorNode';
|
|
19
19
|
export { default as StereoPannerNode } from './core/StereoPannerNode';
|
|
20
|
+
export { default as AudioManager } from './system';
|
|
20
21
|
export { OscillatorType, BiquadFilterType, ChannelCountMode, ChannelInterpretation, ContextState, WindowType, PeriodicWaveConstraints, } from './types';
|
|
21
22
|
export { IndexSizeError, InvalidAccessError, InvalidStateError, RangeError, NotSupportedError, } from './errors';
|
|
22
23
|
//# sourceMappingURL=api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGxE,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,kBAAkB,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC;IAC/D,IAAI,yBAAyB,EAAE,CAC7B,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,KACf,oBAAoB,CAAC;CAC3B;AAgBD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGxE,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,kBAAkB,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC;IAC/D,IAAI,yBAAyB,EAAE,CAC7B,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,KACf,oBAAoB,CAAC;CAC3B;AAgBD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,iBAAiB,GAClB,MAAM,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/AudioContext.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"AudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/AudioContext.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG/C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,gBAAgB;gBAC5C,OAAO,CAAC,EAAE,mBAAmB;IAcnC,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC;IAI3B,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAI5B,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;CAGpC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { NativeEventEmitter } from 'react-native';
|
|
2
|
+
declare const eventEmitter: NativeEventEmitter | undefined;
|
|
3
|
+
declare const AudioManagerModule: {
|
|
4
|
+
setLockScreenInfo(info: {
|
|
5
|
+
[key: string]: string | number | boolean | undefined;
|
|
6
|
+
}): void;
|
|
7
|
+
resetLockScreenInfo(): void;
|
|
8
|
+
enableRemoteCommand(name: string, enabled: boolean): void;
|
|
9
|
+
setAudioSessionOptions(category: string, mode: string, options: Array<string>, active: boolean): void;
|
|
10
|
+
getDevicePreferredSampleRate(): number;
|
|
11
|
+
};
|
|
12
|
+
export { eventEmitter, AudioManagerModule };
|
|
13
|
+
//# sourceMappingURL=NativeAudioManagerModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeAudioManagerModule.d.ts","sourceRoot":"","sources":["../../../src/specs/NativeAudioManagerModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAEnB,MAAM,cAAc,CAAC;AAGtB,QAAA,MAAM,YAAY,gCAGhB,CAAC;AAQH,QAAA,MAAM,kBAAkB;;;QAGlB,IAAI;2BAGe,IAAI;8BAGD,MAAM,WAAW,OAAO,GAAG,IAAI;qCAK7C,MAAM,QACV,MAAM,WACH,MAAM,MAAM,CAAC,UACd,OAAO,GACd,IAAI;oCAQyB,MAAM;CAGvC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/specs/index.ts"],"names":[],"mappings":"AAEA,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE9E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SessionOptions, LockScreenInfo, RemoteControl } from './types';
|
|
2
|
+
import { EmitterSubscription } from 'react-native';
|
|
3
|
+
declare class AudioManager {
|
|
4
|
+
setLockScreenInfo(info: LockScreenInfo): void;
|
|
5
|
+
resetLockScreenInfo(): void;
|
|
6
|
+
setAudioSessionOptions(options: SessionOptions): void;
|
|
7
|
+
getDevicePreferredSampleRate(): number;
|
|
8
|
+
enableRemoteCommand(name: RemoteControl, enabled: boolean, callback?: (value?: number) => void): EmitterSubscription | null;
|
|
9
|
+
}
|
|
10
|
+
declare const _default: AudioManager;
|
|
11
|
+
export default _default;
|
|
12
|
+
//# sourceMappingURL=AudioManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioManager.d.ts","sourceRoot":"","sources":["../../../src/system/AudioManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,cAAM,YAAY;IAChB,iBAAiB,CAAC,IAAI,EAAE,cAAc;IAItC,mBAAmB;IAInB,sBAAsB,CAAC,OAAO,EAAE,cAAc;IAS9C,4BAA4B,IAAI,MAAM;IAItC,mBAAmB,CACjB,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,GAClC,mBAAmB,GAAG,IAAI;CAyF9B;;AAED,wBAAkC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/system/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type IOSCategory = 'record' | 'ambient' | 'playback' | 'multiRoute' | 'soloAmbient' | 'playAndRecord';
|
|
2
|
+
export type IOSMode = 'default' | 'gameChat' | 'videoChat' | 'voiceChat' | 'measurement' | 'voicePrompt' | 'spokenAudio' | 'moviePlayback' | 'videoRecording';
|
|
3
|
+
export type IOSOption = 'duckOthers' | 'allowAirPlay' | 'mixWithOthers' | 'allowBluetooth' | 'defaultToSpeaker' | 'allowBluetoothA2DP' | 'overrideMutedMicrophoneInterruption' | 'interruptSpokenAudioAndMixWithOthers';
|
|
4
|
+
export interface SessionOptions {
|
|
5
|
+
iosMode?: IOSMode;
|
|
6
|
+
iosOptions?: IOSOption[];
|
|
7
|
+
iosCategory?: IOSCategory;
|
|
8
|
+
active?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export type MediaState = 'state_playing' | 'state_paused' | 'state_stopped';
|
|
11
|
+
interface BaseLockScreenInfo {
|
|
12
|
+
[key: string]: string | boolean | number | undefined;
|
|
13
|
+
}
|
|
14
|
+
export interface LockScreenInfo extends BaseLockScreenInfo {
|
|
15
|
+
title?: string;
|
|
16
|
+
artwork?: string;
|
|
17
|
+
artist?: string;
|
|
18
|
+
album?: string;
|
|
19
|
+
genre?: string;
|
|
20
|
+
duration?: number;
|
|
21
|
+
isLiveStream?: boolean;
|
|
22
|
+
state?: MediaState;
|
|
23
|
+
speed?: number;
|
|
24
|
+
elapsedTime?: number;
|
|
25
|
+
}
|
|
26
|
+
export type RemoteControl = 'play' | 'pause' | 'stop' | 'togglePlayPause' | 'changePlaybackRate' | 'nextTrack' | 'previousTrack' | 'skipForward' | 'skipBackward' | 'seekForward' | 'seekBackward' | 'changePlaybackPosition';
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/system/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,SAAS,GACT,UAAU,GACV,YAAY,GACZ,aAAa,GACb,eAAe,CAAC;AAEpB,MAAM,MAAM,OAAO,GACf,SAAS,GACT,UAAU,GACV,WAAW,GACX,WAAW,GACX,aAAa,GACb,aAAa,GACb,aAAa,GACb,eAAe,GACf,gBAAgB,CAAC;AAErB,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,qCAAqC,GACrC,sCAAsC,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,CAAC;AAE5E,UAAU,kBAAkB;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,OAAO,GACP,MAAM,GACN,iBAAiB,GACjB,oBAAoB,GACpB,WAAW,GACX,eAAe,GACf,aAAa,GACb,cAAc,GACd,aAAa,GACb,cAAc,GACd,wBAAwB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-audio-api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0-rc.0",
|
|
4
4
|
"description": "react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification",
|
|
5
5
|
"bin": {
|
|
6
6
|
"setup-rn-audio-api-web": "./scripts/setup-rn-audio-api-web.js"
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"format:js": "prettier --write --list-different src",
|
|
49
49
|
"format:android:cpp": "find android/src/ -path android/src/main/cpp/audioapi/android/libs -iname \"*.h\" -o -iname \"*.cpp\" | xargs clang-format -i",
|
|
50
50
|
"format:android:kotlin": "ktlint -F 'android/src/main/java/**/*.kt'",
|
|
51
|
-
"format:ios": "find ios/ -iname \"*.h\" -o -iname \"*.m\" -o -iname \"*.mm\" -o -iname \"*.cpp\" | xargs clang-format -i",
|
|
51
|
+
"format:ios": "find ios/ \\( -iname \"*.h\" -o -iname \"*.m\" -o -iname \"*.mm\" -o -iname \"*.cpp\" \\) -not -path \"ios/audioapi/ios/*\" | xargs clang-format -i",
|
|
52
52
|
"format:common": "find common/cpp/ -path 'common/cpp/audioapi/libs' -prune -iname \"*.h\" -o -iname \"*.cpp\" | xargs clang-format -i",
|
|
53
53
|
"build": "bob build",
|
|
54
54
|
"prepack": "cp ../../README.md ./README.md",
|
package/src/api.ts
CHANGED
|
@@ -39,6 +39,7 @@ export { default as BiquadFilterNode } from './core/BiquadFilterNode';
|
|
|
39
39
|
export { default as GainNode } from './core/GainNode';
|
|
40
40
|
export { default as OscillatorNode } from './core/OscillatorNode';
|
|
41
41
|
export { default as StereoPannerNode } from './core/StereoPannerNode';
|
|
42
|
+
export { default as AudioManager } from './system';
|
|
42
43
|
|
|
43
44
|
export {
|
|
44
45
|
OscillatorType,
|
package/src/core/AudioContext.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { IAudioContext } from '../interfaces';
|
|
2
2
|
import BaseAudioContext from './BaseAudioContext';
|
|
3
|
+
import AudioManager from '../system';
|
|
3
4
|
import { AudioContextOptions } from '../types';
|
|
4
5
|
import { NotSupportedError } from '../errors';
|
|
5
6
|
|
|
@@ -11,7 +12,11 @@ export default class AudioContext extends BaseAudioContext {
|
|
|
11
12
|
);
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
super(
|
|
15
|
+
super(
|
|
16
|
+
global.createAudioContext(
|
|
17
|
+
options?.sampleRate || AudioManager.getDevicePreferredSampleRate()
|
|
18
|
+
)
|
|
19
|
+
);
|
|
15
20
|
}
|
|
16
21
|
|
|
17
22
|
async close(): Promise<undefined> {
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import {
|
|
2
|
+
NativeModules,
|
|
3
|
+
DeviceEventEmitter,
|
|
4
|
+
NativeEventEmitter,
|
|
5
|
+
Platform,
|
|
6
|
+
} from 'react-native';
|
|
7
|
+
|
|
8
|
+
const NativeAudioManagerModule = NativeModules.AudioManagerModule;
|
|
9
|
+
const eventEmitter = Platform.select({
|
|
10
|
+
ios: new NativeEventEmitter(NativeModules.AudioManagerModule),
|
|
11
|
+
android: DeviceEventEmitter,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
if (!NativeAudioManagerModule || !eventEmitter) {
|
|
15
|
+
throw new Error(
|
|
16
|
+
`Failed to install react-native-audio-api: The native module could not be found.`
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const AudioManagerModule = {
|
|
21
|
+
setLockScreenInfo(info: {
|
|
22
|
+
[key: string]: string | boolean | number | undefined;
|
|
23
|
+
}): void {
|
|
24
|
+
NativeAudioManagerModule.setLockScreenInfo(info);
|
|
25
|
+
},
|
|
26
|
+
resetLockScreenInfo(): void {
|
|
27
|
+
NativeAudioManagerModule.resetLockScreenInfo();
|
|
28
|
+
},
|
|
29
|
+
enableRemoteCommand(name: string, enabled: boolean): void {
|
|
30
|
+
NativeAudioManagerModule.enableRemoteCommand(name, enabled);
|
|
31
|
+
},
|
|
32
|
+
// audio session
|
|
33
|
+
setAudioSessionOptions(
|
|
34
|
+
category: string,
|
|
35
|
+
mode: string,
|
|
36
|
+
options: Array<string>,
|
|
37
|
+
active: boolean
|
|
38
|
+
): void {
|
|
39
|
+
NativeAudioManagerModule.setAudioSessionOptions(
|
|
40
|
+
category,
|
|
41
|
+
mode,
|
|
42
|
+
options,
|
|
43
|
+
active
|
|
44
|
+
);
|
|
45
|
+
},
|
|
46
|
+
getDevicePreferredSampleRate(): number {
|
|
47
|
+
return NativeAudioManagerModule.getDevicePreferredSampleRate();
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export { eventEmitter, AudioManagerModule };
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { SessionOptions, LockScreenInfo, RemoteControl } from './types';
|
|
2
|
+
import { AudioManagerModule, eventEmitter } from '../specs';
|
|
3
|
+
import { EmitterSubscription } from 'react-native';
|
|
4
|
+
|
|
5
|
+
class AudioManager {
|
|
6
|
+
setLockScreenInfo(info: LockScreenInfo) {
|
|
7
|
+
AudioManagerModule.setLockScreenInfo(info);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
resetLockScreenInfo() {
|
|
11
|
+
AudioManagerModule.resetLockScreenInfo();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
setAudioSessionOptions(options: SessionOptions) {
|
|
15
|
+
AudioManagerModule.setAudioSessionOptions(
|
|
16
|
+
options.iosCategory ?? '',
|
|
17
|
+
options.iosMode ?? '',
|
|
18
|
+
options.iosOptions ?? [],
|
|
19
|
+
options.active ?? true
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
getDevicePreferredSampleRate(): number {
|
|
24
|
+
return AudioManagerModule.getDevicePreferredSampleRate();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
enableRemoteCommand(
|
|
28
|
+
name: RemoteControl,
|
|
29
|
+
enabled: boolean,
|
|
30
|
+
callback?: (value?: number) => void
|
|
31
|
+
): EmitterSubscription | null {
|
|
32
|
+
AudioManagerModule.enableRemoteCommand(name, enabled);
|
|
33
|
+
|
|
34
|
+
let subscription = null;
|
|
35
|
+
|
|
36
|
+
if (enabled && callback) {
|
|
37
|
+
switch (name) {
|
|
38
|
+
case 'play':
|
|
39
|
+
subscription = eventEmitter!.addListener('onRemotePlay', callback);
|
|
40
|
+
break;
|
|
41
|
+
|
|
42
|
+
case 'pause':
|
|
43
|
+
subscription = eventEmitter!.addListener('onRemotePause', callback);
|
|
44
|
+
break;
|
|
45
|
+
|
|
46
|
+
case 'stop':
|
|
47
|
+
subscription = eventEmitter!.addListener('onRemoteStop', callback);
|
|
48
|
+
break;
|
|
49
|
+
|
|
50
|
+
case 'togglePlayPause':
|
|
51
|
+
subscription = eventEmitter!.addListener(
|
|
52
|
+
'onRemoteTogglePlayPause',
|
|
53
|
+
callback
|
|
54
|
+
);
|
|
55
|
+
break;
|
|
56
|
+
|
|
57
|
+
case 'changePlaybackRate':
|
|
58
|
+
subscription = eventEmitter!.addListener(
|
|
59
|
+
'onRemoteChangePlaybackRate',
|
|
60
|
+
callback
|
|
61
|
+
);
|
|
62
|
+
break;
|
|
63
|
+
|
|
64
|
+
case 'nextTrack':
|
|
65
|
+
subscription = eventEmitter!.addListener(
|
|
66
|
+
'onRemoteNextTrack',
|
|
67
|
+
callback
|
|
68
|
+
);
|
|
69
|
+
break;
|
|
70
|
+
|
|
71
|
+
case 'previousTrack':
|
|
72
|
+
subscription = eventEmitter!.addListener(
|
|
73
|
+
'onRemotePreviousTrack',
|
|
74
|
+
callback
|
|
75
|
+
);
|
|
76
|
+
break;
|
|
77
|
+
|
|
78
|
+
case 'skipForward':
|
|
79
|
+
subscription = eventEmitter!.addListener(
|
|
80
|
+
'onRemoteSkipForward',
|
|
81
|
+
callback
|
|
82
|
+
);
|
|
83
|
+
break;
|
|
84
|
+
|
|
85
|
+
case 'skipBackward':
|
|
86
|
+
subscription = eventEmitter!.addListener(
|
|
87
|
+
'onRemoteSkipBackward',
|
|
88
|
+
callback
|
|
89
|
+
);
|
|
90
|
+
break;
|
|
91
|
+
|
|
92
|
+
case 'seekForward':
|
|
93
|
+
subscription = eventEmitter!.addListener(
|
|
94
|
+
'onRemoteSeekForward',
|
|
95
|
+
callback
|
|
96
|
+
);
|
|
97
|
+
break;
|
|
98
|
+
|
|
99
|
+
case 'seekBackward':
|
|
100
|
+
subscription = eventEmitter!.addListener(
|
|
101
|
+
'onRemoteSeekBackward',
|
|
102
|
+
callback
|
|
103
|
+
);
|
|
104
|
+
break;
|
|
105
|
+
|
|
106
|
+
case 'changePlaybackPosition':
|
|
107
|
+
subscription = eventEmitter!.addListener(
|
|
108
|
+
'onRemoteChangePlaybackPosition',
|
|
109
|
+
callback
|
|
110
|
+
);
|
|
111
|
+
break;
|
|
112
|
+
|
|
113
|
+
default:
|
|
114
|
+
console.error('Unsupported RemoteControl action:', name);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return subscription;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export default new AudioManager();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './AudioManager';
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export type IOSCategory =
|
|
2
|
+
| 'record'
|
|
3
|
+
| 'ambient'
|
|
4
|
+
| 'playback'
|
|
5
|
+
| 'multiRoute'
|
|
6
|
+
| 'soloAmbient'
|
|
7
|
+
| 'playAndRecord';
|
|
8
|
+
|
|
9
|
+
export type IOSMode =
|
|
10
|
+
| 'default'
|
|
11
|
+
| 'gameChat'
|
|
12
|
+
| 'videoChat'
|
|
13
|
+
| 'voiceChat'
|
|
14
|
+
| 'measurement'
|
|
15
|
+
| 'voicePrompt'
|
|
16
|
+
| 'spokenAudio'
|
|
17
|
+
| 'moviePlayback'
|
|
18
|
+
| 'videoRecording';
|
|
19
|
+
|
|
20
|
+
export type IOSOption =
|
|
21
|
+
| 'duckOthers'
|
|
22
|
+
| 'allowAirPlay'
|
|
23
|
+
| 'mixWithOthers'
|
|
24
|
+
| 'allowBluetooth'
|
|
25
|
+
| 'defaultToSpeaker'
|
|
26
|
+
| 'allowBluetoothA2DP'
|
|
27
|
+
| 'overrideMutedMicrophoneInterruption'
|
|
28
|
+
| 'interruptSpokenAudioAndMixWithOthers';
|
|
29
|
+
|
|
30
|
+
export interface SessionOptions {
|
|
31
|
+
iosMode?: IOSMode;
|
|
32
|
+
iosOptions?: IOSOption[];
|
|
33
|
+
iosCategory?: IOSCategory;
|
|
34
|
+
active?: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type MediaState = 'state_playing' | 'state_paused' | 'state_stopped';
|
|
38
|
+
|
|
39
|
+
interface BaseLockScreenInfo {
|
|
40
|
+
[key: string]: string | boolean | number | undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface LockScreenInfo extends BaseLockScreenInfo {
|
|
44
|
+
title?: string;
|
|
45
|
+
artwork?: string;
|
|
46
|
+
artist?: string;
|
|
47
|
+
album?: string;
|
|
48
|
+
genre?: string;
|
|
49
|
+
duration?: number;
|
|
50
|
+
isLiveStream?: boolean;
|
|
51
|
+
state?: MediaState;
|
|
52
|
+
speed?: number;
|
|
53
|
+
elapsedTime?: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type RemoteControl =
|
|
57
|
+
| 'play'
|
|
58
|
+
| 'pause'
|
|
59
|
+
| 'stop'
|
|
60
|
+
| 'togglePlayPause'
|
|
61
|
+
| 'changePlaybackRate'
|
|
62
|
+
| 'nextTrack'
|
|
63
|
+
| 'previousTrack'
|
|
64
|
+
| 'skipForward'
|
|
65
|
+
| 'skipBackward'
|
|
66
|
+
| 'seekForward'
|
|
67
|
+
| 'seekBackward'
|
|
68
|
+
| 'changePlaybackPosition';
|