react-native-audio-api 0.6.0-rc.0 → 0.6.0-rc.2
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 +35 -22
- package/android/CMakeLists.txt +6 -3
- package/android/build.gradle +1 -0
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +73 -0
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +37 -0
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +6 -10
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +2 -3
- package/android/src/main/java/com/swmansion/audioapi/AudioManagerModule.kt +19 -14
- package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +60 -0
- package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +294 -0
- package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +279 -0
- package/android/src/main/java/com/swmansion/audioapi/system/MediaReceiver.kt +46 -0
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +39 -0
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionEventEmitter.kt +88 -0
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +162 -0
- package/android/src/main/java/com/swmansion/audioapi/system/VolumeChangeListener.kt +27 -0
- package/android/src/main/res/drawable/next.xml +9 -0
- package/android/src/main/res/drawable/pause.xml +9 -0
- package/android/src/main/res/drawable/play.xml +9 -0
- package/android/src/main/res/drawable/previous.xml +9 -0
- package/android/src/main/res/drawable/skip_backward_5.xml +9 -0
- package/android/src/main/res/drawable/skip_forward_5.xml +9 -0
- package/android/src/main/res/drawable/stop.xml +9 -0
- package/app.plugin.js +1 -0
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +29 -5
- package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +1 -0
- package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +149 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +4 -3
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +6 -6
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +38 -0
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +1 -6
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +8 -4
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -0
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +1 -1
- package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +3 -3
- package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +45 -11
- package/common/cpp/audioapi/core/utils/AudioNodeManager.h +6 -2
- package/ios/audioapi/ios/AudioManagerModule.mm +16 -15
- package/ios/audioapi/ios/core/IOSAudioPlayer.h +11 -12
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +22 -16
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +36 -0
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +62 -0
- package/ios/audioapi/ios/core/{AudioPlayer.h → NativeAudioPlayer.h} +1 -8
- package/ios/audioapi/ios/core/{AudioPlayer.m → NativeAudioPlayer.m} +4 -33
- package/ios/audioapi/ios/core/NativeAudioRecorder.h +25 -0
- package/ios/audioapi/ios/core/NativeAudioRecorder.m +47 -0
- package/ios/audioapi/ios/system/AudioEngine.h +7 -1
- package/ios/audioapi/ios/system/AudioEngine.mm +64 -20
- package/ios/audioapi/ios/system/AudioSessionManager.h +3 -1
- package/ios/audioapi/ios/system/AudioSessionManager.mm +37 -25
- package/ios/audioapi/ios/system/LockScreenManager.mm +4 -8
- package/ios/audioapi/ios/system/NotificationManager.h +13 -1
- package/ios/audioapi/ios/system/NotificationManager.mm +96 -44
- package/lib/commonjs/api.js +211 -0
- package/lib/commonjs/api.js.map +1 -0
- package/lib/commonjs/api.web.js +219 -0
- package/lib/commonjs/api.web.js.map +1 -0
- package/lib/commonjs/core/AnalyserNode.js +71 -0
- package/lib/commonjs/core/AnalyserNode.js.map +1 -0
- package/lib/commonjs/core/AudioBuffer.js +44 -0
- package/lib/commonjs/core/AudioBuffer.js.map +1 -0
- package/lib/commonjs/core/AudioBufferSourceNode.js +68 -0
- package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -0
- package/lib/commonjs/core/AudioContext.js +29 -0
- package/lib/commonjs/core/AudioContext.js.map +1 -0
- package/lib/commonjs/core/AudioDestinationNode.js +11 -0
- package/lib/commonjs/core/AudioDestinationNode.js.map +1 -0
- package/lib/commonjs/core/AudioNode.js +30 -0
- package/lib/commonjs/core/AudioNode.js.map +1 -0
- package/lib/commonjs/core/AudioParam.js +82 -0
- package/lib/commonjs/core/AudioParam.js.map +1 -0
- package/lib/commonjs/core/AudioRecorder.js +51 -0
- package/lib/commonjs/core/AudioRecorder.js.map +1 -0
- package/lib/commonjs/core/AudioScheduledSourceNode.js +38 -0
- package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -0
- package/lib/commonjs/core/BaseAudioContext.js +80 -0
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -0
- package/lib/commonjs/core/BiquadFilterNode.js +33 -0
- package/lib/commonjs/core/BiquadFilterNode.js.map +1 -0
- package/lib/commonjs/core/GainNode.js +17 -0
- package/lib/commonjs/core/GainNode.js.map +1 -0
- package/lib/commonjs/core/OfflineAudioContext.js +63 -0
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -0
- package/lib/commonjs/core/OscillatorNode.js +32 -0
- package/lib/commonjs/core/OscillatorNode.js.map +1 -0
- package/lib/commonjs/core/PeriodicWave.js +15 -0
- package/lib/commonjs/core/PeriodicWave.js.map +1 -0
- package/lib/commonjs/core/StereoPannerNode.js +17 -0
- package/lib/commonjs/core/StereoPannerNode.js.map +1 -0
- package/lib/commonjs/errors/IndexSizeError.js +14 -0
- package/lib/commonjs/errors/IndexSizeError.js.map +1 -0
- package/lib/commonjs/errors/InvalidAccessError.js +14 -0
- package/lib/commonjs/errors/InvalidAccessError.js.map +1 -0
- package/lib/commonjs/errors/InvalidStateError.js +14 -0
- package/lib/commonjs/errors/InvalidStateError.js.map +1 -0
- package/lib/commonjs/errors/NotSupportedError.js +14 -0
- package/lib/commonjs/errors/NotSupportedError.js.map +1 -0
- package/lib/commonjs/errors/RangeError.js +14 -0
- package/lib/commonjs/errors/RangeError.js.map +1 -0
- package/lib/commonjs/errors/index.js +42 -0
- package/lib/commonjs/errors/index.js.map +1 -0
- package/lib/commonjs/hooks/useSytemVolume.js +24 -0
- package/lib/commonjs/hooks/useSytemVolume.js.map +1 -0
- package/lib/commonjs/index.js +17 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/interfaces.js +6 -0
- package/lib/commonjs/interfaces.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/plugin/withAudioAPI.js +62 -0
- package/lib/commonjs/plugin/withAudioAPI.js.map +1 -0
- package/lib/commonjs/specs/NativeAudioAPIModule.js +9 -0
- package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -0
- package/lib/commonjs/specs/NativeAudioManagerModule.js +36 -0
- package/lib/commonjs/specs/NativeAudioManagerModule.js.map +1 -0
- package/lib/commonjs/specs/index.js +27 -0
- package/lib/commonjs/specs/index.js.map +1 -0
- package/lib/commonjs/system/AudioManager.js +52 -0
- package/lib/commonjs/system/AudioManager.js.map +1 -0
- package/lib/commonjs/system/index.js +14 -0
- package/lib/commonjs/system/index.js.map +1 -0
- package/lib/commonjs/system/types.js +2 -0
- package/lib/commonjs/system/types.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/utils/index.js +10 -0
- package/lib/commonjs/utils/index.js.map +1 -0
- package/lib/commonjs/web-core/AnalyserNode.js +38 -0
- package/lib/commonjs/web-core/AnalyserNode.js.map +1 -0
- package/lib/commonjs/web-core/AudioBuffer.js +44 -0
- package/lib/commonjs/web-core/AudioBuffer.js.map +1 -0
- package/lib/commonjs/web-core/AudioBufferSourceNode.js +214 -0
- package/lib/commonjs/web-core/AudioBufferSourceNode.js.map +1 -0
- package/lib/commonjs/web-core/AudioContext.js +93 -0
- package/lib/commonjs/web-core/AudioContext.js.map +1 -0
- package/lib/commonjs/web-core/AudioDestinationNode.js +11 -0
- package/lib/commonjs/web-core/AudioDestinationNode.js.map +1 -0
- package/lib/commonjs/web-core/AudioNode.js +33 -0
- package/lib/commonjs/web-core/AudioNode.js.map +1 -0
- package/lib/commonjs/web-core/AudioParam.js +81 -0
- package/lib/commonjs/web-core/AudioParam.js.map +1 -0
- package/lib/commonjs/web-core/AudioScheduledSourceNode.js +41 -0
- package/lib/commonjs/web-core/AudioScheduledSourceNode.js.map +1 -0
- package/lib/commonjs/web-core/BaseAudioContext.js +2 -0
- package/lib/commonjs/web-core/BaseAudioContext.js.map +1 -0
- package/lib/commonjs/web-core/BiquadFilterNode.js +33 -0
- package/lib/commonjs/web-core/BiquadFilterNode.js.map +1 -0
- package/lib/commonjs/web-core/GainNode.js +17 -0
- package/lib/commonjs/web-core/GainNode.js.map +1 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js +96 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -0
- package/lib/commonjs/web-core/OscillatorNode.js +31 -0
- package/lib/commonjs/web-core/OscillatorNode.js.map +1 -0
- package/lib/commonjs/web-core/PeriodicWave.js +15 -0
- package/lib/commonjs/web-core/PeriodicWave.js.map +1 -0
- package/lib/commonjs/web-core/StereoPannerNode.js +17 -0
- package/lib/commonjs/web-core/StereoPannerNode.js.map +1 -0
- package/lib/commonjs/web-core/custom/LoadCustomWasm.js +37 -0
- package/lib/commonjs/web-core/custom/LoadCustomWasm.js.map +1 -0
- package/lib/commonjs/web-core/custom/index.js +14 -0
- package/lib/commonjs/web-core/custom/index.js.map +1 -0
- package/lib/commonjs/web-core/custom/signalsmithStretch/LICENSE.txt +21 -0
- package/lib/commonjs/web-core/custom/signalsmithStretch/README.md +46 -0
- package/lib/commonjs/web-core/custom/signalsmithStretch/SignalsmithStretch.mjs +826 -0
- package/lib/commonjs/web-core/custom/signalsmithStretch/SignalsmithStretch.mjs.map +1 -0
- package/lib/module/api.js +3 -1
- package/lib/module/api.js.map +1 -1
- package/lib/module/core/AudioRecorder.js +45 -0
- package/lib/module/core/AudioRecorder.js.map +1 -0
- package/lib/module/errors/NotSupportedError.js.map +1 -1
- package/lib/module/hooks/useSytemVolume.js +19 -0
- package/lib/module/hooks/useSytemVolume.js.map +1 -0
- package/lib/module/plugin/withAudioAPI.js +58 -0
- package/lib/module/plugin/withAudioAPI.js.map +1 -0
- package/lib/module/specs/NativeAudioManagerModule.js +10 -8
- package/lib/module/specs/NativeAudioManagerModule.js.map +1 -1
- package/lib/module/system/AudioManager.js +26 -44
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/typescript/api.d.ts +5 -1
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/core/AudioRecorder.d.ts +22 -0
- package/lib/typescript/core/AudioRecorder.d.ts.map +1 -0
- package/lib/typescript/errors/NotSupportedError.d.ts.map +1 -1
- package/lib/typescript/hooks/useSytemVolume.d.ts +2 -0
- package/lib/typescript/hooks/useSytemVolume.d.ts.map +1 -0
- package/lib/typescript/interfaces.d.ts +11 -5
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/plugin/withAudioAPI.d.ts +9 -0
- package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -0
- package/lib/typescript/specs/NativeAudioManagerModule.d.ts +4 -2
- package/lib/typescript/specs/NativeAudioManagerModule.d.ts.map +1 -1
- package/lib/typescript/system/AudioManager.d.ts +5 -2
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/system/types.d.ts +36 -5
- package/lib/typescript/system/types.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +5 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +7 -3
- package/src/api.ts +13 -2
- package/src/core/AudioRecorder.ts +81 -0
- package/src/hooks/useSytemVolume.ts +19 -0
- package/src/interfaces.ts +25 -11
- package/src/plugin/withAudioAPI.ts +91 -0
- package/src/specs/NativeAudioManagerModule.ts +13 -19
- package/src/system/AudioManager.ts +37 -87
- package/src/system/types.ts +43 -17
- package/src/types.ts +13 -0
- /package/src/errors/{NotSupportedError.tsx → NotSupportedError.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioManager.d.ts","sourceRoot":"","sources":["../../../src/system/AudioManager.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"AudioManager.d.ts","sourceRoot":"","sources":["../../../src/system/AudioManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,cAAM,YAAY;IAChB,iBAAiB,CAAC,IAAI,EAAE,cAAc;IAItC,mBAAmB;IAInB,sBAAsB,CAAC,OAAO,EAAE,cAAc;IAQ9C,4BAA4B,IAAI,MAAM;IAItC,yBAAyB,CAAC,OAAO,EAAE,OAAO;IAI1C,oBAAoB,CAAC,OAAO,EAAE,OAAO;IAIrC,mBAAmB,CAAC,IAAI,SAAS,iBAAiB,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAIrE,iBAAiB,CAAC,IAAI,SAAS,eAAe,EAC5C,IAAI,EAAE,IAAI,EACV,QAAQ,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,GACnC,mBAAmB,GAAG,IAAI;CAuB9B;;AAED,wBAAkC"}
|
|
@@ -5,9 +5,8 @@ export interface SessionOptions {
|
|
|
5
5
|
iosMode?: IOSMode;
|
|
6
6
|
iosOptions?: IOSOption[];
|
|
7
7
|
iosCategory?: IOSCategory;
|
|
8
|
-
active?: boolean;
|
|
9
8
|
}
|
|
10
|
-
export type MediaState = 'state_playing' | 'state_paused'
|
|
9
|
+
export type MediaState = 'state_playing' | 'state_paused';
|
|
11
10
|
interface BaseLockScreenInfo {
|
|
12
11
|
[key: string]: string | boolean | number | undefined;
|
|
13
12
|
}
|
|
@@ -16,13 +15,45 @@ export interface LockScreenInfo extends BaseLockScreenInfo {
|
|
|
16
15
|
artwork?: string;
|
|
17
16
|
artist?: string;
|
|
18
17
|
album?: string;
|
|
19
|
-
genre?: string;
|
|
20
18
|
duration?: number;
|
|
21
|
-
|
|
19
|
+
description?: string;
|
|
22
20
|
state?: MediaState;
|
|
23
21
|
speed?: number;
|
|
24
22
|
elapsedTime?: number;
|
|
25
23
|
}
|
|
26
|
-
|
|
24
|
+
interface RemoteEmptyType {
|
|
25
|
+
}
|
|
26
|
+
interface RemoteControlEventType {
|
|
27
|
+
value: number;
|
|
28
|
+
}
|
|
29
|
+
interface OnInterruptionEventType {
|
|
30
|
+
type: 'ended' | 'began';
|
|
31
|
+
shouldResume: boolean;
|
|
32
|
+
}
|
|
33
|
+
interface OnRouteChangeEventType {
|
|
34
|
+
reason: string;
|
|
35
|
+
}
|
|
36
|
+
interface RemoteCommands {
|
|
37
|
+
play: RemoteEmptyType;
|
|
38
|
+
pause: RemoteEmptyType;
|
|
39
|
+
stop: RemoteEmptyType;
|
|
40
|
+
togglePlayPause: RemoteEmptyType;
|
|
41
|
+
changePlaybackRate: RemoteEmptyType;
|
|
42
|
+
nextTrack: RemoteEmptyType;
|
|
43
|
+
previousTrack: RemoteEmptyType;
|
|
44
|
+
skipForward: RemoteEmptyType;
|
|
45
|
+
skipBackward: RemoteEmptyType;
|
|
46
|
+
seekForward: RemoteEmptyType;
|
|
47
|
+
seekBackward: RemoteEmptyType;
|
|
48
|
+
changePlaybackPosition: RemoteEmptyType;
|
|
49
|
+
}
|
|
50
|
+
interface RemoteEvents {
|
|
51
|
+
volumeChange: RemoteControlEventType;
|
|
52
|
+
interruption: OnInterruptionEventType;
|
|
53
|
+
routeChange: OnRouteChangeEventType;
|
|
54
|
+
}
|
|
55
|
+
export type RemoteCommandName = keyof RemoteCommands;
|
|
56
|
+
export type RemoteEventName = keyof RemoteEvents;
|
|
57
|
+
export type RemoteEventCallback<Name extends RemoteEventName> = (event: RemoteEvents[Name]) => void;
|
|
27
58
|
export {};
|
|
28
59
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +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;
|
|
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;CAC3B;AAED,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,cAAc,CAAC;AAE1D,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,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,eAAe;CAAG;AAE5B,UAAU,sBAAsB;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,uBAAuB;IAC/B,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,sBAAsB;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,EAAE,eAAe,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,eAAe,CAAC;IACpC,SAAS,EAAE,eAAe,CAAC;IAC3B,aAAa,EAAE,eAAe,CAAC;IAC/B,WAAW,EAAE,eAAe,CAAC;IAC7B,YAAY,EAAE,eAAe,CAAC;IAC9B,WAAW,EAAE,eAAe,CAAC;IAC7B,YAAY,EAAE,eAAe,CAAC;IAC9B,sBAAsB,EAAE,eAAe,CAAC;CACzC;AAED,UAAU,YAAY;IACpB,YAAY,EAAE,sBAAsB,CAAC;IACrC,YAAY,EAAE,uBAAuB,CAAC;IACtC,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,cAAc,CAAC;AACrD,MAAM,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC;AACjD,MAAM,MAAM,mBAAmB,CAAC,IAAI,SAAS,eAAe,IAAI,CAC9D,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,KACtB,IAAI,CAAC"}
|
|
@@ -14,8 +14,13 @@ export interface OfflineAudioContextOptions {
|
|
|
14
14
|
length: number;
|
|
15
15
|
sampleRate: number;
|
|
16
16
|
}
|
|
17
|
+
export interface AudioRecorderOptions {
|
|
18
|
+
sampleRate: number;
|
|
19
|
+
bufferLengthInSamples: number;
|
|
20
|
+
}
|
|
17
21
|
export type WindowType = 'blackman' | 'hann';
|
|
18
22
|
export interface AudioBufferSourceNodeOptions {
|
|
19
23
|
pitchCorrection: boolean;
|
|
20
24
|
}
|
|
25
|
+
export type AudioRecorderStatus = 'idle' | 'initializing' | 'ready' | 'running' | 'stopping' | 'error';
|
|
21
26
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,aAAa,GAAG,UAAU,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5D,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,UAAU,GACV,UAAU,GACV,UAAU,GACV,WAAW,GACX,SAAS,GACT,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9D,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,QAAQ,GACR,UAAU,GACV,UAAU,GACV,QAAQ,CAAC;AAEb,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,4BAA4B;IAC3C,eAAe,EAAE,OAAO,CAAC;CAC1B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,aAAa,GAAG,UAAU,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5D,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,UAAU,GACV,UAAU,GACV,UAAU,GACV,WAAW,GACX,SAAS,GACT,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9D,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,QAAQ,GACR,UAAU,GACV,UAAU,GACV,QAAQ,CAAC;AAEb,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,4BAA4B;IAC3C,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,mBAAmB,GAC3B,MAAM,GACN,cAAc,GACd,OAAO,GACP,SAAS,GACT,UAAU,GACV,OAAO,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-audio-api",
|
|
3
|
-
"version": "0.6.0-rc.
|
|
3
|
+
"version": "0.6.0-rc.2",
|
|
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"
|
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
"!**/__mocks__",
|
|
35
35
|
"!**/.*",
|
|
36
36
|
"!**/node_modules",
|
|
37
|
-
"scripts/setup-rn-audio-api-web.js"
|
|
37
|
+
"scripts/setup-rn-audio-api-web.js",
|
|
38
|
+
"app.plugin.js"
|
|
38
39
|
],
|
|
39
40
|
"scripts": {
|
|
40
41
|
"test": "jest",
|
|
@@ -51,6 +52,7 @@
|
|
|
51
52
|
"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
53
|
"format:common": "find common/cpp/ -path 'common/cpp/audioapi/libs' -prune -iname \"*.h\" -o -iname \"*.cpp\" | xargs clang-format -i",
|
|
53
54
|
"build": "bob build",
|
|
55
|
+
"create:package": "./scripts/create-package.sh",
|
|
54
56
|
"prepack": "cp ../../README.md ./README.md",
|
|
55
57
|
"postpack": "rm ./README.md"
|
|
56
58
|
},
|
|
@@ -87,6 +89,7 @@
|
|
|
87
89
|
"@babel/types": "^7.20.0",
|
|
88
90
|
"@commitlint/config-conventional": "^17.0.2",
|
|
89
91
|
"@evilmartians/lefthook": "^1.5.0",
|
|
92
|
+
"@expo/config-plugins": "^9.0.0",
|
|
90
93
|
"@react-native/babel-preset": "0.77.1",
|
|
91
94
|
"@react-native/eslint-config": "^0.77.1",
|
|
92
95
|
"@react-native/metro-config": "0.77.1",
|
|
@@ -134,7 +137,8 @@
|
|
|
134
137
|
"esm": true
|
|
135
138
|
}
|
|
136
139
|
],
|
|
137
|
-
"typescript"
|
|
140
|
+
"typescript",
|
|
141
|
+
"commonjs"
|
|
138
142
|
]
|
|
139
143
|
},
|
|
140
144
|
"codegenConfig": {
|
package/src/api.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import NativeAudioAPIModule from './specs/NativeAudioAPIModule';
|
|
2
|
-
import
|
|
2
|
+
import { AudioRecorderOptions } from './types';
|
|
3
|
+
import type {
|
|
4
|
+
IAudioContext,
|
|
5
|
+
IAudioRecorder,
|
|
6
|
+
IOfflineAudioContext,
|
|
7
|
+
} from './interfaces';
|
|
3
8
|
|
|
4
9
|
/* eslint-disable no-var */
|
|
5
10
|
declare global {
|
|
@@ -9,12 +14,16 @@ declare global {
|
|
|
9
14
|
length: number,
|
|
10
15
|
sampleRate: number
|
|
11
16
|
) => IOfflineAudioContext;
|
|
17
|
+
|
|
18
|
+
var createAudioRecorder: (options: AudioRecorderOptions) => IAudioRecorder;
|
|
12
19
|
}
|
|
20
|
+
|
|
13
21
|
/* eslint-disable no-var */
|
|
14
22
|
|
|
15
23
|
if (
|
|
16
24
|
global.createAudioContext == null ||
|
|
17
|
-
global.createOfflineAudioContext == null
|
|
25
|
+
global.createOfflineAudioContext == null ||
|
|
26
|
+
global.createAudioRecorder == null
|
|
18
27
|
) {
|
|
19
28
|
if (!NativeAudioAPIModule) {
|
|
20
29
|
throw new Error(
|
|
@@ -39,7 +48,9 @@ export { default as BiquadFilterNode } from './core/BiquadFilterNode';
|
|
|
39
48
|
export { default as GainNode } from './core/GainNode';
|
|
40
49
|
export { default as OscillatorNode } from './core/OscillatorNode';
|
|
41
50
|
export { default as StereoPannerNode } from './core/StereoPannerNode';
|
|
51
|
+
export { default as AudioRecorder } from './core/AudioRecorder';
|
|
42
52
|
export { default as AudioManager } from './system';
|
|
53
|
+
export { default as useSystemVolume } from './hooks/useSytemVolume';
|
|
43
54
|
|
|
44
55
|
export {
|
|
45
56
|
OscillatorType,
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import {
|
|
2
|
+
IAudioRecorder,
|
|
3
|
+
IErrorCallback,
|
|
4
|
+
IAudioReadyCallback,
|
|
5
|
+
IStatusChangeCallback,
|
|
6
|
+
IAudioBuffer,
|
|
7
|
+
} from '../interfaces';
|
|
8
|
+
import { AudioRecorderStatus, AudioRecorderOptions } from '../types';
|
|
9
|
+
import AudioBuffer from './AudioBuffer';
|
|
10
|
+
|
|
11
|
+
export type AudioReadyCallback = (
|
|
12
|
+
buffer: AudioBuffer,
|
|
13
|
+
numFrames: number,
|
|
14
|
+
when: number
|
|
15
|
+
) => void;
|
|
16
|
+
|
|
17
|
+
export type ErrorCallback = (error: Error) => void;
|
|
18
|
+
|
|
19
|
+
export type StatusChangeCallback = (
|
|
20
|
+
status: AudioRecorderStatus,
|
|
21
|
+
previousStatus: AudioRecorderStatus
|
|
22
|
+
) => void;
|
|
23
|
+
|
|
24
|
+
export default class AudioRecorder {
|
|
25
|
+
protected readonly recorder: IAudioRecorder;
|
|
26
|
+
private onAudioReadyCallback: AudioReadyCallback | null = null;
|
|
27
|
+
private onErrorCallback: ErrorCallback | null = null;
|
|
28
|
+
private onStatusChangeCallback: StatusChangeCallback | null = null;
|
|
29
|
+
|
|
30
|
+
private onAudioReadyInternal: IAudioReadyCallback = (
|
|
31
|
+
buffer: IAudioBuffer,
|
|
32
|
+
numFrames: number,
|
|
33
|
+
when: number
|
|
34
|
+
) => {
|
|
35
|
+
if (this.onAudioReadyCallback) {
|
|
36
|
+
this.onAudioReadyCallback(new AudioBuffer(buffer), numFrames, when);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
private onErrorInternal: IErrorCallback = (error: Error) => {
|
|
41
|
+
if (this.onErrorCallback) {
|
|
42
|
+
this.onErrorCallback(error);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
private onStatusChangeInternal: IStatusChangeCallback = (
|
|
47
|
+
status: AudioRecorderStatus,
|
|
48
|
+
previousStatus: AudioRecorderStatus
|
|
49
|
+
) => {
|
|
50
|
+
if (this.onStatusChangeCallback) {
|
|
51
|
+
this.onStatusChangeCallback(status, previousStatus);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
constructor(options: AudioRecorderOptions) {
|
|
56
|
+
this.recorder = global.createAudioRecorder(options);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public start(): void {
|
|
60
|
+
this.recorder.start();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public stop(): void {
|
|
64
|
+
this.recorder.stop();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public onAudioReady(callback: AudioReadyCallback): void {
|
|
68
|
+
this.onAudioReadyCallback = callback;
|
|
69
|
+
this.recorder.onAudioReady(this.onAudioReadyInternal);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public onError(callback: ErrorCallback): void {
|
|
73
|
+
this.onErrorCallback = callback;
|
|
74
|
+
this.recorder.onError(this.onErrorInternal);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public onStatusChange(callback: StatusChangeCallback): void {
|
|
78
|
+
this.onStatusChangeCallback = callback;
|
|
79
|
+
this.recorder.onStatusChange(this.onStatusChangeInternal);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import AudioManager from '../system/AudioManager';
|
|
3
|
+
|
|
4
|
+
export default function useSystemVolume() {
|
|
5
|
+
const [volume, setVolume] = useState(0);
|
|
6
|
+
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
AudioManager.observeVolumeChanges(true);
|
|
9
|
+
const listener = AudioManager.enableRemoteEvent('volumeChange', (e) => {
|
|
10
|
+
setVolume(parseFloat(e.value.toFixed(2)));
|
|
11
|
+
});
|
|
12
|
+
return () => {
|
|
13
|
+
listener?.remove();
|
|
14
|
+
AudioManager.observeVolumeChanges(false);
|
|
15
|
+
};
|
|
16
|
+
}, []);
|
|
17
|
+
|
|
18
|
+
return volume;
|
|
19
|
+
}
|
package/src/interfaces.ts
CHANGED
|
@@ -1,21 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
+
WindowType,
|
|
2
3
|
ContextState,
|
|
3
|
-
BiquadFilterType,
|
|
4
4
|
OscillatorType,
|
|
5
|
+
BiquadFilterType,
|
|
5
6
|
ChannelCountMode,
|
|
7
|
+
AudioRecorderStatus,
|
|
6
8
|
ChannelInterpretation,
|
|
7
|
-
WindowType,
|
|
8
9
|
} from './types';
|
|
9
10
|
|
|
10
|
-
export interface AudioAPIInstaller {
|
|
11
|
-
createAudioContext: (sampleRate?: number) => IAudioContext;
|
|
12
|
-
createOfflineAudioContext: (
|
|
13
|
-
numberOfChannels: number,
|
|
14
|
-
length: number,
|
|
15
|
-
sampleRate: number
|
|
16
|
-
) => IAudioContext;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
11
|
export interface IBaseAudioContext {
|
|
20
12
|
readonly destination: IAudioDestinationNode;
|
|
21
13
|
readonly state: ContextState;
|
|
@@ -172,3 +164,25 @@ export interface IAnalyserNode extends IAudioNode {
|
|
|
172
164
|
getFloatTimeDomainData: (array: Float32Array) => void;
|
|
173
165
|
getByteTimeDomainData: (array: Uint8Array) => void;
|
|
174
166
|
}
|
|
167
|
+
|
|
168
|
+
export type IAudioReadyCallback = (
|
|
169
|
+
buffer: IAudioBuffer,
|
|
170
|
+
numFrames: number,
|
|
171
|
+
when: number
|
|
172
|
+
) => void;
|
|
173
|
+
|
|
174
|
+
export type IErrorCallback = (error: Error) => void;
|
|
175
|
+
|
|
176
|
+
export type IStatusChangeCallback = (
|
|
177
|
+
status: AudioRecorderStatus,
|
|
178
|
+
previousStatus: AudioRecorderStatus
|
|
179
|
+
) => void;
|
|
180
|
+
|
|
181
|
+
export interface IAudioRecorder {
|
|
182
|
+
start: () => void;
|
|
183
|
+
stop: () => void;
|
|
184
|
+
|
|
185
|
+
onAudioReady: (callback: IAudioReadyCallback) => void;
|
|
186
|
+
onError: (callback: IErrorCallback) => void;
|
|
187
|
+
onStatusChange: (callback: IStatusChangeCallback) => void;
|
|
188
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AndroidConfig,
|
|
3
|
+
createRunOncePlugin,
|
|
4
|
+
ConfigPlugin,
|
|
5
|
+
withInfoPlist,
|
|
6
|
+
withAndroidManifest,
|
|
7
|
+
} from '@expo/config-plugins';
|
|
8
|
+
|
|
9
|
+
const pkg = require('react-native-audio-api/package.json');
|
|
10
|
+
|
|
11
|
+
const withBackgroundAudio: ConfigPlugin = (config) => {
|
|
12
|
+
return withInfoPlist(config, (iosConfig) => {
|
|
13
|
+
iosConfig.modResults.UIBackgroundModes = [
|
|
14
|
+
...Array.from(
|
|
15
|
+
new Set([...(iosConfig.modResults.UIBackgroundModes ?? []), 'audio'])
|
|
16
|
+
),
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
return iosConfig;
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const withAndroidPermissions: ConfigPlugin<{
|
|
24
|
+
androidFSPermissions: string[];
|
|
25
|
+
}> = (config, { androidFSPermissions }) => {
|
|
26
|
+
return AndroidConfig.Permissions.withPermissions(
|
|
27
|
+
config,
|
|
28
|
+
androidFSPermissions
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const withForegroundService: ConfigPlugin<{
|
|
33
|
+
androidFSTypes: string[];
|
|
34
|
+
}> = (config, { androidFSTypes }) => {
|
|
35
|
+
return withAndroidManifest(config, (mod) => {
|
|
36
|
+
const manifest = mod.modResults;
|
|
37
|
+
const mainApplication =
|
|
38
|
+
AndroidConfig.Manifest.getMainApplicationOrThrow(manifest);
|
|
39
|
+
|
|
40
|
+
const SFTypes = androidFSTypes.join('|');
|
|
41
|
+
|
|
42
|
+
const serviceElement = {
|
|
43
|
+
$: {
|
|
44
|
+
'android:name':
|
|
45
|
+
'com.swmansion.audioapi.system.MediaNotificationManager$NotificationService',
|
|
46
|
+
'android:stopWithTask': 'true',
|
|
47
|
+
'android:foregroundServiceType': SFTypes,
|
|
48
|
+
},
|
|
49
|
+
intentFilter: [],
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
if (!mainApplication.service) {
|
|
53
|
+
mainApplication.service = [];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
mainApplication.service.push(serviceElement);
|
|
57
|
+
|
|
58
|
+
return mod;
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const withAudioAPI: ConfigPlugin<{
|
|
63
|
+
iosBackgroundMode?: boolean;
|
|
64
|
+
androidForegroundService?: boolean;
|
|
65
|
+
androidFSPermissions?: string[];
|
|
66
|
+
androidFSTypes?: string[];
|
|
67
|
+
}> = (
|
|
68
|
+
config,
|
|
69
|
+
{
|
|
70
|
+
iosBackgroundMode = true,
|
|
71
|
+
androidForegroundService = true,
|
|
72
|
+
androidFSPermissions = [],
|
|
73
|
+
androidFSTypes = [],
|
|
74
|
+
}
|
|
75
|
+
) => {
|
|
76
|
+
if (iosBackgroundMode) {
|
|
77
|
+
config = withBackgroundAudio(config);
|
|
78
|
+
}
|
|
79
|
+
if (androidForegroundService) {
|
|
80
|
+
config = withAndroidPermissions(config, {
|
|
81
|
+
androidFSPermissions,
|
|
82
|
+
});
|
|
83
|
+
config = withForegroundService(config, {
|
|
84
|
+
androidFSTypes,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return config;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export default createRunOncePlugin(withAudioAPI, pkg.name, pkg.version);
|
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
NativeModules,
|
|
3
|
-
DeviceEventEmitter,
|
|
4
|
-
NativeEventEmitter,
|
|
5
|
-
Platform,
|
|
6
|
-
} from 'react-native';
|
|
1
|
+
import { NativeModules, NativeEventEmitter, Platform } from 'react-native';
|
|
7
2
|
|
|
8
3
|
const NativeAudioManagerModule = NativeModules.AudioManagerModule;
|
|
9
|
-
const eventEmitter =
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
const eventEmitter =
|
|
5
|
+
Platform.OS === 'android'
|
|
6
|
+
? new NativeEventEmitter()
|
|
7
|
+
: new NativeEventEmitter(NativeModules.AudioManagerModule);
|
|
13
8
|
|
|
14
9
|
if (!NativeAudioManagerModule || !eventEmitter) {
|
|
15
10
|
throw new Error(
|
|
@@ -29,23 +24,22 @@ const AudioManagerModule = {
|
|
|
29
24
|
enableRemoteCommand(name: string, enabled: boolean): void {
|
|
30
25
|
NativeAudioManagerModule.enableRemoteCommand(name, enabled);
|
|
31
26
|
},
|
|
32
|
-
// audio session
|
|
33
27
|
setAudioSessionOptions(
|
|
34
28
|
category: string,
|
|
35
29
|
mode: string,
|
|
36
|
-
options: Array<string
|
|
37
|
-
active: boolean
|
|
30
|
+
options: Array<string>
|
|
38
31
|
): void {
|
|
39
|
-
NativeAudioManagerModule.setAudioSessionOptions(
|
|
40
|
-
category,
|
|
41
|
-
mode,
|
|
42
|
-
options,
|
|
43
|
-
active
|
|
44
|
-
);
|
|
32
|
+
NativeAudioManagerModule.setAudioSessionOptions(category, mode, options);
|
|
45
33
|
},
|
|
46
34
|
getDevicePreferredSampleRate(): number {
|
|
47
35
|
return NativeAudioManagerModule.getDevicePreferredSampleRate();
|
|
48
36
|
},
|
|
37
|
+
observeAudioInterruptions(enabled: boolean): void {
|
|
38
|
+
NativeAudioManagerModule.observeAudioInterruptions(enabled);
|
|
39
|
+
},
|
|
40
|
+
observeVolumeChanges(enabled: boolean): void {
|
|
41
|
+
NativeAudioManagerModule.observeVolumeChanges(enabled);
|
|
42
|
+
},
|
|
49
43
|
};
|
|
50
44
|
|
|
51
45
|
export { eventEmitter, AudioManagerModule };
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
SessionOptions,
|
|
3
|
+
LockScreenInfo,
|
|
4
|
+
RemoteEventName,
|
|
5
|
+
RemoteEventCallback,
|
|
6
|
+
RemoteCommandName,
|
|
7
|
+
} from './types';
|
|
2
8
|
import { AudioManagerModule, eventEmitter } from '../specs';
|
|
3
9
|
import { EmitterSubscription } from 'react-native';
|
|
4
10
|
|
|
@@ -15,8 +21,7 @@ class AudioManager {
|
|
|
15
21
|
AudioManagerModule.setAudioSessionOptions(
|
|
16
22
|
options.iosCategory ?? '',
|
|
17
23
|
options.iosMode ?? '',
|
|
18
|
-
options.iosOptions ?? []
|
|
19
|
-
options.active ?? true
|
|
24
|
+
options.iosOptions ?? []
|
|
20
25
|
);
|
|
21
26
|
}
|
|
22
27
|
|
|
@@ -24,97 +29,42 @@ class AudioManager {
|
|
|
24
29
|
return AudioManagerModule.getDevicePreferredSampleRate();
|
|
25
30
|
}
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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;
|
|
32
|
+
observeAudioInterruptions(enabled: boolean) {
|
|
33
|
+
AudioManagerModule.observeAudioInterruptions(enabled);
|
|
34
|
+
}
|
|
77
35
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
callback
|
|
82
|
-
);
|
|
83
|
-
break;
|
|
36
|
+
observeVolumeChanges(enabled: boolean) {
|
|
37
|
+
AudioManagerModule.observeVolumeChanges(enabled);
|
|
38
|
+
}
|
|
84
39
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
callback
|
|
89
|
-
);
|
|
90
|
-
break;
|
|
40
|
+
enableRemoteCommand<Name extends RemoteCommandName>(name: Name): void {
|
|
41
|
+
AudioManagerModule.enableRemoteCommand(name, true);
|
|
42
|
+
}
|
|
91
43
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
44
|
+
enableRemoteEvent<Name extends RemoteEventName>(
|
|
45
|
+
name: Name,
|
|
46
|
+
callback?: RemoteEventCallback<Name>
|
|
47
|
+
): EmitterSubscription | null {
|
|
48
|
+
let subscription = null;
|
|
49
|
+
if (!callback) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
switch (name) {
|
|
53
|
+
case 'interruption':
|
|
54
|
+
subscription = eventEmitter.addListener('onInterruption', callback);
|
|
55
|
+
break;
|
|
98
56
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
callback
|
|
103
|
-
);
|
|
104
|
-
break;
|
|
57
|
+
case 'routeChange':
|
|
58
|
+
subscription = eventEmitter.addListener('onRouteChange', callback);
|
|
59
|
+
break;
|
|
105
60
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
callback
|
|
110
|
-
);
|
|
111
|
-
break;
|
|
61
|
+
case 'volumeChange':
|
|
62
|
+
subscription = eventEmitter.addListener('onVolumeChange', callback);
|
|
63
|
+
break;
|
|
112
64
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
65
|
+
default:
|
|
66
|
+
console.error('Unsupported RemoteControl action:', name);
|
|
116
67
|
}
|
|
117
|
-
|
|
118
68
|
return subscription;
|
|
119
69
|
}
|
|
120
70
|
}
|