Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9c599f9 authored by luca020400's avatar luca020400
Browse files

Fix amplitude in high quality recorder

We quantize audio at 16 bit hence switch
our amplitude calculations to match

Change-Id: I5ceed3340314281a3e3a7cce9b458bf5533ec940
parent 5ab96832
Loading
Loading
Loading
Loading
+25 −15
Original line number Diff line number Diff line
@@ -38,23 +38,23 @@ public class HighQualityRecorder implements SoundRecording {
    private static final int SAMPLING_RATE = 44100;
    private static final int CHANNEL_IN = AudioFormat.CHANNEL_IN_DEFAULT;
    private static final int FORMAT = AudioFormat.ENCODING_PCM_16BIT;
    private static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLING_RATE,
    private static final int BUFFER_SIZE_IN_BYTES = 2 * AudioRecord.getMinBufferSize(SAMPLING_RATE,
            CHANNEL_IN, FORMAT);

    private AudioRecord mRecord;
    private Path mPath;
    private int mMaxAmplitude;

    private byte[] mData;
    private Thread mThread;
    private final AtomicBoolean mIsRecording = new AtomicBoolean(false);
    private final AtomicBoolean mTrackAmplitude = new AtomicBoolean(false);

    @Override
    @RequiresPermission(Manifest.permission.RECORD_AUDIO)
    public void startRecording(Path path) {
        mPath = path;
        mRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
                SAMPLING_RATE, CHANNEL_IN, FORMAT, BUFFER_SIZE);
        mData = new byte[BUFFER_SIZE];
                SAMPLING_RATE, CHANNEL_IN, FORMAT, BUFFER_SIZE_IN_BYTES);
        mRecord.startRecording();

        mIsRecording.set(true);
@@ -76,7 +76,7 @@ public class HighQualityRecorder implements SoundRecording {
        } catch (InterruptedException e) {
            // Wait at most 1 second, if we fail save the current data
        } finally {
            PcmConverter.convertToWave(mPath, BUFFER_SIZE);
            PcmConverter.convertToWave(mPath, BUFFER_SIZE_IN_BYTES);
        }

        return true;
@@ -104,15 +104,13 @@ public class HighQualityRecorder implements SoundRecording {

    @Override
    public int getCurrentAmplitude() {
        byte[] data = new byte[BUFFER_SIZE];
        // Make a copy so we don't lock the object too long
        System.arraycopy(mData, 0, data, 0, BUFFER_SIZE);
        double val = 0d;
        for (byte b : data) {
            val += (b * b);
        if (!mTrackAmplitude.get()) {
            mTrackAmplitude.set(true);
        }
        val /= BUFFER_SIZE;
        return (int) (val * 10);

        int value = mMaxAmplitude;
        mMaxAmplitude = 0;
        return value;
    }

    @Override
@@ -127,9 +125,10 @@ public class HighQualityRecorder implements SoundRecording {

    private void recordingThreadImpl() {
        try (BufferedOutputStream out = new BufferedOutputStream(Files.newOutputStream(mPath))) {
            final byte[] data = new byte[BUFFER_SIZE_IN_BYTES];
            while (mIsRecording.get()) {
                try {
                    int status = mRecord.read(mData, 0, BUFFER_SIZE);
                    int status = mRecord.read(data, 0, BUFFER_SIZE_IN_BYTES);
                    switch (status) {
                        case AudioRecord.ERROR_INVALID_OPERATION:
                        case AudioRecord.ERROR_BAD_VALUE:
@@ -142,7 +141,18 @@ public class HighQualityRecorder implements SoundRecording {
                        default:
                            // Status indicates the number of bytes
                            if (status != 0) {
                                out.write(mData, 0, BUFFER_SIZE);
                                if (mTrackAmplitude.get()) {
                                    for (int i = 0; i < data.length; i = i + 2) {
                                        int value = data[i] & 0xff | data[i + 1] << 8;
                                        if (value < 0) {
                                            value = -value;
                                        }
                                        if (mMaxAmplitude < value) {
                                            mMaxAmplitude = value;
                                        }
                                    }
                                }
                                out.write(data, 0, BUFFER_SIZE_IN_BYTES);
                            }
                    }
                } catch (IOException e) {