@@ -104,6 +104,7 @@ class WebRtcAudioRecord {
104104
105105 private final @ Nullable AudioRecordErrorCallback errorCallback ;
106106 private final @ Nullable AudioRecordStateCallback stateCallback ;
107+ private final @ Nullable AudioRecordDataCallback audioRecordDataCallback ;
107108 private final @ Nullable SamplesReadyCallback audioSamplesReadyCallback ;
108109 private final boolean isAcousticEchoCancelerSupported ;
109110 private final boolean isNoiseSuppressorSupported ;
@@ -153,6 +154,13 @@ public void run() {
153154 captureTimeNs = audioTimestamp .nanoTime ;
154155 }
155156 }
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+
156164 nativeDataIsRecorded (nativeAudioRecord , bytesRead , captureTimeNs );
157165 }
158166 if (audioSamplesReadyCallback != null ) {
@@ -196,7 +204,8 @@ public void stopThread() {
196204 WebRtcAudioRecord (Context context , AudioManager audioManager ) {
197205 this (context , newDefaultScheduler () /* scheduler */ , audioManager , DEFAULT_AUDIO_SOURCE ,
198206 DEFAULT_AUDIO_FORMAT , null /* errorCallback */ , null /* stateCallback */ ,
199- null /* audioSamplesReadyCallback */ , WebRtcAudioEffects .isAcousticEchoCancelerSupported (),
207+ null /* audioSamplesReadyCallback */ , null /* audioRecordCallback */ ,
208+ WebRtcAudioEffects .isAcousticEchoCancelerSupported (),
200209 WebRtcAudioEffects .isNoiseSuppressorSupported ());
201210 }
202211
@@ -205,6 +214,7 @@ public WebRtcAudioRecord(Context context, ScheduledExecutorService scheduler,
205214 @ Nullable AudioRecordErrorCallback errorCallback ,
206215 @ Nullable AudioRecordStateCallback stateCallback ,
207216 @ Nullable SamplesReadyCallback audioSamplesReadyCallback ,
217+ @ Nullable AudioRecordDataCallback audioRecordDataCallback ,
208218 boolean isAcousticEchoCancelerSupported , boolean isNoiseSuppressorSupported ) {
209219 if (isAcousticEchoCancelerSupported && !WebRtcAudioEffects .isAcousticEchoCancelerSupported ()) {
210220 throw new IllegalArgumentException ("HW AEC not supported" );
@@ -220,6 +230,7 @@ public WebRtcAudioRecord(Context context, ScheduledExecutorService scheduler,
220230 this .errorCallback = errorCallback ;
221231 this .stateCallback = stateCallback ;
222232 this .audioSamplesReadyCallback = audioSamplesReadyCallback ;
233+ this .audioRecordDataCallback = audioRecordDataCallback ;
223234 this .isAcousticEchoCancelerSupported = isAcousticEchoCancelerSupported ;
224235 this .isNoiseSuppressorSupported = isNoiseSuppressorSupported ;
225236 Logging .d (TAG , "ctor" + WebRtcAudioUtils .getThreadInfo ());
0 commit comments