-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSound.java
More file actions
94 lines (83 loc) · 3.29 KB
/
Sound.java
File metadata and controls
94 lines (83 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.*;
public class Sound {
private Clip clip;
private static double volumenGlobal = 0.5; // Volumen global (0.0 a 1.0)
// Constructor que carga el archivo de sonido
public Sound(String filePath) {
try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(filePath).getAbsoluteFile());
clip = AudioSystem.getClip();
clip.open(audioInputStream);
aplicarVolumen(); // Aplicar volumen al crear el clip
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
e.printStackTrace();
}
}
// Método para reproducir el sonido
public void play() {
if (clip != null) {
aplicarVolumen(); // Asegurar que tiene el volumen actual
clip.setFramePosition(0); // Reiniciar posición
clip.start();
}
}
// Método para detener el sonido
public void stop() {
if (clip != null && clip.isRunning()) {
clip.stop();
}
}
// Método para reiniciar el sonido (para efectos cortos como disparos)
public void restart() {
if (clip != null) {
aplicarVolumen(); // Asegurar volumen actual
clip.setFramePosition(0);
clip.start();
}
}
// Método privado para aplicar el volumen al clip
private void aplicarVolumen() {
if (clip != null && clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) {
try {
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
double value = volumenGlobal <= 0.01 ? 0.01 : volumenGlobal;
float dB = (float) (Math.log10(value) * 20.0);
// Limitar el valor dB al rango permitido
dB = Math.max(gainControl.getMinimum(), Math.min(dB, gainControl.getMaximum()));
gainControl.setValue(dB);
} catch (Exception e) {
// Silenciar errores si el control no está disponible
}
}
}
// Método estático para cambiar el volumen global (afecta a todos los sonidos)
public static void setVolumenGlobal(double volumen) {
volumenGlobal = Math.max(0.01, Math.min(1.0, volumen));
}
// Método de instancia para compatibilidad (actualiza el volumen de este clip)
public void setVolume(double value) {
if (clip != null && clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) {
try {
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
double vol = value <= 0.01 ? 0.01 : value;
float dB = (float) (Math.log10(vol) * 20.0);
dB = Math.max(gainControl.getMinimum(), Math.min(dB, gainControl.getMaximum()));
gainControl.setValue(dB);
} catch (Exception e) {
// Silenciar errores
}
}
}
// Método para obtener el volumen global actual
public static double getVolumenGlobal() {
return volumenGlobal;
}
// Método para liberar recursos
public void close() {
if (clip != null) {
clip.close();
}
}
}