Monday, April 28, 2014

Adjust volume of 16-bits audio buffer

Recently, I found that it is so hard to adjust volume of the audio buffer (yeah... I am new on audio).

In this post, I learned how to adjust volume of 16-bits audio buffer easily.

Here is the code:

private byte[] adjustVolume(byte[] audioSamples, double volume)
{
    byte[] array = new byte[audioSamples.length];
    for (int i = 0; i < array.length; i+=2) {
        // convert byte pair to short
        short audioSample = (short) ((short) ((audioSamples[i+1] & 0xff) << 8) | (audioSamples[i] & 0xff));

        audioSample = (short) (audioSample * volume);

        // convert back
        array[i] = (byte) audioSample;
        array[i+1] = (byte) (audioSample >> 8);

    }
    return array;
}

You can see that the code below is storing audiobuffer using "byte" datatype which is 8-bits datatype. Since our audio buffer is 16-buts datatype, you need to convert it into 16-bits datatype (I used "short") by using shift method (you can find another method to do this). And then, you can do what you want using this audio sample. Finally, you need to convert it back from 16-bits (short) audio sample into 8-bits (byte) audio buffer.

Please note that the manipulation is using one audio sample (in here, it is 16-bits audio sample).

Reference:
http://stackoverflow.com/questions/14485873/audio-change-volume-of-samples-in-byte-array

[ROM] Samsung S7 Stock Firmware BRI (Taiwan台灣)

Latest ROM: G930FXXU1DQEU Download: https://kfhost.net/tpl/firmwares.php?record=B7E6DE774E3811E7963AFA163EE8F90B Reference: http://...