web-dev-qa-db-ja.com

/ dev / snd /で楽しみのためにランダムノイズを生成する

最近、私は魅惑的な/ devフォルダーを調査しています。ノイズを発生させるために、オーディオデバイスにランダムデータを書き込みたいのですが。

ALSAを使用しています。

そこで、ランダムなデータを/ devフォルダーの再生ファイルにパイプするようにcatに指示します...

 cat file-of-random-data > /dev/snd/pcmC0D0p

次に、猫からのエラーのように見えるものを受け取ります

 cat: write error: File descriptor in bad state

サウンドカードからおいしい静的な再生を聞くことができるように、これを修正するにはどうすればよいですか?

42
jones

これが機能しない理由は、そのインターフェースが廃止されているためです。少なくともトリッキーなことをしない限り、もはや/dev/dspを使用してオーディオを書き込むことはできません。

システムでこれを実行するプログラムがあります:padsp。これにより、/dev/audioまたは/dev/dspファイルが新しいAudio Serverシステムにマップされます。

端末を起動し、Sudo suを使用してルートモードに入ります。

次に、cat /dev/urandomに行き、出力をpadspにパイプし、teeコマンドを使用してデータを/dev/audioに送信します。ターミナルには大量のゴミが表示されるので、/dev/nullにリダイレクトすることをお勧めします。

スーパーユーザーになったら、次のコマンドを試してください。

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

マウスなど、他のデバイスを試してみることもできます。たとえば、/dev/psauxまたはusbドライバを使用します。あなたはそれを通してあなたの記憶を実行することさえできます:/dev/mem

これにより、以前は機能しなかった理由が明らかになれば幸いです。

個人的には、ランダムスタティックをプレイするよりもマウスとメモリの方が面白いことがわかりました。

47
Chris Thomas

cat /dev/urandom | aplayは、入力する必要があるコマンドです。 「オーディオ」グループに属していない場合は、aplayの前にSudoを付けることができます。これはどのデーモンにも干渉しません(このコマンドがアクティブで「ノイズ」が正しく聞こえている間はpulseaudioを実行していました)。

編集(2019年8月6日):コマンドの古いバージョンでは、padsp teecataplayの間にあるもの。私が実際に現場で働いている今、それがまったく意味をなさないことに気づきました。また、更新されたコマンド(この回答の冒頭に表示されているもの)が1日に数回使用されているため、機能することもわかっています。

8
Paul Stelian

/ dev/audioまたは/ dev/sndの下にある他のデバイスの1つを試してください。それらのすべてがオーディオデータシンクではありません。ミキサー、マイクなどを捕まえた可能性があります

3
Stefan Noack

サウンドデーモン(pulseaudioなど)がデバイスにロックをかけていますか?他にlsofを介してハンドルがあるかどうかを確認できると思います。

2
jmtd

TL; DR:データの読み取りまたは書き込みを行う前に、デバイスのパラメーターを設定する必要があります。

ステップバイステップ:

  1. PCMデバイスを開きます。例:fd = open("/dev/snd/pcmC0D0p", O_RDWR)。開いた後、PCMはOPEN状態です。

  2. ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)を使用してパラメーターを設定します。ハードウェアパラメータの構造には、masks(各ビットは値)とintervals([最小、最大]範囲)。設定されていないパラメーターは、塗りつぶして渡す必要があります(マスクに設定されたすべてのビット/値、間隔の全範囲)。ハードウェアパラメータを設定した後、PCMはSETUP状態になります。コードについては、TinyALSAの pcm_set_config() を参照してください。

    ACCESSFORMATRATECHANNELS、_PERIOD_SIZE_およびPERIODSを設定するだけで十分です。他のパラメータはこれらのバリアントですが、一部のデバイスでは_BUFFER_SIZE_の倍数以外に設定される_PERIOD_SIZE_を除きます。

  3. ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)を呼び出して、デバイスとALSAランタイム変数を準備します。この後、PCMはPREPARED状態になります。

  4. 読み取り(キャプチャ)または書き込み(再生)を開始します。

PCMデバイスの読み取りまたは書き込み用の最小限のアプリケーションには、ハードウェアパラメータ操作に関するコードのほとんどが含まれます。