react-native-audio-api 0.6.1-rc.4 → 0.6.1-rc.5

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 (34) hide show
  1. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +3 -9
  2. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +1 -2
  3. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +17 -10
  4. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +4 -14
  5. package/common/cpp/audioapi/core/AudioContext.cpp +5 -5
  6. package/common/cpp/audioapi/core/BaseAudioContext.cpp +4 -0
  7. package/common/cpp/audioapi/core/BaseAudioContext.h +1 -0
  8. package/ios/audioapi/ios/AudioAPIModule.mm +22 -10
  9. package/ios/audioapi/ios/core/IOSAudioPlayer.h +1 -2
  10. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +8 -13
  11. package/ios/audioapi/ios/system/AudioSessionManager.mm +1 -1
  12. package/ios/audioapi/ios/system/LockScreenManager.mm +13 -1
  13. package/lib/commonjs/hooks/useSytemVolume.js +1 -1
  14. package/lib/commonjs/hooks/useSytemVolume.js.map +1 -1
  15. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  16. package/lib/commonjs/system/AudioManager.js +12 -10
  17. package/lib/commonjs/system/AudioManager.js.map +1 -1
  18. package/lib/module/hooks/useSytemVolume.js +1 -1
  19. package/lib/module/hooks/useSytemVolume.js.map +1 -1
  20. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  21. package/lib/module/system/AudioManager.js +12 -10
  22. package/lib/module/system/AudioManager.js.map +1 -1
  23. package/lib/typescript/events/types.d.ts +9 -6
  24. package/lib/typescript/events/types.d.ts.map +1 -1
  25. package/lib/typescript/hooks/useSytemVolume.d.ts.map +1 -1
  26. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +3 -2
  27. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  28. package/lib/typescript/system/AudioManager.d.ts +6 -4
  29. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  30. package/package.json +1 -1
  31. package/src/events/types.ts +11 -6
  32. package/src/hooks/useSytemVolume.ts +6 -3
  33. package/src/specs/NativeAudioAPIModule.ts +14 -6
  34. package/src/system/AudioManager.ts +21 -16
@@ -33,13 +33,13 @@ void AudioPlayer::start() {
33
33
  }
34
34
  }
35
35
 
