Generowanie losowego szumu dla zabawy w / dev / snd /

41

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?

Jones
źródło
1
Myślę, że musisz wysłać losowe dane PCM , a może najpierw musisz skonfigurować urządzenie z kilkoma ioctlami - nie możesz po prostu zrzucić losowych bajtów.
Gilles „SO - przestań być zły”
@Gilles Według Wikipedii .wav to PCM i otrzymuję dokładnie taki sam wynik po zastąpieniu losowego pliku plikiem .wav. Zbadam konfigurowanie niektórych kontroli wejścia / wyjścia.
Jones
Czy ktoś ma wskaźnik do samouczka, jak skonfigurować niektóre ioctl? W przypadku czegoś o nazwie ioctls pomyślałem, że ALSA jako interfejs API powinien zapewniać interfejs dla danych wejściowych i wyjściowych?
Jones
Oto działający przykład, jak zapisać dane PCM
Igor Liferenko

Odpowiedzi:

46

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/audiolub /dev/dspdo nowego systemu serwera audio.

Uruchom terminal i przejdź do trybu root za pomocą sudo su.

Następnie zamierzam przesłać dane cat /dev/urandomwyjściowe padspi użyć teepolecenia, 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:

cat /dev/urandom | padsp tee /dev/audio > /dev/null

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!

Chris Thomas
źródło
1
Wielkie dzięki! Właśnie tego szukałem. Odpowiedzi udzielono pełne 7 miesięcy po opublikowaniu pytania! :-)
Jones
3
Wydaje się, że sudodo tego nie są wymagane uprawnienia.
iyrin
2
Dziękuję bardzo. Uznałem, że pliki binarne są dziwnie interesujące. rzeczy takie jak / usr / bin / ls / usr / bin / gnome-terminal / usr / bin / mysql
don bright
hmm, dziwne, „tee” może to zrobić, ale „dd = / dev / audio” nie.
Jasen
@Jasen dd może jednocześnie pisać za dużo. padsp symuluje / dev / audio, aby przekierować go przez alsa. dd bez padsp nawet nie zobaczy / dev / audio, chyba że emulacja OSS w jądrze jest włączona (i domyślnie tak nie jest). I myślę, że napisanie dużego bloku, znacznie większego niż bufory w sterowniku, może nawet nie powieść się.
Paul Stelian,
8

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, pulseaudiogdy polecenie było aktywne i poprawnie słyszałem „szum”).

EDYCJA (6 sierpnia 2019 r.): W starszej wersji polecenia miałem także padsp teecoś pomiędzy cati aplay. 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.

Paul Stelian
źródło
6
Używam ALSA, a „padsp tee” nie jest konieczne.
Geremia
1
Z moich doświadczeń pulseaudio (i tego, z czego korzysta Ubuntu, gdy PA jest wyłączony), które padsp teebył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). @geremia
Paul Stelian
Zabawne, jak teraz widzę, że ta padsp teerzecz 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ź.
Paul Stelian,
3

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

Stefan Noack
źródło
1
Dziękuję za odpowiedź. Według / proc / asound / devices / dev / snd / pcmC0D0p jest właściwym urządzeniem do odtwarzania dźwięku (stąd „p”)
Jones
1
Nie jestem też pewien, ale czy może istnieć wiele „plików” deweloperskich do odtwarzania? I nie mają „/ dev / audio” Myślę, że „/ dev / audio” ma coś wspólnego z OSS, który jest używany na starszych jąder (przed 2.5)
jones
2

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ływ lsof.

jmtd
źródło
1
Dziękuję za pomocną sugestię. Miałem czek, używając grepi lsof. pulseaudioużywa, /dev/snd/controlC0ale nie jest włączone /dev/snd/pcmC0D0p. Miałem podwójną kontrolę, sprawdzając, /var/lockczy w urządzeniu jest plik blokady. ls -alinformuje, że folder jest pusty. Sądzę więc, że pcmC0D0p nie ma blokady
Jones
@jones Trzymanie blokady na kontrolerze może wystarczyć do zablokowania całej karty, w zależności od kierowcy. (przepraszam, że odpowiadam po 8 latach, teraz sam się dowiedziałem)
Paul Stelian
0

TL; DR: Parametry urządzenia należy ustawić przed odczytem lub zapisaniem danych.

Krok po kroku:

  1. Otwórz urządzenie PCM. Np fd = open("/dev/snd/pcmC0D0p", O_RDWR). : Po otwarciu PCM jest w OPENstanie.

  2. 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 w SETUPstanie. Zobacz pcm_set_config () z TinyALSA kodu.

    Ustawianie ACCESS, FORMAT, RATE, CHANNELS, PERIOD_SIZEi PERIODSjest wystarczająca. Pozostałe parametry są ich wariantami, z BUFFER_SIZEtym wyjątkiem, że w niektórych urządzeniach można ustawić nie wielokrotność PERIOD_SIZE.

  3. Zadzwoń, ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)aby przygotować zmienne uruchomieniowe urządzenia i ALSA. Po tym PCM jest w PREPAREDstanie.

  4. 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.

Ricardo Biehl Pasquali
źródło
Nie jestem pewien, czy faktycznie działa odczyt / zapis, ponieważ aplay używa (przynajmniej w systemie, nad którym pracuję) ioctl (fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, ...), a nie rzeczywiste wywołanie write () podczas odtwarzania. Czy sama ALSA ma opakowanie, które pobiera punkty wejścia do odczytu / zapisu i tłumaczy je na ioctl?
Paul Stelian,
@PaulStelian Tak. Zobacz definicję operacji na plikach dla pcm . W snd_pcm_read()i snd_pcm_write(), bajty są przekształcane z ramek .
Ricardo Biehl Pasquali