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.
Files changed (207) hide show
  1. package/README.md +35 -22
  2. package/android/CMakeLists.txt +6 -3
  3. package/android/build.gradle +1 -0
  4. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +73 -0
  5. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +37 -0
  6. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +6 -10
  7. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +2 -3
  8. package/android/src/main/java/com/swmansion/audioapi/AudioManagerModule.kt +19 -14
  9. package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +60 -0
  10. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +294 -0
  11. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +279 -0
  12. package/android/src/main/java/com/swmansion/audioapi/system/MediaReceiver.kt +46 -0
  13. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +39 -0
  14. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionEventEmitter.kt +88 -0
  15. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +162 -0
  16. package/android/src/main/java/com/swmansion/audioapi/system/VolumeChangeListener.kt +27 -0
  17. package/android/src/main/res/drawable/next.xml +9 -0
  18. package/android/src/main/res/drawable/pause.xml +9 -0
  19. package/android/src/main/res/drawable/play.xml +9 -0
  20. package/android/src/main/res/drawable/previous.xml +9 -0
  21. package/android/src/main/res/drawable/skip_backward_5.xml +9 -0
  22. package/android/src/main/res/drawable/skip_forward_5.xml +9 -0
  23. package/android/src/main/res/drawable/stop.xml +9 -0
  24. package/app.plugin.js +1 -0
  25. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +29 -5
  26. package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +1 -0
  27. package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +149 -0
  28. package/common/cpp/audioapi/core/AudioContext.cpp +4 -3
  29. package/common/cpp/audioapi/core/BaseAudioContext.cpp +6 -6
  30. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +38 -0
  31. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +1 -6
  32. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +8 -4
  33. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -0
  34. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +1 -1
  35. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +3 -3
  36. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +45 -11
  37. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +6 -2
  38. package/ios/audioapi/ios/AudioManagerModule.mm +16 -15
  39. package/ios/audioapi/ios/core/IOSAudioPlayer.h +11 -12
  40. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +22 -16
  41. package/ios/audioapi/ios/core/IOSAudioRecorder.h +36 -0
  42. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +62 -0
  43. package/ios/audioapi/ios/core/{AudioPlayer.h → NativeAudioPlayer.h} +1 -8
  44. package/ios/audioapi/ios/core/{AudioPlayer.m → NativeAudioPlayer.m} +4 -33
  45. package/ios/audioapi/ios/core/NativeAudioRecorder.h +25 -0
  46. package/ios/audioapi/ios/core/NativeAudioRecorder.m +47 -0
  47. package/ios/audioapi/ios/system/AudioEngine.h +7 -1
  48. package/ios/audioapi/ios/system/AudioEngine.mm +64 -20
  49. package/ios/audioapi/ios/system/AudioSessionManager.h +3 -1
  50. package/ios/audioapi/ios/system/AudioSessionManager.mm +37 -25
  51. package/ios/audioapi/ios/system/LockScreenManager.mm +4 -8
  52. package/ios/audioapi/ios/system/NotificationManager.h +13 -1
  53. package/ios/audioapi/ios/system/NotificationManager.mm +96 -44
  54. package/lib/commonjs/api.js +211 -0
  55. package/lib/commonjs/api.js.map +1 -0
  56. package/lib/commonjs/api.web.js +219 -0
  57. package/lib/commonjs/api.web.js.map +1 -0
  58. package/lib/commonjs/core/AnalyserNode.js +71 -0
  59. package/lib/commonjs/core/AnalyserNode.js.map +1 -0
  60. package/lib/commonjs/core/AudioBuffer.js +44 -0
  61. package/lib/commonjs/core/AudioBuffer.js.map +1 -0
  62. package/lib/commonjs/core/AudioBufferSourceNode.js +68 -0
  63. package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -0
  64. package/lib/commonjs/core/AudioContext.js +29 -0
  65. package/lib/commonjs/core/AudioContext.js.map +1 -0
  66. package/lib/commonjs/core/AudioDestinationNode.js +11 -0
  67. package/lib/commonjs/core/AudioDestinationNode.js.map +1 -0
  68. package/lib/commonjs/core/AudioNode.js +30 -0
  69. package/lib/commonjs/core/AudioNode.js.map +1 -0
  70. package/lib/commonjs/core/AudioParam.js +82 -0
  71. package/lib/commonjs/core/AudioParam.js.map +1 -0
  72. package/lib/commonjs/core/AudioRecorder.js +51 -0
  73. package/lib/commonjs/core/AudioRecorder.js.map +1 -0
  74. package/lib/commonjs/core/AudioScheduledSourceNode.js +38 -0
  75. package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -0
  76. package/lib/commonjs/core/BaseAudioContext.js +80 -0
  77. package/lib/commonjs/core/BaseAudioContext.js.map +1 -0
  78. package/lib/commonjs/core/BiquadFilterNode.js +33 -0
  79. package/lib/commonjs/core/BiquadFilterNode.js.map +1 -0
  80. package/lib/commonjs/core/GainNode.js +17 -0
  81. package/lib/commonjs/core/GainNode.js.map +1 -0
  82. package/lib/commonjs/core/OfflineAudioContext.js +63 -0
  83. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -0
  84. package/lib/commonjs/core/OscillatorNode.js +32 -0
  85. package/lib/commonjs/core/OscillatorNode.js.map +1 -0
  86. package/lib/commonjs/core/PeriodicWave.js +15 -0
  87. package/lib/commonjs/core/PeriodicWave.js.map +1 -0
  88. package/lib/commonjs/core/StereoPannerNode.js +17 -0
  89. package/lib/commonjs/core/StereoPannerNode.js.map +1 -0
  90. package/lib/commonjs/errors/IndexSizeError.js +14 -0
  91. package/lib/commonjs/errors/IndexSizeError.js.map +1 -0
  92. package/lib/commonjs/errors/InvalidAccessError.js +14 -0
  93. package/lib/commonjs/errors/InvalidAccessError.js.map +1 -0
  94. package/lib/commonjs/errors/InvalidStateError.js +14 -0
  95. package/lib/commonjs/errors/InvalidStateError.js.map +1 -0
  96. package/lib/commonjs/errors/NotSupportedError.js +14 -0
  97. package/lib/commonjs/errors/NotSupportedError.js.map +1 -0
  98. package/lib/commonjs/errors/RangeError.js +14 -0
  99. package/lib/commonjs/errors/RangeError.js.map +1 -0
  100. package/lib/commonjs/errors/index.js +42 -0
  101. package/lib/commonjs/errors/index.js.map +1 -0
  102. package/lib/commonjs/hooks/useSytemVolume.js +24 -0
  103. package/lib/commonjs/hooks/useSytemVolume.js.map +1 -0
  104. package/lib/commonjs/index.js +17 -0
  105. package/lib/commonjs/index.js.map +1 -0
  106. package/lib/commonjs/interfaces.js +6 -0
  107. package/lib/commonjs/interfaces.js.map +1 -0
  108. package/lib/commonjs/package.json +1 -0
  109. package/lib/commonjs/plugin/withAudioAPI.js +62 -0
  110. package/lib/commonjs/plugin/withAudioAPI.js.map +1 -0
  111. package/lib/commonjs/specs/NativeAudioAPIModule.js +9 -0
  112. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -0
  113. package/lib/commonjs/specs/NativeAudioManagerModule.js +36 -0
  114. package/lib/commonjs/specs/NativeAudioManagerModule.js.map +1 -0
  115. package/lib/commonjs/specs/index.js +27 -0
  116. package/lib/commonjs/specs/index.js.map +1 -0
  117. package/lib/commonjs/system/AudioManager.js +52 -0
  118. package/lib/commonjs/system/AudioManager.js.map +1 -0
  119. package/lib/commonjs/system/index.js +14 -0
  120. package/lib/commonjs/system/index.js.map +1 -0
  121. package/lib/commonjs/system/types.js +2 -0
  122. package/lib/commonjs/system/types.js.map +1 -0
  123. package/lib/commonjs/types.js +2 -0
  124. package/lib/commonjs/types.js.map +1 -0
  125. package/lib/commonjs/utils/index.js +10 -0
  126. package/lib/commonjs/utils/index.js.map +1 -0
  127. package/lib/commonjs/web-core/AnalyserNode.js +38 -0
  128. package/lib/commonjs/web-core/AnalyserNode.js.map +1 -0
  129. package/lib/commonjs/web-core/AudioBuffer.js +44 -0
  130. package/lib/commonjs/web-core/AudioBuffer.js.map +1 -0
  131. package/lib/commonjs/web-core/AudioBufferSourceNode.js +214 -0
  132. package/lib/commonjs/web-core/AudioBufferSourceNode.js.map +1 -0
  133. package/lib/commonjs/web-core/AudioContext.js +93 -0
  134. package/lib/commonjs/web-core/AudioContext.js.map +1 -0
  135. package/lib/commonjs/web-core/AudioDestinationNode.js +11 -0
  136. package/lib/commonjs/web-core/AudioDestinationNode.js.map +1 -0
  137. package/lib/commonjs/web-core/AudioNode.js +33 -0
  138. package/lib/commonjs/web-core/AudioNode.js.map +1 -0
  139. package/lib/commonjs/web-core/AudioParam.js +81 -0
  140. package/lib/commonjs/web-core/AudioParam.js.map +1 -0
  141. package/lib/commonjs/web-core/AudioScheduledSourceNode.js +41 -0
  142. package/lib/commonjs/web-core/AudioScheduledSourceNode.js.map +1 -0
  143. package/lib/commonjs/web-core/BaseAudioContext.js +2 -0
  144. package/lib/commonjs/web-core/BaseAudioContext.js.map +1 -0
  145. package/lib/commonjs/web-core/BiquadFilterNode.js +33 -0
  146. package/lib/commonjs/web-core/BiquadFilterNode.js.map +1 -0
  147. package/lib/commonjs/web-core/GainNode.js +17 -0
  148. package/lib/commonjs/web-core/GainNode.js.map +1 -0
  149. package/lib/commonjs/web-core/OfflineAudioContext.js +96 -0
  150. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -0
  151. package/lib/commonjs/web-core/OscillatorNode.js +31 -0
  152. package/lib/commonjs/web-core/OscillatorNode.js.map +1 -0
  153. package/lib/commonjs/web-core/PeriodicWave.js +15 -0
  154. package/lib/commonjs/web-core/PeriodicWave.js.map +1 -0
  155. package/lib/commonjs/web-core/StereoPannerNode.js +17 -0
  156. package/lib/commonjs/web-core/StereoPannerNode.js.map +1 -0
  157. package/lib/commonjs/web-core/custom/LoadCustomWasm.js +37 -0
  158. package/lib/commonjs/web-core/custom/LoadCustomWasm.js.map +1 -0
  159. package/lib/commonjs/web-core/custom/index.js +14 -0
  160. package/lib/commonjs/web-core/custom/index.js.map +1 -0
  161. package/lib/commonjs/web-core/custom/signalsmithStretch/LICENSE.txt +21 -0
  162. package/lib/commonjs/web-core/custom/signalsmithStretch/README.md +46 -0
  163. package/lib/commonjs/web-core/custom/signalsmithStretch/SignalsmithStretch.mjs +826 -0
  164. package/lib/commonjs/web-core/custom/signalsmithStretch/SignalsmithStretch.mjs.map +1 -0
  165. package/lib/module/api.js +3 -1
  166. package/lib/module/api.js.map +1 -1
  167. package/lib/module/core/AudioRecorder.js +45 -0
  168. package/lib/module/core/AudioRecorder.js.map +1 -0
  169. package/lib/module/errors/NotSupportedError.js.map +1 -1
  170. package/lib/module/hooks/useSytemVolume.js +19 -0
  171. package/lib/module/hooks/useSytemVolume.js.map +1 -0
  172. package/lib/module/plugin/withAudioAPI.js +58 -0
  173. package/lib/module/plugin/withAudioAPI.js.map +1 -0
  174. package/lib/module/specs/NativeAudioManagerModule.js +10 -8
  175. package/lib/module/specs/NativeAudioManagerModule.js.map +1 -1
  176. package/lib/module/system/AudioManager.js +26 -44
  177. package/lib/module/system/AudioManager.js.map +1 -1
  178. package/lib/typescript/api.d.ts +5 -1
  179. package/lib/typescript/api.d.ts.map +1 -1
  180. package/lib/typescript/core/AudioRecorder.d.ts +22 -0
  181. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -0
  182. package/lib/typescript/errors/NotSupportedError.d.ts.map +1 -1
  183. package/lib/typescript/hooks/useSytemVolume.d.ts +2 -0
  184. package/lib/typescript/hooks/useSytemVolume.d.ts.map +1 -0
  185. package/lib/typescript/interfaces.d.ts +11 -5
  186. package/lib/typescript/interfaces.d.ts.map +1 -1
  187. package/lib/typescript/plugin/withAudioAPI.d.ts +9 -0
  188. package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -0
  189. package/lib/typescript/specs/NativeAudioManagerModule.d.ts +4 -2
  190. package/lib/typescript/specs/NativeAudioManagerModule.d.ts.map +1 -1
  191. package/lib/typescript/system/AudioManager.d.ts +5 -2
  192. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  193. package/lib/typescript/system/types.d.ts +36 -5
  194. package/lib/typescript/system/types.d.ts.map +1 -1
  195. package/lib/typescript/types.d.ts +5 -0
  196. package/lib/typescript/types.d.ts.map +1 -1
  197. package/package.json +7 -3
  198. package/src/api.ts +13 -2
  199. package/src/core/AudioRecorder.ts +81 -0
  200. package/src/hooks/useSytemVolume.ts +19 -0
  201. package/src/interfaces.ts +25 -11
  202. package/src/plugin/withAudioAPI.ts +91 -0
  203. package/src/specs/NativeAudioManagerModule.ts +13 -19
  204. package/src/system/AudioManager.ts +37 -87
  205. package/src/system/types.ts +43 -17
  206. package/src/types.ts +13 -0
  207. /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,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"}
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' | 'state_stopped';
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
- isLiveStream?: boolean;
19
+ description?: string;
22
20
  state?: MediaState;
