Revista Do Linux
 
OUTRAS SEÇÕES
  Cartas
  Variedades
  Rádio Linux
  Mensagem ao Leitor
  CD do Mês
  Coluna do Augusto
  Leitura
  Dicas e truques
  Opinião
 

ALSA: A Arquitetura Avançada de Som para Linux

~SLa música ideas portará,
y siempre continuará,
sonido electrónico,
decibel sintético~T

~WKraftwerk (music nonstop)

Não demorou muito, após o lançamento do kernel Linux, para que alguém se interessasse em implementar suporte a placas de som. Na época, não era comum que placas de som viessem junto dos computadores. Geralmente vinham em ~Skits multimídia~T acompanhadas de unidades de CD-ROM. Havia poucas marcas e modelos disponíveis e, o que pode soar curioso nos dias de hoje: muitas destas placas traziam consigo uma controladora IDE extra integrada para suportar a unidade de CD-ROM que as acompanhava nos kits ou, pior ainda, a comunicação com a unidade de CD-ROM era feita através de protocolos específicos de cada modelo, fazendo com que drives de CD-ROM fossem compatíveis apenas com as placas de som que acompanhavam, tudo dentro do universo ISA de conflitos de IRQ e DMA selecionados em dip-switches nas placas (devo confessar, sinto alguma falta dos dip-switches nas plaquinhas).

A implementação inicial dos drivers de som no kernel linux passou por uma série de trocas de nome e mudanças, até um dia em que o seu autor resolveu criar uma empresa[1] para comercializar seus drivers para outros sistemas Unix, de maneira proprietária. A empresa se comprometeu a liberar de tempos em tempos novas versões GPL de seu driver, no entanto, as novidades e últimas placas de som só seriam suportadas na versão comercial, demorando para que o suporte aparecesse na versão GPL, se é que apareceria.

O suporte a som em Unix limitava-se, geralmente, à leitura e gravação de áudio digital e até mesmo as estações Unix mais caras tinham disponível como hardware de som apenas um conversor analógico para digital e digital para analógico, permitindo apenas a gravação ou o playback de áudio, boa parte das vezes, não simultâneo. Apesar das limitações de hardware da época, o acesso a esses dispositivos sempre seguiu o estilo natural do Unix, tornando a programação muito simples.

Os drivers no kernel usavam como ponto de entrada um arquivo especial de dispositivo em /dev, você abria o arquivo, lia dados dele, e imediatamente estava gravando do microfone; abria o arquivo para escrita, gravava dados nele, e o som simplesmente saía pelos alto-falantes. Simples, intuitivo e elegante. As opções de playback e gravação, como freqüência de amostragem, bits de amostragem e outras, quando disponíveis, eram configuradas através do controle de entrada e saída (veja ioctl (2)) para o dispositivo.

Mas as aplicações possíveis de um computador em áudio não se restringem a isso. Além de gravar e reproduzir áudio, gostaríamos de poder controlar sintetizadores, baterias eletrônicas, equipamentos de gravação e iluminação de palco através do protocolo MIDI (Musical Instrument Digital Interface ou Interface Digital para Instrumentos Musicais) e muito mais.

As placas de som disponíveis para os computadores se sofisticaram. É comum encontrarmos placas capazes de ir muito além de simplesmente gravar e reproduzir áudio em 16 bits, 44.1KHz estéreo. Há placas capazes de produzir som surround, atuar como verdadeiros samplers digitais capazes de fazer música usando como instrumento o miado do seu gato e outros sons gravados por você. Quase todos os teclados musicais disponíveis no mercado contam com entrada e saída MIDI, e você vai gostar de usá-los para editar partituras eletrônicas em seu computador, produzir sua própria música, montar seu próprio estúdio.

