Publicado el 30 de Marzo del 2018
458 visualizaciones desde el 30 de Marzo del 2018
244,8 KB
9 paginas
Creado hace 14a (21/09/2009)
Configurar Gnu/Linux para producción
musical
Cualquier distribución de Gnu-Linux puede configurarse para trabajar con
audio en tiempo real (con “tiempo real” me refiero a acceder a los procesos
relacionados con el audio sin latencia o tiempo de retardo), en Microsoft
Windows se precisa de controladores especiales para aprovechar el proceso
DSP de las placas de sonido profesionales, estos driver se denominan ASIO
(Audio Stream Input/Output). En Gnu/Linux existe la ventaja de que no se
precisan drivers ni controladores especiales sino que el sistema se configura
para este propósito, desde el corazón mismo que se denomina kernel,
permitiendo así mayor control y rendimiento y no dependiendo de que los
fabricantes de las placas de sonido, nos provean un driver ASIO.
Voy a tratar de hacer un resumen de como configurar un sistema GNU/Linux
para trabajar con audio, basándome en las distribuciones más conocidas,
igualmente existen distribuciones armadas para esto, pero siempre es bueno
saber como se hace.
1-En distribuciones que derivan de Debian como Ubuntu, GNU/Linux Mint,
etc; el kenel real time lo encontramos en los repositorios oficiales de software,
así que abriendo una terminal o consola y escribiendo:
sudo aptitude install linux-image-2.6.XX.X-rt
(El comando sudo es para poder acceder a los permisos de administrador y
hacer cambios de sistema)
En Debian o distribuciones más seguras con el comando su, nos solicita
directamente la contraseña de administrador, y podemos operar con estos
permisos, una vez introducida la clave.
También se puede instalar utilizando el gestor de paquetes visual que tenga la
distribución GNU-Linux, por ejemplo el Gestor de paquetes Synaptic.
2-Luego lo más importante es editar el archivo /etc/security/limits.conf (para
lo que se puede usar como superusuario el editor de textos gedit, nano,
mcedit o cualquier otro disponible), otra vez en la terminal escribimos:
sudo gedit /etc/security/limits.conf y agregamos al final estas líneas:
@audio - rtprio
@audio - nice
@audio - memlock
99
-10
4000000
Guardamos el archivo y reiniciamos la máquina.
Explicación de lo anterior: El valor rtprio es la máxima prioridad con la
que un usuario del grupo audio puede ejecutar una tarea. El valor
memlock es la máxima cantidad de memoria que un miembro del
grupo audio puede bloquear para una tarea siendo ejecutada en
tiempo real. Debería ser inferior a la máxima cantidad de memoria
física; siendo una recomendación común establecerla a la mitad
exacta. El valor nice es el mínimo con el que una tarea puede ser
ejecutada; se trata de la predisposición de una tarea a liberar tiempo
de CPU.
Luego podemos instalar y configurar jack y qjack:
sudo aptitude install qjack jackd
#y luego configurar correctamente jack, ejecutando qjackctl y activando en
setup (o configuración) estas opciones:
tiempo real (activado)
no bloquear memoria (activado)
modo tolerante (activado)
forzar 16bit (activado si querés trabajar en 16 bits)
#y agregás los valores:
Prioridad=70
Cuadros/Períodos=128 (con esto conseguís 5.8 ms de latencia podes
usar 256 también si querés liberar más el cpu consiguiendo 11.4 ms de
latencia -recomendado en pcs mas antiguas-)
Frecuencia de muestreo=44100
Períodos/buffer=2
Máximos puertos=128
Límite de tiempo= 5000 (ms)
Interface= la placa que uses o default
Suavizado=ninguno
Audio=duplex
Dispositivo de entrada=(default)
Dispositivo de salida=(default)
canales=0
latencias=0
Algunos ejemplos de Software Libre Musical:
Ardour: El clon Pro Tools, super rápido-estable y muy profesional
Rosegarden: Secuencer Midi-Audio.
NtEd:Editor de Partituras.
Qsynth: Sampler de Sound Fonts.
Hydrogen: Máquina de ritmos
Audacity: Editor de audio multipista.
ZynAddSubFX: Sinte virtual, con varios tipos de síntesis.
Qjackctl: Interface gráfica para jackd (servidor de audio en tiempo real)
conecta todo que te nombro y lo gestiona.
Plugins Caps y Tap: Muy buenos plugins LADPSA para usar con cualquier
secuencer o editor.
Lmms: Clon de Fruity Loops.
Seq24: Secuenciador midi, basado en loops.
Establecer prioridades RT, o sea aprovechar el
kernel real time:
En esta parte de la explicación me “baso” en el artículo de Florian Paul
Schmidt (muy completo el que quiera lo puede buscar en la web) pero
agregando todo lo que yo pude experimentar.
El paso final es establecer unas cuantas prioridades de tareas. El parche para
tiempo real debería haber creado varias tareas IRQ, así como una tarea
hrtimer. Pueden visualizarse con el comando:
# ps -e
nos muestra lo siguiente (solo copio las tareas que nos pueden llegar a
interesar para audio ya que son muchas, para ahorrar espacio):
PID
TTY TIME
CMD
1
2
3
4
6
12
53
295
296
303
?
?
?
?
?
?
?
?
?
?
00:00:01
init
00:00:00
kthreadd
00:00:00
migration/0
00:00:00
posixcputmr/0
00:01:11
sirq-timer/0
00:00:00
sirq-hrtimer/0
00:00:00
IRQ-9
00:00:25
IRQ-12
00:00:00
IRQ-1
00:00:00
IRQ-8
616
628
645
665
692
752
753
1435
1493
1872
2480
2483
?
?
?
?
?
?
?
?
?
?
?
?
00:00:00
IRQ-16
00:00:00
IRQ-19
00:00:00
IRQ-18
00:00:00
IRQ-23
00:00:00
IRQ-6
00:00:02
IRQ-14
00:00:05
IRQ-15
00:00:00
IRQ-7
00:01:14
IRQ-17
00:00:08
IRQ-20
00:00:00
IRQ-4
00:00:00
IRQ-3
Nos interesan las tareas: sirq-timer/0, sirq-hrtimer/0 y la IRQ de nuestra placa
de sonido que tenemos que ubicar cual es (ya voy a explicar como ubicarla).
En un sistema core dual debe haber dos de cada tarea, una por cada CPU. Yo
no pude comprobarlo porque no tengo core dual.
Vamos a tomar nota del PID de cada una: 6 (sirq-timer) y 12 (sirq-hrtimer).
Luego vamos a buscar el pid de la tarea IRQ en la que reside la tarjeta de
sonido. (En el caso de que la tarjeta de sonido sea usb, correr jackcontrol con
esta tarjeta, y en una consola ver con el comando “top” que dirección IRQ
levanta).
Vemos la salida de:
# cat /proc/interrupts
debería revelar esto:
CPU0
200
IO-APIC-edge
14890
IO-APIC-edge
timer
i8042
2
1
7
0
2
0
IO-APIC-edge
IO-APIC-edge
IO-APIC-edge
floppy
IO-APIC-edge
parport0
IO-APIC-edge
rtc0
IO-APIC-fasteoi
acpi
529675
IO-APIC-edge
i8042
88412
IO-APIC-edge
587044
IO-APIC-edge
ide0
ide1
0
IO-APIC-fasteoi
uhci_hcd:usb1
0:
1:
3:
4:
6:
7:
8:
9:
12:
14:
15:
16:
17:
1685387 IO-APIC-fasteoi ICE1712
18:
19:
20:
23:
0
0
IO-APIC-fasteoi
uhci_hcd:usb3
IO-APIC-fasteoi
uhci_hcd:usb2
19611
IO-APIC-fasteoi
eth0
229710
IO-APIC-fasteoi
ehci_hcd:usb4
NMI: 0
Non-maskable
interrupts
LOC: 7295599 Local timer
interrupts
0 Rescheduling
interrupts
function call
interrupts
TLB shootdowns
Thermal event
interrupts
Spurious
interrupts
RES:
CAL: 0
TLB: 0
TRM: 0
SPU: 0
ERR: 0
MIS: 0
Entonces según esta información:
17: 1660453 IO-APIC-fasteoi ICE1712
el IRQ-17 es donde está mi placa de sonido (en mi caso me doy cuenta porque
ICE1712 es el chipset de las m-audio, que es mi placa)
Para obtener el PID, uso de nuevo el comando:
# ps -e
si se fijan al principio del documento (cuando mostré el resultado de #ps -e)
era el PID 1493
Ahora vamos a utilizar el comando chrt para establecer prioridades real time.
En Debian, este comando forma parte del paquete schedutils. No importa el
orden en el que se establecen las prioridades.
Establecemos nuevas prioridades para cada tarea:
En mi caso:
# chrt -f -p 99 6
# chrt -f -p 99 12
# chrt -f -p 99 1493
Esto debe establecer una prioridad de tiempo real a las tareas identificadas
como 6, 12 y 1493. Una prioridad tan alta como 99 podría no ser en realidad
necesaria e incluso un tanto insegura.
Hay que probar con valores (por lo menos de 50 a 99) hasta encontrar los
adecuados.
Luego y usamos el comando:
# top
para ver si cambiaron las prioridades (antes ejecuté jackd para poner en uso
la placa de sonido para que aparezca IRQ-17 entre los procesos) me devuelve:
PID USER PR NI VIRT RES SHR S %
CPU
TIME+ COMMAND
%
MEM
2747 gabriel 20 0
22588 2052 1716 S 11.6 0.1
0:02.91 jackd
2718 gabriel 20 0
37700 13m 9.9m S 11.3 0.9
0:09.77 gnome-
terminal
2741 gabriel 20 0
44080 11m 9.8m S 10.0 0.8
0:02.98 qjackctl
2577 root
20 0
97.8m 11m 4788 S 6.6
0.8
0:07.85 Xorg
root
1
493
R
T
-5 0
0
0
S 3.3 0.0
2713 gabriel 20 0
30472 11m 7524 S 1.7
295
root
-5
1
-5 0
0
0
S 0.7
2711 gabriel 20 0
20560 10m 7168 S 0.7
2739 gabriel 20 0
2428 1136 900 R 0.3
1
2
3
4
root
root
root
root
20 0
2132 748 652 S 0.0
15 -5 0
RT -5 0
RT -5 0
0
0
0
0
0
0
S 0.0
S 0.0
S 0.0
0.7
0.0
0.7
0.1
0.0
0.0
0.0
0.0
0:01.1
9
IRQ-17
0:01.77 pcmanfm
0:00.70 IRQ-12
0:04.87 lxpanel
0:00.41 top
0:01.38 init
0:00.00 kthreadd
0:00.00 migration/0
0:00.00 posixcputm
r/0
5
6
7
8
root
root
root
root
-5 0
-5 0
-5 0
-5 0
-5
1
R
T
-5
1
-5
1
0
0
0
0
en este caso no aparece la línea:
12
root RT -5 0
0
0
0
0
0
0
S 0.0
0.0
0:00.00 sirq-high/0
S 0.0 0.0
0:00.3
3
sirq-
timer/0
S 0.0
0.0
0:00.00 sirq-net-tx/0
S 0.0
0.0
0:00.00 sirq-net-
rx/0
S0.0 0.0 0:00.01 sirq-
hrtimer/
0
pero se debe a que top esta en movimiento todo el tiempo (pero les aseguro
que está).
Como pueden ver en la sección PR se puede ver la prioridad RT a la que están
corriendo las tareas sirq-timer/0, sirq-hrtimer/0 y IRQ-17.
En realidad todo lo que hicimos hasta ahora sirve para probar el
funcionamiento de las prioridades. Estas prioridades serán restablecidas
después de cada reinicio, así que deberá crearse un script de inicio sencillo,
para recuperarlas.
Dado que los pids de sirq-timer/0 y sirq-hrtimer/0 no van a cambiar, pero el
pid de la placa de sonido sí, vamos a usar "pgrep" para que busque la tarea
IRQ-17, a continuación describo como tiene que ser el contenido del s
Comentarios de: Configurar Gnu/Linux para producción musical (0)
No hay comentarios