HowTo:Workstation:Audio
De Luispa
Audio: ALSA y PulseAudio (configuración final)
Después de varios meses con el Audio funcionando-a-medias, he decidido documentar en este artículo la configuración definitiva de ALSA y PulseAudio. A modo de referencia he dejado enlaces a mi primer y segundo artículos, así como una versión antigua de este mismo, quedando todos obsoletos.
ALSA es la Arquitectura Avanzada de Sonido para Linux que ofrece un entorno de audio y midi para que sea utilizado por el sistema operativo. Los drivers que controlan las tarjetas de entrada/salida vienen en el kernel 2.6, así como un emulador de OSS. Todo el acceso a ALSA "debería" hacerse a través de su API.
- Recomiendo leer esta Introducción muy buena sobre conceptos como arquitectura de las tarjetas de audio, pcm, I/O digital vs analógico, etc. Parte de lo documentado aquí es una copia (traducida) de dichos enlaces.
- Del gráfico (fuente) hay que destacar que los cuadrados VERDES indican que existe puerto físico, y la explicación de estas funcionalidades de las tarjetas de audio es la siguiente:
* Line In - entrada analógica desde un dispositivo externo * Mic In - entrada analógica desde un micrófono mono de bajo nivel. * Line Out - salida analógica hacia un dispositivo externo * Speaker - salida analógica amplificada hacia Altavoces externos. * PCM playback - salida del stream digital generado desde software * PCM Capture - entrada de stream digital que se envía al software * Synthesizer - stream generado desde wavetable (a investigar más...) * Mixer - Dispositivo de control
- La tarjeta de audio consiste en tres conjuntos de componentes:
* Connectoress - Son los "jacks" de siempre, para conectarse al micrófono, altavoces, otros equipos. * Circuitos de Audio - amplifican, "mezclan" la señal de audio, y convierten entre digital y análogico. * Interfaz - conexión de la tarjeta de audio al bus del sistema
El "Interfaz" entre la tarjeta de audio y el procesador suele ser el bus PCI. El hardware que implementa el interfaz está normalmente dentro del 'southbridge', que es parte del chipset de la motherboard. El nombre que se le asigna a la Tarjeta de Audio normalmente es el del southbridge chip. Uso el programa alsamixer para analizar las funcionalidades ofrecidas por cada una de las tarjetas. Para cambiar de Playback a Capture se usa la tecla TAB:
PULSEAUDIO es un Servidor de Sonido multiplataforma, capaz de funcionar por la red LAN. Todo el control se realiza a través de un único proceso que se ejecuta en el segundo plano aceptando una o más fuentes de sonido (SOURCES: micrófonos, line-in, capturadoras, otros procesos) y enviándolo a uno o varios destinos (SINK's = Sumideros: tarjetas de sonido con Altavoces, otros servidores PulseAudio remotos u otros procesos). El objetivo es que todos los flujos de sonido pasen a través de PulseAudio, incluyendo aquellos que provienen de procesos que intentan acceder directamente al hardware.
Proyecto
El objetivo del proyecto es instalar ALSA y PulseAudio de modo que todo el sistema de Sonido y Grabación funcione perfectamente, con la mayor cantidad de aplicaciones posibles, de momento todas aquellas que funcionan con ALSA o PA en nativo y también aquellas que lo hagan mediante wrappers intermedios (para OSS y DSP).
- Este es el Hardware que tengo, 3 dispositivos
- Estos son los drivers que voy a utilizar de ALSA:
Tarjeta de Audio : HDA-Intel - HDA Intel (Incluida en mi motherboard Gigabyte GA-EX58-Extreme WebCam con micro : USB-Audio - QuickCam Pro 9000 Capturadora TV : CX88x - Conexant CX8801
- Mi objetivo final es conseguir esta arquitectura:
alsa/udev
drivers
+-------+
[ALTAVOCES] <-- HDA Intel <-----|<- OUT | /------ Apps. nativas pulseaudio
| | /\------ "padsp"------ Apps. acceso directo dsp
[MICRO] ------> HDA Intel -----\| |--- PulseAudio <--
|-> IN | \------ ALSA ----- Apps nativas alsa
[MICRO] ------> WebCam -----/| |
+-------+
ALSA
Los pasos para ALSA consisten en configurar los drivers del kernel, parametrizarlos (en modprobe.d/alsaconf), instalar las herramientas de apoyo.
- El hardware mencionado, tarjetas HDA Intel (pci), Terratek (pci) y la QuickCam (usb), aparecen de esta forma en el equipo:
# lspci : 00:1b.0 Audio device: Intel Corporation 82801JI (ICH10 Family) HD Audio Controller 0a:01.0 Multimedia video controller: Conexant Systems, Inc. CX23880/1/2/3 PCI Video and Audio Decoder (rev 05) 0a:01.1 Multimedia controller: Conexant Systems, Inc. CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port] (rev 05) 0a:01.2 Multimedia controller: Conexant Systems, Inc. CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port] (rev 05) : # lsusb : Bus 001 Device 005: ID 046d:0990 Logitech, Inc. :
Kernel
- Esta es la configuración del Kernel. Te recomiendo echar un ojo a la Matriz de drivers de ALSA para configurar correctamente los tuyos.
| Configuración del kernel de Linux: Sound Card Support |
--- Sound card support
<M> Advanced Linux Sound Architecture --->
< > Open Sound System (DEPRECATED) --->
--- Advanced Linux Sound Architecture
<M> Sequencer support
< > Sequencer dummy client
<M> OSS Mixer API
<M> OSS PCM (digital audio) API
[*] OSS PCM (digital audio) API - Include plugin system
[*] OSS Sequencer API
[ ] Dynamic device file minor numbers
[ ] Support old ALSA API
[ ] Verbose procfs contents
[ ] Verbose printk
[ ] Debug
[ ] Generic sound devices --->
[*] PCI sound devices --->
[*] USB sound devices --->
< > ALSA for SoC audio support --->
[*] PCI sound devices --->
<M> Intel HD Audio --->
[*] Build hwdep interface for HD-audio driver
[ ] Allow dynamic codec reconfiguration (EXPERIMENTAL)
[*] Support digital beep via input layer
[*] Build Realtek HD-audio codec support
[*] Build Analog Device HD-audio codec support
[*] Build IDT/Sigmatel HD-audio codec support
[*] Build VIA HD-audio codec support
[*] Build ATI HDMI HD-audio codec support
[*] Build NVIDIA HDMI HD-audio codec support
[*] Build INTEL HDMI HD-audio codec support
[*] Build Conexant HD-audio codec support
[*] Build C-Media HD-audio codec support
[*] Build Silicon Labs 3054 HD-modem codec support
[*] Enable generic HD-audio codec parser
[*] Aggressive power-saving on HD-audio
(0) Default time-out for HD-audio power-save mode
[*] USB sound devices <M> USB Audio/MIDI driver < > Tascam US-122, US-224 and US-428 USB driver < > Native Instruments USB audio devices < > Tascam US-122L USB driver
|
- Instalo el nuevo kernel (todavía no arranco el equipo, primero voy a instalar y configurar alsa.
Instalación y Configuración ALSA
- Instalación de los componentes
# emerge -v gnome-alsamixer alsa-utils # rc-update add alsasound boot
- La configuración de ALSA, propietaria de las tarjetas, consiste en parametrizar los módulos del kernel que se van a cargar. Probé con UDEV y reglas (pruebas que realicé) para fijar el orden de cada dispositivo dentro de alsa, pero sin resultado. Al final he preferido fijar el orden de forma manual
- Fuerzo el orden de las tarjetas manualmente, es decir, el de los drivers del kernel.
# HDA Intel alias snd-card-0 snd-hda-intel alias sound-slot-0 snd-hda-intel options snd-hda-intel index=0 # QuickCam alias snd-card-1 snd-usb-audio alias sound-slot-1 snd-usb-audio options snd-usb-audio index=1 # Terratec Cinergy HT PCI alias snd-card-2 cx88-alsa alias sound-slot-2 cx88-alsa options cx88-alsa index=2
- Añado el usuario "luis" al grupo audio
# gpasswd -a luis audio Adding user luis to group audio
Reboot del equipo
- Ya está todo preparado. Arranco el equipo con el nuevo kernel y todo listo para cargar los drivers con su configuración. Durante el arranque del equipo veo los drivers ALSA.
Descripcción Driver ALSA en el Kernel =============================================== - ============================ Tarjeta de Audio - Realtek ALC889A - snd-hda-intel WebCam con micro - QuickCam Pro 9000 - snd-usb-audio Capturadora TV - Terratec Cinergy HT PCI MKII - cx88-alsa
- Verifico qué tarjetas de audio se han activado y en que el orden es el correcto (tal como fijé en /etc/modprobe.d/alsa.conf)
| Código: # cat /proc/asound/cards |
0 [Intel ]: HDA-Intel - HDA Intel
HDA Intel at 0xfdff4000 irq 22
1 [Q9000 ]: USB-Audio - QuickCam Pro 9000
Logitech, Inc. QuickCam Pro 9000 at usb-0000:00:1a.7-6, high speed
2 [CX8801 ]: CX88x - Conexant CX8801
Conexant CX8801 at 0xf8000000
|
- Más adelante configuraré cada uno de los componentes de cada tarjeta, así como su volumen, pero de momento voy a quitar el silencio de los canales de audio (PCM y Master), para hacer una prueba rápida. Hay varias formas de hacerlo...
- Opción 1: El programa alsamixer
# alsamixer
- Opción 2: El programa amixer
# amixer set Master 100 unmute # amixer set PCM 100 unmute
- Opción 3: El programa gráfico de Gnome
Arranco el programa System->Preferencias->Volume Control (ver gráfico) y subo el Front. Añado la aplicación "Volume Control" al panel superior de Gnome para poder subir/bajar el volumen.
Prueba rápida
- Conecto mis altavoces estereo al conector de audio (verde) de la caja y hago una prueba rápida, busco algún fichero .wav en el sistema y lo reproduzco:
$ aplay /usr/share/sounds/login.wav
Comandos ALSA: alsamixer
- Detalles de la tarjeta 0 (HDA Intel)
# alsamixer -c0 (NOTA: Ejecutarlo desde root y asegurándonos que NO existe el fichero /etc/asound.conf)
Card: HDA Intel
Chip: Realtek ALC889A
[Playback] Item: Master Volumen maestro de los altavoces.
Item: Headphone Volumen maestro de los cascos (headphones)
Item: PCM ?? (Aunque lo ponga a volumen 0 todo sigue funcionando, Investigar para qué vale)
Item: Front Volumen STEREO de los altavoces frontales
Item: Front Mic Volumen STEREO playback Mic frontal. No confundir con Mic en "Capture"
Item: Front Mic Boost Subir volumen del Mic (1,2,3) en saltos de 20db's. No confundir con Mic Boost en Capture
Item: Surround Volumen STEREO de los altavoces Surround
Item: Center Volumen STEREO de los altavoces Centrales
Item: LFE ?? no se qué es.
Item: Side Volumen STEREO de los altavoces laterales
Item: Line Volumen STEREO de la salida de línea
Item: Mic ??
Item: Mic Boost ??
Item: IEC958 ??
Item: IEC958 Default PCM ??
Item: Beep ??
[Capture] Item: Front Mic Boost
Item: Mic Boost
Item: IEC958
Item: Capture
Item: Capture 1
Item: Input Source Mic
Item: Input Source 1 Mic
- Detalles de la tarjeta 1 (USB WebCam)
# alsamixer -c1 (NOTA: Ejecutarlo desde root y asegurándonos que NO existe el fichero /etc/asound.conf) Card: QuickCam Pro 9000 Chip: USB Mixer [Playback] (vacio. Es normal, la cámara no tiene salidas de audio) [Capture] Item: Mic. # amixer -c 1 -i scontrols Simple mixer control 'Mic',0
- Detalles de la tarjeta 2 (Sintonizadora de TV Conexant)
# alsamixer -c2 (NOTA: Ejecutarlo desde root y asegurándonos que NO existe el fichero /etc/asound.conf)
Card: Conexant CX8801
Chip: CX88
[Playback] Item: Playback
[Capture] Item: Playback
Item: Capture
# amixer -c 2 -i scontrols
Simple mixer control 'Playback',0
Simple mixer control 'Capture',0
Comandos ALSA: amixer
- El comando amixer es muy útil para trabajar desde la línea de comandos para "ver" toda la configuración de las tarjetas y sus items. También permite cambiar parámetros.
- amixer: CONTROLES SIMPLES
# amixer -c 0 -i scontrols Simple mixer control 'Master',0 Simple mixer control 'Headphone',0 Simple mixer control 'PCM',0 Simple mixer control 'Front',0 Simple mixer control 'Front Mic',0 Simple mixer control 'Front Mic Boost',0 Simple mixer control 'Surround',0 Simple mixer control 'Center',0 Simple mixer control 'LFE',0 Simple mixer control 'Side',0 Simple mixer control 'Line',0 Simple mixer control 'Mic',0 Simple mixer control 'Mic Boost',0 Simple mixer control 'IEC958',0 Simple mixer control 'IEC958 Default PCM',0 Simple mixer control 'Capture',0 Simple mixer control 'Capture',1 Simple mixer control 'Capture',2 Simple mixer control 'Beep',0 Simple mixer control 'Digital',0 Simple mixer control 'Input Source',0 Simple mixer control 'Input Source',1 Simple mixer control 'Input Source',2
- Para ver toda la configuración de la HDA Intel (en micaso tarjeta 0)
# amixer -c 0 scontents Simple mixer control 'Master',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback 0 - 64 Mono: Playback 62 [97%] [-2.00dB] [on] Simple mixer control 'Headphone',0 Capabilities: pswitch Playback channels: Front Left - Front Right Mono: Front Left: Playback [on] Front Right: Playback [on] Simple mixer control 'PCM',0 Capabilities: pvolume Playback channels: Front Left - Front Right Limits: Playback 0 - 255 Mono: Front Left: Playback 188 [74%] [-13.40dB] Front Right: Playback 188 [74%] [-13.40dB] Simple mixer control 'Front',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 64 Mono: Front Left: Playback 57 [89%] [-7.00dB] [on] Front Right: Playback 57 [89%] [-7.00dB] [on] Simple mixer control 'Front Mic',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 31 Mono: Front Left: Playback 26 [84%] [4.50dB] [on] Front Right: Playback 26 [84%] [4.50dB] [on] Simple mixer control 'Front Mic Boost',0 Capabilities: volume Playback channels: Front Left - Front Right Capture channels: Front Left - Front Right Limits: 0 - 3 Front Left: 2 [67%] Front Right: 2 [67%] Simple mixer control 'Surround',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 64 Mono: Front Left: Playback 44 [69%] [-20.00dB] [on] Front Right: Playback 44 [69%] [-20.00dB] [on] Simple mixer control 'Center',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback 0 - 64 Mono: Playback 42 [66%] [-22.00dB] [on] Simple mixer control 'LFE',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback 0 - 64 Mono: Playback 43 [67%] [-21.00dB] [on] Simple mixer control 'Side',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 64 Mono: Front Left: Playback 37 [58%] [-27.00dB] [on] Front Right: Playback 37 [58%] [-27.00dB] [on] Simple mixer control 'Line',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 31 Mono: Front Left: Playback 16 [52%] [-10.50dB] [on] Front Right: Playback 16 [52%] [-10.50dB] [on] Simple mixer control 'Mic',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 31 Mono: Front Left: Playback 31 [100%] [12.00dB] [off] Front Right: Playback 31 [100%] [12.00dB] [off] Simple mixer control 'Mic Boost',0 Capabilities: volume Playback channels: Front Left - Front Right Capture channels: Front Left - Front Right Limits: 0 - 3 Front Left: 2 [67%] Front Right: 2 [67%] Simple mixer control 'IEC958',0 Capabilities: pswitch pswitch-joined cswitch cswitch-joined Playback channels: Mono Capture channels: Mono Mono: Playback [on] Capture [off] Simple mixer control 'IEC958 Default PCM',0 Capabilities: pswitch pswitch-joined Playback channels: Mono Mono: Playback [off] Simple mixer control 'Capture',0 Capabilities: cvolume cswitch Capture channels: Front Left - Front Right Limits: Capture 0 - 46 Front Left: Capture 19 [41%] [3.00dB] [on] Front Right: Capture 19 [41%] [3.00dB] [on] Simple mixer control 'Capture',1 Capabilities: cvolume cswitch Capture channels: Front Left - Front Right Limits: Capture 0 - 46 Front Left: Capture 16 [35%] [0.00dB] [on] Front Right: Capture 16 [35%] [0.00dB] [on] Simple mixer control 'Capture',2 Capabilities: cvolume cswitch Capture channels: Front Left - Front Right Limits: Capture 0 - 46 Front Left: Capture 17 [37%] [1.00dB] [on] Front Right: Capture 17 [37%] [1.00dB] [on] Simple mixer control 'Beep',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 31 Mono: Front Left: Playback 9 [29%] [-21.00dB] [on] Front Right: Playback 9 [29%] [-21.00dB] [on] Simple mixer control 'Digital',0 Capabilities: cvolume Capture channels: Front Left - Front Right Limits: Capture 0 - 120 Front Left: Capture 120 [100%] [30.00dB] Front Right: Capture 120 [100%] [30.00dB] Simple mixer control 'Input Source',0 Capabilities: cenum Items: 'Mic' 'Front Mic' 'Line' Item0: 'Line' Simple mixer control 'Input Source',1 Capabilities: cenum Items: 'Mic' 'Front Mic' 'Line' Item0: 'Mic' Simple mixer control 'Input Source',2 Capabilities: cenum Items: 'Mic' 'Front Mic' 'Line' Item0: 'Mic'
- amixer: CONTROLES
# amixer -c 0 controls numid=39,iface=MIXER,name='Master Playback Switch' numid=38,iface=MIXER,name='Master Playback Volume' numid=11,iface=MIXER,name='Headphone Playback Switch' numid=40,iface=MIXER,name='PCM Playback Volume' numid=19,iface=MIXER,name='Front Mic Boost' numid=15,iface=MIXER,name='Front Mic Playback Switch' numid=14,iface=MIXER,name='Front Mic Playback Volume' numid=2,iface=MIXER,name='Front Playback Switch' numid=1,iface=MIXER,name='Front Playback Volume' numid=4,iface=MIXER,name='Surround Playback Switch' numid=3,iface=MIXER,name='Surround Playback Volume' numid=7,iface=MIXER,name='Center Playback Switch' numid=5,iface=MIXER,name='Center Playback Volume' numid=8,iface=MIXER,name='LFE Playback Switch' numid=6,iface=MIXER,name='LFE Playback Volume' numid=17,iface=MIXER,name='Line Playback Switch' numid=16,iface=MIXER,name='Line Playback Volume' numid=18,iface=MIXER,name='Mic Boost' numid=13,iface=MIXER,name='Mic Playback Switch' numid=12,iface=MIXER,name='Mic Playback Volume' numid=20,iface=MIXER,name='Capture Switch' numid=21,iface=MIXER,name='Capture Switch',index=1 numid=22,iface=MIXER,name='Capture Switch',index=2 numid=23,iface=MIXER,name='Capture Volume' numid=24,iface=MIXER,name='Capture Volume',index=1 numid=25,iface=MIXER,name='Capture Volume',index=2 numid=33,iface=MIXER,name='IEC958 Default PCM Playback Switch' numid=29,iface=MIXER,name='IEC958 Playback Con Mask' numid=30,iface=MIXER,name='IEC958 Playback Pro Mask' numid=31,iface=MIXER,name='IEC958 Playback Default' numid=32,iface=MIXER,name='IEC958 Playback Switch' numid=35,iface=MIXER,name='IEC958 Capture Default' numid=34,iface=MIXER,name='IEC958 Capture Switch' numid=37,iface=MIXER,name='Beep Playback Switch' numid=36,iface=MIXER,name='Beep Playback Volume' numid=41,iface=MIXER,name='Digital Capture Volume' numid=26,iface=MIXER,name='Input Source' numid=27,iface=MIXER,name='Input Source',index=1 numid=28,iface=MIXER,name='Input Source',index=2 numid=10,iface=MIXER,name='Side Playback Switch' numid=9,iface=MIXER,name='Side Playback Volume'
- Ejemplo: ver la configuración de la entrada de la tarjeta HDA Intel. En este ejemplo vemos que las tres entradas están asignadas al "Front Mic", algo que suele ser incorrecto.
bolica ~ # amixer -c 0 cget name='Input Source',index=0 numid=26,iface=MIXER,name='Input Source' ; type=ENUMERATED,access=rw------,values=1,items=3 ; Item #0 'Mic' ; Item #1 'Front Mic' ; Item #2 'Line' : values=1 bolica ~ # amixer -c 0 cget name='Input Source',index=1 numid=27,iface=MIXER,name='Input Source',index=1 ; type=ENUMERATED,access=rw------,values=1,items=3 ; Item #0 'Mic' ; Item #1 'Front Mic' ; Item #2 'Line' : values=1 bolica ~ # amixer -c 0 cget name='Input Source',index=2 numid=28,iface=MIXER,name='Input Source',index=2 ; type=ENUMERATED,access=rw------,values=1,items=3 ; Item #0 'Mic' ; Item #1 'Front Mic' ; Item #2 'Line' : values=1
- Para coregirlo y asignar la entrada de línea (line) a la entrada index=0, y el microfono a las entradas index=1 y 2 , se haría así:
# amixer -c 0 cset name='Input Source',index=0 'Line' # amixer -c 0 cset name='Input Source',index=1 'Mic' # amixer -c 0 cset name='Input Source',index=2 'Mic'
- Ejemplo: obtener datos del volumen del Master con "cget"
# amixer -c 0 cget name='Master Playback Volume' numid=38,iface=MIXER,name='Master Playback Volume' ; type=INTEGER,access=rw---R--,values=1,min=0,max=64,step=0 : values=62 | dBscale-min=-64.00dB,step=1.00dB,mute=0 Que sería equivalente a usar la versión "simple" con "sget" # amixer -c 0 sget 'Master' Simple mixer control 'Master',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback 0 - 64 Mono: Playback 62 [97%] [-2.00dB] [on] En este ejemplo vemos que el valor máximo del volumen es "64", y que actualmente se encuentra en "62", casi a tope.
- Para cambiar el volumen Master simplemente haríamos:
# amixer -c 0 cset name='Master Playback Volume' 40 Que podemos comprobar con el control simple, por ejemplo: # amixer -c0 sget Master Simple mixer control 'Master',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback 0 - 64 Mono: Playback 40 [62%] [-24.00dB] [on]
Configuración completa con amixer
- Con todos estos comandos podemos ver y ajustar la configuración manualmente, e incluso podríamos guardarnos en un pequeño script todo lo necesario para dejarlo siempre a nuestro gusto:
#!/bin/bash # PLAYBACK # Max # ========================================================================== amixer -c0 cset name='Master Playback Switch' on amixer -c0 cset name='Master Playback Volume' 64 # 0-64 amixer -c0 cset name='Headphone Playback Switch' on amixer -c0 cset name='PCM Playback Volume' 188,188 # 0-255 amixer -c0 cset name='Front Playback Switch' on amixer -c0 cset name='Front Playback Volume' 64,64 # 0-64 amixer -c0 cset name='Front Mic Boost' 1,1 # 0-3 amixer -c0 cset name='Front Mic Playback Switch' off amixer -c0 cset name='Front Mic Playback Volume' 10,10 # 0,31 amixer -c0 cset name='Surround Playback Switch' off amixer -c0 cset name='Surround Playback Volume' 44,44 # 0-64 amixer -c0 cset name='Center Playback Switch' off amixer -c0 cset name='Center Playback Volume' 44 # 0-64 amixer -c0 cset name='LFE Playback Switch' off amixer -c0 cset name='LFE Playback Volume' 44 # 0-64 amixer -c0 cset name='Side Playback Switch' off,off amixer -c0 cset name='Side Playback Volume' 37,37 # 0-37 amixer -c0 cset name='Line Playback Switch' off,off amixer -c0 cset name='Line Playback Volume' 16,16 # 0-31 amixer -c0 cset name='Mic Playback Switch' off,off amixer -c0 cset name='Mic Playback Volume' 20,20 # 0-31 amixer -c0 cset name='Mic Boost' 1,1 # 0- amixer -c0 cset name='Beep Playback Switch' on,on amixer -c0 cset name='Beep Playback Volume' 9,9 # 0-31 # CAPTURE # Max # ========================================================================== amixer -c0 cset name='Capture Switch' on,on amixer -c0 cset name='Capture Volume' 35,35 # 0-46 amixer -c0 cset name='Capture Switch',index=1 on,on amixer -c0 cset name='Capture Volume',index=1 35,35 # 0-46 amixer -c0 cset name='Capture Switch',index=2 on,on amixer -c0 cset name='Capture Volume',index=2 35,35 # 0-46 amixer -c0 cset name='Digital Capture Volume' 120,120 # 0-120 amixer -c0 cset name='Input Source' 2 # 0='Mic', 1='Front Mic', 2='Line' amixer -c0 cset name='Input Source',index=1 0 # 0='Mic', 1='Front Mic', 2='Line' amixer -c0 cset name='Input Source',index=2 1 # 0='Mic', 1='Front Mic', 2='Line' # IEC958 # ========================================================================== # PLAYBACK amixer -c0 cset name='IEC958 Playback Switch' off amixer -c0 cset name='IEC958 Default PCM Playback Switch' off # CAPTURE amixer -c0 cset name='IEC958 Capture Switch' off # MASKs #amixer -c0 cset name='IEC958 Playback Con Mask' '[AES0=0x0f AES1=0xff AES2=0x00 AES3=0x00]' #amixer -c0 cset name='IEC958 Playback Pro Mask' '[AES0=0x0f AES1=0x00 AES2=0x00 AES3=0x00]' #amixer -c0 cset name='IEC958 Playback Default' '[AES0=0x04 AES1=0x00 AES2=0x00 AES3=0x00]' #amixer -c0 cset name='IEC958 Capture Default' '[AES0=0x04 AES1=0x00 AES2=0x00 AES3=0x00]'
- Que gráficamente equivaldría a los siguiente:
Salvar Niveles Alsa
- Es importante salvar los niveles configurados, para que en el próximo arranque se restauren de la misma forma
# /etc/init.d/alsasound save * Storing ALSA Mixer Levels...
Comandos aplay/arecord
- PLAYBACK: Para ver los dispositivos de Reproducción
$ aplay -l **** List of PLAYBACK Hardware Devices **** card 1: Intel [HDA Intel], device 0: ALC883 Analog [ALC883 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: Intel [HDA Intel], device 1: ALC883 Digital [ALC883 Digital] Subdevices: 1/1 Subdevice #0: subdevice #0
- CAPTURE: Para ver los dispositivos de captura
$ arecord -l **** List of CAPTURE Hardware Devices **** card 0: Intel [HDA Intel], device 0: ALC889A Analog [ALC889A Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: Intel [HDA Intel], device 1: ALC889A Digital [ALC889A Digital] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: Intel [HDA Intel], device 2: ALC889A Analog [ALC889A Analog] Subdevices: 1/2 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 card 1: Q9000 [QuickCam Pro 9000], device 0: USB Audio [USB Audio] Subdevices: 0/1 Subdevice #0: subdevice #0 card 2: CX8801 [Conexant CX8801], device 0: CX88 Digital [CX88 Digital] Subdevices: 1/1 Subdevice #0: subdevice #0
- Para ver los dispositivos PCM usamos el siguiente comando
# aplay -L default:CARD=Intel HDA Intel, ALC889A Analog Default Audio Device front:CARD=Intel,DEV=0 HDA Intel, ALC889A Analog Front speakers surround40:CARD=Intel,DEV=0 HDA Intel, ALC889A Analog 4.0 Surround output to Front and Rear speakers surround41:CARD=Intel,DEV=0 HDA Intel, ALC889A Analog 4.1 Surround output to Front, Rear and Subwoofer speakers surround50:CARD=Intel,DEV=0 HDA Intel, ALC889A Analog 5.0 Surround output to Front, Center and Rear speakers surround51:CARD=Intel,DEV=0 HDA Intel, ALC889A Analog 5.1 Surround output to Front, Center, Rear and Subwoofer speakers surround71:CARD=Intel,DEV=0 HDA Intel, ALC889A Analog 7.1 Surround output to Front, Center, Side, Rear and Woofer speakers iec958:CARD=Intel,DEV=0 HDA Intel, ALC889A Digital IEC958 (S/PDIF) Digital Audio Output null Discard all samples (playback) or generate zero samples (capture)
- Comprobamos OSS
# cat /proc/asound/oss/sndstat
Sound Driver:3.8.1a-980706 (ALSA v1.0.21 emulation code) Kernel: Linux bolica 2.6.32-gentoo-r1 #1 SMP PREEMPT Tue Jan 12 12:24:41 CET 2010 x86_64 Config options: 0 Installed drivers: Type 10: ALSA emulation Card config: HDA Intel at 0xfdff4000 irq 22 Logitech, Inc. QuickCam Pro 9000 at usb-0000:00:1a.7-5, high speed Conexant CX8801 at 0xf8000000 Audio devices: 0: ALC889A Analog (DUPLEX) 1: USB Audio 2: CX88 Digital Synth devices: NOT ENABLED IN CONFIG Midi devices: NOT ENABLED IN CONFIG Timers: 7: system timer Mixers: 0: Realtek ALC889A 1: USB Mixer 2: CX88
- Ver todas las funcionalidades disponibles
# tree /sys/class/sound /sys/class/sound |-- adsp -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/adsp |-- audio -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/audio |-- audio1 -> ../../devices/pci0000:00/0000:00:1a.7/usb1/1-6/1-6:1.2/sound/card1/audio1 |-- card0 -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0 |-- card1 -> ../../devices/pci0000:00/0000:00:1a.7/usb1/1-6/1-6:1.2/sound/card1 |-- controlC0 -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/controlC0 |-- controlC1 -> ../../devices/pci0000:00/0000:00:1a.7/usb1/1-6/1-6:1.2/sound/card1/controlC1 |-- dsp -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/dsp |-- dsp1 -> ../../devices/pci0000:00/0000:00:1a.7/usb1/1-6/1-6:1.2/sound/card1/dsp1 |-- hwC0D2 -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/hwC0D2 |-- mixer -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/mixer |-- mixer1 -> ../../devices/pci0000:00/0000:00:1a.7/usb1/1-6/1-6:1.2/sound/card1/mixer1 |-- pcmC0D0c -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c |-- pcmC0D0p -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p |-- pcmC0D1c -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1c |-- pcmC0D1p -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p |-- pcmC0D2c -> ../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D2c |-- pcmC1D0c -> ../../devices/pci0000:00/0000:00:1a.7/usb1/1-6/1-6:1.2/sound/card1/pcmC1D0c |-- seq -> ../../devices/virtual/sound/seq |-- sequencer -> ../../devices/virtual/sound/sequencer |-- sequencer2 -> ../../devices/virtual/sound/sequencer2 `-- timer -> ../../devices/virtual/sound/timer
PulseAudio
Configuración
- Instalar PulseAudio y todos sus componentes
* Consulta estos artículos sobre la instalación de pulseaudio 0.9.15 y Baselayout2.
Nota: Con pulseaudio está desaconsejado usar el daemon a nivel sistema, es decir, no necesitas el /etc/init.d/pulseaudio. Más adelante explico cómo se debe arrancar desde la sesión X
- Configurar PulseAudio. El fichero más importante es /etc/pulse/default.pa. CONFIGURACIÓN MANUAL, SIN USAR HAL (( Es la opción que estoy usando ))
.nofail .fail load-module module-device-restore load-module module-stream-restore load-module module-card-restore load-module module-augment-properties load-module module-alsa-sink device=hw:0,0 sink_name=altavoces load-module module-alsa-source device=hw:0,0 source_name=linein load-module module-alsa-source device=hw:0,2 source_name=micro load-module module-alsa-source device=hw:1,0 source_name=micusb .ifexists module-esound-protocol-unix.so load-module module-esound-protocol-unix .endif load-module module-native-protocol-unix load-module module-zeroconf-publish load-module module-esound-protocol-tcp auth-ip-acl=127.0.0.1;192.168.1.0/24 load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.1.0/24 .ifexists module-gconf.so .nofail load-module module-gconf .fail .endif load-module module-default-device-restore load-module module-rescue-streams set-default-sink altavoces set-default-source micro
- Con la configuración manual tengo la ventaja de controlar mejor qué es lo que cargo y asignar por defecto los altavoces y micro de la HDA Intel y el Micro a la cámara WebCam.
- En Gonme pido que durante el login se arranque el daemon
/usr/bin/start-pulseaudio-x11
- Arrancar PulseAudio. Tengo configurado Gnome, por lo que lo va a arrancar en cuanto se hagan peticiones a PulseAudio. Es decir, que puede que ya lo tengas arrancado sin darte cuenta. El proceso arrancará con el UID de tu usuario, no de root. Lo que voy a hacer es matarlo, arrancar el PulseAudio Manager (Gnome arrancará también el daemon) y vigilar en paralelo el syslog para ver cómo está arrancando.
# killall pulseaudio # ps -ef | grep -i pulse root 19912 19664 0 12:25 pts/0 00:00:00 grep --colour=auto -i pulse Aplicación->Sonido y Video->PulseAudio Manager En el gráfico de la derecha podemos ver que el Manager se ha conectado con el daemon, es decir, que el daemon ha arrancado. # ps -ef | grep -i pulse luis 20620 1 0 12:29 ? 00:00:00 /usr/bin/pulseaudio --start --log-target=syslog luis 20631 20620 0 12:29 ? 00:00:00 /usr/libexec/pulse/gconf-helper root 20750 20544 0 12:30 pts/0 00:00:00 grep --colour=auto -i pulse # tail -f /var/log/everything/current Sep 3 12:31:46 [pulseaudio] alsa-source.c: Your kernel driver is broken: it reports a volume range from 18,00 dB to 18,00 dB which makes no sense. Sep 3 12:31:46 [pulseaudio] pid.c: Daemon already running. Sep 3 12:31:46 [pulseaudio] alsa-sink.c: Increasing minimal latency to 1,00 ms
- Todo lo anterior no es necesario, como dije en mi Gnome tengo dicho que se arranque el daemon al hacer login. Esto es lo que veo en el syslog durante el login en Xwindow.
Sep 3 12:50:01 [pulseaudio] alsa-source.c: Your kernel driver is broken: it reports a volume range from 18,00 dB to 18,00 dB which makes no sense. Sep 3 12:50:02 [pulseaudio] pid.c: Daemon already running. Sep 3 12:50:02 [pulseaudio] alsa-sink.c: Increasing minimal latency to 1,00 ms Sep 3 12:50:02 [pulseaudio] alsa-sink.c: Increasing minimal latency to 2,00 ms Sep 3 12:50:02 [pulseaudio] alsa-sink.c: Increasing minimal latency to 4,00 ms Sep 3 12:50:02 [pulseaudio] alsa-sink.c: Increasing minimal latency to 8,00 ms
Integrar PulseAudio y Alsa
- Mi objetivo final es conseguir esta arquitectura:
tarjeta audio ---\ /------ aplicaciones nativas pulseaudio
--- alsa/udev --- pulseaudio
webcam con mic --/ driver \------ alsa ----- aplicaciones nativas alsa
Para conseguir la arquitectura es necesario tener instalado el Plugin de PulseAudio para alsalibs, de modo que todas las aplicaciones que sólo soportan el API de ALSA puedan acceder al Servidor de Audio PulseAudio. Una vez instalado el software simplemente tenemos que indicarselo a ALSA, y se hace a través del fichero /etc/asound.conf o ~/.asoundrc. En mi caso lo doy de alta y además indico que por defecto ALSA tiene que usar PulseAudio.
- Nota: Modifico el fichero $HOME/.asoundrc y "NO UTILIZO (vacío o eliminado) el fichero /etc/asound.conf"
# Configuro un dispositivo en ALSA que le conecta con PulseAudio
pcm.pulse {
type pulse
}
ctl.pulse {
type pulse
}
# Fuerzo que todas las aplicaciones de ALSA usen Pulseaudio
pcm.!default {
type pulse
}
ctl.!default {
type pulse
}
- Comprobación: Puedes comprobar cómo ha arrancado usando el PulseAudio Manager (Aplicaciones->Audio>PulseAudio Manager
- Como nota final, el Plugin ALSA - PulseAudio soporta: reproducción de audio, captura de audio y el Mixer.
Configuración de las aplicaciones
Voy a describir aquí algunas aplicaciones que están funcionando directamente con PulseAudio o a través de ALSA->PulseAudio o GStreamer->Pulseaudio.
- Antes de nada, te recomiendo que abras el "Monitor" de PA, que te permite ver qué se está "reproduciendo" y es muy útil para el troubleshooting, dado que todo lo que pasa por PA hacia los altavoces se ve ahí representado
Aplicaciones->Sonido y Video->PulseAudio Volume meter (playback)
Control de dispositivos y volumen
- Una vez que está configurado, la administración del Audio se hace toda desde PulseAudio.
- padevchooser -> Applet muy cómodo para cambiar de sumidero/fuente, acceso al volumen, etc...
- pavucontrol -> Configuración del Volumen y selección de qué sumidero/fuente es el de por defecto.
- Sistema->preferencias->Audio -> Ver cómo Gnome se integra con PA, selección de entrada, salida, etc...
Cambiar la entrada
- Cambiar la entrada desde la cual se realizará la grabación.
ALSA API
- Ya lo hemos visto, pero no está de más recordarlo. Las aplicaciones ALSA utilizan PulseAudio como salida, tras modificar los ficheros /etc/asound.conf o $HOME/.asoundrc
$ aplay /usr/share/sounds/login.wav Playing WAVE '/usr/share/sounds/login.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
VirtualBox
Funciona con ambos, con PulseAudio o ALSA aunque no demasiado bien. He encontrado una solución a través de pulseaudio, que consiste en añadir tsched=0 a la hola de cargar el módulo alsa-sink en el fichero default.pa
load-module module-alsa-sink device=hw:0,0 sink_name=altavoces tsched=0
A partir de dicha modificación el sonido empieza a funcionar correctamente en el Guest con Windows.
VMWare 6.x
Esta aplicación es la única que no soporta ni ALSA ni PULSEAUDIO, sino que trabaja a través de OSS. Eso significa que nunca he conseguido resolver su problema del todo. La única solución ha sido arrancar VMWare sin ningún sonido, con pulseaudio (o alsa) sin acceder al dispositivo o parando el daemon (pulseaudio).
Hace poco he encontrado un thread donde comentan un truco que parece que funciona correctamente. Resumido, consiste en arrancar VMWare con un wrapper que captura sus llamadas a OSS y que las redirige a ALSA. El wrapper se llama libaoss.so (en tiempos probé otro llamado padsp sin éxito). Los enlaces interesantes son:
- Luke's PPA: https://launchpad.net/~themuso/+archive/ppa
- Instrucciones para hacer el wrapping de vmware-vmx con libaoss: https://bugs.launchpad.net/ubuntu/+bug/81742
- Modificación de daemon.conf para PulseAudio: default-fragments y default-fragment-size-msec puestos a 4
"... With this setup I'm finally able to have sound in both the Host Ubuntu OS and (non-choppy & non-stuttering sound) in a Windows XP Professional (32 bit) virtual machine. Your mileage may very (YMMV) depending on your hardware and what not..."
- Describo aquí un resumen de las instrucciones que yo he seguido. No he necesitado set-uid a la libreria y funciona.
1. emerge alsa-oss (tengo la 1.0.17)
3. Parar el vmware player
4. Crear un shell script (por ejemplo vmware.sh) que llame a vmware con la precarga de la librería
#!/bin/bash
#
LD_PRELOAD=/usr/lib64/libaoss.so exec vmware "$@"
5. En la config del Guest poner sonido: 'Autodetect' o '/dev/dsp'
6. Modificar /etc/pulse/daemon.conf
default-fragments = 4
default-fragment-size-msec = 4
7. Arrancar
$ vmware.sh
Y me funciona perfectamente !!
Nota: en el caso de usar sólo ALSA esto debería funcionar también. La única duda es que igual funciona con cortes el audio, que en el caso de usar pulseaudio se resuelve con las opciones antes mencionadas de daemon.conf
VMWare 7.x
Por fin!!!, ya soporta ALSA con lo que todo se arregla
Gnome y GStreamer
- Verifica que tienes hecho el link de esdcompat. Esto engalla a Gnome para que arranque PA en vez de ESD. Lo hace la instalación de PulseAudio, el programa esdcompat es un script.
$ ls -al /usr/bin/esd lrwxrwxrwx 1 root root 18 feb 20 2009 /usr/bin/esd -> /usr/bin/esdcompat
- Configuro en el arranque de Gnome que se inicie el servidor de pulseaudio, el device chooser y el resto de programas de audio
Sistema->Preferencias->Sesiones->Programas de inicio PulseAudio Device Chooser (padevchooser) Sistema de Sonido PulseAudio (start-pulseaudio-x11) Gestor del volumen (/usr/libexec/gnome-volume-manager --sm-disable) Gnome Login Sound (/usr/bin/canberra-gtk-play --id="desktop-login" --description="GNOME Login")
- En Preferencias->Sonido configuro las opciones de Sonido, tanto los dispositivos (todo a pulseaudio) como los sonidos del sistema.
- En Preferencias->Control del Volumen verifico que el mixer es Pulseaudio y que no está en mute, y tiene volumen.
- Configuro el GStreamer. El entorno multimedia GStreamer es un nuevo sistema muy moderno que permite a las aplicaciones conectar con él y que este se encarge de la salida a través de diferentes plugins, esto evita que las aplicaciones tenga que saber de todo (alsa, esd, arts, pulse, ...), simplemente es una capa intermedia que permite hacer el desarrollo para un único interfaz: GStreamer, y este tiene múltiples plugins, entre ellos el gst-pulse. Lo que hago es configurar GStreamer en Gnome para que use dicho plugin:
$ gstreamer-properties
Skype 2.0
- La Beta2.1 es inestable todavía con pulseaudio, porlo tanto he vuelto a la 2.0 y la mejor configuración que he encontrado es la siguiente:
Entrada (micro): ALSA QuickCam. Salida/LLamada: PulseAudio
El único reto es si alguna aplicación está usando el micrófono, skype no podrá acceder a él (pero esto no es algo que ocurrirá normalmente). La ventaja es que al usar PA para salida, me permite compartirlo con otras aplicaciones que están reproduciendo audio. Un ejemplo: es posible ver la Televisión (con vdr y xineliboutput) y a la vez mantener una charla por Skype y que ambas salidas de audio funcionen (no es algo que haremos, pero era por probar). Otro ejemplo: Podemos estar escuchando música con Amarok y cuando entra una llamada la oímos.
Skype 2.1 Beta 2
- He descargado e instalado la nueva Beta (enero/2010) y la configuración funciona perfectamente.
Entrada (micro): PulseAudio Salida/LLamada: PulseAudio
Amarok 2.1
- Amarok soporta PulseAudio en esta versión, así que lo he configurado para que todas sus opciones de Salida apunten a PulseAudio, y la de entrada a QuickCam (aunque no creo que grabe nada :-)).
Preferencias->Configurar Amarok->Reproducción->Configuración del Sistema de Sonido
Plugin de Flash con Audio para Firefox
También funciona perfectamente.
Análisis: ALSA + PulseAudio
- Aplicaciones accediendo al Audio de forma única. Como he descrito antes, todas las aplicaciones que soporten PulseAudio y/o ALSA funcionan perfectamente: Gnome, Skype, VDR, VirtualBox, Amarok, control de volumen.
- Simultanear Aplicaciones:
- VDR funcionando + aplay: OK - VDR funcionando + VMWare: OK - VMWare con guest playing + aplay: OK - Skype "hablando" y sounds de Gnome OK - VirtualBox (alsa/PA) + Skype/aplay/gnomesounds OK - Amarok 1º + Skype OK - VMWare 6.x Necesita el truco comentado - VMWare 7.x OK
- Conclusión:
- Funciona TODO !
NOTA: El único problema que encontré fue VMWare 6.x, que usa /dev/dsp, por lo que monopoliza el audio. Si alguna aplicación está usando el audio y arrancamos un Guest, no tendrá acceso y arranca desconectado. El workaround es desactivar que se emitan sonidos al pulsar botones (preferencias de Audio de Gnome) y conectar manualmente el audio en el Guest. Se soluciona como menciono aquí
- Pendientes: Con gnome hay un bug bastante molesto: falta la etiqueta de temas de sonido en gnome-volume-control: BUG ID 596454
Enlaces y Créditos
| [1] | http://wiki.luispa.com/ | Página principal de LuisPa. |
- Enlaces a estudiar
- http://www.alsa-project.org/main/index.php/Main_Page
- http://alsa.opensrc.org/index.php/Main_Page
- http://www.gentoo.org/doc/es/alsa-guide.xml
- http://www.iua.upf.edu/~dgarcia/Modders/Docs/alsadoc-pcm.html
- http://www.pulseaudio.org/wiki/PerfectSetup
- http://developer.novell.com/wiki/index.php/Feisty/HOWTO:_PulseAudio
- http://en.gentoo-wiki.com/wiki/PulseAudio
Volver a la página de Multimedia
--Luis 21:39 24 ene 2010 (CET)



