Como faço para configurar o som com o PulseAudio e o Multiseat?

12

No espírito de divulgação total, acabei de publicar esta pergunta nos fóruns do ubuntu, mas acho que mais cabeças trabalhando nela não poderiam machucar.

Eu tenho uma configuração multi-assento funcionando muito bem. Os dispositivos de entrada de conexão a quente funcionam conforme o esperado e tal. O único problema que ainda não consigo resolver é obter o áudio de cada assento.

Aqui está um resumo das minhas tentativas de fazer o áudio funcionar:

  1. Crie ~ / .pulse / default.pa configurado dinamicamente com base no qual $ DISPLAY o usuário efetua login.

    • Veja esta pasta para obter detalhes.
  2. Carregue o pulseaudio como uma instância de todo o sistema.

    • Não foi possível fazer isso funcionar. Nenhum hardware de áudio estava acessível aos usuários.
  3. Use as regras do udev para marcar assentos no ConsoleKit. Seguindo as diretrizes do udev encontradas aqui: http://www.freedesktop.org/wiki/Software/systemd/multiseat

    • Eu não achei que isso funcionaria, embora tenha sido "garantido" que alguém funcione no irc.freenode #pulseaudio

Nenhuma dessas tentativas teve sucesso, e é por isso que agora busco ajuda na comunidade. É bem possível que os métodos sugeridos funcionem e eu apenas estraguei alguns aspectos, idk. Esta é a última peça do quebra-cabeça necessária antes que eu possa ir e atualizar a página do MultiseatX para incluir instruções para o Ubuntu 12.04.

Meu entendimento sobre a situação: o acesso ao pulseaudio é restrito à sessão ativa, conforme marcado pelo ConsoleKit (algo sobre uma ACL). O CK pode marcar apenas uma sessão como ativa por vez. Esse simples fato da vida me leva a acreditar que a solução deve envolver o pulseaudio sendo executado como uma instância de todo o sistema. Cada usuário deve conectar-se ao servidor de pulso e limitar-se a um subconjunto de todo o hardware. Talvez cada usuário se conecte ao servidor de pulso via localhost, idk. Sei que, independentemente das minhas tentativas e dos resultados fracassados, sempre fui capaz de usar sudo aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Center.wavpara reproduzir algo em qualquer hardware.

Estou agarrando palhas e agora estou com os últimos cabelos que consigo arrancar da minha cabeça. Por favor, me ajude a descobrir isso para que possamos compartilhar a riqueza. Qualquer informação adicional necessária será fornecida a seu pedido.

Anthony
fonte
Entendi corretamente: são 2 assentos e 2 placas de som? Você substituiu o default.pa pelos pequenos arquivos personalizados ou adicionou as linhas personalizadas ao default.pa inalterado?
Takkat 24/09/12
Eu gostaria de ter notado o comentário aqui ... Então sim, são 2 placas de som. Um é o áudio integrado, o outro é o áudio do HDMI no gpu. Os pequenos arquivos personalizados estão em ~ / .pulse, mas /etc/pulse/default.pa está intocado. Portanto, nesse caso, até onde eu entendi, o ~ / .pulse / default.pa não substituirá o /etc/pulse/default.pa, mas sim se fundirá a ele.
Anthony
Tente com dois arquivos .pa personalizados com o conteúdo completo do default.pa, onde a seção de dispositivo diferente, como nos dois arquivos existentes, é adicionada (caso não sejam mescladas).
Takkat 25/09/12
Além disso, o default.pa lido pelo pulseaudio run no modo de todo o sistema deve estar em /etc/pulse, não em HOME.
Takkat 25/09/12
Eu tenho principalmente trabalhando em ATM. Vou relatar quando tiver tudo resolvido.
Anthony

Respostas:

7

Passei muitas horas pesquisando on-line, testando várias configurações e conversando com os desenvolvedores do Pulseaudio. A conclusão é que a execução do pulseaudio no modo de usuário normal permitirá que apenas a sessão ativa, conforme marcada pelo ConsoleKit, acesse o hardware de áudio. Como o ConsoleKit atual só pode marcar uma sessão como ativa por vez, isso significa que devemos executar uma instância do pulseaudio em todo o sistema. A vantagem: cada assento pode ter áudio individual. A desvantagem: TODO o hardware de áudio está disponível para qualquer usuário e pode ser manipulado à vontade. Essa não é uma situação ideal para um cibercafé ou outro ambiente público em que a segurança seja uma preocupação real. Lembre-se disso ao criar a política de segurança do site. Pode ser prudente restringir a execução do controle de pavimentação apenas aos administradores.

Como sempre, faça um backup de todos os seus arquivos de configuração padrão. Se você alterou suas configurações sem fazer backup, é possível recuperar o pacote pulseaudio com o apt-get -d install pulseaudio. Isso fará o download do pacote (para / var / cache / archives / apt) e você pode extrair o conteúdo para recuperar as configurações padrão. Esteja ciente de que o client.conf não está incluído nele.

Para executar o pulseaudio como um daemon em todo o sistema, precisamos editar alguns arquivos.

1.) / etc / default / pulseaudio

    PULSEAUDIO_SYSTEM_START=1

2.) /etc/pulse/daemon.conf - Veja man pulse-daemon.conf para mais informações.

    daemonize = yes
    local-server-type = system

3.) /etc/pulse/client.conf

    autospawn = no

Também precisamos adicionar usuários ao grupo de acesso por pulso.

sudo usermod -a -G pulse-access <username>

