Saturday, January 07, 2012

:: Configurar mais de um dispositivo de som como DEFAULT no Linux ::

Como prometi no post anterior, aqui vai uma dica que é bem útil pra mim e que espero seja útil para mais gente.

Descrição do problema:

Tenho dois dispositivos de som no meu PC de casa, sendo a placa de som onboard (onde estão ligados meus speakers 5.1) e meu headset USB (Logitech G930). Ambos funcionam perfeitamente no Linux (com exceção dos botões de função do G930).

Minha esposa prefere usar os speakers para ouvir música, ouvir as ligações (skype) e assistir vídeos (youtube). E eu prefiro usar o headset quando estou trabalhando.

O grande "dilema" é que utilizamos usuários diferentes no Linux e, nesse caso, perfis diferentes no que se refere aos dispositivos de som. Esse dilema surge porque os aplicativos do linux são variados, utilizam bibliotecas variadas e, sendo assim, não têm um comportamento uniforme como acontece no Windows ou MacOS. Eu posso selecionar meu headset para ser o dispositivo default nas configurações do KDE. A partir daí todos os aplicativos do KDE que usam som vão lançar o som por ali. Por exemplo, as notificações de som dos aplicativos/sistema, as músicas que o Amarok toca, etc. Porém o plugin de flash vai fazer o áudio dos vídeos do youtube saírem pelo dispositivo que está setado como default pelo ALSA (que é o subsistema de audio que o Linux usa (ou pelo menos a grande maioria das distribuições)).

Teoria de como resolver o MEU problema:

O que eu preciso é configurar um dispositivo como sendo o default do sistema, ou seja, para todos os usuários esse dispositivo será o primário; configurar exceções para que em casos específicos (usuário da minha esposa, por exemplo) o default device seja outro.

Então o que eu quero é:
  • Headset G930 - dispositivo default do sistema
  • Placa de som - dispositivo default para minha esposa
Como resolver, na prática:

A magia está em fazer a configuração via arquivo "~/.asoundrc" (notar que "~" indica a pasta HOME do usuário; o "." no início do nome do arquivo indica que ele é um arquivo oculto).

O ALSA, ao detectar a existência desse arquivo no HOME do usuário passa a obedecer as regras ali indicadas, ao invés de seguir sua configuração padrão.

Por default, meu Linux reconhece a placa de som onboard como sendo o dispositivo primário de áudio. Como quero que o primário, globalmente falando, seja meu headset, então preciso em primeiro lugar mudar esse "comportamento". Para isso basta editar o arquivo /etc/modprobe.d/sound.conf e alterar os índices dos dispositivos ali presente. Então o headset fica com o índice "0" e a placa de som fica com "1". Ficaria mais ou menos assim (não estou postando do meu PC, então não lembro exatamente como está lá):

options snd-usb-audio index=0
options snd-hda-intel index=1

Então agora meu headset é o primário e a placa de som a secundária. Agora preciso fazer com que a placa de som seja a "primária" para o usuário da minha esposa. Então vamos ao "~/.asoundrc".

Em minhas pesquisas na Internet descobri várias maneiras de se obter essa configuração. Porém as que utilizei antes da "versão final", me deixavam com um pequeno-grande problema: quando um aplicativo estava usando o dispositivo de som, outros aplicativos ficam impossibilitados de o usar. Por exemplo, se eu rodasse um video do youtube no navegador, o que é feito pelo plugin de flash, esse ficava ativo o tempo todo, não liberando o dispositivo mesmo depois do vídeo já ter acabado. Assim nem mesmo os aplicativos do KDE (como o Amarok) conseguiam produzir sons. Ou, no meu caso, em que o Amarok já inicia junto com o KDE, aquele já tomava conta do dispositivo de som (mesmo que não estivesse tocando nada) e ferrava tudo.

O segredo está em habilitar a mixagem por software, o que possibilita que mais de um aplicativo toquem sons simultaneamente (se por acaso alguém precisa disso), mas o mais importante, um aplicativo não fica "de dono" do dispositivo quando não está fazendo nada, deixando que outros possam utilizá-lo.

Primeiro precisamos ver com qual número de identificação o dispositivo foi identificado pelo sistema. Isso é feito com o comando "aplay -l". No meu caso a placa de som onboard está como "card 1".

A grande magia: (configuração do ~/.asoundrc):

pcm.!default {
type plug
slave.pcm "dmixer"
}

pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hw:1,0"
}
bindings {
0 0
1 1
}
}

ctl.dmixer{
type hw
card 1
}
Pronto, com esse arquivo dentro do HOME da minha esposa a placa de som fica como default para ela, enquanto que o meu headset fica como default globalmente.
Quem tiver alguma dǘvida sobre como fazer a magia funcionar, deixe um comentário que eu vejo se posso ajudar. De antemão já aviso que não sou um mestre em ALSA e suas magias negras. Apenas tive que dar uma pesquisada para fazer funcionar como eu estava precisando.
Para os meu amigos "non-linux-users" que tenho certeza vão ficar me zoando e dizendo coisas como "porra, mas até pra configurar uma coisa simples como essa no Linux é um parto"... Sim, eu concordo com vocês. Não sei se em alguma outra distribuição essa configuração toda é mais fácil de ser implementada via ferramenta gráfica. Na distribuição que uso (alguns diriam que eu TEIMO em usar), não rola. Mas sigo insistindo no Slackware justamente porque é graças a essa "crueza" que eu aprendo cada vez mais, ao contrário do que acontece com os pobre Joe Users que estão soltos pelo mundo a fora ;)

Enjoy!

No comments: