in react-native-pytorch-core/android/src/main/java/org/pytorch/rn/core/audio/AudioModule.java [46:101]
public void record(final int length, final Promise promise) {
Log.d(NAME, "started recording");
requestMicrophonePermission();
final int recordingLength = SAMPLE_RATE * length;
Thread recordingThread =
new Thread(
() -> {
try {
final int bufferSize =
AudioRecord.getMinBufferSize(
SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
final AudioRecord record =
new AudioRecord(
MediaRecorder.AudioSource.DEFAULT,
SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize);
if (record.getState() != AudioRecord.STATE_INITIALIZED) {
Log.e(NAME, "Audio Record can't initialize!");
return;
}
record.startRecording();
long shortsRead = 0;
int audioDataOffset = 0;
int shortsToCopy = 0;
short[] audioBuffer = new short[bufferSize / 2];
short[] audioData = new short[recordingLength];
while (shortsRead < recordingLength) {
int numberOfShort = record.read(audioBuffer, 0, audioBuffer.length);
shortsRead += numberOfShort;
shortsToCopy = Math.min(numberOfShort, recordingLength - audioDataOffset);
System.arraycopy(audioBuffer, 0, audioData, audioDataOffset, shortsToCopy);
audioDataOffset += shortsToCopy;
Log.d(NAME, String.format("shortsRead=%d", shortsRead));
}
record.stop();
record.release();
Audio audio = new Audio(audioData);
JSContext.NativeJSRef ref = JSContext.wrapObject(audio);
promise.resolve(ref.getJSRef());
} catch (Exception e) {
Log.e(NAME, "Error recording audio:", e);
promise.reject(e);
}
});
recordingThread.start();
}