As placas de computador vêm com uma grande variedade de chips on-board, com recursos variados, e é preciso ter um conjunto de drivers capaz de se aproveitar desses recursos, suportar a imensa variedade de placas, oferecer suporte poderoso ao processamento de mensagens MIDI, ter resposta rápida aos eventos relacionados com áudio (baixa latência), suportar múltiplos dispositivos simultaneamente, ser capaz de acesso ~Sfull duplex~T aos dispositivos de áudio, (o que significa ser capaz de gravar e tocar ao mesmo tempo) e não limitar o suporte a uma qualidade apenas razoável de áudio. Afinal, placas profissionais suportam 24 bits por amostra em freqüências por vezes superiores a 48KHz de amostragem.

Se isso não bastasse, é necessário ainda oferecer ao programador uma API que seja poderosa, capaz de suportar de maneira consistente as características únicas de cada hardware, de preferência simples, de forma a facilitar o desenvolvimento de aplicações.

Definitivamente, um conjunto de requisitos bastante complexo, que os drivers de som do kernel Linux (que conhecemos por OSS ou Open Sound System) falhavam em oferecer. Por isso, Jaroslav Kysela iniciou o projeto ALSA, Advanced Linux Sound Architecture, ou Arquitetura de Som Avançada para Linux[2].

A arquitetura do OSS não tinha em especial um grande suporte a placas ISA plug-and-play e autodetecção de hardware, não suportava múltiplas placas de som simultaneamente, especialmente se fossem de marcas ou modelos diferentes, além de ter uma API obscura, remendada e de certa forma amadorística.

O OSS iniciou seu desenvolvimento num período em que o kernel Linux sequer suportava carregamento dinâmico de drivers e as placas disponíveis para os simples mortais não possuíam recursos dignos de ser chamados ~Savançados~T, muito menos ~Sprofissionais~T.

Somos muito gratos ao grande trabalho feito pelo OSS nestes anos, e sabemos que suas limitações não são meramente ~Sculpa de seus criadores~T, mas da evolução rápida tanto do kernel Linux como dos recursos de hardware disponíveis para o usuário. É tempo de mudar e, finalmente, no primeiro semestre deste ano os drivers ALSA foram integrados ao Kernel atualmente em desenvolvimento (a série 2.5 de kernels) o que significa que a partir da próxima versão estável teremos todo o benefício desta arquitetura avançada de áudio sem o ônus de compilações adicionais de drivers, ou instalação de pacotes extras.

Quais as novidades?

Os drivers ALSA são extremamente modulares. Ao contrário do OSS, que carrega poucos módulos que fazem muitas coisas, o ALSA faz com que cada módulo cuide de um hardware ou de uma função específica. Uma das primeiras coisas que se nota é a grande quantidade de módulos (geralmente prefixados por ~Ssnd-~T) que são carregados quando iniciamos o ALSA. Isso permite maior flexibilidade no suporte a diferentes chipsets, com diferentes características, além de permitir que diferentes placas com partes semelhantes de hardware compartilhem drivers entre si, reduzindo o uso de memória, entre outras vantagens.

A criação de uma biblioteca conhecida como ~Slibasound~T faz com que o programador não tenha que interagir diretamente com o kernel, utilizando convenções mais intuitivas, liberando o programador das especificidades de cada hardware e, o mais importante, tornando cada vez mais rara a necessidade de se criar incompatibilidades de API quando grandes mudanças na arquitetura dos drivers se fizerem necessárias.

Se a API for forçada a mudar dentro do kernel, as mudanças necessárias serão feitas também na biblioteca libasound, o que, na grande maioria dos casos, preservará aplicações escritas anteriormente, uma vez que a API da biblioteca de programação poderá ser mantida intacta. Os drivers ALSA vêm sendo amplamente utilizados e seu design vem sendo conseqüentemente posto em prova e aperfeiçoado há um bom tempo. Temos hoje APIs bastante estáveis e poderosas, tanto no kernel quanto na biblioteca de desenvolvimento.

Outra coisa que se nota imediatamente é a quantidade de recursos que podem ser acessados através da aplicação mixer dos drivers alsa, conhecida como ~Samixer~T. Você pode alterar cada um dos parâmetros disponibilizados pelo hardware, como o volume de canais individuais de áudio, surround, posicionamento 3D, etc., indo muito além do mero ~SVolume Global/Microfone/CD/Sintetizador/PCM~T dos mixers atuais, e oferecendo total controle sobre os recursos de cada placa e seus parâmetros.

