Плавное изменение громкости SourceDataLine

264
05 мая 2018, 17:59

Привет всем в попытках написания музыкального плеера возникла потребность в плавном изменении громкости звука код рабочий вот только при изменении громкости слышен треск как можно это исправить?

public class MainClass {
static FloatControl volume;
public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
    /// Gui
    JFrame frame = new JFrame("Test");
    JSlider sld = new JSlider();
    frame.setSize(300, 100);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    sld.setMaximum(100);
    sld.addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent arg0) {
            VolumeConroller.SetVolume(sld.getValue());
        }
    });
    frame.add(sld);
    frame.setVisible(true);
    File f = new File("Test.wav");
    AudioInputStream ais = AudioSystem.getAudioInputStream(f);
    AudioFormat form = ais.getFormat();
    DataLine.Info info = new DataLine.Info(SourceDataLine.class, form);
    SourceDataLine Output = (SourceDataLine) AudioSystem.getLine(info);
    Output.open();
    volume = (FloatControl) Output.getControl(FloatControl.Type.MASTER_GAIN);
    Output.start();
    VolumeConroller vc = new VolumeConroller();
    byte[] data = new byte[5000];
    int hum = 0;
    while (hum != -1) {
        hum = ais.read(data, 0, data.length);
        Output.write(data, 0, data.length);
    }
  }
}

VolumeConroller

public class VolumeConroller extends Thread {
static float destvol = 0;
static float curvol = 0;
public VolumeConroller() {
    SetVolume(50);
    this.start();
}
@Override
public void run() {
    while (true) {
        if (curvol > destvol + 0.1 || curvol < destvol - 0.1) {
            sleep(4);
            if (destvol > curvol) {
                curvol += 0.1;
            } else {
                curvol -= 0.1;
            }
            MainClass.volume.setValue(curvol);
        } else {
            sleep(300);
        }
    }
}
public static void SetVolume(int d) {
    if (d == 0) {
        destvol = -80;
    } else {
        destvol = Map(d, 0, 100, -50f, 0.3f);
    }
}
public static float Map(float n, float start1, float stop1, float start2, float stop2) {
    return ((n - start1) / (stop1 - start1)) * (stop2 - start2) + start2;
}
static void sleep(int t) {
    try {
        Thread.sleep(t);
    } catch (InterruptedException e) {
    }
  }
}
READ ALSO
Не вытягиваются данные с таблицы [требует правки]

Не вытягиваются данные с таблицы [требует правки]

не загружаются данние из таблиц

201
Что необходимо для запуска Java-программ?

Что необходимо для запуска Java-программ?

Предположим я написал программуСамую простую, калькулятор какой-нибудь

244
Получение индекса выбранной RadioButton

Получение индекса выбранной RadioButton

Есть следующая разметка:

335
Как проигрывать звук из mp4 видео?

Как проигрывать звук из mp4 видео?

Каким образом можно проиграть звуковую дорожку видеофайла (mp4) при помощи java? И как её можно остановить/поставить на паузу/перескочить на определённое...

239