23
21
  speed?: number;
24
22
  elapsedTime?: number;
25
23
  }
26
- export type RemoteControl = 'play' | 'pause' | 'stop' | 'togglePlayPause' | 'changePlaybackRate' | 'nextTrack' | 'previousTrack' | 'skipForward' | 'skipBackward' | 'seekForward' | 'seekBackward' | 'changePlaybackPosition';
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;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"}
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.0",
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 type { IAudioContext, IOfflineAudioContext } from './interfaces';
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 = Platform.select({
10
- ios: new NativeEventEmitter(NativeModules.AudioManagerModule),
11
- android: DeviceEventEmitter,
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 { SessionOptions, LockScreenInfo, RemoteControl } from './types';
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
- 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;
32
+ observeAudioInterruptions(enabled: boolean) {
33
+ AudioManagerModule.observeAudioInterruptions(enabled);
34
+ }
77
35
 
78
- case 'skipForward':
79
- subscription = eventEmitter!.addListener(
80
- 'onRemoteSkipForward',
81
- callback
82
- );
83
- break;
36
+ observeVolumeChanges(enabled: boolean) {
37
+ AudioManagerModule.observeVolumeChanges(enabled);
38
+ }
84
39
 
85
- case 'skipBackward':
86
- subscription = eventEmitter!.addListener(
87
- 'onRemoteSkipBackward',
88
- callback
89
- );
90
- break;
40
+ enableRemoteCommand<Name extends RemoteCommandName>(name: Name): void {
41
+ AudioManagerModule.enableRemoteCommand(name, true);
42
+ }
91
43
 
92
- case 'seekForward':
93
- subscription = eventEmitter!.addListener(
94
- 'onRemoteSeekForward',
95
- callback
96
- );
97
- break;
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
- case 'seekBackward':
100
- subscription = eventEmitter!.addListener(
101
- 'onRemoteSeekBackward',
102
- callback
103
- );
104
- break;
57
+ case 'routeChange':
58
+ subscription = eventEmitter.addListener('onRouteChange', callback);
59
+ break;
105
60
 
106
- case 'changePlaybackPosition':
107
- subscription = eventEmitter!.addListener(
108
- 'onRemoteChangePlaybackPosition',
109
- callback
110
- );
111
- break;
61
+ case 'volumeChange':
62
+ subscription = eventEmitter.addListener('onVolumeChange', callback);
63
+ break;
112
64
 
113
- default:
114
- console.error('Unsupported RemoteControl action:', name);
115
- }
65
+ default:
66
+ console.error('Unsupported RemoteControl action:', name);
116
67
  }
117
-
118
68
  return subscription;
119
69
  }
120
70
  }