O número de placas suportadas é muito grande, havendo suporte inclusive para placas profissionais capazes de gravar e reproduzir múltiplos canais estéreo simultaneamente, o que permite a criação de aplicações profissionais de gravação e mixagem de áudio digital em tempo real direto para o disco rígido, permitindo seu uso profissional em estúdios digitais. O tempo de resposta do ALSA sempre foi uma preocupação de seus desenvolvedores. Usando kernels com suporte a Real Time, o Linux pode atingir patamares de qualidade semelhantes aos de sistemas voltados para multimídia, como o BeOS (que descanse em paz, no céu dos sistemas operacionais, ao menos por enquanto).

Seqüenciamento MIDI

É na arquitetura do seqüenciador MIDI que estão os avanços mais evidentes e impressionantes em relação à arquitetura anterior. A arquitetura do seqüenciador ALSA segue um conceito próximo ao ~Scliente-servidor~T, em que se pode conectar às portas de entrada e saída MIDI para a troca de mensagens. Estas ~Sportas~T podem ser saídas MIDI físicas interligadas a equipamento externo, como um teclado ou módulo sintetizador, ou programas que se registram no driver, capazes de tratar de alguma forma as mensagens MIDI.

Podemos escrever aplicações que tratem estas mensagens produzindo som, modifiquem parâmetros e repassem as mensagens para outras portas, possibilitando a criação de ~Sroteadores~T midi, muito importante em um estúdio profissional, ou comandando o que quer que você queira comandar por mensagens MIDI. Um exemplo poderia ser usar um PC para controlar luzes de palco por meio de comandos emitidos pelo próprio músico a partir de um instrumento digital, programa seqüenciador ou sensores especiais. As possibilidades são limitadas apenas pela imaginação do implementador, e a implementação enormemente simplificada graças à API ALSA.

Um exemplo notório da utilidade desse sistema é o uso do programa timidity, capaz de ~Srenderizar~T arquivos MIDI em áudio, utilizando instrumentos sampleados. O timidity tem suporte nativo a ALSA e pode ser usado como um ~Sservidor~T para seqüenciadores musicais, transformando-o num poderoso sintetizador em tempo real por software. Com isto, é possível fazer, ouvir e editar música de qualidade com MIDI, mesmo sem ter uma placa de som ou sintetizador potentes

E as aplicações antigas?

A compatibilidade com as aplicações desenvolvidas para utilizar a interface de programação do OSS foi também uma preocupação do time de desenvolvimento desde o início. Os drivers ALSA possuem módulos de compatibilidade (Geralmente sufixados com -oss. Por exemplo, snd-pcm-oss, snd-seq-oss, snd-mixer-oss, etc.) que permitem compatibilidade de API e binária com aplicações desenvolvidas para OSS. Assim, jogos e demais aplicações que fazem uso de áudio podem continuar sendo usados sem a necessidade de alterações no código, que pode nem estar disponível.

Os drivers ALSA fornecem boa parte do que era necessário para que um sistema baseado no kernel Linux pudesse ser utilizado em aplicações profissionais de áudio, e inúmeras aplicações de porte já vêm sendo desenvolvidas de forma a aproveitar toda a sua potencialidade.

Quando o novo kernel e arquitetura de áudio se tornarem padrão, teremos certamente dado um enorme salto qualitativo nas aplicações desta área, aliado ao desenvolvimento de distribuições específicas voltadas diretamente para multimídia. Não será surpresa começarmos a encontrar computadores com GNU/Linux em estúdios caseiros, profissionais e grandes emissoras de rádio. E você já pode se antecipar a isso: os drivers ALSA já estão disponíveis como add-ons em praticamente todas as distribuições.

Saiba mais:
4Front Technologies - www.opensound.com
ALSA Project - www.alsa-project.org


Eduardo Marcel Maçan - macan@debian.org

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux