2010-12-15 19 views
12

¿Cómo utilizar el altavoz de PC en Linux para la programación de c/C++? ¿Puedo controlar el pitido y la frecuencia?¿Cómo usar el altavoz de PC en Linux?

+0

alsa-lib http://www.alsa-project.org/alsa-doc/ alsa-lib/ –

+5

Puede obtener una tarjeta de sonido por menos de $ 10. Ya no tiene que ir a ningún lado cerca del altavoz de la PC. –

+4

También 12 preguntas y no hay respuestas aceptadas. Si realmente desea hacer más preguntas en el futuro, ** corrige eso **. – ereOn

Respuesta

2

Es de suponer que si hay todavía un 8253 equivalente en el conjunto de chips conectados a algo parecido a un altavoz, puede acceder de acuerdo con los registros de la hoja de datos o guías antiguas de PC (me alivia admitir que ya no tengo esta información en mi cabeza) ya sea desde un módulo kernel o después de llamar a ioperm() como root.

Hubo también una vez un controlador de audio PWM kernel "analógico" para el altavoz de la PC. Creo que fue la primera vez que compilé un kernel. Esto fue en los días previos a los módulos kernel, o al menos antes de que se convirtieran en distribuciones populares.

+1

En realidad, hay un controlador de dispositivo para esto en el kernel estándar (es posible que no esté cargado). ¿Por qué no usar eso? – MarkR

+0

Sí, es probablemente preferible usar eso si está o puede estar disponible. –

3

Sí, abra un dispositivo de consola (como/dev/console o/dev/tty0), luego emita el KIOCSOUND ioctl, tal como se describe en la página de comando man console_ioctl (4).

Es asqueroso y específico de Linux, pero creo que responde a su pregunta.


EDIT: unbelivably, hay un controlador de PC-altavoz en el núcleo para ALSA que le da la reproducción de sonido digital en el altavoz del PC. Su calidad de sonido será pobre y se utilizará una gran cantidad de CPU aunque :)

9

Tomado de here:

#include <sys/ioctl.h> 
#include <unistd.h> 
#include <linux/kd.h> 
int main(void) 
{ 
    int freq[] = { /* C D E F G A B C */ 
        523, 587, 659, 698, 784, 880, 988, 1046 }; 
    int i; 

    for (i=0; i<8; i++) 
    { 
      ioctl(STDOUT_FILENO, KIOCSOUND, 1193180/freq[i]); 
      usleep(500000); 
    } 
    ioctl(STDOUT_FILENO, KIOCSOUND, 0); /*Stop silly sound*/ 
    return 0; 
} 
Cuestiones relacionadas