36
- void AudioPlayer::resume() {
36
+ void AudioPlayer::stop() {
37
37
  if (mStream_) {
38
- mStream_->requestStart();
38
+ mStream_->requestPause();
39
39
  }
40
40
  }
41
41
 
42
- void AudioPlayer::stop() {
42
+ void AudioPlayer::cleanup() {
43
43
  isInitialized_ = false;
44
44
 
45
45
  if (mStream_) {
@@ -49,12 +49,6 @@ void AudioPlayer::stop() {
49
49
  }
50
50
  }
51
51
 
52
- void AudioPlayer::pause() {
53
- if (mStream_) {
54
- mStream_->requestPause();
55
- }
56
- }
57
-
58
52
  DataCallbackResult AudioPlayer::onAudioReady(
59
53
  AudioStream *oboeStream,
60
54
  void *audioData,
@@ -19,9 +19,8 @@ class AudioPlayer : public AudioStreamDataCallback {
19
19
  float sampleRate);
20
20
 
21
21
  void start();
22
- void resume();
23
22
  void stop();
24
- void pause();
23
+ void cleanup();
25
24
 
26
25
  DataCallbackResult onAudioReady(
27
26
  AudioStream *oboeStream,
@@ -53,6 +53,23 @@ class AudioAPIModule(
53
53
  return true
54
54
  }
55
55
 
56
+ override fun getDevicePreferredSampleRate(): Double = MediaSessionManager.getDevicePreferredSampleRate()
57
+
58
+ override fun setAudioSessionActivity(
59
+ enabled: Boolean,
60
+ promise: Promise?,
61
+ ) {
62
+ // noting to do here
63
+ }
64
+
65
+ override fun setAudioSessionOptions(
66
+ category: String?,
67
+ mode: String?,
68
+ options: ReadableArray?,
69
+ ) {
70
+ // noting to do here
71
+ }
72
+
56
73
  override fun setLockScreenInfo(info: ReadableMap?) {
57
74
  MediaSessionManager.setLockScreenInfo(info)
58
75
  }
@@ -68,16 +85,6 @@ class AudioAPIModule(
68
85
  MediaSessionManager.enableRemoteCommand(name!!, enabled)
69
86
  }
70
87
 
71
- override fun setAudioSessionOptions(
72
- category: String?,
73
- mode: String?,
74
- options: ReadableArray?,
75
- ) {
76
- // noting to do here
77
- }
78
-
79
- override fun getDevicePreferredSampleRate(): Double = MediaSessionManager.getDevicePreferredSampleRate()
80
-
81
88
  override fun observeAudioInterruptions(enabled: Boolean) {
82
89
  MediaSessionManager.observeAudioInterruptions(enabled)
83
90
  }
@@ -45,13 +45,8 @@ class AudioContextHostObject : public BaseAudioContextHostObject {
45
45
  auto audioContext = std::static_pointer_cast<AudioContext>(context_);
46
46
  auto result = audioContext->resume();
47
47
 
48
- if (!result) {
49
- promise->reject("Failed to resume audio context, because it is already closed.");
50
- return;
51
- }
52
-
53
- promise->resolve([](jsi::Runtime &runtime) {
54
- return jsi::Value::undefined();
48
+ promise->resolve([result](jsi::Runtime &runtime) {
49
+ return jsi::Value(result);
55
50
  });
56
51
  }).detach();
57
52
  });
@@ -65,13 +60,8 @@ class AudioContextHostObject : public BaseAudioContextHostObject {
65
60
  auto audioContext = std::static_pointer_cast<AudioContext>(context_);
66
61
  auto result = audioContext->suspend();
67
62
 
68
- if (!result) {
69
- promise->reject("Failed to resume audio context, because it is already closed.");
70
- return;
71
- }
72
-
73
- promise->resolve([](jsi::Runtime &runtime) {
74
- return jsi::Value::undefined();
63
+ promise->resolve([result](jsi::Runtime &runtime) {
64
+ return jsi::Value(result);
75
65
  });
76
66
  }).detach();
77
67
  });
@@ -36,28 +36,28 @@ AudioContext::~AudioContext() {
36
36
 
37
37
  void AudioContext::close() {
38
38
  state_ = ContextState::CLOSED;
39
- audioPlayer_->stop();
40
39
 
40
+ audioPlayer_->cleanup();
41
41
  nodeManager_->cleanup();
42
42
  }
43
43
 
44
44
  bool AudioContext::resume() {
45
- if (isClosed()) {
45
+ if (isClosed() || isRunning()) {
46
46
  return false;
47
47
  }
48
48
 
49
49
  state_ = ContextState::RUNNING;
50
- audioPlayer_->resume();
50
+ audioPlayer_->start();
51
51
  return true;
52
52
  }
53
53
 
54
54
  bool AudioContext::suspend() {
55
- if (isClosed()) {
55
+ if (isClosed() || isSuspended()) {
56
56
  return false;
57
57
  }
58
58
 
59
59
  state_ = ContextState::SUSPENDED;
60
- audioPlayer_->pause();
60
+ audioPlayer_->stop();
61
61
  return true;
62
62
  }
63
63
 
@@ -139,6 +139,10 @@ bool BaseAudioContext::isRunning() const {
139
139
  return state_ == ContextState::RUNNING;
140
140
  }
141
141
 
142
+ bool BaseAudioContext::isSuspended() const {
143
+ return state_ == ContextState::SUSPENDED;
144
+ }
145
+
142
146
  bool BaseAudioContext::isClosed() const {
143
147
  return state_ == ContextState::CLOSED;
144
148
  }
@@ -62,6 +62,7 @@ class BaseAudioContext {
62
62
  AudioNodeManager *getNodeManager();
63
63
 
64
64
  [[nodiscard]] bool isRunning() const;
65
+ [[nodiscard]] bool isSuspended() const;
65
66
  [[nodiscard]] bool isClosed() const;
66
67
 
67
68
  protected:
@@ -80,19 +80,21 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
80
80
  return @true;
81
81
  }
82
82
 
83
- RCT_EXPORT_METHOD(setLockScreenInfo : (NSDictionary *)info)
83
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)
84
84
  {
85
- [self.lockScreenManager setLockScreenInfo:info];
85
+ return [self.audioSessionManager getDevicePreferredSampleRate];
86
86
  }
87
87
 
88
- RCT_EXPORT_METHOD(resetLockScreenInfo)
88
+ RCT_EXPORT_METHOD(
89
+ setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
90
+ reject)
89
91
  {
90
- [self.lockScreenManager resetLockScreenInfo];
91
- }
92
+ if ([self.audioSessionManager setActive:enabled]) {
93
+ resolve(@"true");
94
+ return;
95
+ }
92
96
 
93
- RCT_EXPORT_METHOD(enableRemoteCommand : (NSString *)name enabled : (BOOL)enabled)
94
- {
95
- [self.lockScreenManager enableRemoteCommand:name enabled:enabled];
97
+ resolve(@"false");
96
98
  }
97
99
 
98
100
  RCT_EXPORT_METHOD(setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)options)
@@ -100,9 +102,19 @@ RCT_EXPORT_METHOD(setAudioSessionOptions : (NSString *)category mode : (NSString
100
102
  [self.audioSessionManager setAudioSessionOptions:category mode:mode options:options];
101
103
  }
102
104
 
103
- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)
105
+ RCT_EXPORT_METHOD(setLockScreenInfo : (NSDictionary *)info)
104
106
  {
105
- return [self.audioSessionManager getDevicePreferredSampleRate];
107
+ [self.lockScreenManager setLockScreenInfo:info];
108
+ }
109
+
110
+ RCT_EXPORT_METHOD(resetLockScreenInfo)
111
+ {
112
+ [self.lockScreenManager resetLockScreenInfo];
113
+ }
114
+
115
+ RCT_EXPORT_METHOD(enableRemoteCommand : (NSString *)name enabled : (BOOL)enabled)
116
+ {
117
+ [self.lockScreenManager enableRemoteCommand:name enabled:enabled];
106
118
  }
107
119
 
108
120
  RCT_EXPORT_METHOD(observeAudioInterruptions : (BOOL)enabled)
@@ -21,9 +21,8 @@ class IOSAudioPlayer {
21
21
  ~IOSAudioPlayer();
22
22
 
23
23
  void start();
24
- void resume();
25
24
  void stop();
26
- void pause();
25
+ void cleanup();
27
26
 
28
27
  protected:
29
28
  std::shared_ptr<AudioBus> audioBus_;
@@ -43,12 +43,7 @@ IOSAudioPlayer::IOSAudioPlayer(const std::function<void(std::shared_ptr<AudioBus
43
43
 
44
44
  IOSAudioPlayer::~IOSAudioPlayer()
45
45
  {
46
- stop();
47
- [audioPlayer_ cleanup];
48
-
49
- if (audioBus_) {
50
- audioBus_ = nullptr;
51
- }
46
+ cleanup();
52
47
  }
53
48
 
54
49
  void IOSAudioPlayer::start()
@@ -61,20 +56,20 @@ void IOSAudioPlayer::start()
61
56
  isRunning_.store(true);
62
57
  }
63
58
 
64
- void IOSAudioPlayer::resume()
65
- {
66
- isRunning_.store(true);
67
- }
68
-
69
59
  void IOSAudioPlayer::stop()
70
60
  {
71
61
  isRunning_.store(false);
72
62
  [audioPlayer_ stop];
73
63
  }
74
64
 
75
- void IOSAudioPlayer::pause()
65
+ void IOSAudioPlayer::cleanup()
76
66
  {
77
- isRunning_.store(false);
67
+ stop();
68
+ [audioPlayer_ cleanup];
69
+
70
+ if (audioBus_) {
71
+ audioBus_ = nullptr;
72
+ }
78
73
  }
79
74
 
80
75
  } // namespace audioapi
@@ -9,7 +9,7 @@
9
9
 
10
10
  self.sessionCategory = AVAudioSessionCategoryPlayback;
11
11
  self.sessionMode = AVAudioSessionModeDefault;
12
- self.sessionOptions = AVAudioSessionCategoryOptionAllowAirPlay;
12
+ self.sessionOptions = 0;
13
13
  self.hasDirtySettings = true;
14
14
  self.isActive = false;
15
15
  }
@@ -19,7 +19,10 @@
19
19
  if (self = [super init]) {
20
20
  self.audioAPIModule = audioAPIModule;
21
21
  self.playingInfoCenter = [MPNowPlayingInfoCenter defaultCenter];
22
- [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
22
+
23
+ dispatch_async(dispatch_get_main_queue(), ^{
24
+ [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
25
+ });
23
26
  }
24
27
 
25
28
  return self;
@@ -29,10 +32,16 @@
29
32
  {
30
33
  NSLog(@"[LockScreenManager] cleanup");
31
34
  [self resetLockScreenInfo];
35
+
36
+ dispatch_async(dispatch_get_main_queue(), ^{
37
+ [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
38
+ });
32
39
  }
33
40
 
34
41
  - (void)setLockScreenInfo:(NSDictionary *)info
35
42
  {
43
+ self.playingInfoCenter = [MPNowPlayingInfoCenter defaultCenter];
44
+
36
45
  // now playing info(lock screen info)
37
46
  NSMutableDictionary *lockScreenInfoDict;
38
47
 
@@ -61,6 +70,8 @@
61
70
  }
62
71
  }
63
72
 
73
+ self.playingInfoCenter.playbackState = MPNowPlayingPlaybackStatePaused;
74
+
64
75
  // artwork
65
76
  NSString *artworkUrl = [self getArtworkUrl:[info objectForKey:@"artwork"]];
66
77
  [self updateArtworkIfNeeded:artworkUrl];
@@ -68,6 +79,7 @@
68
79
 
69
80
  - (void)resetLockScreenInfo
70
81
  {
82
+ self.playingInfoCenter = [MPNowPlayingInfoCenter defaultCenter];
71
83
  self.playingInfoCenter.nowPlayingInfo = nil;
72
84
  self.artworkUrl = nil;
73
85
  }
@@ -11,7 +11,7 @@ function useSystemVolume() {
11
11
  const [volume, setVolume] = (0, _react.useState)(0);
12
12
  (0, _react.useEffect)(() => {
13
13
  _AudioManager.default.observeVolumeChanges(true);
14
- const listener = _AudioManager.default.enableSystemEvent('volumeChange', e => {
14
+ const listener = _AudioManager.default.addSystemEventListener('volumeChange', e => {
15
15
  setVolume(parseFloat(e.value.toFixed(2)));
16
16
  });
17
17
  return () => {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_AudioManager","_interopRequireDefault","e","__esModule","default","useSystemVolume","volume","setVolume","useState","useEffect","AudioManager","observeVolumeChanges","listener","enableSystemEvent","parseFloat","value","toFixed","remove"],"sourceRoot":"../../../src","sources":["hooks/useSytemVolume.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAkD,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnC,SAASG,eAAeA,CAAA,EAAG;EACxC,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAG,IAAAC,eAAQ,EAAC,CAAC,CAAC;EAEvC,IAAAC,gBAAS,EAAC,MAAM;IACdC,qBAAY,CAACC,oBAAoB,CAAC,IAAI,CAAC;IACvC,MAAMC,QAAQ,GAAGF,qBAAY,CAACG,iBAAiB,CAAC,cAAc,EAAGX,CAAC,IAAK;MACrEK,SAAS,CAACO,UAAU,CAACZ,CAAC,CAACa,KAAK,CAACC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC;IACF,OAAO,MAAM;MACXJ,QAAQ,EAAEK,MAAM,CAAC,CAAC;MAElBP,qBAAY,CAACC,oBAAoB,CAAC,KAAK,CAAC;IAC1C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAOL,MAAM;AACf","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_AudioManager","_interopRequireDefault","e","__esModule","default","useSystemVolume","volume","setVolume","useState","useEffect","AudioManager","observeVolumeChanges","listener","addSystemEventListener","parseFloat","value","toFixed","remove"],"sourceRoot":"../../../src","sources":["hooks/useSytemVolume.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAkD,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnC,SAASG,eAAeA,CAAA,EAAG;EACxC,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAG,IAAAC,eAAQ,EAAC,CAAC,CAAC;EAEvC,IAAAC,gBAAS,EAAC,MAAM;IACdC,qBAAY,CAACC,oBAAoB,CAAC,IAAI,CAAC;IACvC,MAAMC,QAAQ,GAAGF,qBAAY,CAACG,sBAAsB,CAClD,cAAc,EACbX,CAAC,IAAK;MACLK,SAAS,CAACO,UAAU,CAACZ,CAAC,CAACa,KAAK,CAACC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CACF,CAAC;IACD,OAAO,MAAM;MACXJ,QAAQ,EAAEK,MAAM,CAAC,CAAC;MAElBP,qBAAY,CAACC,oBAAoB,CAAC,KAAK,CAAC;IAC1C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAOL,MAAM;AACf","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["Object","defineProperty","exports","value","NativeAudioAPIModule","_reactNative","require","TurboModuleRegistry","get"],"sourceRoot":"../../../src","sources":["specs/NativeAudioAPIModule.ts"],"mappings":"AAAA,YAAY;;AAACA,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,oBAAA;AACb,IAAAC,YAAA,GAAAC,OAAA;AAwBA,MAAMF,oBAAoB,GAAAF,OAAA,CAAAE,oBAAA,GAAGG,gCAAmB,CAACC,GAAG,CAAO,gBAAgB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Object","defineProperty","exports","value","NativeAudioAPIModule","_reactNative","require","TurboModuleRegistry","get"],"sourceRoot":"../../../src","sources":["specs/NativeAudioAPIModule.ts"],"mappings":"AAAA,YAAY;;AAACA,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,oBAAA;AACb,IAAAC,YAAA,GAAAC,OAAA;AAgCA,MAAMF,oBAAoB,GAAAF,OAAA,CAAAE,oBAAA,GAAGG,gCAAmB,CAACC,GAAG,CAAO,gBAAgB,CAAC","ignoreList":[]}
@@ -16,17 +16,20 @@ class AudioManager {
16
16
  constructor() {
17
17
  this.audioEventEmitter = new _events.AudioEventEmitter(global.AudioEventEmitter);
18
18
  }
19
- setLockScreenInfo(info) {
20
- _specs.NativeAudioAPIModule.setLockScreenInfo(info);
19
+ getDevicePreferredSampleRate() {
20
+ return _specs.NativeAudioAPIModule.getDevicePreferredSampleRate();
21
21
  }
22
- resetLockScreenInfo() {
23
- _specs.NativeAudioAPIModule.resetLockScreenInfo();
22
+ setAudioSessionActivity(enabled) {
23
+ return _specs.NativeAudioAPIModule.setAudioSessionActivity(enabled);
24
24
  }
25
25
  setAudioSessionOptions(options) {
26
26
  _specs.NativeAudioAPIModule.setAudioSessionOptions(options.iosCategory ?? '', options.iosMode ?? '', options.iosOptions ?? []);
27
27
  }
28
- getDevicePreferredSampleRate() {
29
- return _specs.NativeAudioAPIModule.getDevicePreferredSampleRate();
28
+ setLockScreenInfo(info) {
29
+ _specs.NativeAudioAPIModule.setLockScreenInfo(info);
30
+ }
31
+ resetLockScreenInfo() {
32
+ _specs.NativeAudioAPIModule.resetLockScreenInfo();
30
33
  }
31
34
  observeAudioInterruptions(enabled) {
32
35
  _specs.NativeAudioAPIModule.observeAudioInterruptions(enabled);
@@ -34,11 +37,10 @@ class AudioManager {
34
37
  observeVolumeChanges(enabled) {
35
38
  _specs.NativeAudioAPIModule.observeVolumeChanges(enabled);
36
39
  }
37
- enableSystemEvent(name, callback, enabled = true) {
40
+ enableRemoteCommand(name, enabled) {
38
41
  _specs.NativeAudioAPIModule.enableRemoteCommand(name, enabled);
39
- if (!enabled || !callback) {
40
- return null;
41
- }
42
+ }
43
+ addSystemEventListener(name, callback) {
42
44
  return this.audioEventEmitter.addAudioEventListener(name, callback);
43
45
  }
44
46
  async requestRecordingPermissions() {
@@ -1 +1 @@
1
- {"version":3,"names":["_specs","require","_events","global","AudioEventEmitter","NativeAudioAPIModule","Error","install","AudioManager","constructor","audioEventEmitter","setLockScreenInfo","info","resetLockScreenInfo","setAudioSessionOptions","options","iosCategory","iosMode","iosOptions","getDevicePreferredSampleRate","observeAudioInterruptions","enabled","observeVolumeChanges","enableSystemEvent","name","callback","enableRemoteCommand","addAudioEventListener","requestRecordingPermissions","checkRecordingPermissions","_default","exports","default"],"sourceRoot":"../../../src","sources":["system/AudioManager.ts"],"mappings":";;;;;;AAEA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAIE,MAAM,CAACC,iBAAiB,IAAI,IAAI,EAAE;EACpC,IAAI,CAACC,2BAAoB,EAAE;IACzB,MAAM,IAAIC,KAAK,CACb,iFACF,CAAC;EACH;EAEAD,2BAAoB,CAACE,OAAO,CAAC,CAAC;AAChC;AAEA,MAAMC,YAAY,CAAC;EAEjBC,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACC,iBAAiB,GAAG,IAAIN,yBAAiB,CAACD,MAAM,CAACC,iBAAiB,CAAC;EAC1E;EAEAO,iBAAiBA,CAACC,IAAoB,EAAE;IACtCP,2BAAoB,CAAEM,iBAAiB,CAACC,IAAI,CAAC;EAC/C;EAEAC,mBAAmBA,CAAA,EAAG;IACpBR,2BAAoB,CAAEQ,mBAAmB,CAAC,CAAC;EAC7C;EAEAC,sBAAsBA,CAACC,OAAuB,EAAE;IAC9CV,2BAAoB,CAAES,sBAAsB,CAC1CC,OAAO,CAACC,WAAW,IAAI,EAAE,EACzBD,OAAO,CAACE,OAAO,IAAI,EAAE,EACrBF,OAAO,CAACG,UAAU,IAAI,EACxB,CAAC;EACH;EAEAC,4BAA4BA,CAAA,EAAW;IACrC,OAAOd,2BAAoB,CAAEc,4BAA4B,CAAC,CAAC;EAC7D;EAEAC,yBAAyBA,CAACC,OAAgB,EAAE;IAC1ChB,2BAAoB,CAAEe,yBAAyB,CAACC,OAAO,CAAC;EAC1D;EAEAC,oBAAoBA,CAACD,OAAgB,EAAE;IACrChB,2BAAoB,CAAEiB,oBAAoB,CAACD,OAAO,CAAC;EACrD;EAEAE,iBAAiBA,CACfC,IAAU,EACVC,QAAoC,EACpCJ,OAAO,GAAG,IAAI,EACiB;IAC/BhB,2BAAoB,CAAEqB,mBAAmB,CAACF,IAAI,EAAEH,OAAO,CAAC;IAExD,IAAI,CAACA,OAAO,IAAI,CAACI,QAAQ,EAAE;MACzB,OAAO,IAAI;IACb;IAEA,OAAO,IAAI,CAACf,iBAAiB,CAACiB,qBAAqB,CAACH,IAAI,EAAEC,QAAQ,CAAC;EACrE;EAEA,MAAMG,2BAA2BA,CAAA,EAA8B;IAC7D,OAAOvB,2BAAoB,CAAEuB,2BAA2B,CAAC,CAAC;EAC5D;EAEA,MAAMC,yBAAyBA,CAAA,EAA8B;IAC3D,OAAOxB,2BAAoB,CAAEwB,yBAAyB,CAAC,CAAC;EAC1D;AACF;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc,IAAIxB,YAAY,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_specs","require","_events","global","AudioEventEmitter","NativeAudioAPIModule","Error","install","AudioManager","constructor","audioEventEmitter","getDevicePreferredSampleRate","setAudioSessionActivity","enabled","setAudioSessionOptions","options","iosCategory","iosMode","iosOptions","setLockScreenInfo","info","resetLockScreenInfo","observeAudioInterruptions","observeVolumeChanges","enableRemoteCommand","name","addSystemEventListener","callback","addAudioEventListener","requestRecordingPermissions","checkRecordingPermissions","_default","exports","default"],"sourceRoot":"../../../src","sources":["system/AudioManager.ts"],"mappings":";;;;;;AAMA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAIE,MAAM,CAACC,iBAAiB,IAAI,IAAI,EAAE;EACpC,IAAI,CAACC,2BAAoB,EAAE;IACzB,MAAM,IAAIC,KAAK,CACb,iFACF,CAAC;EACH;EAEAD,2BAAoB,CAACE,OAAO,CAAC,CAAC;AAChC;AAEA,MAAMC,YAAY,CAAC;EAEjBC,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACC,iBAAiB,GAAG,IAAIN,yBAAiB,CAACD,MAAM,CAACC,iBAAiB,CAAC;EAC1E;EAEAO,4BAA4BA,CAAA,EAAW;IACrC,OAAON,2BAAoB,CAAEM,4BAA4B,CAAC,CAAC;EAC7D;EAEAC,uBAAuBA,CAACC,OAAgB,EAAoB;IAC1D,OAAOR,2BAAoB,CAAEO,uBAAuB,CAACC,OAAO,CAAC;EAC/D;EAEAC,sBAAsBA,CAACC,OAAuB,EAAE;IAC9CV,2BAAoB,CAAES,sBAAsB,CAC1CC,OAAO,CAACC,WAAW,IAAI,EAAE,EACzBD,OAAO,CAACE,OAAO,IAAI,EAAE,EACrBF,OAAO,CAACG,UAAU,IAAI,EACxB,CAAC;EACH;EAEAC,iBAAiBA,CAACC,IAAoB,EAAE;IACtCf,2BAAoB,CAAEc,iBAAiB,CAACC,IAAI,CAAC;EAC/C;EAEAC,mBAAmBA,CAAA,EAAG;IACpBhB,2BAAoB,CAAEgB,mBAAmB,CAAC,CAAC;EAC7C;EAEAC,yBAAyBA,CAACT,OAAgB,EAAE;IAC1CR,2BAAoB,CAAEiB,yBAAyB,CAACT,OAAO,CAAC;EAC1D;EAEAU,oBAAoBA,CAACV,OAAgB,EAAE;IACrCR,2BAAoB,CAAEkB,oBAAoB,CAACV,OAAO,CAAC;EACrD;EAEAW,mBAAmBA,CAACC,IAA4B,EAAEZ,OAAgB,EAAE;IAClER,2BAAoB,CAAEmB,mBAAmB,CAACC,IAAI,EAAEZ,OAAO,CAAC;EAC1D;EAEAa,sBAAsBA,CACpBD,IAAU,EACVE,QAAmC,EACX;IACxB,OAAO,IAAI,CAACjB,iBAAiB,CAACkB,qBAAqB,CAACH,IAAI,EAAEE,QAAQ,CAAC;EACrE;EAEA,MAAME,2BAA2BA,CAAA,EAA8B;IAC7D,OAAOxB,2BAAoB,CAAEwB,2BAA2B,CAAC,CAAC;EAC5D;EAEA,MAAMC,yBAAyBA,CAAA,EAA8B;IAC3D,OAAOzB,2BAAoB,CAAEyB,yBAAyB,CAAC,CAAC;EAC1D;AACF;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc,IAAIzB,YAAY,CAAC,CAAC","ignoreList":[]}
@@ -6,7 +6,7 @@ export default function useSystemVolume() {
6
6
  const [volume, setVolume] = useState(0);
7
7
  useEffect(() => {
8
8
  AudioManager.observeVolumeChanges(true);
9
- const listener = AudioManager.enableSystemEvent('volumeChange', e => {
9
+ const listener = AudioManager.addSystemEventListener('volumeChange', e => {
10
10
  setVolume(parseFloat(e.value.toFixed(2)));
11
11
  });
12
12
  return () => {
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useState","AudioManager","useSystemVolume","volume","setVolume","observeVolumeChanges","listener","enableSystemEvent","e","parseFloat","value","toFixed","remove"],"sourceRoot":"../../../src","sources":["hooks/useSytemVolume.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,OAAOC,YAAY,MAAM,2BAAwB;AAEjD,eAAe,SAASC,eAAeA,CAAA,EAAG;EACxC,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGJ,QAAQ,CAAC,CAAC,CAAC;EAEvCD,SAAS,CAAC,MAAM;IACdE,YAAY,CAACI,oBAAoB,CAAC,IAAI,CAAC;IACvC,MAAMC,QAAQ,GAAGL,YAAY,CAACM,iBAAiB,CAAC,cAAc,EAAGC,CAAC,IAAK;MACrEJ,SAAS,CAACK,UAAU,CAACD,CAAC,CAACE,KAAK,CAACC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC;IACF,OAAO,MAAM;MACXL,QAAQ,EAAEM,MAAM,CAAC,CAAC;MAElBX,YAAY,CAACI,oBAAoB,CAAC,KAAK,CAAC;IAC1C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAOF,MAAM;AACf","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useState","AudioManager","useSystemVolume","volume","setVolume","observeVolumeChanges","listener","addSystemEventListener","e","parseFloat","value","toFixed","remove"],"sourceRoot":"../../../src","sources":["hooks/useSytemVolume.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,OAAOC,YAAY,MAAM,2BAAwB;AAEjD,eAAe,SAASC,eAAeA,CAAA,EAAG;EACxC,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGJ,QAAQ,CAAC,CAAC,CAAC;EAEvCD,SAAS,CAAC,MAAM;IACdE,YAAY,CAACI,oBAAoB,CAAC,IAAI,CAAC;IACvC,MAAMC,QAAQ,GAAGL,YAAY,CAACM,sBAAsB,CAClD,cAAc,EACbC,CAAC,IAAK;MACLJ,SAAS,CAACK,UAAU,CAACD,CAAC,CAACE,KAAK,CAACC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CACF,CAAC;IACD,OAAO,MAAM;MACXL,QAAQ,EAAEM,MAAM,CAAC,CAAC;MAElBX,YAAY,CAACI,oBAAoB,CAAC,KAAK,CAAC;IAC1C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAOF,MAAM;AACf","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["TurboModuleRegistry","NativeAudioAPIModule","get"],"sourceRoot":"../../../src","sources":["specs/NativeAudioAPIModule.ts"],"mappings":"AAAA,YAAY;;AACZ,SAASA,mBAAmB,QAAQ,cAAc;AAwBlD,MAAMC,oBAAoB,GAAGD,mBAAmB,CAACE,GAAG,CAAO,gBAAgB,CAAC;AAE5E,SAASD,oBAAoB","ignoreList":[]}
1
+ {"version":3,"names":["TurboModuleRegistry","NativeAudioAPIModule","get"],"sourceRoot":"../../../src","sources":["specs/NativeAudioAPIModule.ts"],"mappings":"AAAA,YAAY;;AACZ,SAASA,mBAAmB,QAAQ,cAAc;AAgClD,MAAMC,oBAAoB,GAAGD,mBAAmB,CAACE,GAAG,CAAO,gBAAgB,CAAC;AAE5E,SAASD,oBAAoB","ignoreList":[]}
@@ -12,17 +12,20 @@ class AudioManager {
12
12
  constructor() {
13
13
  this.audioEventEmitter = new AudioEventEmitter(global.AudioEventEmitter);
14
14
  }
15
- setLockScreenInfo(info) {
16
- NativeAudioAPIModule.setLockScreenInfo(info);
15
+ getDevicePreferredSampleRate() {
16
+ return NativeAudioAPIModule.getDevicePreferredSampleRate();
17
17
  }
18
- resetLockScreenInfo() {
19
- NativeAudioAPIModule.resetLockScreenInfo();
18
+ setAudioSessionActivity(enabled) {
19
+ return NativeAudioAPIModule.setAudioSessionActivity(enabled);
20
20
  }
21
21
  setAudioSessionOptions(options) {
22
22
  NativeAudioAPIModule.setAudioSessionOptions(options.iosCategory ?? '', options.iosMode ?? '', options.iosOptions ?? []);
23
23
  }
24
- getDevicePreferredSampleRate() {
25
- return NativeAudioAPIModule.getDevicePreferredSampleRate();
24
+ setLockScreenInfo(info) {
25
+ NativeAudioAPIModule.setLockScreenInfo(info);
26
+ }
27
+ resetLockScreenInfo() {
28
+ NativeAudioAPIModule.resetLockScreenInfo();
26
29
  }
27
30
  observeAudioInterruptions(enabled) {
28
31
  NativeAudioAPIModule.observeAudioInterruptions(enabled);
@@ -30,11 +33,10 @@ class AudioManager {
30
33
  observeVolumeChanges(enabled) {
31
34
  NativeAudioAPIModule.observeVolumeChanges(enabled);
32
35
  }
33
- enableSystemEvent(name, callback, enabled = true) {
36
+ enableRemoteCommand(name, enabled) {
34
37
  NativeAudioAPIModule.enableRemoteCommand(name, enabled);
35
- if (!enabled || !callback) {
36
- return null;
37
- }
38
+ }
39
+ addSystemEventListener(name, callback) {
38
40
  return this.audioEventEmitter.addAudioEventListener(name, callback);
39
41
  }
40
42
  async requestRecordingPermissions() {
@@ -1 +1 @@
1
- {"version":3,"names":["NativeAudioAPIModule","AudioEventEmitter","global","Error","install","AudioManager","constructor","audioEventEmitter","setLockScreenInfo","info","resetLockScreenInfo","setAudioSessionOptions","options","iosCategory","iosMode","iosOptions","getDevicePreferredSampleRate","observeAudioInterruptions","enabled","observeVolumeChanges","enableSystemEvent","name","callback","enableRemoteCommand","addAudioEventListener","requestRecordingPermissions","checkRecordingPermissions"],"sourceRoot":"../../../src","sources":["system/AudioManager.ts"],"mappings":";;AAEA,SAASA,oBAAoB,QAAQ,mBAAU;AAC/C,SAASC,iBAAiB,QAAgC,oBAAW;AAErE,IAAIC,MAAM,CAACD,iBAAiB,IAAI,IAAI,EAAE;EACpC,IAAI,CAACD,oBAAoB,EAAE;IACzB,MAAM,IAAIG,KAAK,CACb,iFACF,CAAC;EACH;EAEAH,oBAAoB,CAACI,OAAO,CAAC,CAAC;AAChC;AAEA,MAAMC,YAAY,CAAC;EAEjBC,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACC,iBAAiB,GAAG,IAAIN,iBAAiB,CAACC,MAAM,CAACD,iBAAiB,CAAC;EAC1E;EAEAO,iBAAiBA,CAACC,IAAoB,EAAE;IACtCT,oBAAoB,CAAEQ,iBAAiB,CAACC,IAAI,CAAC;EAC/C;EAEAC,mBAAmBA,CAAA,EAAG;IACpBV,oBAAoB,CAAEU,mBAAmB,CAAC,CAAC;EAC7C;EAEAC,sBAAsBA,CAACC,OAAuB,EAAE;IAC9CZ,oBAAoB,CAAEW,sBAAsB,CAC1CC,OAAO,CAACC,WAAW,IAAI,EAAE,EACzBD,OAAO,CAACE,OAAO,IAAI,EAAE,EACrBF,OAAO,CAACG,UAAU,IAAI,EACxB,CAAC;EACH;EAEAC,4BAA4BA,CAAA,EAAW;IACrC,OAAOhB,oBAAoB,CAAEgB,4BAA4B,CAAC,CAAC;EAC7D;EAEAC,yBAAyBA,CAACC,OAAgB,EAAE;IAC1ClB,oBAAoB,CAAEiB,yBAAyB,CAACC,OAAO,CAAC;EAC1D;EAEAC,oBAAoBA,CAACD,OAAgB,EAAE;IACrClB,oBAAoB,CAAEmB,oBAAoB,CAACD,OAAO,CAAC;EACrD;EAEAE,iBAAiBA,CACfC,IAAU,EACVC,QAAoC,EACpCJ,OAAO,GAAG,IAAI,EACiB;IAC/BlB,oBAAoB,CAAEuB,mBAAmB,CAACF,IAAI,EAAEH,OAAO,CAAC;IAExD,IAAI,CAACA,OAAO,IAAI,CAACI,QAAQ,EAAE;MACzB,OAAO,IAAI;IACb;IAEA,OAAO,IAAI,CAACf,iBAAiB,CAACiB,qBAAqB,CAACH,IAAI,EAAEC,QAAQ,CAAC;EACrE;EAEA,MAAMG,2BAA2BA,CAAA,EAA8B;IAC7D,OAAOzB,oBAAoB,CAAEyB,2BAA2B,CAAC,CAAC;EAC5D;EAEA,MAAMC,yBAAyBA,CAAA,EAA8B;IAC3D,OAAO1B,oBAAoB,CAAE0B,yBAAyB,CAAC,CAAC;EAC1D;AACF;AAEA,eAAe,IAAIrB,YAAY,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["NativeAudioAPIModule","AudioEventEmitter","global","Error","install","AudioManager","constructor","audioEventEmitter","getDevicePreferredSampleRate","setAudioSessionActivity","enabled","setAudioSessionOptions","options","iosCategory","iosMode","iosOptions","setLockScreenInfo","info","resetLockScreenInfo","observeAudioInterruptions","observeVolumeChanges","enableRemoteCommand","name","addSystemEventListener","callback","addAudioEventListener","requestRecordingPermissions","checkRecordingPermissions"],"sourceRoot":"../../../src","sources":["system/AudioManager.ts"],"mappings":";;AAMA,SAASA,oBAAoB,QAAQ,mBAAU;AAC/C,SAASC,iBAAiB,QAAgC,oBAAW;AAErE,IAAIC,MAAM,CAACD,iBAAiB,IAAI,IAAI,EAAE;EACpC,IAAI,CAACD,oBAAoB,EAAE;IACzB,MAAM,IAAIG,KAAK,CACb,iFACF,CAAC;EACH;EAEAH,oBAAoB,CAACI,OAAO,CAAC,CAAC;AAChC;AAEA,MAAMC,YAAY,CAAC;EAEjBC,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACC,iBAAiB,GAAG,IAAIN,iBAAiB,CAACC,MAAM,CAACD,iBAAiB,CAAC;EAC1E;EAEAO,4BAA4BA,CAAA,EAAW;IACrC,OAAOR,oBAAoB,CAAEQ,4BAA4B,CAAC,CAAC;EAC7D;EAEAC,uBAAuBA,CAACC,OAAgB,EAAoB;IAC1D,OAAOV,oBAAoB,CAAES,uBAAuB,CAACC,OAAO,CAAC;EAC/D;EAEAC,sBAAsBA,CAACC,OAAuB,EAAE;IAC9CZ,oBAAoB,CAAEW,sBAAsB,CAC1CC,OAAO,CAACC,WAAW,IAAI,EAAE,EACzBD,OAAO,CAACE,OAAO,IAAI,EAAE,EACrBF,OAAO,CAACG,UAAU,IAAI,EACxB,CAAC;EACH;EAEAC,iBAAiBA,CAACC,IAAoB,EAAE;IACtCjB,oBAAoB,CAAEgB,iBAAiB,CAACC,IAAI,CAAC;EAC/C;EAEAC,mBAAmBA,CAAA,EAAG;IACpBlB,oBAAoB,CAAEkB,mBAAmB,CAAC,CAAC;EAC7C;EAEAC,yBAAyBA,CAACT,OAAgB,EAAE;IAC1CV,oBAAoB,CAAEmB,yBAAyB,CAACT,OAAO,CAAC;EAC1D;EAEAU,oBAAoBA,CAACV,OAAgB,EAAE;IACrCV,oBAAoB,CAAEoB,oBAAoB,CAACV,OAAO,CAAC;EACrD;EAEAW,mBAAmBA,CAACC,IAA4B,EAAEZ,OAAgB,EAAE;IAClEV,oBAAoB,CAAEqB,mBAAmB,CAACC,IAAI,EAAEZ,OAAO,CAAC;EAC1D;EAEAa,sBAAsBA,CACpBD,IAAU,EACVE,QAAmC,EACX;IACxB,OAAO,IAAI,CAACjB,iBAAiB,CAACkB,qBAAqB,CAACH,IAAI,EAAEE,QAAQ,CAAC;EACrE;EAEA,MAAME,2BAA2BA,CAAA,EAA8B;IAC7D,OAAO1B,oBAAoB,CAAE0B,2BAA2B,CAAC,CAAC;EAC5D;EAEA,MAAMC,yBAAyBA,CAAA,EAA8B;IAC3D,OAAO3B,oBAAoB,CAAE2B,yBAAyB,CAAC,CAAC;EAC1D;AACF;AAEA,eAAe,IAAItB,YAAY,CAAC,CAAC","ignoreList":[]}
@@ -20,7 +20,7 @@ interface OnInterruptionEventType {
20
20
  interface OnRouteChangeEventType {
21
21
  reason: string;
22
22
  }
23
- interface SystemEvents {
23
+ interface RemoteCommandEvents {
24
24
  remotePlay: EventEmptyType;
25
25
  remotePause: EventEmptyType;
26
26
  remoteStop: EventEmptyType;
@@ -28,15 +28,17 @@ interface SystemEvents {
28
28
  remoteChangePlaybackRate: EventTypeWithValue;
29
29
  remoteNextTrack: EventEmptyType;
30
30
  remotePreviousTrack: EventEmptyType;
31
- remoteSkipForward: EventEmptyType;
32
- remoteSkipBackward: EventEmptyType;
33
- remoteSeekForward: EventTypeWithValue;
34
- remoteSeekBackward: EventTypeWithValue;
31
+ remoteSkipForward: EventTypeWithValue;
32
+ remoteSkipBackward: EventTypeWithValue;
33
+ remoteSeekForward: EventEmptyType;
34
+ remoteSeekBackward: EventEmptyType;
35
35
  remoteChangePlaybackPosition: EventTypeWithValue;
36
+ }
37
+ type SystemEvents = RemoteCommandEvents & {
36
38
  volumeChange: EventTypeWithValue;
37
39
  interruption: OnInterruptionEventType;
38
40
  routeChange: OnRouteChangeEventType;
39
- }
41
+ };
40
42
  export interface OnAudioReadyEventType {
41
43
  buffer: AudioBuffer;
42
44
  numFrames: number;
@@ -50,6 +52,7 @@ interface AudioAPIEvents {
50
52
  systemStateChanged: EventEmptyType;
51
53
  }
52
54
  type AudioEvents = SystemEvents & AudioAPIEvents;
55
+ export type RemoteCommandEventName = keyof RemoteCommandEvents;
53
56
  export type SystemEventName = keyof SystemEvents;
54
57
  export type SystemEventCallback<Name extends SystemEventName> = (event: SystemEvents[Name]) => void;
55
58
  export type AudioAPIEventName = keyof AudioAPIEvents;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/events/types.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAE9C,UAAU,cAAc;CAAG;AAE3B,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;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,YAAY;IACpB,UAAU,EAAE,cAAc,CAAC;IAC3B,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,cAAc,CAAC;IAC3B,qBAAqB,EAAE,cAAc,CAAC;IACtC,wBAAwB,EAAE,kBAAkB,CAAC;IAC7C,eAAe,EAAE,cAAc,CAAC;IAChC,mBAAmB,EAAE,cAAc,CAAC;IACpC,iBAAiB,EAAE,cAAc,CAAC;IAClC,kBAAkB,EAAE,cAAc,CAAC;IACnC,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,4BAA4B,EAAE,kBAAkB,CAAC;IACjD,YAAY,EAAE,kBAAkB,CAAC;IACjC,YAAY,EAAE,uBAAuB,CAAC;IACtC,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,qBAAqB,CAAC;IAClC,eAAe,EAAE,0BAA0B,CAAC;IAC5C,UAAU,EAAE,cAAc,CAAC;IAC3B,kBAAkB,EAAE,cAAc,CAAC;CACpC;AAED,KAAK,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAEjD,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;AAEV,MAAM,MAAM,iBAAiB,GAAG,MAAM,cAAc,CAAC;AACrD,MAAM,MAAM,qBAAqB,CAAC,IAAI,SAAS,iBAAiB,IAAI,CAClE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,KACxB,IAAI,CAAC;AAEV,MAAM,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC;AAC/C,MAAM,MAAM,kBAAkB,CAAC,IAAI,SAAS,cAAc,IAAI,CAC5D,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KACrB,IAAI,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/events/types.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAE9C,UAAU,cAAc;CAAG;AAE3B,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;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,mBAAmB;IAC3B,UAAU,EAAE,cAAc,CAAC;IAC3B,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,cAAc,CAAC;IAC3B,qBAAqB,EAAE,cAAc,CAAC;IACtC,wBAAwB,EAAE,kBAAkB,CAAC;IAC7C,eAAe,EAAE,cAAc,CAAC;IAChC,mBAAmB,EAAE,cAAc,CAAC;IACpC,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,EAAE,cAAc,CAAC;IAClC,kBAAkB,EAAE,cAAc,CAAC;IACnC,4BAA4B,EAAE,kBAAkB,CAAC;CAClD;AAED,KAAK,YAAY,GAAG,mBAAmB,GAAG;IACxC,YAAY,EAAE,kBAAkB,CAAC;IACjC,YAAY,EAAE,uBAAuB,CAAC;IACtC,WAAW,EAAE,sBAAsB,CAAC;CACrC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,qBAAqB,CAAC;IAClC,eAAe,EAAE,0BAA0B,CAAC;IAC5C,UAAU,EAAE,cAAc,CAAC;IAC3B,kBAAkB,EAAE,cAAc,CAAC;CACpC;AAED,KAAK,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAEjD,MAAM,MAAM,sBAAsB,GAAG,MAAM,mBAAmB,CAAC;AAE/D,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;AAEV,MAAM,MAAM,iBAAiB,GAAG,MAAM,cAAc,CAAC;AACrD,MAAM,MAAM,qBAAqB,CAAC,IAAI,SAAS,iBAAiB,IAAI,CAClE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,KACxB,IAAI,CAAC;AAEV,MAAM,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC;AAC/C,MAAM,MAAM,kBAAkB,CAAC,IAAI,SAAS,cAAc,IAAI,CAC5D,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KACrB,IAAI,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSytemVolume.d.ts","sourceRoot":"","sources":["../../../src/hooks/useSytemVolume.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,UAAU,eAAe,WAgBtC"}
1
+ {"version":3,"file":"useSytemVolume.d.ts","sourceRoot":"","sources":["../../../src/hooks/useSytemVolume.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,UAAU,eAAe,WAmBtC"}
@@ -2,13 +2,14 @@ import type { TurboModule } from 'react-native';
2
2
  import { PermissionStatus } from '../system/types';
3
3
  interface Spec extends TurboModule {
4
4
  install(): boolean;
5
+ getDevicePreferredSampleRate(): number;
6
+ setAudioSessionActivity(enabled: boolean): Promise<boolean>;
7
+ setAudioSessionOptions(category: string, mode: string, options: Array<string>): void;
5
8
  setLockScreenInfo(info: {
6
9
  [key: string]: string | boolean | number | undefined;
7
10
  }): void;
8
11
  resetLockScreenInfo(): void;
9
12
  enableRemoteCommand(name: string, enabled: boolean): void;
10
- setAudioSessionOptions(category: string, mode: string, options: Array<string>): void;
11
- getDevicePreferredSampleRate(): number;
12
13
  observeAudioInterruptions(enabled: boolean): void;
13
14
  observeVolumeChanges(enabled: boolean): void;
14
15
  requestRecordingPermissions(): Promise<PermissionStatus>;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeAudioAPIModule.d.ts","sourceRoot":"","sources":["../../../src/specs/NativeAudioAPIModule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,UAAU,IAAK,SAAQ,WAAW;IAChC,OAAO,IAAI,OAAO,CAAC;IAEnB,iBAAiB,CAAC,IAAI,EAAE;QACtB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;KACtD,GAAG,IAAI,CAAC;IACT,mBAAmB,IAAI,IAAI,CAAC;IAC5B,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1D,sBAAsB,CACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,GACrB,IAAI,CAAC;IACR,4BAA4B,IAAI,MAAM,CAAC;IACvC,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAClD,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,2BAA2B,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzD,yBAAyB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACxD;AAED,QAAA,MAAM,oBAAoB,aAAkD,CAAC;AAE7E,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"NativeAudioAPIModule.d.ts","sourceRoot":"","sources":["../../../src/specs/NativeAudioAPIModule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,UAAU,IAAK,SAAQ,WAAW;IAChC,OAAO,IAAI,OAAO,CAAC;IACnB,4BAA4B,IAAI,MAAM,CAAC;IAGvC,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,sBAAsB,CACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,GACrB,IAAI,CAAC;IAGR,iBAAiB,CAAC,IAAI,EAAE;QACtB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;KACtD,GAAG,IAAI,CAAC;IACT,mBAAmB,IAAI,IAAI,CAAC;IAG5B,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1D,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAClD,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAG7C,2BAA2B,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzD,yBAAyB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACxD;AAED,QAAA,MAAM,oBAAoB,aAAkD,CAAC;AAE7E,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -1,16 +1,18 @@
1
1
  import { SessionOptions, LockScreenInfo, PermissionStatus } from './types';
2
- import { SystemEventName, SystemEventCallback } from '../events/types';
2
+ import { SystemEventName, SystemEventCallback, RemoteCommandEventName } from '../events/types';
3
3
  import { AudioEventSubscription } from '../events';
4
4
  declare class AudioManager {
5
5
  private readonly audioEventEmitter;
6
6
  constructor();
7
+ getDevicePreferredSampleRate(): number;
8
+ setAudioSessionActivity(enabled: boolean): Promise<boolean>;
9
+ setAudioSessionOptions(options: SessionOptions): void;
7
10
  setLockScreenInfo(info: LockScreenInfo): void;
8
11
  resetLockScreenInfo(): void;
9
- setAudioSessionOptions(options: SessionOptions): void;
10
- getDevicePreferredSampleRate(): number;
11
12
  observeAudioInterruptions(enabled: boolean): void;
12
13
  observeVolumeChanges(enabled: boolean): void;
13
- enableSystemEvent<Name extends SystemEventName>(name: Name, callback?: SystemEventCallback<Name>, enabled?: boolean): AudioEventSubscription | null;
14
+ enableRemoteCommand(name: RemoteCommandEventName, enabled: boolean): void;
15
+ addSystemEventListener<Name extends SystemEventName>(name: Name, callback: SystemEventCallback<Name>): AudioEventSubscription;
14
16
  requestRecordingPermissions(): Promise<PermissionStatus>;
15
17
  checkRecordingPermissions(): Promise<PermissionStatus>;
16
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AudioManager.d.ts","sourceRoot":"","sources":["../../../src/system/AudioManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAqB,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAYtE,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;;IAKtD,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,iBAAiB,CAAC,IAAI,SAAS,eAAe,EAC5C,IAAI,EAAE,IAAI,EACV,QAAQ,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,EACpC,OAAO,UAAO,GACb,sBAAsB,GAAG,IAAI;IAU1B,2BAA2B,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAIxD,yBAAyB,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAG7D;;AAED,wBAAkC"}
1
+ {"version":3,"file":"AudioManager.d.ts","sourceRoot":"","sources":["../../../src/system/AudioManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAqB,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAYtE,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;;IAKtD,4BAA4B,IAAI,MAAM;IAItC,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3D,sBAAsB,CAAC,OAAO,EAAE,cAAc;IAQ9C,iBAAiB,CAAC,IAAI,EAAE,cAAc;IAItC,mBAAmB;IAInB,yBAAyB,CAAC,OAAO,EAAE,OAAO;IAI1C,oBAAoB,CAAC,OAAO,EAAE,OAAO;IAIrC,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO;IAIlE,sBAAsB,CAAC,IAAI,SAAS,eAAe,EACjD,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,mBAAmB,CAAC,IAAI,CAAC,GAClC,sBAAsB;IAInB,2BAA2B,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAIxD,yBAAyB,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAG7D;;AAED,wBAAkC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-audio-api",
3
- "version": "0.6.1-rc.4",
3
+ "version": "0.6.1-rc.5",
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"
@@ -26,7 +26,7 @@ interface OnRouteChangeEventType {
26
26
  reason: string;
27
27
  }
28
28
 
29
- interface SystemEvents {
29
+ interface RemoteCommandEvents {
30
30
  remotePlay: EventEmptyType;
31
31
  remotePause: EventEmptyType;
32
32
  remoteStop: EventEmptyType;
@@ -34,15 +34,18 @@ interface SystemEvents {
34
34
  remoteChangePlaybackRate: EventTypeWithValue;
35
35
  remoteNextTrack: EventEmptyType;
36
36
  remotePreviousTrack: EventEmptyType;
37
- remoteSkipForward: EventEmptyType;
38
- remoteSkipBackward: EventEmptyType;
39
- remoteSeekForward: EventTypeWithValue;
40
- remoteSeekBackward: EventTypeWithValue;
37
+ remoteSkipForward: EventTypeWithValue;
38
+ remoteSkipBackward: EventTypeWithValue;
39
+ remoteSeekForward: EventEmptyType;
40
+ remoteSeekBackward: EventEmptyType;
41
41
  remoteChangePlaybackPosition: EventTypeWithValue;
42
+ }
43
+
44
+ type SystemEvents = RemoteCommandEvents & {
42
45
  volumeChange: EventTypeWithValue;
43
46
  interruption: OnInterruptionEventType;
44
47
  routeChange: OnRouteChangeEventType;
45
- }
48
+ };
46
49
 
47
50
  export interface OnAudioReadyEventType {
48
51
  buffer: AudioBuffer;
@@ -60,6 +63,8 @@ interface AudioAPIEvents {
60
63
 
61
64
  type AudioEvents = SystemEvents & AudioAPIEvents;
62
65
 
66
+ export type RemoteCommandEventName = keyof RemoteCommandEvents;
67
+
63
68
  export type SystemEventName = keyof SystemEvents;
64
69
  export type SystemEventCallback<Name extends SystemEventName> = (
65
70
  event: SystemEvents[Name]
@@ -6,9 +6,12 @@ export default function useSystemVolume() {
6
6
 
7
7
  useEffect(() => {
8
8
  AudioManager.observeVolumeChanges(true);
9
- const listener = AudioManager.enableSystemEvent('volumeChange', (e) => {
10
- setVolume(parseFloat(e.value.toFixed(2)));
11
- });
9
+ const listener = AudioManager.addSystemEventListener(
10
+ 'volumeChange',
11
+ (e) => {
12
+ setVolume(parseFloat(e.value.toFixed(2)));
13
+ }
14
+ );
12
15
  return () => {
13
16
  listener?.remove();
14
17
 
@@ -5,20 +5,28 @@ import { PermissionStatus } from '../system/types';
5
5
 
6
6
  interface Spec extends TurboModule {
7
7
  install(): boolean;
8
+ getDevicePreferredSampleRate(): number;
8
9
 
9
- setLockScreenInfo(info: {
10
- [key: string]: string | boolean | number | undefined;
11
- }): void;
12
- resetLockScreenInfo(): void;
13
- enableRemoteCommand(name: string, enabled: boolean): void;
10
+ // AVAudioSession management
11
+ setAudioSessionActivity(enabled: boolean): Promise<boolean>;
14
12
  setAudioSessionOptions(
15
13
  category: string,
16
14
  mode: string,
17
15
  options: Array<string>
18
16
  ): void;
19
- getDevicePreferredSampleRate(): number;
17
+
18
+ // Lock Screen Info
19
+ setLockScreenInfo(info: {
20
+ [key: string]: string | boolean | number | undefined;
21
+ }): void;
22
+ resetLockScreenInfo(): void;
23
+
24
+ // Remote commands, system events and interruptions
25
+ enableRemoteCommand(name: string, enabled: boolean): void;
20
26
  observeAudioInterruptions(enabled: boolean): void;
21
27
  observeVolumeChanges(enabled: boolean): void;
28
+
29
+ // Permissions
22
30
  requestRecordingPermissions(): Promise<PermissionStatus>;
23
31
  checkRecordingPermissions(): Promise<PermissionStatus>;
24
32
  }
@@ -1,5 +1,9 @@
1
1
  import { SessionOptions, LockScreenInfo, PermissionStatus } from './types';
2
- import { SystemEventName, SystemEventCallback } from '../events/types';
2
+ import {
3
+ SystemEventName,
4
+ SystemEventCallback,
5
+ RemoteCommandEventName,
6
+ } from '../events/types';
3
7
  import { NativeAudioAPIModule } from '../specs';
4
8
  import { AudioEventEmitter, AudioEventSubscription } from '../events';
5
9
 
@@ -19,12 +23,12 @@ class AudioManager {
19
23
  this.audioEventEmitter = new AudioEventEmitter(global.AudioEventEmitter);
20
24
  }
21
25
 
22
- setLockScreenInfo(info: LockScreenInfo) {
23
- NativeAudioAPIModule!.setLockScreenInfo(info);
26
+ getDevicePreferredSampleRate(): number {
27
+ return NativeAudioAPIModule!.getDevicePreferredSampleRate();
24
28
  }
25
29
 
26
- resetLockScreenInfo() {
27
- NativeAudioAPIModule!.resetLockScreenInfo();
30
+ setAudioSessionActivity(enabled: boolean): Promise<boolean> {
31
+ return NativeAudioAPIModule!.setAudioSessionActivity(enabled);
28
32
  }
29
33
 
30
34
  setAudioSessionOptions(options: SessionOptions) {
@@ -35,8 +39,12 @@ class AudioManager {
35
39
  );
36
40
  }
37
41
 
38
- getDevicePreferredSampleRate(): number {
39
- return NativeAudioAPIModule!.getDevicePreferredSampleRate();
42
+ setLockScreenInfo(info: LockScreenInfo) {
43
+ NativeAudioAPIModule!.setLockScreenInfo(info);
44
+ }
45
+
46
+ resetLockScreenInfo() {
47
+ NativeAudioAPIModule!.resetLockScreenInfo();
40
48
  }
41
49
 
42
50
  observeAudioInterruptions(enabled: boolean) {
@@ -47,17 +55,14 @@ class AudioManager {
47
55
  NativeAudioAPIModule!.observeVolumeChanges(enabled);
48
56
  }
49
57
 
50
- enableSystemEvent<Name extends SystemEventName>(
51
- name: Name,
52
- callback?: SystemEventCallback<Name>,
53
- enabled = true
54
- ): AudioEventSubscription | null {
58
+ enableRemoteCommand(name: RemoteCommandEventName, enabled: boolean) {
55
59
  NativeAudioAPIModule!.enableRemoteCommand(name, enabled);
60
+ }
56
61
 
57
- if (!enabled || !callback) {
58
- return null;
59
- }
60
-
62
+ addSystemEventListener<Name extends SystemEventName>(
63
+ name: Name,
64
+ callback: SystemEventCallback<Name>
65
+ ): AudioEventSubscription {
61
66
  return this.audioEventEmitter.addAudioEventListener(name, callback);
62
67
  }
63
68