Аудио: изменение громкости семплов в байтовом массиве

Я читаю wav-файл в массив байтов, используяэтот метод (показан ниже), Теперь, когда он хранится в моем байтовом массиве, я хочу изменить громкость звука.

private byte[] getAudioFileData(final String filePath) {
    byte[] data = null;
    try {
    final ByteArrayOutputStream baout = new ByteArrayOutputStream();
    final File file = new File(filePath);
    final AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);

    byte[] buffer = new byte[4096];
    int c;
    while ((c = audioInputStream.read(buffer, 0, buffer.length)) != -1) {
        baout.write(buffer, 0, c);
    }
    audioInputStream.close();
    baout.close();
    data = baout.toByteArray();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return data;
}

Редактировать: По запросу некоторая информация о аудио формате:

PCM_SIGNED 44100,0 Гц, 16 бит, моно, 2 байта / кадр, с прямым порядком байтов

Из класса физики я вспомнил, что вы можете изменить амплитуду синусоиды, умножив значение синуса на число от 0 до 1.

Редактировать: Обновлен код для 16-битных семплов:

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 int
        int audioSample = (int) ((audioSamples[i+1] & 0xff) << 8) | (audioSamples[i] & 0xff);

        audioSample = (int) (audioSample * volume);

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

    }
    return array;
}

Звук сильно искажается, если я умножаюaudioSample с участиемvolume, Если я не буду и сравнить оба массива сArrays.compare(array, audioSample) Я могу заключить, что байтовый массив правильно конвертируется в int и наоборот.

Кто-нибудь может мне помочь? Что я тут не так делаю? Спасибо! :)

Ответы на вопрос(4)

Ваш ответ на вопрос