Soporte ALSA para el Bt878a y Fedora Core 4
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:
# lsmodModule 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 Bt878
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, MonoY 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
FFT de 450KHz de una señal de 896000 Sps
- Agradecimientos
Clemens Ladisch
Chris Bagwell
- Autor:
Juan Domenech Fernandez
http://www.domenech.org
v1.2 01-mayo-2006
v0 11-octubre-2004