Sonido al presionar un boton
Hola gente.
Les cuento...
Acabo de terminar de programar un piano, pero la cosa es que al momento de presionar el boton este libera el sonido al levantar el dedo, y lo que quiero es que al momento de presionar sobre la tecla (boton) suene.
Y la otra es que quiero poder presionar 2 teclas al mismo tiempo, seguramente esto se hace con Threads. Estoy tratando de realizarlo con AsyncTasks pero no logro resolverlo.
Espero me puedan ayudar, Saludos.
- Inicie sesión o regístrese para enviar comentarios
Sonido...
Has tenido suerte... hace unos días tuve que añadir a una GUI unos sonidos para cuando pulsabas un boton normal, cuando saltaba algun error o cuando salia algun dialogo de pregunta. Utilice una clase que extendia de la clase Threads y quedó algo tal que asi: (no se si será lo mas optimo, pero no se me ocurrio otra cosa)
import sun.audio.*;
import java.io.*;
import java.net.URL;
public class FuncionalidadSonido extends Thread {
private InputStream in;
AudioStream as = null;
/**
* Depende el parametro que recibe el constructor suena una cosa u otra.
*
* @param pTipoSonido
* - error - dialogo - boton - inicio
* @throws IOException
*/
public FuncionalidadSonido(String pTipoSonido) throws IOException {
if(pTipoSonido == null){
return;
}
// inn = new InputStream[3];
if (pTipoSonido.equals("error")) {
// in = new
// FileInputStream(getClass().getResource("/sonidos/dialogo-error.wav").toString());
in = new FileInputStream("src/sonidos/dialogo-error.wav");
} else if (pTipoSonido.equals("dialogo")) {
// in = new
// FileInputStream(getClass().getResource("/sonidos/dialog-pregunta.wav").toString());
in = new FileInputStream("src/sonidos/dialog-pregunta.wav");
} else if (pTipoSonido.equals("boton")) {
// in = new
// FileInputStream(getClass().getResource("/sonidos/boton.wav").toString());
in = new FileInputStream("src/sonidos/boton.wav");
} else if (pTipoSonido.equals("inicio")) {
// in = new
// FileInputStream(getClass().getResource("/sonidos/inicio.wav").toString());
in = new FileInputStream("src/sonidos/inicio.wav");
} else {
// in = new
// FileInputStream(getClass().getResource("/sonidos/boton.wav").toString());
in = new FileInputStream("src/sonidos/boton.wav");
}
as = new AudioStream(in);
}
public void run() {
AudioPlayer.player.start(as);
}
/**
* sustituye al metodo stop que esta deprecated. El thread sigue funcionando
* pero el sonido se corta.
*/
public void pararActual() {
AudioPlayer.player.stop(as);
}
public void sonidoBoton() {
try {
new FuncionalidadSonido("boton").start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void sonidoError() {
try {
new FuncionalidadSonido("error").start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void sonidoDialogo() {
try {
new FuncionalidadSonido("dialogo").start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void sonidoInicial() {
try {
new FuncionalidadSonido("inicio").start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Lo que tienes que hacer ahora en la clase donde quieres que suena es declarar un objeto del tipo FuncionalidadSonido fs = new FuncionalidadSonido(null) y pasarle null como parametro ya que he creado metodos llamandose a si mismo con los distintos sonidos.
Que consigues? que puedan sonar dos sonidos distintos ya que "fs" funciona como Thread padre que llama a el resto de los Thread hijos. Debes tener en cuenta que si el sonido es muy largo, no se parara a menos que llames al metodo de pararActual().
Si tienes algun problema dimelo. El funcionamiento en alguna clase seria el siguiente:
FuncionalidadSonido fs;
public Prueba(){
fs = new FuncionalidadSonido(null);
}
...
//Hacer que suene el sonido del boton
fs.sonidoBoton(); // Se creara un thread con el sonido del boton.
//Hacer que suene un error
fs.sonidoError();
}
Lo que comentas de que quieres que suene cuando presiones la tecla en vez de cuando justo levantas el dedo de ella es cambiar el keyevent.
Tienes estos 3 tipos referentes a los keyevent:
keyPressed - cuando pulsas la tecla hacia abajo
keyReleased - cuando levantas la tecla
keyTyped - El caracter unicode que representa esta tecla se manda por el teclado al sistema de entrada
Despues de ver la respuesta
Despues de ver la respuesta de iocio encontr'e esto
http://stackoverflow.com/questions/26305/how-can-i-play-sound-in-java
La diferencia es que AudioPlayer es un api no publico y te puede causar problemas en el futuro ( lo descontinuan, ya no sale, no esta disponible, tiene bugs. etc. etc. )
Pero basicamente el mecanismo es el mismo.
gracias
Esta bien saberlo. Me lo apunto para la proxima.
Saludos