@@ -104,6 +104,7 @@ class WebRtcAudioRecord {
104
104
105
105
private final @ Nullable AudioRecordErrorCallback errorCallback ;
106
106
private final @ Nullable AudioRecordStateCallback stateCallback ;
107
+ private final @ Nullable AudioRecordDataCallback audioRecordDataCallback ;
107
108
private final @ Nullable SamplesReadyCallback audioSamplesReadyCallback ;
108
109
private final boolean isAcousticEchoCancelerSupported ;
109
110
private final boolean isNoiseSuppressorSupported ;
@@ -153,6 +154,13 @@ public void run() {
153
154
captureTimeNs = audioTimestamp .nanoTime ;
154
155
}
155
156
}
157
+
158
+ // Allow the client to intercept the ByteBuffer (to modify it)
159
+ if (audioRecordDataCallback != null ) {
160
+ audioRecordDataCallback .onAudioDataRecorded (audioRecord .getAudioFormat (),
161
+ audioRecord .getChannelCount (), audioRecord .getSampleRate (), byteBuffer );
162
+ }
163
+
156
164
nativeDataIsRecorded (nativeAudioRecord , bytesRead , captureTimeNs );
157
165
}
158
166
if (audioSamplesReadyCallback != null ) {
@@ -196,7 +204,8 @@ public void stopThread() {
196
204
WebRtcAudioRecord (Context context , AudioManager audioManager ) {
197
205
this (context , newDefaultScheduler () /* scheduler */ , audioManager , DEFAULT_AUDIO_SOURCE ,
198
206
DEFAULT_AUDIO_FORMAT , null /* errorCallback */ , null /* stateCallback */ ,
199
- null /* audioSamplesReadyCallback */ , WebRtcAudioEffects .isAcousticEchoCancelerSupported (),
207
+ null /* audioSamplesReadyCallback */ , null /* audioRecordCallback */ ,
208
+ WebRtcAudioEffects .isAcousticEchoCancelerSupported (),
200
209
WebRtcAudioEffects .isNoiseSuppressorSupported ());
201
210
}
202
211
@@ -205,6 +214,7 @@ public WebRtcAudioRecord(Context context, ScheduledExecutorService scheduler,
205
214
@ Nullable AudioRecordErrorCallback errorCallback ,
206
215
@ Nullable AudioRecordStateCallback stateCallback ,
207
216
@ Nullable SamplesReadyCallback audioSamplesReadyCallback ,
217
+ @ Nullable AudioRecordDataCallback audioRecordDataCallback ,
208
218
boolean isAcousticEchoCancelerSupported , boolean isNoiseSuppressorSupported ) {
209
219
if (isAcousticEchoCancelerSupported && !WebRtcAudioEffects .isAcousticEchoCancelerSupported ()) {
210
220
throw new IllegalArgumentException ("HW AEC not supported" );
@@ -220,6 +230,7 @@ public WebRtcAudioRecord(Context context, ScheduledExecutorService scheduler,
220
230
this .errorCallback = errorCallback ;
221
231
this .stateCallback = stateCallback ;
222
232
this .audioSamplesReadyCallback = audioSamplesReadyCallback ;
233
+ this .audioRecordDataCallback = audioRecordDataCallback ;
223
234
this .isAcousticEchoCancelerSupported = isAcousticEchoCancelerSupported ;
224
235
this .isNoiseSuppressorSupported = isNoiseSuppressorSupported ;
225
236
Logging .d (TAG , "ctor" + WebRtcAudioUtils .getThreadInfo ());
0 commit comments