PulseAudio multi-usuario en Debian Stretch

A estas alturas la única razón por la que no llamo a estos posts “Desaventuras en la tierra de Linux, parte 99” es porque quiero que el título refleje el tema del post. En este caso se trata de PulseAudio y su compatibilidad multi-usuario en Debian Stretch.

Antes que nada, si sólo tienes un usuario en tu distro de Linux entonces este post no es de tu interés y puedes dejar de leer ahora. Si, en cambio, tienes varios usuarios, este post te puede interesar.

El problema de PulseAudio en Debian Stretch es que, de forma predeterminada, sólo está activo para un usuario y si intentas iniciar sesión como otro usuario o ejecutar programas como otro usuario, el segundo usuario no podrá usar PulseAudio. Lo anterior no necesariamente significa que el segundo usuario no tendrá sonido ya que además de PulseAudio es muy probable que también se haya instalado ALSA cuando instalaste Debian Stretch; así que, por ejemplo, yo puedo ejecutar el MPV para ver una película como un segundo usuario y podré escuchar el sonido porque el reproductor usará ALSA si no puede usar PulseAudio. El problema surge, obviamente, cuando el programa que el segundo usuario quiere ejecutar requiere forzosamente PulseAudio, por ejemplo, Firefox.

Firefox en Linux recientemente dejó de soportar ALSA y ahora requiere forzosamente PulseAudio. Para el primer usuario eso no es un problema, Firefox tendrá acceso a PulseAudio y reproducirá el audio sin problemas pero, si inicias sesión como un segundo usuario, este no podrá usar PulseAudio y eso significa que no habrá forma de tener audio en Firefox.

La razón por la que Debian Stretch limita PulseAudio a un usuario se debe, según parece, a “cuestiones de seguridad”, lo que puede ser una razón válida pero no deja de ser decepcionante que, siendo PulseAudio un sistema basado en el concepto de servidor/cliente, no se pueda hacer uso de esa característica para permitir a varios usuarios tener audio usando un único servidor de PulseAudio… o, mejor dicho, sí se puede pero Debian no aprovecha esa característica y además no hay una forma sencilla de habilitarla sino que, para variar, requiere ensuciarte las manos búscando información en internet sobre los oscuros comandos necesarios para poder utilizar una poderosa herramienta que debería venir activada de forma predeterminada.

La solución para tener audio para varios usuarios consiste, como era de esperarse, en iniciar el servidor de PulseAudio del primer usuario de forma que permita al segundo usuario (o más) reproducir audio usando el servidor iniciado por el primer usuario. Bastante simple pero, por supuesto, imposible de hacer sin tener que pasar varias horas cazando información 😦 .

Para empezar, la configuración de PulseAudio predeterminada de Debian Stretch hace imposible la tarea de compartir el servidor de audio con otros usuarios, así que tenemos que cargar una configuración personalizada. Por suerte, PulseAudio buscará los archivos de configuración en ~/.config/pulse antes de cargar los predeterminados del sistema, así que podemos copiar los archivos de sistema a nuestro directorio home antes de continuar:

monstruosoft@debian:~$ cp /etc/pulse/default.pa ~/.config/pulse/
monstruosoft@debian:~$ cp /etc/pulse/client.conf ~/.config/pulse/

El archivo de configuración default.pa define cómo se iniciará el servidor de PulseAudio, mientras que el archivo client.conf define cómo se iniciarán los clientes de PulseAudio. El servidor de PulseAudio se puede iniciar en un modo de sistema pero todas las fuentes dicen que iniciarlo en este modo no es recomendable, así que iniciaremos el servidor en modo de usuario y lo configuraremos para que acepte conexiones de clientes de otros usuarios; para hacer esto debemos editar el archivo ~/.config/default.pa y buscar la sección marcada como ‘### Load several protocols’ y modificarla para que quede como se muestra a continuación, los cambios están marcados en negrita:

### Load several protocols
.ifexists module-esound-protocol-unix.so
load-module module-esound-protocol-unix
.endif
load-module module-native-protocol-unix socket=/tmp/monstruosoft-pulse-socket auth-group=audio

