\author {Sven Goldt}
\title {Guía Linux de Programación}

\chapter {Programación del Sonido}
Un PC tiene por lo menos un dispositivo de sonido: el altavoz interno. Pero, usted puede comprar también una tarjeta de sonido para insertar en su PC para
disponer de un dispositivo de sonido más sofisticado. Mire Linux Sound User's Guide o Sound-HOWTO - HOWTO para comprobar las tarjetas soportadas. 

\section {Programación del altavoz interno}
Lo crea o no, el altavoz de su PC es parte de la consola de Linux y
por tanto un dispositivo de carácter. Por tanto, para manipularlo
usaremos llamadas ioctl(). Para el altavoz interno tenemos dos comandos:

\begin {enumerate}
\item KDMKTONE

   \noindent Genera un tono durante un tiempo especificado.

   \noindent Ejemplo: {\tt ioctl (fd, KDMKTONE,(long) argumento)}.

\item KIOCSOUND

   \noindent Genera un tono sin fin, o para otro que suena actualmente.

   \noindent Ejemplo: {\tt ioctl(fd,KIOCSOUND,(int) tono)}.
\end {enumerate}

El {\tt argumento} consiste en un valor de tono en su parte baja y la duración en la parte alta. El valor de tono no es la frecuencia. El temporizador del PC,el 8254, se
cronometra a 1.19 MHz y por tanto es 1190000/frecuencia. La duración se mide en ticks de cronómetro. Las dos llamadas a ioctl vuelven inmediatamente y
por consiguiente puede producir pitidos largos sin bloquear el
programa mientras.\\
El comando KDMKTONE debe usarse para producir señales de aviso ya que
no tiene que preocuparse de parar el tono.\\
El comando KIOCSOUND puede usarse para tocar canciones tal como se
demuestra en el programa de ejemplo {\tt splay} {\it (por favor,
envíeme más ficheros {\tt.sng})}. Para parar el tono hay que usar el
valor 0 en el {\tt tono}.

\section {Programación de una Tarjeta de sonido}

Como programador, le resultará importante saber si el sistema sobre el
que actúa tiene una tarjeta de sonido conectada. Para ello puede
intentar abrir {\tt /dev/sndstat}. Si falla y sale ENODEV en el valor
de {\tt errno}, es porque no hay ningún manejador de sonido activo. El
mismo resultado puede obtenerse chequeando {\tt /dev/dsp}, siempre que
no sea un enlace al manejador {\tt pcsnd} en cuyo caso la llamada {\tt
open()} no fallaría.

Si quiere intentarlo a nivel de hardware, deberá conocer alguna
combinación de llamadas {\tt outb()} e {\tt inb()} para detectar la
tarjeta que está buscando.

Utilizando el manejador de sonido en los programas, tiene la ventaja
de que funcionará igual en otros sistemas 386, ya que la gente
inteligente decidirá usar el mismo controlador en Linux, isc, FreeBSD
y otras versiones de Unix de 386. Esto ayudará a transportar programas
con sonido entre Linux y otras arquitecturas. Una tarjeta de sonido no
es parte de la consola Linux, sino un dispositivo especial. En general
ofrecerá las siguientes prestaciones:

\begin {samepage}
\begin {itemize}
\item Muestreo digital, en entrada y salida
\item Modulación de frecuencia, en salida
\item Interfaz MIDI
\end {itemize}
\end {samepage}

Cada una de estas características tienen su propia interfaz con el
controlador. Para el muestreo digital se usa {\tt /dev/dsp}. Para la
modulación de frecuencia se usa {\tt /dev/sequencer}, y para la
interfaz MIDI se usa {\tt /dev/midi}. Los ajustes de sonido (tal como
volumen o bajos), pueden controlarse mediante la interfaz {\tt
/dev/mixer}. Por compatibilidad se incluye también un dispositivo {\tt
/dev/audio}, capaz que reproducir datos de sonido SUN $\mu$-law,
que los mapea al dispositivo de muestreo digital.

Si supuso la utilización de {\tt ioctl()} para manipular dispositivos
de sonido, está en lo cierto. Las peticiones de esta clase se definen
en $<linux/soundcard.h>$ y comienzan con SNDCTL\_.

\bigskip {\bf Puesto que no tengo una tarjeta de sonido, alguien con
más conocimientos debería continuar este capítulo}

\endinput
