react-native-audio-api 0.6.0-rc.1 → 0.6.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -22
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +73 -0
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +37 -0
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +6 -10
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +2 -3
- package/android/src/main/java/com/swmansion/audioapi/AudioManagerModule.kt +10 -8
- package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +7 -7
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionEventEmitter.kt +4 -0
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +31 -13
- package/android/src/main/java/com/swmansion/audioapi/system/VolumeChangeListener.kt +27 -0
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +29 -5
- package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +1 -0
- package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +149 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +4 -3
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +6 -6
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +38 -0
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +5 -0
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +1 -1
- package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +45 -11
- package/common/cpp/audioapi/core/utils/AudioNodeManager.h +6 -2
- package/ios/audioapi/ios/AudioManagerModule.mm +9 -10
- package/ios/audioapi/ios/core/IOSAudioPlayer.h +11 -12
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +22 -16
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +36 -0
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +64 -0
- package/ios/audioapi/ios/core/{AudioPlayer.h → NativeAudioPlayer.h} +1 -8
- package/ios/audioapi/ios/core/{AudioPlayer.m → NativeAudioPlayer.m} +4 -33
- package/ios/audioapi/ios/core/NativeAudioRecorder.h +31 -0
- package/ios/audioapi/ios/core/NativeAudioRecorder.m +107 -0
- package/ios/audioapi/ios/system/AudioEngine.h +7 -1
- package/ios/audioapi/ios/system/AudioEngine.mm +64 -20
- package/ios/audioapi/ios/system/AudioSessionManager.h +3 -1
- package/ios/audioapi/ios/system/AudioSessionManager.mm +37 -25
- package/ios/audioapi/ios/system/NotificationManager.h +7 -1
- package/ios/audioapi/ios/system/NotificationManager.mm +30 -0
- package/lib/commonjs/api.js +15 -1
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/core/AudioRecorder.js +51 -0
- package/lib/commonjs/core/AudioRecorder.js.map +1 -0
- package/lib/commonjs/errors/NotSupportedError.js.map +1 -1
- package/lib/commonjs/hooks/useSytemVolume.js +24 -0
- package/lib/commonjs/hooks/useSytemVolume.js.map +1 -0
- package/lib/commonjs/plugin/withAudioAPI.js +1 -1
- package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
- package/lib/commonjs/specs/NativeAudioManagerModule.js +5 -2
- package/lib/commonjs/specs/NativeAudioManagerModule.js.map +1 -1
- package/lib/commonjs/system/AudioManager.js +23 -50
- package/lib/commonjs/system/AudioManager.js.map +1 -1
- package/lib/module/api.js +3 -1
- package/lib/module/api.js.map +1 -1
- package/lib/module/core/AudioRecorder.js +45 -0
- package/lib/module/core/AudioRecorder.js.map +1 -0
- package/lib/module/errors/NotSupportedError.js.map +1 -1
- package/lib/module/hooks/useSytemVolume.js +19 -0
- package/lib/module/hooks/useSytemVolume.js.map +1 -0
- package/lib/module/plugin/withAudioAPI.js +1 -1
- package/lib/module/plugin/withAudioAPI.js.map +1 -1
- package/lib/module/specs/NativeAudioManagerModule.js +5 -2
- package/lib/module/specs/NativeAudioManagerModule.js.map +1 -1
- package/lib/module/system/AudioManager.js +23 -50
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/typescript/api.d.ts +5 -1
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/core/AudioRecorder.d.ts +22 -0
- package/lib/typescript/core/AudioRecorder.d.ts.map +1 -0
- package/lib/typescript/errors/NotSupportedError.d.ts.map +1 -1
- package/lib/typescript/hooks/useSytemVolume.d.ts +2 -0
- package/lib/typescript/hooks/useSytemVolume.d.ts.map +1 -0
- package/lib/typescript/interfaces.d.ts +11 -5
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioManagerModule.d.ts +2 -1
- package/lib/typescript/specs/NativeAudioManagerModule.d.ts.map +1 -1
- package/lib/typescript/system/AudioManager.d.ts +4 -3
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/system/types.d.ts +26 -7
- package/lib/typescript/system/types.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +5 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/api.ts +13 -2
- package/src/core/AudioRecorder.ts +81 -0
- package/src/hooks/useSytemVolume.ts +19 -0
- package/src/interfaces.ts +25 -11
- package/src/plugin/withAudioAPI.ts +2 -1
- package/src/specs/NativeAudioManagerModule.ts +5 -8
- package/src/system/AudioManager.ts +30 -107
- package/src/system/types.ts +31 -21
- package/src/types.ts +13 -0
- /package/src/errors/{NotSupportedError.tsx → NotSupportedError.ts} +0 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#import <audioapi/ios/core/NativeAudioRecorder.h>
|
|
2
|
+
#import <audioapi/ios/system/AudioEngine.h>
|
|
3
|
+
#import <audioapi/ios/system/AudioSessionManager.h>
|
|
4
|
+
|
|
5
|
+
@implementation NativeAudioRecorder
|
|
6
|
+
|
|
7
|
+
- (instancetype)initWithReceiverBlock:(AudioReceiverBlock)receiverBlock
|
|
8
|
+
bufferLength:(int)bufferLength
|
|
9
|
+
sampleRate:(float)sampleRate
|
|
10
|
+
{
|
|
11
|
+
if (self = [super init]) {
|
|
12
|
+
self.bufferLength = bufferLength;
|
|
13
|
+
self.sampleRate = sampleRate;
|
|
14
|
+
|
|
15
|
+
self.receiverBlock = [receiverBlock copy];
|
|
16
|
+
|
|
17
|
+
float devicePrefferedSampleRate = [[[AudioSessionManager sharedInstance] getDevicePreferredSampleRate] floatValue];
|
|
18
|
+
|
|
19
|
+
self.inputFormat = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32
|
|
20
|
+
sampleRate:devicePrefferedSampleRate
|
|
21
|
+
channels:1
|
|
22
|
+
interleaved:NO];
|
|
23
|
+
self.outputFormat = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32
|
|
24
|
+
sampleRate:sampleRate
|
|
25
|
+
channels:1
|
|
26
|
+
interleaved:NO];
|
|
27
|
+
self.audioConverter = [[AVAudioConverter alloc] initFromFormat:self.inputFormat toFormat:self.outputFormat];
|
|
28
|
+
|
|
29
|
+
__weak typeof(self) weakSelf = self;
|
|
30
|
+
self.receiverSinkBlock = ^OSStatus(
|
|
31
|
+
const AudioTimeStamp *_Nonnull timestamp,
|
|
32
|
+
AVAudioFrameCount frameCount,
|
|
33
|
+
const AudioBufferList *_Nonnull inputData) {
|
|
34
|
+
return [weakSelf processAudioInput:inputData withFrameCount:frameCount atTimestamp:timestamp];
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
self.sinkNode = [[AVAudioSinkNode alloc] initWithReceiverBlock:self.receiverSinkBlock];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return self;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
- (OSStatus)processAudioInput:(const AudioBufferList *)inputData
|
|
44
|
+
withFrameCount:(AVAudioFrameCount)frameCount
|
|
45
|
+
atTimestamp:(const AudioTimeStamp *)timestamp
|
|
46
|
+
{
|
|
47
|
+
float inputSampleRate = self.inputFormat.sampleRate;
|
|
48
|
+
float outputSampleRate = self.outputFormat.sampleRate;
|
|
49
|
+
|
|
50
|
+
AVAudioTime *time = [[AVAudioTime alloc] initWithAudioTimeStamp:timestamp sampleRate:outputSampleRate];
|
|
51
|
+
|
|
52
|
+
if (inputSampleRate != outputSampleRate) {
|
|
53
|
+
AVAudioPCMBuffer *inputBuffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:self.inputFormat
|
|
54
|
+
frameCapacity:frameCount];
|
|
55
|
+
|
|
56
|
+
memcpy(
|
|
57
|
+
inputBuffer.mutableAudioBufferList->mBuffers[0].mData,
|
|
58
|
+
inputData->mBuffers[0].mData,
|
|
59
|
+
inputData->mBuffers[0].mDataByteSize);
|
|
60
|
+
inputBuffer.frameLength = frameCount;
|
|
61
|
+
|
|
62
|
+
int outputFrameCount = frameCount * outputSampleRate / inputSampleRate;
|
|
63
|
+
|
|
64
|
+
AVAudioPCMBuffer *outputBuffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:self.audioConverter.outputFormat
|
|
65
|
+
frameCapacity:outputFrameCount];
|
|
66
|
+
|
|
67
|
+
NSError *error = nil;
|
|
68
|
+
AVAudioConverterInputBlock inputBlock =
|
|
69
|
+
^AVAudioBuffer *_Nullable(AVAudioPacketCount inNumberOfPackets, AVAudioConverterInputStatus *outStatus)
|
|
70
|
+
{
|
|
71
|
+
*outStatus = AVAudioConverterInputStatus_HaveData;
|
|
72
|
+
return inputBuffer;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
[self.audioConverter convertToBuffer:outputBuffer error:&error withInputFromBlock:inputBlock];
|
|
76
|
+
|
|
77
|
+
if (error) {
|
|
78
|
+
NSLog(@"Error during audio conversion: %@", error.localizedDescription);
|
|
79
|
+
return kAudioServicesBadSpecifierSizeError;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
self.receiverBlock(outputBuffer.audioBufferList, outputBuffer.frameLength, time);
|
|
83
|
+
|
|
84
|
+
return kAudioServicesNoError;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
self.receiverBlock(inputData, frameCount, time);
|
|
88
|
+
|
|
89
|
+
return kAudioServicesNoError;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
- (void)start
|
|
93
|
+
{
|
|
94
|
+
[[AudioEngine sharedInstance] attachInputNode:self.sinkNode];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
- (void)stop
|
|
98
|
+
{
|
|
99
|
+
[[AudioEngine sharedInstance] detachInputNode];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
- (void)cleanup
|
|
103
|
+
{
|
|
104
|
+
self.receiverBlock = nil;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
@end
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
@property (nonatomic, strong) AVAudioEngine *audioEngine;
|
|
9
9
|
@property (nonatomic, strong) NSMutableDictionary *sourceNodes;
|
|
10
10
|
@property (nonatomic, strong) NSMutableDictionary *sourceFormats;
|
|
11
|
+
@property (nonatomic, strong) AVAudioSinkNode *inputNode;
|
|
11
12
|
|
|
12
13
|
+ (instancetype)sharedInstance;
|
|
13
14
|
- (void)cleanup;
|
|
14
|
-
|
|
15
15
|
- (bool)rebuildAudioEngine;
|
|
16
16
|
- (void)startEngine;
|
|
17
17
|
- (void)stopEngine;
|
|
@@ -20,4 +20,10 @@
|
|
|
20
20
|
- (NSString *)attachSourceNode:(AVAudioSourceNode *)sourceNode format:(AVAudioFormat *)format;
|
|
21
21
|
- (void)detachSourceNodeWithId:(NSString *)sourceNodeId;
|
|
22
22
|
|
|
23
|
+
- (void)attachInputNode:(AVAudioSinkNode *)inputNode;
|
|
24
|
+
- (void)detachInputNode;
|
|
25
|
+
|
|
26
|
+
- (void)startIfNecessary;
|
|
27
|
+
- (void)stopIfNecessary;
|
|
28
|
+
|
|
23
29
|
@end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#import <audioapi/ios/system/AudioEngine.h>
|
|
2
|
+
#import <audioapi/ios/system/AudioSessionManager.h>
|
|
2
3
|
|
|
3
4
|
@implementation AudioEngine
|
|
4
5
|
|
|
@@ -7,9 +8,11 @@ static AudioEngine *_sharedInstance = nil;
|
|
|
7
8
|
+ (instancetype)sharedInstance
|
|
8
9
|
{
|
|
9
10
|
static dispatch_once_t onceToken;
|
|
11
|
+
|
|
10
12
|
dispatch_once(&onceToken, ^{
|
|
11
13
|
_sharedInstance = [[self alloc] initPrivate];
|
|
12
14
|
});
|
|
15
|
+
|
|
13
16
|
return _sharedInstance;
|
|
14
17
|
}
|
|
15
18
|
|
|
@@ -23,10 +26,14 @@ static AudioEngine *_sharedInstance = nil;
|
|
|
23
26
|
{
|
|
24
27
|
if (self = [super init]) {
|
|
25
28
|
self.audioEngine = [[AVAudioEngine alloc] init];
|
|
26
|
-
self.
|
|
29
|
+
self.inputNode = nil;
|
|
30
|
+
|
|
27
31
|
self.sourceNodes = [[NSMutableDictionary alloc] init];
|
|
28
32
|
self.sourceFormats = [[NSMutableDictionary alloc] init];
|
|
33
|
+
|
|
34
|
+
[[AudioSessionManager sharedInstance] setActive:true];
|
|
29
35
|
}
|
|
36
|
+
|
|
30
37
|
return self;
|
|
31
38
|
}
|
|
32
39
|
|
|
@@ -40,12 +47,13 @@ static AudioEngine *_sharedInstance = nil;
|
|
|
40
47
|
self.audioEngine = nil;
|
|
41
48
|
self.sourceNodes = nil;
|
|
42
49
|
self.sourceFormats = nil;
|
|
50
|
+
self.inputNode = nil;
|
|
51
|
+
|
|
52
|
+
[[AudioSessionManager sharedInstance] setActive:false];
|
|
43
53
|
}
|
|
44
54
|
|
|
45
55
|
- (bool)rebuildAudioEngine
|
|
46
56
|
{
|
|
47
|
-
NSError *error = nil;
|
|
48
|
-
|
|
49
57
|
if ([self.audioEngine isRunning]) {
|
|
50
58
|
return true;
|
|
51
59
|
}
|
|
@@ -58,14 +66,10 @@ static AudioEngine *_sharedInstance = nil;
|
|
|
58
66
|
[self.audioEngine connect:sourceNode to:self.audioEngine.mainMixerNode format:format];
|
|
59
67
|
}
|
|
60
68
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
69
|
+
[self.audioEngine attachNode:self.inputNode];
|
|
70
|
+
[self.audioEngine connect:self.audioEngine.inputNode to:self.inputNode format:nil];
|
|
64
71
|
|
|
65
|
-
|
|
66
|
-
NSLog(@"Error while rebuilding audio engine: %@", [error debugDescription]);
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
72
|
+
[self startEngine];
|
|
69
73
|
|
|
70
74
|
return true;
|
|
71
75
|
}
|
|
@@ -93,7 +97,7 @@ static AudioEngine *_sharedInstance = nil;
|
|
|
93
97
|
return;
|
|
94
98
|
}
|
|
95
99
|
|
|
96
|
-
[self.audioEngine
|
|
100
|
+
[self.audioEngine stop];
|
|
97
101
|
}
|
|
98
102
|
|
|
99
103
|
- (bool)isRunning
|
|
@@ -112,24 +116,64 @@ static AudioEngine *_sharedInstance = nil;
|
|
|
112
116
|
[self.audioEngine attachNode:sourceNode];
|
|
113
117
|
[self.audioEngine connect:sourceNode to:self.audioEngine.mainMixerNode format:format];
|
|
114
118
|
|
|
115
|
-
|
|
116
|
-
[self startEngine];
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
+
[self startIfNecessary];
|
|
119
120
|
return sourceNodeId;
|
|
120
121
|
}
|
|
121
122
|
|
|
122
123
|
- (void)detachSourceNodeWithId:(NSString *)sourceNodeId
|
|
123
124
|
{
|
|
124
|
-
NSLog(@"[AudioEngine] detaching source
|
|
125
|
+
NSLog(@"[AudioEngine] detaching source node with ID: %@", sourceNodeId);
|
|
125
126
|
|
|
126
127
|
AVAudioSourceNode *sourceNode = [self.sourceNodes valueForKey:sourceNodeId];
|
|
127
|
-
[self.audioEngine detachNode:sourceNode];
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
if (sourceNode != nil) {
|
|
130
|
+
[self.audioEngine detachNode:sourceNode];
|
|
131
|
+
|
|
132
|
+
[self.sourceNodes removeObjectForKey:sourceNodeId];
|
|
133
|
+
[self.sourceFormats removeObjectForKey:sourceNodeId];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
[self stopIfNecessary];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
- (void)attachInputNode:(AVAudioSinkNode *)inputNode
|
|
140
|
+
{
|
|
141
|
+
self.inputNode = inputNode;
|
|
142
|
+
|
|
143
|
+
[self.audioEngine attachNode:inputNode];
|
|
144
|
+
[self.audioEngine connect:self.audioEngine.inputNode to:inputNode format:nil];
|
|
145
|
+
|
|
146
|
+
[self startIfNecessary];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
- (void)detachInputNode
|
|
150
|
+
{
|
|
151
|
+
if (self.inputNode != nil) {
|
|
152
|
+
[self.audioEngine detachNode:self.inputNode];
|
|
153
|
+
self.inputNode = nil;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
[self stopIfNecessary];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
- (void)startIfNecessary
|
|
160
|
+
{
|
|
161
|
+
if ([self isRunning]) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if ([self.sourceNodes count] > 0 || self.inputNode != nil) {
|
|
166
|
+
[self startEngine];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
- (void)stopIfNecessary
|
|
171
|
+
{
|
|
172
|
+
if (![self isRunning]) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
131
175
|
|
|
132
|
-
if ([self.sourceNodes count] == 0) {
|
|
176
|
+
if ([self.sourceNodes count] == 0 && self.inputNode == nil) {
|
|
133
177
|
[self stopEngine];
|
|
134
178
|
}
|
|
135
179
|
}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
@property (nonatomic, weak) AVAudioSession *audioSession;
|
|
9
9
|
|
|
10
|
+
@property (nonatomic, assign) bool isActive;
|
|
11
|
+
@property (nonatomic, assign) bool hasDirtySettings;
|
|
10
12
|
@property (nonatomic, assign) AVAudioSessionMode sessionMode;
|
|
11
13
|
@property (nonatomic, assign) AVAudioSessionCategory sessionCategory;
|
|
12
14
|
@property (nonatomic, assign) AVAudioSessionCategoryOptions sessionOptions;
|
|
@@ -17,6 +19,6 @@
|
|
|
17
19
|
|
|
18
20
|
- (NSNumber *)getDevicePreferredSampleRate;
|
|
19
21
|
- (void)setAudioSessionOptions:(NSString *)category mode:(NSString *)mode options:(NSArray *)options;
|
|
20
|
-
- (bool)setActive:(bool)active
|
|
22
|
+
- (bool)setActive:(bool)active;
|
|
21
23
|
|
|
22
24
|
@end
|
|
@@ -26,10 +26,11 @@ static AudioSessionManager *_sharedInstance = nil;
|
|
|
26
26
|
|
|
27
27
|
self.sessionCategory = AVAudioSessionCategoryPlayback;
|
|
28
28
|
self.sessionMode = AVAudioSessionModeDefault;
|
|
29
|
-
self.sessionOptions =
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
self.sessionOptions = AVAudioSessionCategoryOptionAllowAirPlay;
|
|
30
|
+
self.hasDirtySettings = true;
|
|
31
|
+
self.isActive = false;
|
|
32
32
|
}
|
|
33
|
+
|
|
33
34
|
return self;
|
|
34
35
|
}
|
|
35
36
|
|
|
@@ -119,35 +120,59 @@ static AudioSessionManager *_sharedInstance = nil;
|
|
|
119
120
|
}
|
|
120
121
|
}
|
|
121
122
|
|
|
122
|
-
bool hasDirtySettings = false;
|
|
123
|
-
|
|
124
123
|
if (self.sessionCategory != sessionCategory) {
|
|
125
|
-
hasDirtySettings = true;
|
|
124
|
+
self.hasDirtySettings = true;
|
|
126
125
|
self.sessionCategory = sessionCategory;
|
|
127
126
|
}
|
|
128
127
|
|
|
129
128
|
if (self.sessionMode != sessionMode) {
|
|
130
|
-
hasDirtySettings = true;
|
|
129
|
+
self.hasDirtySettings = true;
|
|
131
130
|
self.sessionMode = sessionMode;
|
|
132
131
|
}
|
|
133
132
|
|
|
134
133
|
if (self.sessionOptions != sessionOptions) {
|
|
135
|
-
hasDirtySettings = true;
|
|
134
|
+
self.hasDirtySettings = true;
|
|
136
135
|
self.sessionOptions = sessionOptions;
|
|
137
136
|
}
|
|
138
137
|
|
|
139
|
-
if (
|
|
138
|
+
if (self.isActive) {
|
|
140
139
|
[self configureAudioSession];
|
|
141
140
|
}
|
|
142
141
|
}
|
|
143
142
|
|
|
144
|
-
- (bool)setActive:(bool)active
|
|
143
|
+
- (bool)setActive:(bool)active
|
|
145
144
|
{
|
|
146
|
-
|
|
145
|
+
if (active == self.isActive) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (active) {
|
|
150
|
+
[self configureAudioSession];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
NSError *error = nil;
|
|
154
|
+
|
|
155
|
+
bool success = [self.audioSession setActive:active error:&error];
|
|
156
|
+
|
|
157
|
+
if (success) {
|
|
158
|
+
self.isActive = active;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (error != nil) {
|
|
162
|
+
NSLog(@"[AudioSessionManager] setting session as %@ failed", active ? @"ACTIVE" : @"INACTIVE");
|
|
163
|
+
} else {
|
|
164
|
+
NSLog(@"[AudioSessionManager] session is %@", active ? @"ACTIVE" : @"INACTIVE");
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return success;
|
|
147
168
|
}
|
|
148
169
|
|
|
149
170
|
- (bool)configureAudioSession
|
|
150
171
|
{
|
|
172
|
+
if (![self hasDirtySettings]) {
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
|
|
151
176
|
NSLog(
|
|
152
177
|
@"[AudioSessionManager] configureAudioSession, category: %@, mode: %@, options: %lu",
|
|
153
178
|
self.sessionCategory,
|
|
@@ -156,13 +181,6 @@ static AudioSessionManager *_sharedInstance = nil;
|
|
|
156
181
|
|
|
157
182
|
NSError *error = nil;
|
|
158
183
|
|
|
159
|
-
[self.audioSession setPreferredIOBufferDuration:0.022 error:&error];
|
|
160
|
-
|
|
161
|
-
if (error != nil) {
|
|
162
|
-
NSLog(@"Error while setting preffered IO buffer duration: %@", [error debugDescription]);
|
|
163
|
-
return false;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
184
|
[self.audioSession setCategory:self.sessionCategory mode:self.sessionMode options:self.sessionOptions error:&error];
|
|
167
185
|
|
|
168
186
|
if (error != nil) {
|
|
@@ -170,13 +188,7 @@ static AudioSessionManager *_sharedInstance = nil;
|
|
|
170
188
|
return false;
|
|
171
189
|
}
|
|
172
190
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
if (error != nil) {
|
|
176
|
-
NSLog(@"Error while activating audio session: %@", [error debugDescription]);
|
|
177
|
-
return false;
|
|
178
|
-
}
|
|
179
|
-
|
|
191
|
+
self.hasDirtySettings = false;
|
|
180
192
|
return true;
|
|
181
193
|
}
|
|
182
194
|
|
|
@@ -12,11 +12,17 @@
|
|
|
12
12
|
|
|
13
13
|
@property (nonatomic, assign) bool isInterrupted;
|
|
14
14
|
@property (nonatomic, assign) bool hadConfigurationChange;
|
|
15
|
-
@property (nonatomic, assign)
|
|
15
|
+
@property (nonatomic, assign) bool audioInterruptionsObserved;
|
|
16
|
+
@property (nonatomic, assign) bool volumeChangesObserved;
|
|
16
17
|
|
|
17
18
|
+ (instancetype)sharedInstanceWithAudioManagerModule:(AudioManagerModule *)audioManagerModule;
|
|
18
19
|
- (void)cleanup;
|
|
19
20
|
|
|
20
21
|
- (void)observeAudioInterruptions:(BOOL)enabled;
|
|
22
|
+
- (void)observeVolumeChanges:(BOOL)enabled;
|
|
23
|
+
- (void)observeValueForKeyPath:(NSString *)keyPath
|
|
24
|
+
ofObject:(id)object
|
|
25
|
+
change:(NSDictionary *)change
|
|
26
|
+
context:(void *)context;
|
|
21
27
|
|
|
22
28
|
@end
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
@implementation NotificationManager
|
|
7
7
|
|
|
8
8
|
static NotificationManager *_sharedInstance = nil;
|
|
9
|
+
static NSString *VolumeObservationContext = @"VolumeObservationContext";
|
|
9
10
|
|
|
10
11
|
+ (instancetype)sharedInstanceWithAudioManagerModule:(AudioManagerModule *)audioManagerModule
|
|
11
12
|
{
|
|
@@ -59,6 +60,35 @@ static NotificationManager *_sharedInstance = nil;
|
|
|
59
60
|
self.audioInterruptionsObserved = enabled;
|
|
60
61
|
}
|
|
61
62
|
|
|
63
|
+
// WARNING: this does not work in a simulator environment, test it on a real device
|
|
64
|
+
- (void)observeVolumeChanges:(BOOL)enabled
|
|
65
|
+
{
|
|
66
|
+
if (self.volumeChangesObserved == enabled) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (enabled) {
|
|
71
|
+
[[AVAudioSession sharedInstance] addObserver:self
|
|
72
|
+
forKeyPath:@"outputVolume"
|
|
73
|
+
options:NSKeyValueObservingOptionNew
|
|
74
|
+
context:(void *)&VolumeObservationContext];
|
|
75
|
+
} else {
|
|
76
|
+
[[AVAudioSession sharedInstance] removeObserver:self forKeyPath:@"outputVolume" context:nil];
|
|
77
|
+
}
|
|
78
|
+
self.volumeChangesObserved = enabled;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
- (void)observeValueForKeyPath:(NSString *)keyPath
|
|
82
|
+
ofObject:(id)object
|
|
83
|
+
change:(NSDictionary *)change
|
|
84
|
+
context:(void *)context
|
|
85
|
+
{
|
|
86
|
+
if ([keyPath isEqualToString:@"outputVolume"] && context == &VolumeObservationContext) {
|
|
87
|
+
NSNumber *volume = [NSNumber numberWithFloat:[change[@"new"] floatValue]];
|
|
88
|
+
[self.audioManagerModule sendEventWithName:@"onVolumeChange" body:@{@"value" : volume}];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
62
92
|
- (void)configureNotifications
|
|
63
93
|
{
|
|
64
94
|
[self.notificationCenter addObserver:self
|
package/lib/commonjs/api.js
CHANGED
|
@@ -51,6 +51,12 @@ Object.defineProperty(exports, "AudioParam", {
|
|
|
51
51
|
return _AudioParam.default;
|
|
52
52
|
}
|
|
53
53
|
});
|
|
54
|
+
Object.defineProperty(exports, "AudioRecorder", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () {
|
|
57
|
+
return _AudioRecorder.default;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
54
60
|
Object.defineProperty(exports, "AudioScheduledSourceNode", {
|
|
55
61
|
enumerable: true,
|
|
56
62
|
get: function () {
|
|
@@ -165,6 +171,12 @@ Object.defineProperty(exports, "WindowType", {
|
|
|
165
171
|
return _types.WindowType;
|
|
166
172
|
}
|
|
167
173
|
});
|
|
174
|
+
Object.defineProperty(exports, "useSystemVolume", {
|
|
175
|
+
enumerable: true,
|
|
176
|
+
get: function () {
|
|
177
|
+
return _useSytemVolume.default;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
168
180
|
var _NativeAudioAPIModule = _interopRequireDefault(require("./specs/NativeAudioAPIModule"));
|
|
169
181
|
var _AudioBuffer = _interopRequireDefault(require("./core/AudioBuffer"));
|
|
170
182
|
var _AudioBufferSourceNode = _interopRequireDefault(require("./core/AudioBufferSourceNode"));
|
|
@@ -180,7 +192,9 @@ var _BiquadFilterNode = _interopRequireDefault(require("./core/BiquadFilterNode"
|
|
|
180
192
|
var _GainNode = _interopRequireDefault(require("./core/GainNode"));
|
|
181
193
|
var _OscillatorNode = _interopRequireDefault(require("./core/OscillatorNode"));
|
|
182
194
|
var _StereoPannerNode = _interopRequireDefault(require("./core/StereoPannerNode"));
|
|
195
|
+
var _AudioRecorder = _interopRequireDefault(require("./core/AudioRecorder"));
|
|
183
196
|
var _system = _interopRequireDefault(require("./system"));
|
|
197
|
+
var _useSytemVolume = _interopRequireDefault(require("./hooks/useSytemVolume"));
|
|
184
198
|
var _types = require("./types");
|
|
185
199
|
var _errors = require("./errors");
|
|
186
200
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -188,7 +202,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
188
202
|
|
|
189
203
|
/* eslint-disable no-var */
|
|
190
204
|
|
|
191
|
-
if (global.createAudioContext == null || global.createOfflineAudioContext == null) {
|
|
205
|
+
if (global.createAudioContext == null || global.createOfflineAudioContext == null || global.createAudioRecorder == null) {
|
|
192
206
|
if (!_NativeAudioAPIModule.default) {
|
|
193
207
|
throw new Error(`Failed to install react-native-audio-api: The native module could not be found.`);
|
|
194
208
|
}
|
package/lib/commonjs/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_NativeAudioAPIModule","_interopRequireDefault","require","_AudioBuffer","_AudioBufferSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_GainNode","_OscillatorNode","_StereoPannerNode","_system","_types","_errors","e","__esModule","default","global","createAudioContext","createOfflineAudioContext","NativeAudioAPIModule","Error","install"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_NativeAudioAPIModule","_interopRequireDefault","require","_AudioBuffer","_AudioBufferSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_GainNode","_OscillatorNode","_StereoPannerNode","_AudioRecorder","_system","_useSytemVolume","_types","_errors","e","__esModule","default","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","NativeAudioAPIModule","Error","install"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,qBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAoCA,IAAAC,YAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,sBAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,aAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,oBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,qBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,UAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,aAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,WAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,yBAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,iBAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,iBAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,SAAA,GAAAb,sBAAA,CAAAC,OAAA;AACA,IAAAa,eAAA,GAAAd,sBAAA,CAAAC,OAAA;AACA,IAAAc,iBAAA,GAAAf,sBAAA,CAAAC,OAAA;AACA,IAAAe,cAAA,GAAAhB,sBAAA,CAAAC,OAAA;AACA,IAAAgB,OAAA,GAAAjB,sBAAA,CAAAC,OAAA;AACA,IAAAiB,eAAA,GAAAlB,sBAAA,CAAAC,OAAA;AAEA,IAAAkB,MAAA,GAAAlB,OAAA;AAUA,IAAAmB,OAAA,GAAAnB,OAAA;AAMkB,SAAAD,uBAAAqB,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AA9DlB;;AAYA;;AAEA,IACEG,MAAM,CAACC,kBAAkB,IAAI,IAAI,IACjCD,MAAM,CAACE,yBAAyB,IAAI,IAAI,IACxCF,MAAM,CAACG,mBAAmB,IAAI,IAAI,EAClC;EACA,IAAI,CAACC,6BAAoB,EAAE;IACzB,MAAM,IAAIC,KAAK,CACb,iFACF,CAAC;EACH;EAEAD,6BAAoB,CAACE,OAAO,CAAC,CAAC;AAChC","ignoreList":[]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _AudioBuffer = _interopRequireDefault(require("./AudioBuffer"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
class AudioRecorder {
|
|
10
|
+
onAudioReadyCallback = null;
|
|
11
|
+
onErrorCallback = null;
|
|
12
|
+
onStatusChangeCallback = null;
|
|
13
|
+
onAudioReadyInternal = (buffer, numFrames, when) => {
|
|
14
|
+
if (this.onAudioReadyCallback) {
|
|
15
|
+
this.onAudioReadyCallback(new _AudioBuffer.default(buffer), numFrames, when);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
onErrorInternal = error => {
|
|
19
|
+
if (this.onErrorCallback) {
|
|
20
|
+
this.onErrorCallback(error);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
onStatusChangeInternal = (status, previousStatus) => {
|
|
24
|
+
if (this.onStatusChangeCallback) {
|
|
25
|
+
this.onStatusChangeCallback(status, previousStatus);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.recorder = global.createAudioRecorder(options);
|
|
30
|
+
}
|
|
31
|
+
start() {
|
|
32
|
+
this.recorder.start();
|
|
33
|
+
}
|
|
34
|
+
stop() {
|
|
35
|
+
this.recorder.stop();
|
|
36
|
+
}
|
|
37
|
+
onAudioReady(callback) {
|
|
38
|
+
this.onAudioReadyCallback = callback;
|
|
39
|
+
this.recorder.onAudioReady(this.onAudioReadyInternal);
|
|
40
|
+
}
|
|
41
|
+
onError(callback) {
|
|
42
|
+
this.onErrorCallback = callback;
|
|
43
|
+
this.recorder.onError(this.onErrorInternal);
|
|
44
|
+
}
|
|
45
|
+
onStatusChange(callback) {
|
|
46
|
+
this.onStatusChangeCallback = callback;
|
|
47
|
+
this.recorder.onStatusChange(this.onStatusChangeInternal);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.default = AudioRecorder;
|
|
51
|
+
//# sourceMappingURL=AudioRecorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_AudioBuffer","_interopRequireDefault","require","e","__esModule","default","AudioRecorder","onAudioReadyCallback","onErrorCallback","onStatusChangeCallback","onAudioReadyInternal","buffer","numFrames","when","AudioBuffer","onErrorInternal","error","onStatusChangeInternal","status","previousStatus","constructor","options","recorder","global","createAudioRecorder","start","stop","onAudioReady","callback","onError","onStatusChange","exports"],"sourceRoot":"../../../src","sources":["core/AudioRecorder.ts"],"mappings":";;;;;;AAQA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAwC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAezB,MAAMG,aAAa,CAAC;EAEzBC,oBAAoB,GAA8B,IAAI;EACtDC,eAAe,GAAyB,IAAI;EAC5CC,sBAAsB,GAAgC,IAAI;EAE1DC,oBAAoB,GAAwBA,CAClDC,MAAoB,EACpBC,SAAiB,EACjBC,IAAY,KACT;IACH,IAAI,IAAI,CAACN,oBAAoB,EAAE;MAC7B,IAAI,CAACA,oBAAoB,CAAC,IAAIO,oBAAW,CAACH,MAAM,CAAC,EAAEC,SAAS,EAAEC,IAAI,CAAC;IACrE;EACF,CAAC;EAEOE,eAAe,GAAoBC,KAAY,IAAK;IAC1D,IAAI,IAAI,CAACR,eAAe,EAAE;MACxB,IAAI,CAACA,eAAe,CAACQ,KAAK,CAAC;IAC7B;EACF,CAAC;EAEOC,sBAAsB,GAA0BA,CACtDC,MAA2B,EAC3BC,cAAmC,KAChC;IACH,IAAI,IAAI,CAACV,sBAAsB,EAAE;MAC/B,IAAI,CAACA,sBAAsB,CAACS,MAAM,EAAEC,cAAc,CAAC;IACrD;EACF,CAAC;EAEDC,WAAWA,CAACC,OAA6B,EAAE;IACzC,IAAI,CAACC,QAAQ,GAAGC,MAAM,CAACC,mBAAmB,CAACH,OAAO,CAAC;EACrD;EAEOI,KAAKA,CAAA,EAAS;IACnB,IAAI,CAACH,QAAQ,CAACG,KAAK,CAAC,CAAC;EACvB;EAEOC,IAAIA,CAAA,EAAS;IAClB,IAAI,CAACJ,QAAQ,CAACI,IAAI,CAAC,CAAC;EACtB;EAEOC,YAAYA,CAACC,QAA4B,EAAQ;IACtD,IAAI,CAACrB,oBAAoB,GAAGqB,QAAQ;IACpC,IAAI,CAACN,QAAQ,CAACK,YAAY,CAAC,IAAI,CAACjB,oBAAoB,CAAC;EACvD;EAEOmB,OAAOA,CAACD,QAAuB,EAAQ;IAC5C,IAAI,CAACpB,eAAe,GAAGoB,QAAQ;IAC/B,IAAI,CAACN,QAAQ,CAACO,OAAO,CAAC,IAAI,CAACd,eAAe,CAAC;EAC7C;EAEOe,cAAcA,CAACF,QAA8B,EAAQ;IAC1D,IAAI,CAACnB,sBAAsB,GAAGmB,QAAQ;IACtC,IAAI,CAACN,QAAQ,CAACQ,cAAc,CAAC,IAAI,CAACb,sBAAsB,CAAC;EAC3D;AACF;AAACc,OAAA,CAAA1B,OAAA,GAAAC,aAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NotSupportedError","Error","constructor","message","name","_default","exports","default"],"sourceRoot":"../../../src","sources":["errors/NotSupportedError.
|
|
1
|
+
{"version":3,"names":["NotSupportedError","Error","constructor","message","name","_default","exports","default"],"sourceRoot":"../../../src","sources":["errors/NotSupportedError.ts"],"mappings":";;;;;;AAAA,MAAMA,iBAAiB,SAASC,KAAK,CAAC;EACpCC,WAAWA,CAACC,OAAe,EAAE;IAC3B,KAAK,CAACA,OAAO,CAAC;IACd,IAAI,CAACC,IAAI,GAAG,mBAAmB;EACjC;AACF;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEcP,iBAAiB","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = useSystemVolume;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _AudioManager = _interopRequireDefault(require("../system/AudioManager"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
function useSystemVolume() {
|
|
11
|
+
const [volume, setVolume] = (0, _react.useState)(0);
|
|
12
|
+
(0, _react.useEffect)(() => {
|
|
13
|
+
_AudioManager.default.observeVolumeChanges(true);
|
|
14
|
+
const listener = _AudioManager.default.enableRemoteEvent('volumeChange', e => {
|
|
15
|
+
setVolume(parseFloat(e.value.toFixed(2)));
|
|
16
|
+
});
|
|
17
|
+
return () => {
|
|
18
|
+
listener?.remove();
|
|
19
|
+
_AudioManager.default.observeVolumeChanges(false);
|
|
20
|
+
};
|
|
21
|
+
}, []);
|
|
22
|
+
return volume;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=useSytemVolume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_AudioManager","_interopRequireDefault","e","__esModule","default","useSystemVolume","volume","setVolume","useState","useEffect","AudioManager","observeVolumeChanges","listener","enableRemoteEvent","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;MAClBP,qBAAY,CAACC,oBAAoB,CAAC,KAAK,CAAC;IAC1C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAOL,MAAM;AACf","ignoreList":[]}
|
|
@@ -26,7 +26,7 @@ const withForegroundService = (config, {
|
|
|
26
26
|
const SFTypes = androidFSTypes.join('|');
|
|
27
27
|
const serviceElement = {
|
|
28
28
|
$: {
|
|
29
|
-
'android:name': 'system.MediaNotificationManager$NotificationService',
|
|
29
|
+
'android:name': 'com.swmansion.audioapi.system.MediaNotificationManager$NotificationService',
|
|
30
30
|
'android:stopWithTask': 'true',
|
|
31
31
|
'android:foregroundServiceType': SFTypes
|
|
32
32
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_configPlugins","require","pkg","withBackgroundAudio","config","withInfoPlist","iosConfig","modResults","UIBackgroundModes","Array","from","Set","withAndroidPermissions","androidFSPermissions","AndroidConfig","Permissions","withPermissions","withForegroundService","androidFSTypes","withAndroidManifest","mod","manifest","mainApplication","Manifest","getMainApplicationOrThrow","SFTypes","join","serviceElement","$","intentFilter","service","push","withAudioAPI","iosBackgroundMode","androidForegroundService","_default","exports","default","createRunOncePlugin","name","version"],"sourceRoot":"../../../src","sources":["plugin/withAudioAPI.ts"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AAQA,MAAMC,GAAG,GAAGD,OAAO,CAAC,qCAAqC,CAAC;AAE1D,MAAME,mBAAiC,GAAIC,MAAM,IAAK;EACpD,OAAO,IAAAC,4BAAa,EAACD,MAAM,EAAGE,SAAS,IAAK;IAC1CA,SAAS,CAACC,UAAU,CAACC,iBAAiB,GAAG,CACvC,GAAGC,KAAK,CAACC,IAAI,CACX,IAAIC,GAAG,CAAC,CAAC,IAAIL,SAAS,CAACC,UAAU,CAACC,iBAAiB,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CACtE,CAAC,CACF;IAED,OAAOF,SAAS;EAClB,CAAC,CAAC;AACJ,CAAC;AAED,MAAMM,sBAEJ,GAAGA,CAACR,MAAM,EAAE;EAAES;AAAqB,CAAC,KAAK;EACzC,OAAOC,4BAAa,CAACC,WAAW,CAACC,eAAe,CAC9CZ,MAAM,EACNS,oBACF,CAAC;AACH,CAAC;AAED,MAAMI,qBAEJ,GAAGA,CAACb,MAAM,EAAE;EAAEc;AAAe,CAAC,KAAK;EACnC,OAAO,IAAAC,kCAAmB,EAACf,MAAM,EAAGgB,GAAG,IAAK;IAC1C,MAAMC,QAAQ,GAAGD,GAAG,CAACb,UAAU;IAC/B,MAAMe,eAAe,GACnBR,4BAAa,CAACS,QAAQ,CAACC,yBAAyB,CAACH,QAAQ,CAAC;IAE5D,MAAMI,OAAO,GAAGP,cAAc,CAACQ,IAAI,CAAC,GAAG,CAAC;IAExC,MAAMC,cAAc,GAAG;MACrBC,CAAC,EAAE;QACD,cAAc,
|
|
1
|
+
{"version":3,"names":["_configPlugins","require","pkg","withBackgroundAudio","config","withInfoPlist","iosConfig","modResults","UIBackgroundModes","Array","from","Set","withAndroidPermissions","androidFSPermissions","AndroidConfig","Permissions","withPermissions","withForegroundService","androidFSTypes","withAndroidManifest","mod","manifest","mainApplication","Manifest","getMainApplicationOrThrow","SFTypes","join","serviceElement","$","intentFilter","service","push","withAudioAPI","iosBackgroundMode","androidForegroundService","_default","exports","default","createRunOncePlugin","name","version"],"sourceRoot":"../../../src","sources":["plugin/withAudioAPI.ts"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AAQA,MAAMC,GAAG,GAAGD,OAAO,CAAC,qCAAqC,CAAC;AAE1D,MAAME,mBAAiC,GAAIC,MAAM,IAAK;EACpD,OAAO,IAAAC,4BAAa,EAACD,MAAM,EAAGE,SAAS,IAAK;IAC1CA,SAAS,CAACC,UAAU,CAACC,iBAAiB,GAAG,CACvC,GAAGC,KAAK,CAACC,IAAI,CACX,IAAIC,GAAG,CAAC,CAAC,IAAIL,SAAS,CAACC,UAAU,CAACC,iBAAiB,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CACtE,CAAC,CACF;IAED,OAAOF,SAAS;EAClB,CAAC,CAAC;AACJ,CAAC;AAED,MAAMM,sBAEJ,GAAGA,CAACR,MAAM,EAAE;EAAES;AAAqB,CAAC,KAAK;EACzC,OAAOC,4BAAa,CAACC,WAAW,CAACC,eAAe,CAC9CZ,MAAM,EACNS,oBACF,CAAC;AACH,CAAC;AAED,MAAMI,qBAEJ,GAAGA,CAACb,MAAM,EAAE;EAAEc;AAAe,CAAC,KAAK;EACnC,OAAO,IAAAC,kCAAmB,EAACf,MAAM,EAAGgB,GAAG,IAAK;IAC1C,MAAMC,QAAQ,GAAGD,GAAG,CAACb,UAAU;IAC/B,MAAMe,eAAe,GACnBR,4BAAa,CAACS,QAAQ,CAACC,yBAAyB,CAACH,QAAQ,CAAC;IAE5D,MAAMI,OAAO,GAAGP,cAAc,CAACQ,IAAI,CAAC,GAAG,CAAC;IAExC,MAAMC,cAAc,GAAG;MACrBC,CAAC,EAAE;QACD,cAAc,EACZ,4EAA4E;QAC9E,sBAAsB,EAAE,MAAM;QAC9B,+BAA+B,EAAEH;MACnC,CAAC;MACDI,YAAY,EAAE;IAChB,CAAC;IAED,IAAI,CAACP,eAAe,CAACQ,OAAO,EAAE;MAC5BR,eAAe,CAACQ,OAAO,GAAG,EAAE;IAC9B;IAEAR,eAAe,CAACQ,OAAO,CAACC,IAAI,CAACJ,cAAc,CAAC;IAE5C,OAAOP,GAAG;EACZ,CAAC,CAAC;AACJ,CAAC;AAED,MAAMY,YAKJ,GAAGA,CACH5B,MAAM,EACN;EACE6B,iBAAiB,GAAG,IAAI;EACxBC,wBAAwB,GAAG,IAAI;EAC/BrB,oBAAoB,GAAG,EAAE;EACzBK,cAAc,GAAG;AACnB,CAAC,KACE;EACH,IAAIe,iBAAiB,EAAE;IACrB7B,MAAM,GAAGD,mBAAmB,CAACC,MAAM,CAAC;EACtC;EACA,IAAI8B,wBAAwB,EAAE;IAC5B9B,MAAM,GAAGQ,sBAAsB,CAACR,MAAM,EAAE;MACtCS;IACF,CAAC,CAAC;IACFT,MAAM,GAAGa,qBAAqB,CAACb,MAAM,EAAE;MACrCc;IACF,CAAC,CAAC;EACJ;EAEA,OAAOd,MAAM;AACf,CAAC;AAAC,IAAA+B,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEa,IAAAC,kCAAmB,EAACN,YAAY,EAAE9B,GAAG,CAACqC,IAAI,EAAErC,GAAG,CAACsC,OAAO,CAAC","ignoreList":[]}
|
|
@@ -20,14 +20,17 @@ const AudioManagerModule = exports.AudioManagerModule = {
|
|
|
20
20
|
enableRemoteCommand(name, enabled) {
|
|
21
21
|
NativeAudioManagerModule.enableRemoteCommand(name, enabled);
|
|
22
22
|
},
|
|
23
|
-
setAudioSessionOptions(category, mode, options
|
|
24
|
-
NativeAudioManagerModule.setAudioSessionOptions(category, mode, options
|
|
23
|
+
setAudioSessionOptions(category, mode, options) {
|
|
24
|
+
NativeAudioManagerModule.setAudioSessionOptions(category, mode, options);
|
|
25
25
|
},
|
|
26
26
|
getDevicePreferredSampleRate() {
|
|
27
27
|
return NativeAudioManagerModule.getDevicePreferredSampleRate();
|
|
28
28
|
},
|
|
29
29
|
observeAudioInterruptions(enabled) {
|
|
30
30
|
NativeAudioManagerModule.observeAudioInterruptions(enabled);
|
|
31
|
+
},
|
|
32
|
+
observeVolumeChanges(enabled) {
|
|
33
|
+
NativeAudioManagerModule.observeVolumeChanges(enabled);
|
|
31
34
|
}
|
|
32
35
|
};
|
|
33
36
|
//# sourceMappingURL=NativeAudioManagerModule.js.map
|