Estas modificaciones definen primero un socket, la forma a través de la cual los clientes se conectarán al servidor de PulseAudio, puedes usar el nombre que quieras para el socket pero debes ponerlo, de preferencia, en una ruta donde todos los usuarios que usarán PulseAudio tengan permiso de lectura y escritura como, en este caso, /tmp/. La segunda modificación usa el argumento auth-group para indicar que todos los usuarios que pertenezcan al grupo audio tendrán permiso para conectarse al servidor de PulseAudio. Así de simple. Por qué está opción no es la predeterminada o por qué no hay una forma sencilla de activarla en Debian Stretch es algo que no puedo entender 😦 . En fin, esta simple configuración es todo lo que se necesita para que el servidor de PulseAudio permita que otros usuarios que estén en el grupo audio tengan sonido. Simple, sí, pero me tomó horas encontrar y entender la solución. ¡No debería ser así! 😦 . Algunas fuentes sugieren usar el argumento auth-anonymous, que permite a cualquiera usar el servidor de PulseAudio. Desde un punto de vista de “seguridad”, creo que usar auth-group es una mejor opción. También existen otros argumentos y opciones para identificar a los clientes que pueden conectarse al servidor de PulseAudio, incluyendo el uso de un archivo cookie para identificarse.

Con los cambios anteriores al archivo default.pa podemos iniciar un servidor de PulseAudio que permita conexiones de otros usuarios en el grupo audio. Ahora simplemente debemos configurar los clientes de PulseAudio; esto es, una vez más, tan simple que no debería requerir buscar por horas 😦 . Para configurar el cliente de PulseAudio, abre el archivo ~/.config/client.conf y modifica la siguiente línea:

; default-server =

para que quede de como se muestra a continuación:

default-server = unix:/tmp/monstruosoft-pulse-socket

Nota el indicador de protocolo unix: en la definición de la ruta del socket para conectarse al servidor de PulseAudio. El nombre del socket debe ser, obviamente, el mismo que usaste en el archivo default.pa.

Con estos simples cambios todo está listo. Para aplicar los cambios podemos reiniciar el servidor de PulseAudio usando los siguientes comandos:

monstruosoft@debian:~$ pulseaudio --kill
monstruosoft@debian:~$ pulseaudio -D

Por supuesto, habrás notado que aún no hemos configurado el cliente de PulseAudio para los demás usuarios. Como lo imaginarás, simplemente se requiere hacer las mismas modificaciones que hicimos al archivo client.conf para cada usuario al que quieras darle acceso al servidor de PulseAudio, por ejemplo, /home/usuario2/.config/pulse/client.conf. Recuerda que usuario2 debe estar en el grupo audio, eso lo puedes configurar en la ventana de ‘Usuarios y Grupos’ del menú de LXDE.

Con estos simples cambios ahora Firefox tendrá sonido sin importar cuantas cuentas de usuario estén abiertas simultáneamente.

En teoría, los cambios deberían cargarse automáticamente cada que reinicies la PC pero, claro, las cosas nunca pueden ser tan fáciles 😦 . En mi PC, PulseAudio no se inicia automáticamente después de hacer estos cambios, no se carga la configuración de sistema en /etc/pulse ni mi configuración personalizada, así que tengo que iniciar PulseAudio manualmente con el comando pulseaudio -D cada que reinicio la PC. Esta es una molestia menor a cambio de tener sonido para todos los usuarios.

Algunas notas extra:

  • Si no quieres hacer los cambios descritos en este post, puedes matar pulseaudio para un usuario e iniciarlo para otro, de esta manera puedes tener sonido para uno u otro usuario pero no para ambos al mismo tiempo.

  • Por alguna de esas razones sin explicación, en Debian Stretch es posible que tengas que ejecutar alsamixer para configurar el volumen después de reiniciar el servidor de PulseAudio.

  • Algunos comandos útiles relacionados con PulseAudio son pactl (por ejemplo pactl info), pacmd y pavucontrol (el control de volumen de PulseAudio).

  • Puedes verificar el estado de PulseAudio ejecutando pacmd o pactl info que mostrarán un error si PulseAudio no está en ejecución. También puedes ejecutar pulseaudio –check que regresará un código de salida 0 si PulseAudio está listo y un 1 si no está listo. Puedes checar el código de salida de un programa con el comando echo $?.

  • Creo que la razón por la que PulseAudio no se ejecuta automáticamente puede ser debido a que la existencia del archivo de socket /tmp/monstruosoft-pulse-socket puede hacer que el inico de Debian considere que el servidor ya está en ejecución. Poner el socket en /dev/shm o borrar el socket al apagar la PC tal vez podría ayudar… tal vez.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s