Soporte ALSA para el Bt878a y Fedora Core 4

English Version

Nota: Este articulo tiene una versión anterior utilizando Fedora Core 2. Queda obsoleto.

1.1 - Componentes
1.2 - Preparación
1.3 - Actualización versión ALSA
1.4 - Comprobación
2.1 - Mezclador
3.1 - Captura de prueba (1)
3.2 - Parcheo aplay.c
3.3 - Captura de prueba (2)
4.1 - SoX bajo ALSA
4.2 - Captura prueba SoX ALSA Ensoniq
4.3 - Captura prueba SoX ALSA Bt878a
5.1 - Conexión nativa a GNUradio



1.1 - Componentes

Fedora Core 4
Linux Kernel 2.6.11
ALSA 1.0.9rc4
Tarjeta de sonido Ensoniq 1371
Tarjeta capturadora Bt878a modificada
 

1.2 - Preparación

Instalación típica de Linux.

El instalador ha detectado automáticamente la tarjeta de sonido Ensoniq 1371 pero no la del Bt878a.

/etc/modprobe.conf

alias eth0 3c59x
alias snd-card-0 snd-ens1371
options snd-card-0 index=0
options snd-ens1371 index=0
remove snd-ens1371 { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-ens1371
alias usb-controller uhci-hcd

Añadimos las siguientes líneas al fichero /etc/modprobe.conf para la carga automática del soporte ALSA para Bt87x

alias snd-card-1 snd-bt87x
alias sound-slot-1 snd-bt87x
options snd-bt87x index=1 load_all


Dejando de esta manera la tarjeta de sonido Creative con el numero 0 y la etapa de audio del Bt878 con el numero 1. Es especialmente importante la opción "load_all" para que funcione correctamente la carga del modulo.

 

1.3 - Actualización versión ALSA

Obtención de ficheros. Descargo la última versión de aquí: http://www.alsa-project.org/ . Descargo: alsa-driver-1.0.9rc4a.tar.bz2, alsa-lib-1.0.9rc4.tar.bz2, alsa-utils-1.0.9rc4a.tar.bz2 y alsa-oss-1.0.9rc4.tar.bz2.

# cd alsa-lib-1.0.9rc4
# ./configure
# make
# make install

# cd alsa-driver-1.0.9rc4a
# ./configure --with-cards=ens1371,bt87x
# make
# make install

# cd alsa-utils-1.0.9rc4a
# ./configure
# make
# make install

# cd alsa-oss-1.0.9rc4
# ./configure
# make
# make install


Reiniciamos el equipo.

 

1.4 - Comprobación

Tras el reinicio la lista de módulos cargados presenta este aspecto:

# lsmod
Module                  Size  Used by
lp                     13001  0 
autofs4                29253  2 
rfcomm                 42333  0 
l2cap                  30661  5 rfcomm
bluetooth              56133  4 rfcomm,l2cap
sunrpc                167813  1 
video                  15941  0 
button                  6609  0 
battery                 9413  0 
ac                      4805  0 
md5                     4033  1 
ipv6                  268097  8 
uhci_hcd               35152  0 
bt878                  10457  0 
bttv                  161393  1 bt878
video_buf              23749  1 bttv
i2c_algo_bit            9289  1 bttv
v4l2_common             5825  1 bttv
btcx_risc               4937  1 bttv
tveeprom               13017  1 bttv
videodev                9537  1 bttv
shpchp                 94405  0 
parport_pc             28933  0 
parport                40585  2 lp,parport_pc
i2c_viapro              8017  0 
i2c_core               21569  4 bttv,i2c_algo_bit,tveeprom,i2c_viapro
snd_bt87x              16712  3 
snd_ens1371            32224  3 
gameport               18633  1 snd_ens1371
snd_rawmidi            30880  1 snd_ens1371
snd_ac97_codec         79484  1 snd_ens1371
snd_seq_oss            39424  0 
snd_seq_midi_event      8704  1 snd_seq_oss
snd_seq                63504  4 snd_seq_oss,snd_seq_midi_event
snd_seq_device          9356  3 snd_rawmidi,snd_seq_oss,snd_seq
snd_pcm_oss            51872  0 
snd_mixer_oss          18560  4 snd_pcm_oss
snd_pcm               100104  5 snd_bt87x,snd_ens1371,snd_ac97_codec,snd_pcm_oss
snd_timer              34180  2 snd_seq,snd_pcm
snd                    56932  16 snd_bt87x,snd_ens1371,snd_rawmidi,snd_ac97_codec,snd_seq_oss,snd_seq,snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer
soundcore              10913  4 snd
snd_page_alloc         10244  2 snd_bt87x,snd_pcm
3c59x                  45033  0 
mii                     5441  1 3c59x
floppy                 65269  0 
dm_snapshot            17413  0 
dm_zero                 2113  0 
dm_mirror              26029  0 
ext3                  132553  2 
jbd                    86233  1 ext3
dm_mod                 58101  6 dm_snapshot,dm_zero,dm_mirror


Comprobamos los periféricos de sonido ALSA:

# ll /dev/snd/
total 0
crw-------  1 root root 116,  0 Aug  7 20:17 controlC0
crw-------  1 root root 116, 32 Aug  7 20:17 controlC1
crw-------  1 root root 116,  8 Aug  7 20:17 midiC0D0
crw-------  1 root root 116, 24 Aug  7 20:17 pcmC0D0c
crw-------  1 root root 116, 16 Aug  7 20:17 pcmC0D0p
crw-------  1 root root 116, 17 Aug  7 20:17 pcmC0D1p
crw-------  1 root root 116, 56 Aug  7 20:17 pcmC1D0c
crw-------  1 root root 116, 57 Aug  7 20:17 pcmC1D1c
crw-------  1 root root 116,  1 Aug  7 20:17 seq
crw-------  1 root root 116, 33 Aug  7 20:17 timer

pcmC1D0c corresponde a la entrada de sonido digital del Bt878 y pcmC1D1c a la entrada analógica.

 

2.1 - Mezclador

Instalamos el gnome-alsamixer. Parece ser que el mezclador incluido en el Fedora Core 4 conecta con el mixer OSS emulado y no con el nativo ALSA. (?)

Página oficial gnome-alsamixer http://www.paw.co.za/projects/gnome-alsamixer/.
Parece que esta página ya no esta mantenida. Finalmente he obtenido la versión 0.9.6 de aquí: http://rpm.pbone.net/index.php3/stat/4/idpl/1699907/com/gnome-alsamixer-0.9.6-3.1.fc3.rf.i386.rpm.html .

Instalar gnome-alsamixer-0.9.6-3.1.fc3.rf.i386.rpm

Gnome ALSA Mixer Ensoniq 1371

gnome-alsa-mixer-ensoniq

Gnome ALSA Mixer Bt878

gnome-alsa-mixer-bt87x-b7878a

Subimos el volumen al máximo y seleccionamos la entrada "TV Tuner" (como indica la imagen).

 

3.1 - Captura de prueba (1)

Realizamos una captura de prueba utilizando el comando arecord nativo de ALSA:

# arecord -D hw:1,1 -r 448000 -f S16_LE -t wav test.wav
arecord: main:456:
bad speed value 448000

-D hw:1,1   
1 es el segundo periférico físico (el primero es el 0, en mi caso la tarjeta de sonido) y 1 es el segundo periférico lógico (el primero es el 0, la interfase digital del Bt878a)
-r 448000      muestras por segundo
-f S16_LE    Formato "signed word little-endian"

Falla. arecord esta limitado a 192000 Sps. Lo parcheamos.

 

3.2 - Parcheo aplay.c

Modificamos aplay.c para que nos permita la máxima velocidad. Nos situamos en el directorio de las utilidades ALSA que hemos instalado anteriormente. La utilidad arecord es un alias de aplay.

# cd alsa-utils-1.0.9rc4a/aplay/
# gedit aplay.c

Nos situamos en la línea 456 y modificamos el valor 192000 por 1792000:


if
(tmp < 2000 || tmp > 1792000) {
 

Grabamos y compilamos nuevamente:

# cd ..
# make
# make install
 


3.3 - Captura de prueba (2)

Realizamos captura de prueba:

# arecord -D hw:1,1 -r 896000 -f S16_LE -t wav test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 896000 Hz, Mono
Y funciona correctamente. Ahora tenemos ALSA funcionando a 896000 Sps. Obtenemos el siguiente análisis de espectro utilizando la técnica del "cable alrededor de un aparato de televisión" (descrito en un artículo anterior).


Espectrograma con baudline


 

4.1 - SoX bajo ALSA

SoX soporta ALSA pero es necesario compilarlo para poder acceder a un periférico nativo (?). Descargo la última versión estable (sox-12.17.7.tar.gz) de aquí http://sox.sourceforge.net/.

Compilamos:

# cd sox-12.17.7
# ./configure

Aparece este Warning pero lo ignoramos:

...
configure: WARNING: sound/asound.h: present but cannot be compiled
configure: WARNING: sound/asound.h: check for missing prerequisite headers?
configure: WARNING: sound/asound.h: see the Autoconf documentation
configure: WARNING: sound/asound.h: section "Present But Cannot Be Compiled"
configure: WARNING: sound/asound.h: proceeding with the preprocessor's result
configure: WARNING: sound/asound.h: in the future, the compiler will take precedence
configure: WARNING: ## --------------------------------------------- ##
configure: WARNING: ## Report this to cbagwell@users.sourceforge.net ##
configure: WARNING: ## --------------------------------------------- ##
...


# make
# make install

El instalador no ha colocado el binario en el lugar adecuado. Lo copiamos manualmente:

# cd src
# ll /usr/bin/sox
-rwxr-xr-x 1 root root 275584 May 12 16:09 /usr/bin/sox
# ll sox
-rwxr-xr-x 1 root root 756042 Aug 7 19:39 sox
# mv /usr/bin/sox /usr/bin/sox.old
# cp sox /usr/bin/

 

Comprobamos la instalación de SoX y observamos que ALSA es uno de los "tipos" soportados:

# sox -Vh
sox: Version 12.17.7
Usage: [ gopts ] [ fopts ] ifile [ fopts ] ofile [ effect [ effopts ] ]
gopts: -e -h -p -v volume -V
fopts: -r rate -c channels -s/-u/-U/-A/-a/-i/-g/-f -b/-w/-l/-d -x
effect: avg band bandpass bandreject chorus compand copy dcshift deemph earwax
echo echos fade filter flanger highp highpass lowp lowpass mask mcompand
noiseprof noisered pan phaser pick pitch polyphase rate repeat resample reverb
reverse silence speed stat stretch swap synth trim vibro vol
effopts: depends on effect
Supported file formats: aiff al alsa au auto avr cdr cvs dat vms gsm hcom
la lu maud nul ossdsp prc raw sb sf sl smp sndt sph 8svx sw txw ub ul uw voc
vorbis vox wav wve

 

4.2 - Captura prueba SoX ALSA Ensoniq

# sox -V -r 48000 -w -t alsa /dev/snd/pcmC0D0c -t .wav test.wav
sox: Input file /dev/snd/pcmC0D0c: using sample rate 48000
size shorts, encoding signed (2's complement), 1 channel
sox: Writing Wave file: Microsoft PCM format, 1 channel, 48000 samp/sec
sox: 96000 byte/sec, 2 block align, 16 bits/samp
sox: Output file test.wav: using sample rate 48000
size shorts, encoding signed (2's complement), 1 channel
sox: Output file: comment "Processed by SoX"

sox: Finished writing Wave file, 983040 data bytes 491520 samples


Funciona bien.

 

4.3 - Captura prueba SoX ALSA Bt878a

# sox -V -r 48000 -w -t alsa /dev/snd/pcmC1D1c -t .wav test.wav
sox: Failed reading /dev/snd/pcmC1D1c: ioctl operation failed 22


Falla.
 

-V   Verbose
-r   Sample rate
-w   Word
/dev/snd/pcmC0D0c
   Periférico nativo ALSA para la Ensoniq 1371.
/dev/snd/pcmC1D1c
   Periférico nativo ALSA para el Bt878a. D1 es el segundo periférico lógico (el primero es D0, la interfase digital del Bt878). Y la letra c en el nombre del periférico significa modo captura (para el modo de reproducción es p).
 

El problema que aparece ahora es que SoX genera error "ioctl opeation failed 22" con todas las combinaciones de parámetros.

# sox -V -r 448000 -sw -t alsa /dev/snd/pcmC1D1c -t .wav test.wav
sox: Failed reading /dev/snd/pcmC1D1c: ioctl operation failed 22

He comprobado el correcto funcionamiento de SoX contra ALSA al conectar a la Ensoniq (/dev/snd/pcmC0D0c) pero no contra nuestro chip.

Continuara...

 

5.1 - Conexión nativa a GNUradio

Una vez compilado GNUradio en nuestro equipo es extremadamente fácil utilizarlo para conectar al Bt878 mediante el periférico nativo ALSA.

Ejemplo audio_fft_alsa.py

alsa-gnuradio-bt878-fft-spectrum-spectrogram-1
FFT de 450KHz de una señal de 896000 Sps


 

 

- Agradecimientos

Clemens Ladisch
Chris Bagwell



- Autor:

Juan Domenech Fernandez

http://www.domenech.org
 

English Version

v1.2 01-mayo-2006
v0 11-octubre-2004