Entendendo o que significa “canais”, “buffer_size”, “period_size”, “bindings” e “ipc_key” em .asoundrc

2

Para configurar minha placa de som USB para meu PC com Linux, comecei a aprender sobre o ALSA e sobre como gravar arquivos de configuração. Depois de muito esforço, consegui escrever uma e começar a trabalhar. O seguinte é meu .asoundrc armazenado em minha pasta pessoal:

pcm.!default {
    type plug
    slave {
       pcm "hw:1,0"
    }
}

ctl.!default {
    type hw
    card 1
}

pcm_slave.maudiomtrackeight1 {
    pcm "hw:1,0"
    channels 8
    rate 44100
    buffer_size 4096
    period_size 1024
}

pcm.outch1 {
    type dshare
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 0 ]
    hint.description "M-Audio M-Track Eight output/playback channel 1"
}

pcm.inch1 {
    type dsnoop
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 0 ]
    hint.description "M-Audio M-Track Eight input/capture channel 1"
}

pcm.outch2 {
    type dshare
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 1 ]
    hint.description "M-Audio M-Track Eight output/playback channel 2"
}

pcm.inch2 {
    type dsnoop
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 1 ]
    hint.description "M-Audio M-Track Eight input/capture channel 2"
}

pcm.outch3 {
    type dshare
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 2 ]
    hint.description "M-Audio M-Track Eight output/playback channel 3"
}

pcm.inch3 {
    type dsnoop
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 2 ]
    hint.description "M-Audio M-Track Eight input/capture channel 3"
}

pcm.outch4 {
    type dshare
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 3 ]
    hint.description "M-Audio M-Track Eight output/playback channel 4"
}

pcm.inch4 {
    type dsnoop
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 3 ]
    hint.description "M-Audio M-Track Eight input/capture channel 4"
}

pcm.outch5 {
    type dshare
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 4 ]
    hint.description "M-Audio M-Track Eight output/playback channel 5"
}

pcm.inch5 {
    type dsnoop
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 4 ]
    hint.description "M-Audio M-Track Eight input/capture channel 5"
}

pcm.outch6 {
    type dshare
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 5 ]
    hint.description "M-Audio M-Track Eight output/playback channel 6"
}

pcm.inch6 {
    type dsnoop
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 5 ]
    hint.description "M-Audio M-Track Eight input/capture channel 6"
}

pcm.outch7 {
    type dshare
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 6 ]
    hint.description "M-Audio M-Track Eight output/playback channel 7"
}

pcm.inch7 {
    type dsnoop
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 6 ]
    hint.description "M-Audio M-Track Eight input/capture channel 7"
}

pcm.outch8 {
    type dshare
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 7 ]
    hint.description "M-Audio M-Track Eight output/playback channel 8"
}

pcm.inch8 {
    type dsnoop
    ipc_key 1111
    slave maudiomtrackeight1
    bindings [ 7 ]
    hint.description "M-Audio M-Track Eight input/capture channel 8"
}

Embora eu fosse capaz de entender a maioria dos conceitos, não consegui entender o seguinte:

  • channels : representa os números dos canais de áudio? Como se eu fosse usar mono ou estéreo ? Digamos que, se minha placa de som tiver 8 portas de entrada e 8 portas de saída, se eu usar a configuração mono devo definir um valor de 16 - 8 entradas + 8 saídas ou 8 - 8 entradas / saídas pares (e no caso de eu usar a configuração estéreo , devo definir um valor de 8 - 4 entradas + 4 saídas ou 4 - 4 pares de entrada / saída)?
  • buffer_size : Eu não sei nada, exceto que tornar esses tamanhos menores é necessário para garantir uma latência menor. O que exatamente isso significa?
  • period_size : mais uma vez, isso tem que estar relacionado à latência?
  • bindings : esses são os que mapeiam os canais para as portas? Para a configuração mono , usei [ <index_number> ] . Posso usar a configuração [ <index_number1> <index_number2> ] para estéreo e da mesma forma?
  • ipc_key : Eu entendo que é um dado número único, o mesmo para cada dispositivo PCM definido a partir do mesmo escravo. Supondo que eu adicione uma nova placa de som detectada como hw:2,0 , e vá em frente para definir dispositivos PCM da mesma maneira como acima, eu terei que atribuir um valor diferente para este parâmetro (digamos 2222) para cada dispositivo PCM definido a partir do novo escravo?

