2012-04-09 19 views
9

Quiero generar un pitido con una frecuencia y duración específicas (para diferentes señales de sonido) usando el bíper del sistema (y solo los parlantes si el bíper no está disponible/accesible). Sé que es posible hacer esto usando ioctl, pero eso requiere acceso de root, que no quiero.Pitido en Linux en C

Sé que podría usar el comando "beep", pero eso sería una dependencia, que, de ser posible, no debería usarse (no hay dependencias externas, solo las bibliotecas básicas de Linux y C).

Lo que tengo actualmente es el siguiente código (pero esto requiere privilegios de superusuario para ejecutar):

#include <stdlib.h> 
#include <fcntl.h> 
#include <linux/kd.h> 

int main(int argc, char *argv[]) 
{ 
int fd = open("/dev/console", O_RDONLY); 
if (fd == -1 || argc != 3) return -1; 
return ioctl(fd, KDMKTONE, (atoi(argv[2])<<16)+(1193180/atoi(argv[1]))); 
} 

Si no hay otra manera de hacer esto, entonces voy a utilizar pitido, pero me gusta mucho para evitar dependencias e integrar el pitido directamente en mi secuencia de comandos, pero estoy seguro de que alguien aquí sabrá una solución/solución alternativa.

Realmente no quiero bibliotecas externas ya que el programa debe ser tan ligero como sea posible.

+0

Si se ejecuta en una computadora de escritorio, puede usar ALSA. Y también podría usar el comando 'play' ... Y algunos escritorios tienen notificaciones ... –

+0

@BasileStarynkevitch ¿No sería eso complicar demasiado las cosas? Solo quiero un simple pitido con una frecuencia y duración específicas. Como ya le dije a Pablo, quiero mantenerlo tan ligero como sea posible, pero supongo que usar el sonido o el suid para obtener acceso a la raíz es el camino a seguir, entonces? – omnidan

+0

Vea si [esto] (http://stackoverflow.com/questions/412789/windows-beep-equivalent-for-linux) lo ayuda. @paxdiablo afirma que también se puede ejecutar desde una cuenta de usuario. –

Respuesta

3

Creo que la única manera de hacer esto es usar suid para dar acceso a mi propio programa a la raíz, o usar beep, que ya tiene suid. Supongo que solo añadiré una dependencia más, entonces, como beep no es demasiado grande de todos modos.

Gracias por todas las respuestas, estoy seguro de que otras bibliotecas son geniales para señales más complejas, ¡pero necesito una muy simple!

Creo que esta pregunta se puede marcar como resuelta/cerrada, entonces.

Si alguien encuentra una manera de crear un sonido utilizando la consola de superusuario sin-privilegios, todavía estoy interesado en esta solución :)

Gracias a todos de nuevo.

0

Intente utilizar una biblioteca de audio como OpenAL.

+0

Quiero mantener el programa tan ligero como sea posible – omnidan

+0

Luego solo sale un carácter de campana '\ a' y dejar el sonido en el emulador de terminal. Por supuesto, no puede cambiar el tono ni el tono de ese sonido ... –

+0

@BasileStarynkevitch Sí, por supuesto que también es posible, pero quiero que las frecuencias específicas difieran un poco en las señales. – omnidan

2

El pitido más básica sigue siendo '\ a', si nuestro terminal soporta:

fprintf(stdout, "\aBeep!\n"); 
+0

Sí, pero esa es solo una frecuencia. – omnidan

+0

Dije que era básico ... Perdón por eso. (La reacción aún podría ser útil para las personas que visiten esta página después). – wildplasser

+0

Tampoco funciona muy bien si la salida se redirige. –

4

Por favor mirar el código fuente de Linux estándar beep. http://www.johnath.com/beep/beep.c

Utiliza KIOCSOUND ioctl para "bip", pero no necesita privilegios de superusuario para hacerlo funcionar. He configurado que sea legible y ejecutable por los usuarios en el grupo "beep".

Así que mi usuario estándar con UID 1000 está en el grupo con GID 501 (lo llamé "beep"). Además tuve chmod 4750 /usr/bin/beep y ahora puedo escuchar pitidos (en el rango 20-20000Hz) sin pedir privilegios de superusuario.