Áudio (AC97/HDA)
AC97 e Intel HDA são as duas famílias de dispositivo de áudio que um kernel mais provavelmente encontra emuladas sob o QEMU, e apesar de serem padrões separados de eras diferentes, os dois são construídos em torno da mesma ideia central: um buffer circular que o controlador esvazia continuamente via DMA, então um driver fornece dados de áudio em massa com antecedência em vez de ser interrompido uma vez por amostra individual da forma que um design ingênuo poderia funcionar.
O modelo de buffer circular
Seção intitulada “O modelo de buffer circular”Um driver aloca um buffer, o preenche com amostras de áudio, e entrega ao controlador seu endereço físico e comprimento; o controlador então lê através desse buffer continuamente via DMA, dando a volta de novo para o início uma vez que alcança o fim, e levanta uma interrupção em pontos que o driver configurou de antemão (comumente quando o buffer está pela metade, e de novo quando dá a volta) em vez de uma vez por amostra.
struct audio_buffer_descriptor { uint32_t buffer_addr; // endereço físico dos dados de amostra uint16_t sample_count; uint16_t flags; // interrupção ao completar, etc.};Isso é o que torna reprodução contínua possível sem uma taxa de interrupção impraticável: numa taxa de amostragem típica de 48.000 Hz, interromper uma vez por amostra significaria 48.000 interrupções por segundo só para um fluxo de áudio, enquanto interromper só quando uma região do buffer precisa ser reabastecida, comumente algumas dezenas de vezes por segundo, deixa ao driver bastante tempo entre interrupções para preparar o próximo pedaço de áudio sem que uma lacuna audível algum dia se desenvolva na saída.
Registradores de mixer versus bus master
Seção intitulada “Registradores de mixer versus bus master”Controladores tanto AC97 quanto HDA dividem seu espaço de registrador em dois grupos funcionalmente distintos. Registradores de mixer controlam o próprio caminho de sinal de áudio: volume mestre, volume por canal, taxa de amostragem, e roteamento de entrada/saída, valores que um driver define uma vez durante a inicialização e ajusta só em resposta a mudanças explícitas de volume ou formato, não em cronograma fixo algum. Registradores de bus master controlam o motor de DMA que de fato move amostras entre o buffer circular e o codec de áudio: o endereço físico do buffer, seu comprimento, um bit de controle para iniciar ou parar a transferência, e bits de status reportando quão longe pelo buffer o controlador está atualmente.
// mixer: define volume mestre (exemplo AC97)mixer_write(AC97_MASTER_VOLUME, (attenuation_left << 8) | attenuation_right);
// bus master: aponta o controlador para o buffer e o iniciabm_write32(BDBAR, buffer_descriptor_phys_addr);bm_write8(CIV_LVI, last_valid_index);bm_write8(CONTROL, RUN_BIT);Manter os dois separados é deliberado por parte do hardware: um driver ajustando volume no meio da reprodução toca só registradores de mixer, sem efeito algum na transferência de DMA já em andamento, e um driver que só quer mudar formato ou volume nunca precisa tocar o lado de bus master.
Por que AC97 é o ponto de partida mais simples
Seção intitulada “Por que AC97 é o ponto de partida mais simples”O AC97 é anterior ao HDA e tem um conjunto de registradores consideravelmente menor e mais diretamente mapeado em memória, com menos negociação exigida antes de a reprodução poder começar: um driver mapeia as BARs de mixer e bus master através do PCI da mesma forma que qualquer outro dispositivo PCI é descoberto, define um punhado de registradores de mixer, e aponta os registradores de bus master para uma lista de descritores de buffer preparada, com comparativamente pouco mais entre mapear o dispositivo e ouvir som. O HDA, o padrão moderno de fato presente em hardware atual, usa um modelo consideravelmente mais elaborado construído em torno de codecs descobertos e configurados através de um protocolo de comando/resposta por verbos enviado sobre seus próprios ring buffers internos, mais próximo em espírito de um pequeno barramento próprio do que de um arquivo de registrador plano, o que torna um driver HDA mínimo e funcional um empreendimento maior apesar de HDA e AC97 compartilharem a mesma ideia subjacente de DMA por buffer circular em seu núcleo. Um kernel hobbyist visando áudio pela primeira vez comumente começa com AC97 especificamente porque o QEMU o emula fielmente e seu modelo de registrador exige a menor quantidade de protocolo antes de o primeiro som tocar, mesmo que HDA seja o que qualquer máquina física atual de fato expõe.
Notas de implementação
Seção intitulada “Notas de implementação”A própria lista de descritores de buffer (um array de pares endereço/comprimento de buffer em vez de um único buffer, tanto em AC97 quanto em HDA) existe para que o controlador possa ser mantido continuamente alimentado sem o driver precisar reprogramar o motor de DMA a cada interrupção individual: o driver reabastece qualquer entrada de descritor que o controlador acabou de terminar enquanto o controlador já está consumindo uma entrada diferente mais à frente na lista, a mesma disciplina de double-buffering que evita uma lacuna audível ou falha de um reabastecimento que chega um momento tarde demais. Paging é diretamente relevante aqui da mesma forma que é para qualquer dispositivo capaz de DMA: tanto os descritores de buffer quanto os buffers de amostra para os quais apontam precisam de memória fisicamente contígua e adequadamente mapeada que o controlador consiga alcançar sem tradução alguma que o próprio motor de DMA não realize.
Referências
Seção intitulada “Referências”- ^ Intel, AC’97 Component Specification: a especificação em nível de registrador para o modelo de mixer e bus master descrito acima.
- ^ Intel, High Definition Audio Specification: o modelo baseado em codec/verbo que o HDA usa no lugar do conjunto de registradores mais plano do AC97.
Ver também
Seção intitulada “Ver também”- PCI: descoberta de dispositivo e mapeamento de BAR para qualquer uma das famílias de controlador.
- Paging & Virtual Memory: os buffers fisicamente contíguos dos quais tanto o motor de DMA do mixer quanto as listas de descritor deste artigo dependem.