¿Cómo reproducir sonidos en diferentes tonos en C sin usar ninguna biblioteca externa? Sé que hay docenas de bibliotecas de sonido en C que te permiten reproducir sonido, pero lo que quiero saber es cómo funciona eso detrás. ¿Cómo le dices a la computadora que toque una determinada nota en un cierto tono/frecuencia? Sé que es posible en Windows usando la función sound()
pero no puedo encontrar ninguna documentación que hable sobre Linux, todo lo que encontré es la función beep()
(o write(1, "\a", 1)
) que genera el terminal predeterminado emite un pitido, pero no puedo entender cómo reproducir diferentes sonidos.
La API de audio nativa del kernel de Linux es ALSA (Advanced Linux Sound Architecture).
Ejemplo de reproducción de audio sin procesar con ALSA: https://gist.github.com/ghedo/963382/815c98d1ba0eda1b486eb9d80d9a91a81d995283
Sin embargo, ALSA es una API de bajo nivel que no se recomienda usar directamente en aplicaciones de nivel superior.
Una API de audio de sistema moderno para GNU/Linux sería PulseAudio (el valor predeterminado actual en Ubuntu), o el PipeWire más nuevo y posiblemente mejor (el valor predeterminado en Fedora).
Ejemplo de reproducción de audio sin procesar con PipeWire que genera audio "desde cero":
https://docs.pipewire.org/page_tutorial4.html
¿Cómo le dices a la computadora que toque una determinada nota en un cierto tono/frecuencia?
El sonido es una vibración mecánica que se propaga a través del aire (u otro medio). Se puede representar digitalmente como una secuencia de valores numéricos que representan la presión del aire a una frecuencia de muestreo dada. Para reproducir un tono/frecuencia determinado, genere una onda sinusoidal de esa frecuencia (a la frecuencia de muestreo de la reproducción) y use la API de sonido de su elección para reproducirla.
Consulte el tutorial de PipeWire anterior para ver un ejemplo de generación de un tono de 440 Hz.
Acerca de PulseAudio/PipeWire:
Estas bibliotecas suelen ser parte del sistema operativo y están expuestas como API del sistema (por lo que no son "bibliotecas externas" si eso significa alguna biblioteca para enviar con su programa o pedir a los usuarios que instalen), y deben ser utilizadas por aplicaciones para reproducir audio. .
Detrás de escena, estas bibliotecas manejan el enrutamiento de audio, la mezcla, la cancelación de eco, la grabación y la reproducción en el kernel a través de ALSA (o usando Bluetooth, etc.). Todo lo que los usuarios y desarrolladores esperan de la capa de audio del sistema.
Hasta hace poco, PulseAudio era la API de audio del sistema de escritorio universal de facto, y muchas aplicaciones todavía usan la API PulseAudio para reproducir audio en GNU/Linux. PipeWire incluye compatibilidad con PulseAudio, por lo que las aplicaciones que utilizan la API de PulseAudio seguirán funcionando en el futuro previsible.
Ejemplo de reproducción de audio sin formato con PulseAudio: https://freedesktop.org/software/pulseaudio/doxygen/pacat-simple_8c-example.html