Skip to content

Commit 0a33bb7

Browse files
committed
Adding optional volume metering
1 parent 4b254b9 commit 0a33bb7

File tree

4 files changed

+37
-9
lines changed

4 files changed

+37
-9
lines changed

android/src/main/java/com/dooboolab/RNAudioRecorderPlayerModule.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public class RNAudioRecorderPlayerModule extends ReactContextBaseJavaModule impl
4242
private String audioFileURL = "";
4343

4444
private int subsDurationMillis = 100;
45+
private boolean _meteringEnabled = false;
4546

4647
private final ReactApplicationContext reactContext;
4748
private MediaRecorder mediaRecorder;
@@ -63,7 +64,7 @@ public String getName() {
6364
}
6465

6566
@ReactMethod
66-
public void startRecorder(final String path, final ReadableMap audioSet, Promise promise) {
67+
public void startRecorder(final String path, final Boolean meteringEnabled, final ReadableMap audioSet, Promise promise) {
6768
try {
6869
if (
6970
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
@@ -86,6 +87,7 @@ public void startRecorder(final String path, final ReadableMap audioSet, Promise
8687
}
8788

8889
audioFileURL = (path.equals("DEFAULT")) ? FILE_LOCATION : path;
90+
_meteringEnabled = meteringEnabled;
8991

9092
if (mediaRecorder == null) {
9193
mediaRecorder = new MediaRecorder();
@@ -116,6 +118,18 @@ public void run() {
116118
long time = SystemClock.elapsedRealtime() - systemTime;
117119
WritableMap obj = Arguments.createMap();
118120
obj.putDouble("current_position", time);
121+
int maxAmplitude = 0;
122+
if (mediaRecorder != null) {
123+
maxAmplitude = mediaRecorder.getMaxAmplitude();
124+
125+
}
126+
double dB = -160;
127+
double maxAudioSize = 32767;
128+
if (maxAmplitude > 0){
129+
dB = 20 * Math.log10(maxAmplitude / maxAudioSize);
130+
}
131+
132+
obj.putInt("current_metering", (int) dB);
119133
sendEvent(reactContext, "rn-recordback", obj);
120134
recordHandler.postDelayed(this, subsDurationMillis);
121135
}

index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,19 @@ class AudioRecorderPlayer {
185185
*/
186186
startRecorder = async (
187187
uri?: string,
188+
meteringEnabled?: boolean,
188189
audioSets?: AudioSet,
189190
): Promise<string> => {
190191
if (!uri) {
191192
uri = 'DEFAULT';
192193
}
194+
if (!meteringEnabled) {
195+
meteringEnabled = false;
196+
}
193197

194198
if (!this._isRecording) {
195199
this._isRecording = true;
196-
return RNAudioRecorderPlayer.startRecorder(uri, audioSets);
200+
return RNAudioRecorderPlayer.startRecorder(uri, meteringEnabled, audioSets);
197201
}
198202
return 'Already recording';
199203
};

ios/RNAudioRecorderPlayer.m

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ @implementation RNAudioRecorderPlayer {
2121
AVAudioPlayer *audioPlayer;
2222
NSTimer *recordTimer;
2323
NSTimer *playTimer;
24+
BOOL _meteringEnabled;
2425
}
2526
double subscriptionDuration = 0.1;
2627

2728
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
2829
NSLog(@"audioPlayerDidFinishPlaying");
2930
NSNumber *duration = [NSNumber numberWithDouble:audioPlayer.duration * 1000];
30-
NSNumber *currentTime = [NSNumber numberWithDouble:audioPlayer.duration * 1000];
3131

3232
// Send last event then finish it.
3333
// NSString* status = [NSString stringWithFormat:@"{\"duration\": \"%@\", \"current_position\": \"%@\"}", [duration stringValue], [currentTime stringValue]];
@@ -46,8 +46,15 @@ - (void)updateRecorderProgress:(NSTimer*) timer
4646
{
4747
NSNumber *currentTime = [NSNumber numberWithDouble:audioRecorder.currentTime * 1000];
4848
// NSString* status = [NSString stringWithFormat:@"{\"current_position\": \"%@\"}", [currentTime stringValue]];
49+
NSNumber *currentMetering = [NSNumber numberWithDouble:0];
50+
if (_meteringEnabled) {
51+
[audioRecorder updateMeters];
52+
currentMetering = [NSNumber numberWithDouble:[audioRecorder averagePowerForChannel: 0]];
53+
}
54+
4955
NSDictionary *status = @{
5056
@"current_position" : [currentTime stringValue],
57+
@"current_metering" : [currentMetering stringValue],
5158
};
5259
[self sendEventWithName:@"rn-recordback" body:status];
5360
}
@@ -64,7 +71,7 @@ - (void)updateProgress:(NSTimer*) timer
6471
[audioPlayer stop];
6572
return;
6673
}
67-
74+
6875
// NSString* status = [NSString stringWithFormat:@"{\"duration\": \"%@\", \"current_position\": \"%@\"}", [duration stringValue], [currentTime stringValue]];
6976
NSDictionary *status = @{
7077
@"duration" : [duration stringValue],
@@ -116,6 +123,7 @@ - (dispatch_queue_t)methodQueue
116123
}
117124

118125
RCT_EXPORT_METHOD(startRecorder:(NSString*)path
126+
meteringEnabled:(BOOL)meteringEnabled
119127
audioSets: (NSDictionary*)audioSets
120128
resolve:(RCTPromiseResolveBlock)resolve
121129
reject:(RCTPromiseRejectBlock)reject) {
@@ -125,6 +133,7 @@ - (dispatch_queue_t)methodQueue
125133
NSNumber *numberOfChannel = [RCTConvert NSNumber:audioSets[@"AVNumberOfChannelsKeyIOS"]];
126134
NSNumber *avFormat;
127135
NSNumber *audioQuality = [RCTConvert NSNumber:audioSets[@"AVEncoderAudioQualityKeyIOS"]];
136+
_meteringEnabled = meteringEnabled;
128137

129138
if ([path isEqualToString:@"DEFAULT"]) {
130139
audioFileURL = [NSURL fileURLWithPath:[GetDirectoryOfType_Sound(NSCachesDirectory) stringByAppendingString:@"sound.m4a"]];
@@ -196,11 +205,12 @@ - (dispatch_queue_t)methodQueue
196205
initWithURL:audioFileURL
197206
settings:audioSettings
198207
error:nil];
199-
208+
audioRecorder.meteringEnabled = _meteringEnabled;
209+
200210
[audioRecorder setDelegate:self];
201211
[audioRecorder record];
202212
[self startRecorderTimer];
203-
213+
204214
NSString *filePath = self->audioFileURL.absoluteString;
205215
resolve(filePath);
206216
}
@@ -271,7 +281,7 @@ - (dispatch_queue_t)methodQueue
271281
audioFileURL = [NSURL URLWithString:path];
272282
}
273283
}
274-
284+
275285
NSLog(@"Error %@",error);
276286

277287
if (!audioPlayer) {
@@ -333,7 +343,7 @@ - (dispatch_queue_t)methodQueue
333343
if (playTimer != nil) {
334344
[playTimer invalidate];
335345
playTimer = nil;
336-
}
346+
}
337347
resolve(@"pause play");
338348
} else {
339349
reject(@"audioPlayer pause", @"audioPlayer is not playing", nil);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"version": "2.5.1",
44
"description": "React Native Audio Recorder and Player.",
55
"homepage": "https://github.com/dooboolab/react-native-audio-recorder-player",
6-
"main": "index.js",
6+
"main": "index.ts",
77
"types": "index.d.ts",
88
"postinstall": "dooboolab-welcome postinstall",
99
"scripts": {

0 commit comments

Comments
 (0)