Привет всем в попытках написания музыкального плеера возникла потребность в плавном изменении громкости звука код рабочий вот только при изменении громкости слышен треск как можно это исправить?
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) {
}
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей