Como configurar um coletor PulseAudio?

16

Estou tentando configurar um coletor PulseAudio no meu Raspberry Pi, a fim de transmitir todos os sons do sistema do meu PC para lá. Qual é a melhor forma de fazê-lo?

Por exemplo, é possível assistir a filmes ou a latência é muito alta? Eu tentei isso há algum tempo usando o gstreamer, mas com uma latência de cerca de 2 segundos, o que é inútil para os meus requisitos.

anon
fonte
11
Eu recebo um segundo ou dois de latência.
goldilocks

Respostas:

19

As instruções oficiais para a criação de uma "conexão direta" em uma rede espero apenas trabalho para a maioria das pessoas, mas parece pulseaudio e eu não se dão muito bem: ele me levou horas . [Além de "conexão direta", você também pode usar um método de "túnel" descrito mais abaixo, mas eu recomendo a leitura primeiro.]

Agora tenho um som de streaming de desktop (fedora 17) para o pi. Minimizei os /etc/pulsearquivos de configuração dos dois lados. No lado da área de trabalho:

/etc/pulse/client.conf

# See man pulse-client.conf
default-server = tcp:192.168.2.13:4713

O endereço LAN do meu pi com a porta pulseaudio padrão. Mas aqui está algo que me deixou confuso por um tempo - com um servidor especificado, o pulseaudio nem sequer começava:

> pulseaudio --start
N: [pulseaudio] main.c: User-configured server at tcp:192.168.2.13:4713, refusing to start/autospawn.

Ele será executado em primeiro plano (provavelmente porque não lê pulse-client.conf?). No entanto , como se vê, não é necessário executá-lo no lado da área de trabalho (envio) , algo que não está explicitado nos documentos do pulseaudio. Usando lsof -i -Pisso, parece que plugins de nível inferior para vários players de mídia fazem o trabalho.

Portanto, essa linha "client.conf" é realmente tudo o que você precisa no lado do desktop / cliente, se tudo o que você fará é usar a rede (mas consulte "Mais complicações", abaixo).

Embora o daemon pulseaudio (no lado receptor / servidor) possa ser executado como um serviço do sistema, os desenvolvedores do pulse o recomendam e, de fato, no pi o script init apenas causa um aviso: você ainda precisa iniciar por você mesmo. O Fedora nem sequer inclui uma entrada do serviço de inicialização systemd para ele.

Portanto, no lado pi, você deve iniciar e parar explicitamente o processo do servidor pulseaudio, configurado da seguinte maneira:

/etc/pulse/daemon.conf

# See man pulse-daemon.conf
log-level = info
exit-idle-time = 10800 # 3 hours

Você pode usar -1 para exit-idle-timemanter o daemon em execução indefinidamente. Cuidado: isso é segundos e o padrão é 20 (o que significa que continuará "misteriosamente" morrendo se você não definir isso).

/etc/pulse/default.pa

# See man default.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.2.0/24
load-module module-alsa-sink device=hw:0,0

Como esse é um aplicativo de rede, não é uma boa ideia executá-lo como root. No entanto, como mencionado em man pulseaudio, também é uma boa idéia "renice" o processo para dar uma prioridade mais alta. Você pode fazer isso manualmente com nice, mas o pulseaudio fará isso automaticamente para o root ou para os membros do pulse-rtgrupo, se o executável for "setuid", o que significa que ele pode fazer uso de alguns privilégios de root e depois mudar para o uid correto não registrado ( pinge passwdtambém precisa fazer isso). Então (como root ou sudo):

chmod u+s /usr/bin/pulseaudio

Não há um pulse-rtgrupo criado quando o pulseaudio está instalado no raspbian, portanto:

groupadd pulse-rt

Isso lhe dará um gid como 1003. Adicione (por exemplo) o usuário pi a esse grupo:

usermod -aG pulse-rt pi

Mas no raspbian, você ainda não poderá mudar como pi. Para isso, adicione a /etc/security/limits.conf:

@pulse-rt       hard nice -20
@pulse-rt       soft nice -20

Você precisa realmente executar um logon antes que essas alterações ocorram; Se você usar ssh com o pi, use login. Agora você pode iniciar o pulseaudio e ele se renegará -11, o que provavelmente é uma prioridade mais alta que a maioria dos outros processos (veja o valor de NICE em top).

Ao reproduzir som transmitido da rede, o pulseaudio no pi usa cerca de 10% da CPU e uma quantidade trivial de memória. :) Ele e minha área de trabalho estão em uma LAN com fio; o fluxo de pulsos bruta de dados pcm (acredito), portanto, o uso da largura de banda corresponde à taxa de amostragem da fonte, 1 kB / s ou mais. Infelizmente, há um atraso perceptível no som se você estiver assistindo a um vídeo.

Ainda mais complicações ...

Infelizmente, nenhum dos vários aplicativos de som do meu PC funcionou imediatamente; mpg123não seria executado. Para isso, no fedora, você precisa do mpg123-plugins-pulseaudiopacote. Para coisas em flash no navegador (por exemplo, youtude), você precisa alsa-plugins-pulseaudio(é isso que realmente se conecta ao servidor remoto). Outras distros devem ter pacotes similares. Se você já usava o pulseaudio antes (eu não estava), você já pode instalá-los.

Os sinos e assobios da área de trabalho do KDE também não funcionaram. Esse é um problema mais difícil de resolver, porque procura um servidor pulseaudio local e, conforme descrito, usar uma conexão direta significa que nenhum servidor pode ser executado localmente. A maneira de contornar isso é usar o método "tunnel".

módulo-túnel-pia

Essa é a outra maneira mencionada nos documentos do pulseaudio. Nesse caso, você tem um servidor executando nos dois lados e uma mão na outra. Para fazer isso, comente o "servidor padrão" /etc/client.confe adicione um local que /etc/default.pacontenha:

load-module module-tunnel-sink sink_name=rpi_tunnel server=tcp:192.168.2.13:4713 sink=bcm1

Se você não sink_nameinserir, o pulseaudio não será iniciado. O sinkrefere-se ao nome do coletor no lado pi, que também precisa de um nome; adicione um correspondente sink_nameà module-alsa-sinklinha default.palá:

load-module module-alsa-sink device=hw:0,0 sink_name=bcm1 

Inicie o servidor nos dois lados e pronto ... mais ou menos. Enquanto tudo, incluindo os bipes do KDE, agora eram executados, a reprodução em flash do navegador gaguejou muito. No entanto, em outro ambiente de área de trabalho (na verdade, apenas um gerenciador de janelas, fvwm), tudo estava bem.

Eu gosto do KDE, mas posso viver sem os bipes, então por enquanto vou manter uma conexão direta.

Solução de problemas

Se você tiver problemas, o uso pulseaudio -vvvv --log-level=debugdo pi fornece muitas mensagens de depuração. Inicialmente, quando não consegui ouvir som no pi, isso relatou um problema "relacionado a um bug no driver ALSA bcm2835" que me pareceu estranho, pois o som era bom apenas com o alsa, e tenho certeza de que existe um software pi que depende disso. no pulseaudio - apt-get remove pulseaudioe uma reinstalação apt-get install pulseaudioparecia consertar isso ... Não é uma solução que eu gostaria de ver, mas, ei, pelo menos agora eu posso ouvir tish sem precisar conectar alto-falantes em todas as caixas. Na maioria das vezes.

goldilocks
fonte
Obrigado pela resposta extensa. Porém, uma pergunta: o que acontece com o áudio vindo diretamente do Pi?
Vincent Vincent
Não sei se eu tentei isso (não estou mais fazendo isso), mas o pulseaudio deve ser um multiplexador, então deve funcionar.
goldilocks