Recentemente, estive explorando a pasta / dev encantada. Quero gravar alguns dados aleatórios em um dispositivo de áudio para gerar algum ruído.
Estou usando o ALSA.
Então, eu instruo o gato a canalizar alguns dados aleatórios para o arquivo de reprodução na pasta / dev ...
cat file-of-random-data > /dev/snd/pcmC0D0p
então eu recebo o que parece ser um erro do gato
cat: write error: File descriptor in bad state
Como posso corrigir isso para poder ouvir uma reprodução estática deliciosa da minha placa de som?
Respostas:
Acho que o motivo de isso não funcionar para você é porque essa interface foi preterida. Você normalmente não pode gravar áudio usando
/dev/dsp
mais, pelo menos sem ser complicado.Não é um programa que vai conseguir isso para você em seu sistema:
padsp
. Isso mapeará o arquivo/dev/audio
ou/dev/dsp
para o novo sistema do Audio Server.Ligue o terminal e entre no modo raiz com
sudo su
.Então, vou
cat /dev/urandom
direcionar a saídapadsp
e usar otee
comando para enviar os dados/dev/audio
. Você receberá uma tonelada de lixo no seu terminal e poderá redirecionar para/dev/null
.Quando você estiver no superusuário, tente este comando:
Você pode tentar outros dispositivos, como o mouse: Use
/dev/psaux
:, por exemplo, ou o driver USB. Você pode até executar sua memória através dele:/dev/mem
Espero que isso esclareça por que não estava funcionando antes.
Pessoalmente, achei o mouse e a memória muito mais interessantes do que jogar estática aleatória!
fonte
sudo
privilégios não são necessários para isso.cat /dev/urandom | aplay
é o comando que precisa ser digitado. Se você não está no grupo "áudio", você pode prefixar aplay com sudo. Isso também não interfere em nenhum daemons (eu estava executandopulseaudio
enquanto este comando estava ativo e ouvi corretamente o "ruído".EDIT (6 de agosto de 2019): Em uma versão mais antiga do comando, eu também tinha uma
padsp tee
coisa entre ocat
eaplay
. Agora que estou trabalhando no campo, percebo que não fazia absolutamente nenhum sentido. Além disso, eu sei que o comando atualizado (o que está visível agora no início desta resposta) funciona porque eu o uso várias vezes ao dia no trabalho.fonte
padsp tee
era necessário (eu tinha o 12.04.2 preciso naquele momento). O problema é que você não deve tentar despejar dados diretamente nos dispositivos, mesmo que você seja root ( até onde eu sei, poucos arquivos são legíveis e nenhum gravável na pasta / dev), porque você pode receber um erro (na melhor das hipóteses, o que é mais comum a cada atualização), travar o kernel ou até quebrar o dispositivo, em casos raros. Deve-se usar elementos não privilegiados, como aplay, para fazer isso (grupo ou raiz de áudio necessário, infelizmente). @geremiapadsp tee
coisa realmente não faz nenhum sentido. No trabalho, uso algo semelhante sem essa linha para testar se estou fazendo progresso ao escrever o driver de áudio. Agora atualizará minha resposta.Tente / dev / audio ou um dos outros dispositivos em / dev / snd. Nem todos são coletores de dados de áudio, você pode ter pego um mixer, microfone ou algo assim
fonte
Um daemon de som (por exemplo
pulseaudio
) mantém uma trava no dispositivo? Eu acho que você pode descobrir se alguma outra coisa tem um controle sobre isso vialsof
.fonte
grep
elsof
.pulseaudio
está usando,/dev/snd/controlC0
mas não está ativado/dev/snd/pcmC0D0p
. Eu verifiquei duas vezes/var/lock
para descobrir se havia um arquivo para uma trava no dispositivo.ls -al
informa que a pasta está vazia. Então eu acho que não há bloqueio na pcmC0D0pTL; DR: Os parâmetros do dispositivo devem ser definidos antes de ler ou gravar dados nele.
Passo a passo:
Abra o dispositivo PCM. Por exemplo:
fd = open("/dev/snd/pcmC0D0p", O_RDWR)
. Depois de aberto, o PCM está noOPEN
estado.Defina os parâmetros com
ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)
. A estrutura de parâmetros do hardware possui máscaras (cada bit é um valor) e intervalos ( intervalo [mínimo, máximo]). Os parâmetros que não estão sendo definidos devem ser passados preenchidos (todos os bits / valores definidos para máscaras; intervalo completo para intervalos). Após definir os parâmetros de hardware, o PCM está noSETUP
estado. Veja pcm_set_config () do TinyALSA para código.Definindo
ACCESS
,FORMAT
,RATE
,CHANNELS
,PERIOD_SIZE
ePERIODS
é suficiente. Os outros parâmetros são variantes destes, excetoBUFFER_SIZE
que em alguns dispositivos pode ser definido como um não múltiplo dePERIOD_SIZE
.Chame
ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
para preparar variáveis de tempo de execução do dispositivo e do ALSA. Depois disso, o PCM está noPREPARED
estado.Comece a ler (capturar) ou escrever (reproduzir).
Um aplicativo mínimo para leitura ou gravação em um dispositivo PCM terá a maior parte do código relacionado à manipulação de parâmetros de hardware.
fonte
snd_pcm_read()
esnd_pcm_write()
, os bytes são convertidos em quadros .