Agora que todos os usuários podem acessar o hardware de áudio, precisamos selecionar o hardware que cada usuário usará. Isso pode ser feito usando o pavucontrol. Esteja ciente de que as configurações são armazenadas POR USUÁRIO e não seguirão o assento. Se os usuários trocarem de lugar, será necessário selecionar novamente o hardware de áudio desejado.

Comentários adicionais sobre Pulseaudio

Eu esperava que houvesse uma solução mais elegante para obter o áudio por assento funcionando. O uso de um Pulseaudio em todo o sistema em vários assentos tem muitas desvantagens e não é totalmente estável entre as reinicializações. Eu tinha tentado iniciar uma instância em todo o sistema e ter instâncias de usuário conectadas a ela como um servidor via localhost. Isso não parece funcionar, pois quando o pulseaudio --start é executado, ele gera fontes daemon.conf.

Em relação ao ConsolKit

O problema que vemos ao executar um pulseaudio normal por usuário é que um assento tem acesso ao hardware e todos os outros têm Saída Dummy. Isso ocorre porque o ConsoleKit não reconhece totalmente o assento. A CK considera todos os nossos assentos como sessões do assento1 e pode marcar apenas uma sessão como ativa. Esse fato pode ser visto executando getfacl / dev / snd / *. Ocorreu-me que poderíamos editar a ACL apropriada dos arquivos / dev / snd / com base nos quais $ DISPLAY um determinado usuário está usando. Esta é uma opção que eu não explorei. Por favor, considere contribuir com a causa de vários lugares, explorando esta hipótese e editando o documento com suas descobertas.

Existem ramificações de vários lugares para o ConsoleKit , GDM-2.3 e GDM-3.x , o que deve fornecer a funcionalidade automática de vários lugares.

Notas Adicionais

1.) Seria aconselhável também proibir os usuários de carregar os módulos DISALLOW_MODULE_LOADING = 1.

2.) autospawn = no não é totalmente necessário, como visto no meu arquivo de exemplo. Não causa problemas.

Anthony
fonte
1
Anthony, obrigado por seu post, foi útil! Eu enfrentei o mesmo problema e descobri como alcançar o resultado desejado sem executar o Pulseaudio no modo de sistema. Dê uma olhada: unix.stackexchange.com/a/104344/34581 . Espero que seja útil.
Ilia Rostovtsev 9/12
1

Meu entendimento sobre a situação: o acesso ao pulseaudio é restrito à sessão ativa, conforme marcado pelo ConsoleKit (algo sobre uma ACL). O CK pode marcar apenas uma sessão como ativa por vez.

Há um patch no ConsoleKit para adicionar suporte a vários assentos ; isso permitirá que todos os assentos ativos sejam reportados como ativos. Talvez isso resolva seu problema. Ele precisa de cooperação com o gerenciador de exibição e existe um patch para versões antigas do GDM que adiciona esse suporte.

Eu trabalhei com vários servidores no Natty (11.04) usando pacotes ConsoleKit e GDM modificados de um PPA . Ainda não atualizei o Natty - demorei muito tempo para descobrir como fazê-lo funcionar e estou preocupado que o LightDM não funcione com o ConsoleKit corrigido.

EDIT: Devo observar que o Fedora 17 possui alguns recursos impressionantes de vários assentos, alguns dos quais estarão no Quantal. Eles têm uma página wiki descrevendo sua abordagem . O Ubuntu não pode simplesmente copiar a abordagem do Fedora porque exigiria mudanças significativas; O Fedora usa systemd e GDM, enquanto o Ubuntu usa upstart e LightDM.

Richard Hansen
fonte
Ri muito. Conheço os ramos ConsoleKit e GDM de vários lugares. Você notará que eu o vinculei a eles na página Ubuntu MultiseatX que estou atualizando. Na verdade, o ramo ck depende do ramo gdm. Eles são mantidos pela mesma pessoa da Oracle. O PPA que você referenciou também é algo que eu conheço e não é para o 12.04. Estou tentando fazer isso de uma maneira que não envolva sair dos repositórios padrão. Com relação ao Fedora e systemd ..., a abordagem multiseat systemd NÃO funcionará com o binário da nvidia.
Anthony
0

Recentemente, eu estava tentando resolver o problema com o PulseAudio e o Multiseat. Vendo que não havia solução elegante, minha solução alternativa era usar a rede.

Esta solução se adapta ao meu cenário, porque eu sou o usuário que mais frequentemente está na máquina e meu assento está mais frequentemente conectado. E meu assento é configurado com a mão esquerda e ninguém mais o usa.

No meu, ~/.config/pulse/default.paeu copiei a configuração do sistema /etc/pulse/default.pae adicionei a seguinte linha:

load-module module-native-protocol-tcp auth-anonymous=1 auth-ip-acl=127.0.0.1

Nas configurações de áudio pulsado de outros usuários, adicione um túnel - ou vários, se for o que você precisa - com algo junto:

load-module module-tunnel-sink server=127.0.0.1 sink=alsa_output.pci-0000_00_XX.X.iec958-stereo

Mude o nome do coletor para corresponder ao nome da sua máquina. Você pode optar por configurar um nome mais amigável - o que significa que você deve configurá-lo no seu arquivo de configurações do pulseaudio - mas eu apenas usei o nome consultando-o pacmd list-sinks.

Não é uma solução elegante, provavelmente tentarei usar uma configuração de todo o sistema, conforme sugerido por @Anthony na minha próxima plataforma, mas se você tiver muitas placas e quiser compartilhar um ou poucos coletores / fontes, esta é uma mais solução "cirúrgica".

MariusSiuram
fonte