2012-10-10 38 views
6

Estoy intentando agregar sonido a un script de Perl para alertar al usuario de que la transacción fue correcta (es posible que el usuario no esté mirando la pantalla todo el tiempo mientras trabaja). Me gustaría mantenerme lo más portátil posible, ya que la secuencia de comandos se ejecuta en las estaciones de Windows y Linux.
que puedaReproducción de sonido en el script de Perl

use Win32::Sound; 
Win32::Sound::Play('SystemDefault',SND_ASYNC); 

para Windows. Pero no estoy seguro de cómo llamar a un sonido genérico en Linux (Gnome). Hasta el momento, se me ha ocurrido con

system('paplay /usr/share/sounds/gnome/default/alert/sonar.ogg'); 

Pero no estoy seguro de si puedo contar con ese camino que está disponible.
Así, tres preguntas:

  1. ¿Hay una mejor manera de llamar a un sonido por defecto en Gnome
  2. ¿Es ese camino bastante universales (al menos entre los sabores Debain/Ubuntu)
  3. paplay toma un tiempo para salir después de reproducir un sonido, ¿hay una mejor manera de llamarlo?

Prefiero no tocar el parlante del sistema, suena horrible (esto va a jugar mucho) y las listas negras de Ubuntu de todos modos.
Gracias!

Respuesta

3

Una forma más portátil de obtener la ruta a paplay (suponiendo que esté allí) podría ser usar File::Which. Posteriormente, se podría obtener la ruta como:

use File::Which; 
my $paplay_path = which 'paplay'; 

Y para reproducir el sonido de forma asíncrona, puede fork un subproceso:

my $pid = fork; 
if (!$pid) { 
    # in the child process 
    system $paplay_path, '/usr/share/sounds/gnome/default/alert/sonar.ogg'; 
} 

# parent proc continues here 

Nótese también que he utilizado el formulario de varias argumento de system; al hacerlo, evita el shell y ejecuta el programa solicitado directamente. Esto evita errores peligrosos (y es más eficiente).

+0

Estaba pensando en 'fork', pero no estaba seguro de si eso causaría más problemas al ser llamado repetidamente. Lo probaré. ¡Gracias! – charlesbridge

+0

Además, me refiero a la ruta a un archivo de sonido con el que puedo contar para estar disponible para jugar (no 'paplay'). Pero creo que es la misma idea, simplemente (-R $ ruta) hasta que encuentre uno que funcione. – charlesbridge

+0

También, estoy escribiendo esto en Perl/Tk. 'fork' tiene que llamar explícitamente a' CORE :: exit() 'o' POSIX :: _ exit() 'o suceden cosas horribles. – charlesbridge

Cuestiones relacionadas