Ostatnio przeglądałem folder enchanted / dev. Chcę zapisać losowe dane na urządzeniu audio w celu wygenerowania szumu.
Używam ALSA.
Poinstruowałem więc kota, aby przekazał losowe dane do odtwarzanego pliku w folderze / dev ...
cat file-of-random-data > /dev/snd/pcmC0D0p
wtedy otrzymuję od kota coś, co wydaje się błędem
cat: write error: File descriptor in bad state
Jak mogę to naprawić, aby usłyszeć pyszne, statyczne odtwarzanie z mojej karty dźwiękowej?
Odpowiedzi:
Myślę, że powodem, dla którego to nie działa, jest to, że interfejs ten jest przestarzały. Zwykle nie można już pisać audio
/dev/dsp
, przynajmniej bez podstępu.Jest to program, który będzie wykonać to dla ciebie w systemie:
padsp
. Spowoduje to zmapowanie pliku/dev/audio
lub/dev/dsp
do nowego systemu serwera audio.Uruchom terminal i przejdź do trybu root za pomocą
sudo su
.Następnie zamierzam przesłać dane
cat /dev/urandom
wyjściowepadsp
i użyćtee
polecenia, aby wysłać dane do/dev/audio
. Dostaniesz mnóstwo śmieci w swoim terminalu, więc możesz chcieć przekierować do/dev/null
.Gdy jesteś w superużytkowniku, wypróbuj to polecenie:
Możesz nawet spróbować z innymi urządzeniami, takimi jak mysz: użyj
/dev/psaux
:, na przykład lub sterownika USB. Możesz nawet uruchomić swoją pamięć:/dev/mem
Mam nadzieję, że to wyjaśnia, dlaczego wcześniej nie działało.
Osobiście uważam, że mysz i pamięć są o wiele bardziej interesujące niż granie w przypadkowe zakłócenia!
źródło
sudo
do tego nie są wymagane uprawnienia.cat /dev/urandom | aplay
to polecenie, które należy wpisać. Jeśli nie jesteś w grupie „audio”, możesz poprzedzić grę sudo. To również nie koliduje z żadnymi demonami (działałem,pulseaudio
gdy polecenie było aktywne i poprawnie słyszałem „szum”).EDYCJA (6 sierpnia 2019 r.): W starszej wersji polecenia miałem także
padsp tee
coś pomiędzycat
iaplay
. Teraz, kiedy faktycznie pracuję w terenie, zdaję sobie sprawę, że nie miało to absolutnie żadnego sensu. Wiem też, że zaktualizowane polecenie (to widoczne teraz na początku tej odpowiedzi) działa, ponieważ używam go kilka razy dziennie w pracy.źródło
padsp tee
było wymagane (miałem wtedy dokładną wersję 12.04.2) Chodzi o to, że nie powinieneś próbować zrzucać danych bezpośrednio na urządzenia, nawet jeśli byłeś rootem ( o ile wiem, niewiele plików jest czytelnych i żadnego z nich nie można zapisać w folderze / dev), ponieważ możesz albo otrzymać błąd (w najlepszym przypadku, który występuje częściej z każdą aktualizacją), zawiesić jądro lub nawet uszkodzić urządzenie, w rzadkich przypadkach. W tym celu należy używać nieuprzywilejowanych elementów, takich jak aplay (niestety wymagana jest grupa audio lub root). @geremiapadsp tee
rzecz wcale nie ma żadnego sensu. W pracy używam czegoś podobnego bez tej linii, aby sprawdzić, czy robię postępy w pisaniu sterownika audio. Zaktualizuje teraz moją odpowiedź.Spróbuj / dev / audio lub jednego z innych urządzeń w / dev / snd. Nie wszystkie z nich są odbiornikami audio, być może złapałeś mikser, mikrofon lub coś takiego
źródło
Czy demon dźwięku (np.
pulseaudio
) Trzyma blokadę na urządzeniu? Myślę, że możesz dowiedzieć się, czy cokolwiek innego ma na to wpływlsof
.źródło
grep
ilsof
.pulseaudio
używa,/dev/snd/controlC0
ale nie jest włączone/dev/snd/pcmC0D0p
. Miałem podwójną kontrolę, sprawdzając,/var/lock
czy w urządzeniu jest plik blokady.ls -al
informuje, że folder jest pusty. Sądzę więc, że pcmC0D0p nie ma blokadyTL; DR: Parametry urządzenia należy ustawić przed odczytem lub zapisaniem danych.
Krok po kroku:
Otwórz urządzenie PCM. Np
fd = open("/dev/snd/pcmC0D0p", O_RDWR)
. : Po otwarciu PCM jest wOPEN
stanie.Ustaw parametry za pomocą
ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)
. Struktura parametrów sprzętowych ma maski (każdy bit jest wartością) i przedziały ([minimalny, maksymalny] zakres). Parametry, które nie są ustawiane, muszą zostać wypełnione (wszystkie bity / wartości ustawione dla masek; pełny zakres dla przedziałów). Po ustawieniu parametrów sprzętowych PCM jest wSETUP
stanie. Zobacz pcm_set_config () z TinyALSA kodu.Ustawianie
ACCESS
,FORMAT
,RATE
,CHANNELS
,PERIOD_SIZE
iPERIODS
jest wystarczająca. Pozostałe parametry są ich wariantami, zBUFFER_SIZE
tym wyjątkiem, że w niektórych urządzeniach można ustawić nie wielokrotnośćPERIOD_SIZE
.Zadzwoń,
ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
aby przygotować zmienne uruchomieniowe urządzenia i ALSA. Po tym PCM jest wPREPARED
stanie.Rozpocznij czytanie (przechwytywanie) lub pisanie (odtwarzanie).
Minimalna aplikacja do odczytu lub zapisu na urządzeniu PCM będzie miała większość kodu wokół manipulacji parametrami sprzętowymi.
źródło
snd_pcm_read()
isnd_pcm_write()
, bajty są przekształcane z ramek .