Kürzlich habe ich den verzauberten / dev-Ordner erkundet. Ich möchte zufällige Daten auf ein Audiogerät schreiben, um Rauschen zu erzeugen.
Ich benutze ALSA.
Also weise ich cat an, einige zufällige Daten in die Wiedergabedatei im Ordner / dev zu leiten ...
cat file-of-random-data > /dev/snd/pcmC0D0p
dann erhalte ich von cat einen scheinbaren fehler
cat: write error: File descriptor in bad state
Wie kann ich das beheben, damit ich ein köstliches statisches Spiel von meiner Soundkarte hören kann?
Antworten:
Ich denke, der Grund, warum dies bei Ihnen nicht funktioniert, ist, dass diese Schnittstelle veraltet ist. Normalerweise kann man mit Audio nicht mehr schreiben
/dev/dsp
, zumindest ohne dass es schwierig ist.Es ist ein Programm, das für Sie auf Ihrem System erreichen wird:
padsp
. Dadurch wird die Datei/dev/audio
oder/dev/dsp
dem neuen Audioserver-System zugeordnet.Starten Sie das Terminal und wechseln Sie mit in den Root-Modus
sudo su
.Dann gehe ich zu
cat /dev/urandom
und leite die Ausgabe inpadsp
und benutze dentee
Befehl, um die Daten an zu senden/dev/audio
. Sie werden eine Menge Müll in Ihrem Terminal finden, zu dem Sie möglicherweise umleiten möchten/dev/null
.Versuchen Sie im Superuser den folgenden Befehl:
Vielleicht möchten Sie es sogar mit anderen Geräten wie Ihrer Maus versuchen: Verwenden Sie
/dev/psaux
zum Beispiel: oder den USB-Treiber. Sie können sogar Ihr Gedächtnis durchgehen lassen:/dev/mem
Hoffe, das erklärt, warum es vorher nicht funktioniert hat.
Ich persönlich fand die Maus und das Gedächtnis viel interessanter als das Spielen von statischem Zufall!
quelle
sudo
keine Berechtigungen erforderlich sind.cat /dev/urandom | aplay
ist der Befehl, der eingegeben werden muss. Wenn Sie nicht in der Gruppe "Audio" sind, können Sie sudo das Präfix aplay voranstellen. Dies stört auch keine Daemons (ich lief,pulseaudio
während dieser Befehl aktiv war und das "Rauschen" richtig hörte).BEARBEITEN (6. August 2019): In einer älteren Version des Befehls hatte ich auch eine
padsp tee
Sache zwischen demcat
undaplay
. Jetzt, da ich tatsächlich auf dem Gebiet arbeite, merke ich, dass es absolut keinen Sinn ergab. Außerdem weiß ich, dass der aktualisierte Befehl (der jetzt am Anfang dieser Antwort angezeigte) funktioniert, da ich ihn mehrmals am Tag bei der Arbeit verwende.quelle
padsp tee
ausfällt ) war dies erforderlich (ich hatte zu diesem Zeitpunkt genau den 12.04.2). Das Problem ist, dass Sie nicht versuchen sollten, Daten direkt auf Geräte zu übertragen, selbst wenn Sie root waren ( Soweit ich weiß, sind nur wenige Dateien im Ordner / dev lesbar und keine beschreibbar. Sie könnten entweder einen Fehler bekommen (im besten Fall, der bei jedem Update häufiger auftritt), den Kernel zum Absturz bringen oder sogar das Gerät beschädigen. in seltenen Fällen. Man sollte dazu unprivilegierte Elemente wie aplay verwenden (Audio-Gruppe oder Root sind leider erforderlich). @ Geremiapadsp tee
Ding überhaupt keinen Sinn ergibt. Bei der Arbeit benutze ich etwas Ähnliches ohne diese Zeile, um zu testen, ob ich beim Schreiben des Audiotreibers Fortschritte mache. Werde jetzt meine Antwort aktualisieren.Probieren Sie / dev / audio oder eines der anderen Geräte unter / dev / snd aus. Nicht alle von ihnen sind Audio-Datenquellen. Möglicherweise haben Sie einen Mixer, ein Mikrofon oder etwas anderes gefunden
quelle
Hält ein Sound-Daemon (z. B.
pulseaudio
) eine Sperre für das Gerät? Ich denke, Sie können herausfinden, ob irgendetwas anderes einen Griff darüber hatlsof
.quelle
grep
undlsof
.pulseaudio
wird verwendet/dev/snd/controlC0
, ist aber nicht aktiviert/dev/snd/pcmC0D0p
. Ich überprüfte noch einmal,/var/lock
ob eine Datei für eine Sperre auf dem Gerät vorhanden war.ls -al
sagt, dass der Ordner leer ist. Ich denke, es gibt keine Sperre für pcmC0D0pTL; DR: Die Geräteparameter müssen vor dem Lesen oder Schreiben von Daten eingestellt werden.
Schritt für Schritt:
Öffnen Sie das PCM-Gerät. Zum Beispiel:
fd = open("/dev/snd/pcmC0D0p", O_RDWR)
. Nach dem Öffnen befindet sich PCM imOPEN
Status.Parameter einstellen mit
ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)
. Die Hardware-Parameterstruktur enthält Masken (jedes Bit ist ein Wert) und Intervalle ([Minimum, Maximum] -Bereich). Die nicht gesetzten Parameter müssen gefüllt übergeben werden (alle gesetzten Bits / Werte für Masken; voller Bereich für Intervalle). Nach dem Einstellen der Hardware-Parameter befindet sich PCM imSETUP
Status. Code finden Sie in pcm_set_config () von TinyALSA.Einstellung
ACCESS
,FORMAT
,RATE
,CHANNELS
,PERIOD_SIZE
undPERIODS
ist ausreichend. Die anderen Parameter sind Varianten davon, mit der Ausnahme,BUFFER_SIZE
dass bei einigen Geräten ein Nicht-Vielfaches von eingestellt werden kannPERIOD_SIZE
.Aufruf
ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
zur Vorbereitung von Geräte- und ALSA-Laufzeitvariablen. Danach befindet sich das PCM imPREPARED
Status.Beginnen Sie mit dem Lesen (Aufnahme) oder Schreiben (Wiedergabe).
Bei einer Minimalanwendung zum Lesen oder Schreiben auf ein PCM-Gerät dreht sich der größte Teil des Codes um die Manipulation von Hardwareparametern.
quelle
snd_pcm_read()
undsnd_pcm_write()
werden Bytes in Frames konvertiert .