Eu poderia tentar experimentar um pouco para entender o resto, mas ainda assim algumas coisas não poderiam ser removidas. O fato de que não há muitos tutoriais e falta de boa documentação oficial da ALSA também não está ajudando na causa. Alguém pode lançar alguma luz sobre isso?

    
por skrowten_hermit 22.03.2017 / 17:56

1 resposta

2

Resposta parcial:

Primeiro, deixe-me dizer que é muito provável que você não precise escrever uma configuração para o seu M-Track. Na verdade, a maneira como você configurou isso é o que você não quer na maioria das circunstâncias: você fez de cada canal um dispositivo separado. Isso significa que quando você tenta gravar, digamos, uma banda tocando ao mesmo tempo, é possível obter deslocamentos aleatórios entre os canais (membros da banda) porque cada canal é processado separadamente. Então, normalmente, você gravaria todos os 8 canais em faixas separadas, e então você os sincroniza bem e pode editá-los.

O mesmo vale se você quiser conectar seu sistema Hi-Fi doméstico para reproduzir música: Você quer canais síncronos para dispositivos esquerdo / direito / central / subwoofer / traseiro etc., não separados.

As únicas circunstâncias em que posso pensar se faz sentido separar dispositivos é se, por algum motivo, cada canal estiver conectado a um alto-falante em uma sala diferente e você quiser reproduzir músicas diferentes em cada uma delas.

Além disso, o moderno ALSA fornece automaticamente dshare e dsnoop plugins em cima do hardware por padrão, então você não precisa especificá-los explicitamente.

Dito isto, aqui estão as explicações:

  • channels : o número de canais que são simultaneamente gravados / reproduzidos. 1 para mono, 2 para estéreo, 8 para o seu cartão. Entrada e saída são contadas separadamente, então para 8 entradas e 8 canais de entrada você diz apenas "8 canais". A maneira como você configura seus dispositivos inch e outch requer uma entrada channels 1 para cada.

  • bindings : mapeia os canais do dispositivo ao qual o dispositivo escravo está vinculado aos canais deste dispositivo. Digamos que você queira trocar os canais esquerdo e direito do dispositivo original colocando um plug-in na parte superior e, em seguida, diria bindings { 0 1 1 0 } .

  • ipc_key : dmix , dshare e dsnoop plugins permitem que vários clientes se comuniquem com uma única origem / coletor. Essa comunicação é feita por meio dessa chave (IPC = comunicação entre processos). Então, a chave precisa ser diferente para cada plugin, não importa se você tem vários plugins para uma placa de som ou um plugin para cada placa de som, ou você terá problemas.

  • buffer_size : Os dados de áudio são armazenados e transferidos nos chamados buffers, ou seja, pedaços de RAM para um número de amostras. Se você aumentar muito, muitos dados serão armazenados antes de serem processados, aumentando a latência. Se você diminuir muito, a sobrecarga de processamento impedirá que todos os dados sejam processados antes que os próximos dados sejam recebidos ou que precisem ser apagados, portanto, você terá a perda de áudio.

  • period_size : nenhuma ideia.

Todos os plugins do ALSA PCM também são descritos aqui em detalhes.

Não mexa com buffer_size ou period_size a menos que você realmente saiba o que está fazendo. Se a latência for importante para você (por exemplo, se você quiser usar o computador para uma apresentação ao vivo), a primeira coisa a fazer é verificar se o Pulseaudio está desinstalado e usar jackd para todos os tipos de áudio. Somente se você ainda experimentar problemas de latência notáveis, poderá tentar valores diferentes para buffer_size .

    
por 23.03.2017 / 10:00