Introdução ========== Muitas vezes queremos que vários aplicativos emitam sons ao mesmo tempo, pode ser o programa de mensagem instantânea que avisa que chegou mensagem enquanto uma música é tocada, ou até mesmo vários usuários que usam o mesmo computador e querem poder utilizar o dispositivo de áudio. Isto não era possível porque o antigo sistema de som, que também está presente em outros sistemas UNIX, o Open Sound System (OSS), deixava apenas um aplicativo obter o acesso ao dispositivo, geralmente o /dev/dsp. Com o ALSA tudo melhorou, isto porque além de suporte aos mais avançados recursos das placas de som ele também fornece uma série de "plugins" que podem ser utilizados para misturar os sons e então possibilitar que vários aplicativos emitam sons (dmix) e até mesmo que vários processos capturem som ao mesmo tempo (dsnoop). Explicarei aqui como configurar o ALSA para tirar proveito destes recursos, principalmente o dmix. Se você já utiliza uma versão recente de ALSA (>1.0) no seu sistema (a maioria das distribuições modernas), não precisa compilar nada, é só modificar um arquivo de configuração! Requisitos ========== Para seguir este tutorial você precisa do ALSA configurado e funcionando, como a maioria das distribuições GNU/Linux novas fornece utilitários para auxiliar tal configuração eu não explicarei esta parte. Caso você encontre problemas, verifique se: * o usuário atual tem permissões para ler e escrever os dispositivos em /dev/snd/ * o módulo ALSA é o correto para seu dispositivo. Você pode visualizar os dispositivos de reprodução com: aplay -l Arquivos a alterar ================== Caso você queira que as alterações tenha efeito para todos os usuários, altere: /etc/asound.conf Caso queira alterar somente o seu usuário: $HOME/.asoundrc Nos exemplos utilizo o /etc/asound.conf Teste Básico ============ Este teste básico deve funcionar sem qualquer configuração extra: aplay -D plug:dmix som_teste1.wav & aplay -D plug:dmix som_teste2.wav & (aplay é parte do pacote alsa-utils) Isto deve tocar os dois arquivos simultâneamente, caso você presenciar alguns "pulos" não se preocupe, configuraremos os buffers mais tarde. Caso este teste não funcione, você não tem seu ALSA configurado direito. Configurando dmix ================= Configure o ALSA (/etc/asound.conf ou ~/.asoundrc): ---- pcm.snd_card { type hw card 0 } pcm.dmixoss { type dmix ipc_key 1234 # precisa ser unico!!! ipc_key_add_uid false # varios usuarios podem utilizar este dispositivo ipc_perm 0666 # deixe que todos escrevam para este dispositivo slave.pcm "snd_card" slave { # configure latency parameters period_time 0 period_size 1024 # precisa ser potencia de 2. buffer_size 8192 # caso o valor acima nao for suficiente, o som pula # buffer_size 16384# mais agressivo ainda # format "S32_LE" # ou SL16_LE } bindings { # Somente os dois primeiros canais serao utilizados (0->0, 1->1) 0 0 # mapeia de 0 para 0 1 1 # mapeia de 1 para 1 } } ctl.dmixoss { type plug slave.pcm "snd_card" } pcm.dsnooposs { type dsnoop ipc_key 34567 slave.pcm "snd_card" slave { # configure latency parameters period_time 0 period_size 1024 # precisa ser potencia de 2. buffer_size 8192 # caso o valor acima nao for suficiente, o som pula # buffer_size 16384# mais agressivo ainda } bindings { # Somente os dois primeiros canais serao utilizados (0->0, 1->1) 0 0 # mapeia de 0 para 0 1 1 # mapeia de 1 para 1 } } pcm.duplex { type asym playback.pcm "dmixoss" # Use nosso sistema multiplexado capture.pcm "dsnooposs" # similar ao DMIX, mas para captura, ele pega uma # unica fonte e converte para varios canais. } # Para compatibilidade com OSS usando o wrapper 'aoss' pcm.dsp0 { type plug slave.pcm "duplex" } ctl.dsp0 { type plug slave.pcm "snd_card" } ctl.mixer0 { type plug slave.pcm "snd_card" } ---- Depois de ter configurado o ALSA, basta escolher nos seus aplicativos que usam ALSA o suporte o dispositivo: "pcm.duplex". Exemplos: * Configure o artsd (kde) para usar ALSA e o dispositivo: pcm.duplex * Configure o mplayer para usar ALSA (-ao alsa) e o dispositivo pcm.duplex (-adevice pcm.duplex) * Configure o xine para usar o ALSA e o dispositvo pcm.duplex Aplicativos que usam a camada OSS devem ser executados com o "wrapper" aoss: aoss meu-programa-que-usa-oss (aoss está no pacote alsa-oss) Exemplos: aoss play som_teste1.wav aoss skype Apêndices ========= Skype + Arts + Dmix =================== Mude o /usr/bin/skype original para skype.bin: mv /usr/bin/skype /usr/bin/skype.bin Crie um novo script /usr/bin/skype: ---- #!/bin/sh WRAPPER="" if artsshell status 2>&1 > /dev/null; then WRAPPER="artsdsp -m" elif which aoss 2>&1 > /dev/null; then WRAPPER="aoss" fi $WRAPPER /usr/bin/skype.bin ---- Lembre-se de evitar que o /usr/bin/skype.bin seja salvo na sessão do KDE, pois ele será reiniciado sem o $WRAPPER e portanto não vai funcionar. Para isso utilize: KControl -> KDE Components -> Session Manager Applications to be excluded from sessions: /usr/bin/skype.bin Referências =========== * Gentoo Wiki: http://gentoo-wiki.com/HOWTO_ALSA_sound_mixer_aka_dmix * http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html * http://alsa.opensrc.org/index.php?page=DmixPlugin