react-native-audio-api 1.0.0-nightly-3745d67-20261103 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,6 +17,7 @@ import com.facebook.react.turbomodule.core.CallInvokerHolderImpl
17
17
  import com.swmansion.audioapi.system.ForegroundServiceManager
18
18
  import com.swmansion.audioapi.system.MediaSessionManager
19
19
  import com.swmansion.audioapi.system.NativeFileInfo
20
+ import com.swmansion.audioapi.system.NativeRecorderControl
20
21
  import com.swmansion.audioapi.system.PermissionRequestListener
21
22
  import java.lang.ref.WeakReference
22
23
  import kotlin.concurrent.thread
@@ -92,6 +93,8 @@ class AudioAPIModule(
92
93
  }
93
94
 
94
95
  override fun invalidate() {
96
+ // Before the cleanups below pull the foreground service and input routing from under it.
97
+ NativeRecorderControl.stop()
95
98
  reactContext.get()?.removeLifecycleEventListener(this)
96
99
  ForegroundServiceManager.cleanup()
97
100
  MediaSessionManager.cleanup()
@@ -1,6 +1,7 @@
1
1
  #import <audioapi/ios/system/AudioEngine.h>
2
2
  #import <audioapi/ios/system/AudioSessionManager.h>
3
3
 
4
+ #include <audioapi/core/inputs/ActiveRecorderHandle.h>
4
5
  #include <mutex>
5
6
 
6
7
  @interface AudioEngineSourceRegistration : NSObject
@@ -149,6 +150,9 @@ static AudioEngine *_sharedInstance = nil;
149
150
 
150
151
  - (void)cleanup
151
152
  {
153
+ // outside of lock because it locks on its own
154
+ (void)audioapi::ActiveRecorderHandle::global().stopAndReturnInfo();
155
+
152
156
  std::scoped_lock lock(_engineLock);
153
157
  [self destroyAudioEngine];
154
158
  self.state = AudioEngineState::AudioEngineStateIdle;
@@ -70,7 +70,7 @@ static AudioSessionManager *_sharedInstance = nil;
70
70
 
71
71
  - (void)setPreferredIOBufferFrames:(int)frames
72
72
  {
73
- if (!self.shouldManageSession) {
73
+ if (!self.shouldManageSession || self.audioSession == nil) {
74
74
  return;
75
75
  }
76
76
 
@@ -7,6 +7,8 @@ exports.default = useAudioInput;
7
7
  var _react = require("react");
8
8
  var _api = require("../api");
9
9
  const meaningfulReasons = ['NewDeviceAvailable', 'OldDeviceUnavailable',
10
+ // iOS reports a disconnected Bluetooth headset that was the current input this way not old device unavailable
11
+ 'Override',
10
12
  // e.g. system picks a different device as current one is not suitable for the new configuration
11
13
  'CategoryChange', 'ConfigurationChange'];
12
14
 
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_api","meaningfulReasons","useAudioInput","availableInputs","setAvailableInputs","useState","currentInput","setCurrentInput","selectInput","useCallback","device","selection","id","AudioManager","setInputDevice","devicesInfo","getDevicesInfo","useEffect","fetchAvailableInputs","audioDevices","currentDeviceId","currentInputs","length","handleRouteChange","event","includes","reason","sub","addSystemEventListener","remove","useMemo","find","d"],"sourceRoot":"../../../src","sources":["hooks/useAudioInput.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,IAAA,GAAAD,OAAA;AAQA,MAAME,iBAAsC,GAAG,CAC7C,oBAAoB,EACpB,sBAAsB;AACtB;AACA,gBAAgB,EAChB,qBAAqB,CACtB;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASC,aAAaA,CAAA,EAAG;EACtC,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAC,eAAQ,EAAkB,EAAE,CAAC;EAC3E,MAAM,CAACC,YAAY,EAAEC,eAAe,CAAC,GAAG,IAAAF,eAAQ,EAAgB,IAAI,CAAC;EAErE,MAAMG,WAAW,GAAG,IAAAC,kBAAW,EAC7B,MAAOC,MAAmC,IAAK;IAC7C,MAAMC,SAAS,GAAGD,MAAM,KAAK,SAAS,GAAG,SAAS,GAAGA,MAAM,CAACE,EAAE;IAE9D,MAAMC,iBAAY,CAACC,cAAc,CAACH,SAAS,CAAC;IAC5CJ,eAAe,CAACI,SAAS,KAAK,SAAS,GAAG,IAAI,GAAGA,SAAS,CAAC;IAE3D,MAAMI,WAA6B,GAAG,MAAMF,iBAAY,CAACG,cAAc,CAAC,CAAC;IACzEZ,kBAAkB,CAACW,WAAW,CAACZ,eAAe,CAAC;EACjD,CAAC,EACD,EACF,CAAC;EAED,IAAAc,gBAAS,EAAC,MAAM;IACd,eAAeC,oBAAoBA,CAAA,EAAG;MACpC,MAAMC,YAAY,GAAG,MAAMN,iBAAY,CAACG,cAAc,CAAC,CAAC;MACxD,MAAMI,eAAe,GAAGD,YAAY,CAACE,aAAa,CAACC,MAAM,GACrDH,YAAY,CAACE,aAAa,CAAC,CAAC,CAAC,CAACT,EAAE,GAChC,IAAI;MAERR,kBAAkB,CAACe,YAAY,CAAChB,eAAe,CAAC;MAChDI,eAAe,CAACa,eAAe,CAAC;IAClC;IAEA,eAAeG,iBAAiBA,CAACC,KAA6B,EAAE;MAC9D,IAAI,CAACvB,iBAAiB,CAACwB,QAAQ,CAACD,KAAK,CAACE,MAAM,CAAC,EAAE;QAC7C;MACF;MAEA,MAAMR,oBAAoB,CAAC,CAAC;IAC9B;IAEA,MAAMS,GAAG,GAAGd,iBAAY,CAACe,sBAAsB,CAC7C,aAAa,EACbL,iBACF,CAAC;IAEDL,oBAAoB,CAAC,CAAC;IACtB,OAAO,MAAM;MACXS,GAAG,EAAEE,MAAM,CAAC,CAAC;IACf,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO,IAAAC,cAAO,EACZ,OAAO;IACL;AACN;AACA;AACA;IACM3B,eAAe;IACf;AACN;AACA;AACA;IACMG,YAAY,EAAEH,eAAe,CAAC4B,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACpB,EAAE,KAAKN,YAAY,CAAC,IAAI,IAAI;IACxE;AACN;AACA;AACA;AACA;IACME;EACF,CAAC,CAAC,EACF,CAACL,eAAe,EAAEG,YAAY,EAAEE,WAAW,CAC7C,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_api","meaningfulReasons","useAudioInput","availableInputs","setAvailableInputs","useState","currentInput","setCurrentInput","selectInput","useCallback","device","selection","id","AudioManager","setInputDevice","devicesInfo","getDevicesInfo","useEffect","fetchAvailableInputs","audioDevices","currentDeviceId","currentInputs","length","handleRouteChange","event","includes","reason","sub","addSystemEventListener","remove","useMemo","find","d"],"sourceRoot":"../../../src","sources":["hooks/useAudioInput.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,IAAA,GAAAD,OAAA;AAQA,MAAME,iBAAsC,GAAG,CAC7C,oBAAoB,EACpB,sBAAsB;AACtB;AACA,UAAU;AACV;AACA,gBAAgB,EAChB,qBAAqB,CACtB;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASC,aAAaA,CAAA,EAAG;EACtC,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAC,eAAQ,EAAkB,EAAE,CAAC;EAC3E,MAAM,CAACC,YAAY,EAAEC,eAAe,CAAC,GAAG,IAAAF,eAAQ,EAAgB,IAAI,CAAC;EAErE,MAAMG,WAAW,GAAG,IAAAC,kBAAW,EAC7B,MAAOC,MAAmC,IAAK;IAC7C,MAAMC,SAAS,GAAGD,MAAM,KAAK,SAAS,GAAG,SAAS,GAAGA,MAAM,CAACE,EAAE;IAE9D,MAAMC,iBAAY,CAACC,cAAc,CAACH,SAAS,CAAC;IAC5CJ,eAAe,CAACI,SAAS,KAAK,SAAS,GAAG,IAAI,GAAGA,SAAS,CAAC;IAE3D,MAAMI,WAA6B,GAAG,MAAMF,iBAAY,CAACG,cAAc,CAAC,CAAC;IACzEZ,kBAAkB,CAACW,WAAW,CAACZ,eAAe,CAAC;EACjD,CAAC,EACD,EACF,CAAC;EAED,IAAAc,gBAAS,EAAC,MAAM;IACd,eAAeC,oBAAoBA,CAAA,EAAG;MACpC,MAAMC,YAAY,GAAG,MAAMN,iBAAY,CAACG,cAAc,CAAC,CAAC;MACxD,MAAMI,eAAe,GAAGD,YAAY,CAACE,aAAa,CAACC,MAAM,GACrDH,YAAY,CAACE,aAAa,CAAC,CAAC,CAAC,CAACT,EAAE,GAChC,IAAI;MAERR,kBAAkB,CAACe,YAAY,CAAChB,eAAe,CAAC;MAChDI,eAAe,CAACa,eAAe,CAAC;IAClC;IAEA,eAAeG,iBAAiBA,CAACC,KAA6B,EAAE;MAC9D,IAAI,CAACvB,iBAAiB,CAACwB,QAAQ,CAACD,KAAK,CAACE,MAAM,CAAC,EAAE;QAC7C;MACF;MAEA,MAAMR,oBAAoB,CAAC,CAAC;IAC9B;IAEA,MAAMS,GAAG,GAAGd,iBAAY,CAACe,sBAAsB,CAC7C,aAAa,EACbL,iBACF,CAAC;IAEDL,oBAAoB,CAAC,CAAC;IACtB,OAAO,MAAM;MACXS,GAAG,EAAEE,MAAM,CAAC,CAAC;IACf,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO,IAAAC,cAAO,EACZ,OAAO;IACL;AACN;AACA;AACA;IACM3B,eAAe;IACf;AACN;AACA;AACA;IACMG,YAAY,EAAEH,eAAe,CAAC4B,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACpB,EAAE,KAAKN,YAAY,CAAC,IAAI,IAAI;IACxE;AACN;AACA;AACA;AACA;IACME;EACF,CAAC,CAAC,EACF,CAACL,eAAe,EAAEG,YAAY,EAAEE,WAAW,CAC7C,CAAC;AACH","ignoreList":[]}
@@ -3,6 +3,8 @@
3
3
  import { useCallback, useEffect, useMemo, useState } from 'react';
4
4
  import { AudioManager } from '../api';
5
5
  const meaningfulReasons = ['NewDeviceAvailable', 'OldDeviceUnavailable',
6
+ // iOS reports a disconnected Bluetooth headset that was the current input this way not old device unavailable
7
+ 'Override',
6
8
  // e.g. system picks a different device as current one is not suitable for the new configuration
7
9
  'CategoryChange', 'ConfigurationChange'];
8
10
 
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useMemo","useState","AudioManager","meaningfulReasons","useAudioInput","availableInputs","setAvailableInputs","currentInput","setCurrentInput","selectInput","device","selection","id","setInputDevice","devicesInfo","getDevicesInfo","fetchAvailableInputs","audioDevices","currentDeviceId","currentInputs","length","handleRouteChange","event","includes","reason","sub","addSystemEventListener","remove","find","d"],"sourceRoot":"../../../src","sources":["hooks/useAudioInput.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAEjE,SAASC,YAAY,QAAQ,QAAQ;AAQrC,MAAMC,iBAAsC,GAAG,CAC7C,oBAAoB,EACpB,sBAAsB;AACtB;AACA,gBAAgB,EAChB,qBAAqB,CACtB;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,aAAaA,CAAA,EAAG;EACtC,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAGL,QAAQ,CAAkB,EAAE,CAAC;EAC3E,MAAM,CAACM,YAAY,EAAEC,eAAe,CAAC,GAAGP,QAAQ,CAAgB,IAAI,CAAC;EAErE,MAAMQ,WAAW,GAAGX,WAAW,CAC7B,MAAOY,MAAmC,IAAK;IAC7C,MAAMC,SAAS,GAAGD,MAAM,KAAK,SAAS,GAAG,SAAS,GAAGA,MAAM,CAACE,EAAE;IAE9D,MAAMV,YAAY,CAACW,cAAc,CAACF,SAAS,CAAC;IAC5CH,eAAe,CAACG,SAAS,KAAK,SAAS,GAAG,IAAI,GAAGA,SAAS,CAAC;IAE3D,MAAMG,WAA6B,GAAG,MAAMZ,YAAY,CAACa,cAAc,CAAC,CAAC;IACzET,kBAAkB,CAACQ,WAAW,CAACT,eAAe,CAAC;EACjD,CAAC,EACD,EACF,CAAC;EAEDN,SAAS,CAAC,MAAM;IACd,eAAeiB,oBAAoBA,CAAA,EAAG;MACpC,MAAMC,YAAY,GAAG,MAAMf,YAAY,CAACa,cAAc,CAAC,CAAC;MACxD,MAAMG,eAAe,GAAGD,YAAY,CAACE,aAAa,CAACC,MAAM,GACrDH,YAAY,CAACE,aAAa,CAAC,CAAC,CAAC,CAACP,EAAE,GAChC,IAAI;MAERN,kBAAkB,CAACW,YAAY,CAACZ,eAAe,CAAC;MAChDG,eAAe,CAACU,eAAe,CAAC;IAClC;IAEA,eAAeG,iBAAiBA,CAACC,KAA6B,EAAE;MAC9D,IAAI,CAACnB,iBAAiB,CAACoB,QAAQ,CAACD,KAAK,CAACE,MAAM,CAAC,EAAE;QAC7C;MACF;MAEA,MAAMR,oBAAoB,CAAC,CAAC;IAC9B;IAEA,MAAMS,GAAG,GAAGvB,YAAY,CAACwB,sBAAsB,CAC7C,aAAa,EACbL,iBACF,CAAC;IAEDL,oBAAoB,CAAC,CAAC;IACtB,OAAO,MAAM;MACXS,GAAG,EAAEE,MAAM,CAAC,CAAC;IACf,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO3B,OAAO,CACZ,OAAO;IACL;AACN;AACA;AACA;IACMK,eAAe;IACf;AACN;AACA;AACA;IACME,YAAY,EAAEF,eAAe,CAACuB,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACjB,EAAE,KAAKL,YAAY,CAAC,IAAI,IAAI;IACxE;AACN;AACA;AACA;AACA;IACME;EACF,CAAC,CAAC,EACF,CAACJ,eAAe,EAAEE,YAAY,EAAEE,WAAW,CAC7C,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useMemo","useState","AudioManager","meaningfulReasons","useAudioInput","availableInputs","setAvailableInputs","currentInput","setCurrentInput","selectInput","device","selection","id","setInputDevice","devicesInfo","getDevicesInfo","fetchAvailableInputs","audioDevices","currentDeviceId","currentInputs","length","handleRouteChange","event","includes","reason","sub","addSystemEventListener","remove","find","d"],"sourceRoot":"../../../src","sources":["hooks/useAudioInput.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAEjE,SAASC,YAAY,QAAQ,QAAQ;AAQrC,MAAMC,iBAAsC,GAAG,CAC7C,oBAAoB,EACpB,sBAAsB;AACtB;AACA,UAAU;AACV;AACA,gBAAgB,EAChB,qBAAqB,CACtB;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,aAAaA,CAAA,EAAG;EACtC,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAGL,QAAQ,CAAkB,EAAE,CAAC;EAC3E,MAAM,CAACM,YAAY,EAAEC,eAAe,CAAC,GAAGP,QAAQ,CAAgB,IAAI,CAAC;EAErE,MAAMQ,WAAW,GAAGX,WAAW,CAC7B,MAAOY,MAAmC,IAAK;IAC7C,MAAMC,SAAS,GAAGD,MAAM,KAAK,SAAS,GAAG,SAAS,GAAGA,MAAM,CAACE,EAAE;IAE9D,MAAMV,YAAY,CAACW,cAAc,CAACF,SAAS,CAAC;IAC5CH,eAAe,CAACG,SAAS,KAAK,SAAS,GAAG,IAAI,GAAGA,SAAS,CAAC;IAE3D,MAAMG,WAA6B,GAAG,MAAMZ,YAAY,CAACa,cAAc,CAAC,CAAC;IACzET,kBAAkB,CAACQ,WAAW,CAACT,eAAe,CAAC;EACjD,CAAC,EACD,EACF,CAAC;EAEDN,SAAS,CAAC,MAAM;IACd,eAAeiB,oBAAoBA,CAAA,EAAG;MACpC,MAAMC,YAAY,GAAG,MAAMf,YAAY,CAACa,cAAc,CAAC,CAAC;MACxD,MAAMG,eAAe,GAAGD,YAAY,CAACE,aAAa,CAACC,MAAM,GACrDH,YAAY,CAACE,aAAa,CAAC,CAAC,CAAC,CAACP,EAAE,GAChC,IAAI;MAERN,kBAAkB,CAACW,YAAY,CAACZ,eAAe,CAAC;MAChDG,eAAe,CAACU,eAAe,CAAC;IAClC;IAEA,eAAeG,iBAAiBA,CAACC,KAA6B,EAAE;MAC9D,IAAI,CAACnB,iBAAiB,CAACoB,QAAQ,CAACD,KAAK,CAACE,MAAM,CAAC,EAAE;QAC7C;MACF;MAEA,MAAMR,oBAAoB,CAAC,CAAC;IAC9B;IAEA,MAAMS,GAAG,GAAGvB,YAAY,CAACwB,sBAAsB,CAC7C,aAAa,EACbL,iBACF,CAAC;IAEDL,oBAAoB,CAAC,CAAC;IACtB,OAAO,MAAM;MACXS,GAAG,EAAEE,MAAM,CAAC,CAAC;IACf,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO3B,OAAO,CACZ,OAAO;IACL;AACN;AACA;AACA;IACMK,eAAe;IACf;AACN;AACA;AACA;IACME,YAAY,EAAEF,eAAe,CAACuB,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACjB,EAAE,KAAKL,YAAY,CAAC,IAAI,IAAI;IACxE;AACN;AACA;AACA;AACA;IACME;EACF,CAAC,CAAC,EACF,CAACJ,eAAe,EAAEE,YAAY,EAAEE,WAAW,CAC7C,CAAC;AACH","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useAudioInput.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useAudioInput.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAUzB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa;IAiD/B;;;OAGG;;IAEH;;;OAGG;;IAEH;;;;OAIG;0BA1DU,eAAe,GAAG,SAAS;EA+D7C"}
1
+ {"version":3,"file":"useAudioInput.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useAudioInput.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAYzB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa;IAiD/B;;;OAGG;;IAEH;;;OAGG;;IAEH;;;;OAIG;0BA1DU,eAAe,GAAG,SAAS;EA+D7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAudioInput.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useAudioInput.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAUzB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa;IAiD/B;;;OAGG;;IAEH;;;OAGG;;IAEH;;;;OAIG;0BA1DU,eAAe,GAAG,SAAS;EA+D7C"}
1
+ {"version":3,"file":"useAudioInput.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useAudioInput.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAYzB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa;IAiD/B;;;OAGG;;IAEH;;;OAGG;;IAEH;;;;OAIG;0BA1DU,eAAe,GAAG,SAAS;EA+D7C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-audio-api",
3
- "version": "1.0.0-nightly-3745d67-20261103",
3
+ "version": "1.0.0",
4
4
  "description": "react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification",
5
5
  "bin": {
6
6
  "setup-rn-audio-api-web": "./scripts/setup-rn-audio-api-web.js"
@@ -11,6 +11,8 @@ import {
11
11
  const meaningfulReasons: RouteChangeReason[] = [
12
12
  'NewDeviceAvailable',
13
13
  'OldDeviceUnavailable',
14
+ // iOS reports a disconnected Bluetooth headset that was the current input this way not old device unavailable
15
+ 'Override',
14
16
  // e.g. system picks a different device as current one is not suitable for the new configuration
15
17
  'CategoryChange',
16
18
  'ConfigurationChange',