Tocar um WAV através de / dev / console


0

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.


Está soando como se você quisesse reproduzir um arquivo de som localizado em um sistema remotamente em outro sistema, é este o caso?
LawrenceC

Respostas:


2

TL; DR

Não, não é possível. Usar aplay ou mplayer.

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.


Na verdade, o .wav suporta a compactação. Apenas não é usado com freqüência.
Ignacio Vazquez-Abrams

Sim, sim. Meu ponto é, não é para áudio como utf-8 arquivos simples são para texto.
Eroen

0

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;)


na verdade é praticamente o mesmo que produzir dados pcm (wav / mp3) em praticamente qualquer chip de som de microcomputador de 8 bits, já que esses também eram normalmente feitos para produzir -frequências- não -volumes- ... (só que esses-can- produzir outras voltagens além de +5 ou qualquer outra coisa e 0 volt - como eles têm DACs completos - um pouco demais de hardware para fazer o que você quiser com eles hoje em dia;)
HRH Sven Olaf von CyberBunker

Eu diria que isso pode ser feito. mas vai soar como se estivesse fazendo mais de 300 bauds. : P
HRH Sven Olaf von CyberBunker

para dar uma ideia: lembro-me de que a introdução da fala foi realmente reproduzida no altifalante do pc (nunca tivemos placas de som / adlib;) youtube.com/watch?v=2WlUfUBosgs
HRH Sven Olaf von CyberBunker
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.