Existe uma maneira de reproduzir um WAV /dev/console
? (sem ser root)
Da mesma forma que o comando shell
/dev/urandom > /dev/console
produz um som aleatório
cat music.wav > /dev/console
não funciona.
Eu posso usar /dev/dsp
mas o som não vem do alto-falante interno do PC.
Respostas:
TL; DR
Não, não é possível. Usar
aplay
oumplayer
.Por que não?
Existem dois problemas com a sua ideia. O primeiro é que escrever para
/dev/console
resulta nos caracteres escritos aparecendo no console do sistema, que é comumente usado para mostrar notificações de erro para o usuário (eu acredito), e não para reproduzir sons. Se de alguma forma você tem um som escrito, eu acho que é devido à chance de 1/256 de cada personagem, o que deve fazer um bip curto.O segundo problema é que um
.wav
não é um fluxo de áudio bruto e não ambíguo, mesmo que seja menos complexo e (geralmente) não compactado como muitos outros formatos. Na verdade (iirc), nunca pode haver algo como um fluxo de áudio bruto e não ambíguo. Você sempre (no mínimo) precisará de um cabeçalho especificando a resolução e a taxa da amostra para fazer qualquer coisa útil com os dados. Eu ficaria muito surpreso se fosse decidido que uma das responsabilidades do kernel do Linux era decodificar vários formatos de áudio. Geralmente é uma coisa melhor feita por um programa no userspace.Digressão:
A linha Windows 9x (pelo menos parte dela) fez a decodificação de imagens no kernel para ícones. Isso acabou por ser uma ideia menos do que estelar e causou muitos ecrãs a azul.
Solução proposta
Se você quer tocar o seu wav a partir da linha de comando, existe uma série de programas que irão decodificar o arquivo para você e comunicá-lo ao kernel, geralmente usando a interface do ALSA. Eu sugiro aplay, que está disponível na maioria dos sistemas e é bastante simplista, ou o mplayer, que também é amplamente distribuído, mas com uma complexidade muito maior. Se o seu sistema suporta som, é provável que pelo menos um deles esteja instalado.
fonte
deve ser possível, mas se você concordar com a quantidade produzida é outra história.
Primeiro de tudo, um wav é modulado por código de pulso (pcm), o alto-falante do PC é praticamente uma história on-or-off, então existem 2 opções ... analisar a freqüência que o wav deseja arquivar (vai ser difícil se houver múltiplos frequências ao mesmo tempo) faça o altifalante reproduzir essa frequência, ou viva com o facto de só poder estar ligado ou desligado e apenas ligá-lo ou desligá-lo se os dados no wav atingirem um determinado valor pré-definido. limite de volume / pcm.
também o wav teria um amostrador muito maior do que o hardware do alto-falante provavelmente pode suportar (não tenho certeza disso, mas não ser capaz de definir outras amplitudes além de "tanta tensão quanto a coisa pode suportar" ou "zero" sem nada entre é o maior problema aqui.
agora ... as coisas que você quer examinar no método 1 são ioctl (x, KIOCSOUND, 1193180 / desired-freq-in-hz); com 0 obviamente sendo desligado. KDMKTONE ioctl em um fd em / dev / console parece ter que produzir timbres especificados por um período especificado em jiffies.
mas se você quiser fazer isso corretamente eu peguei a folha de dados do chip que o alto-falante está conectado e resolva o problema diretamente, sem nem me incomodar com / dev / console ou qualquer coisa do linux ... então você pode de fato , basta ligar a tensão ou desligá-la. o que daria um som modulado pcm ... apenas sem qualquer variação de amplitude entre 'alto' e 'nada'.
provavelmente todos os métodos soam como lixo de qualquer maneira ... mas analisando a freqüência primeiro e depois reproduzindo uma freqüência não irá funcionar para música que normalmente contém múltiplas freqüências ao mesmo tempo.
todo o ioctl KIOCSOUND / KDMKTONE parece depender das configurações clocktick no kernel, assim como o estar presente de um / dev / console e um descritor de arquivo para aquele que está sendo aberto também. eles não parecem "apenas endereçar o pino de i / o do chip ao qual o beeper do pc está conectado".
temporizador de interrupção programável (PIT) intel 8259 porta i / o $ 0042 r / w contador PIT 2, cassete & amp; alto-falante (XT, AT, PS / 2)
Basicamente, a abordagem usual seria programá-lo com uma frequência desejada e, em seguida, produziria bips, mas o que você quer é apenas 'on' ou 'off', então basicamente 0hz ou muito baixo hz, então reprogramar o PIT quando os dados de o wav vai de '1' a 0 para desligá-lo novamente ... e assim por diante. lidar com a taxa de amostragem do arquivo wav é de software como qualquer outra coisa. (pegue a média ou simplesmente pule as amostras se ela estiver muito alta - ela é analógica, e você só pode produzir saída digital;)
fonte