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?


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!


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.


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


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.