最近、私は魅惑的な/ devフォルダーを調査しています。ノイズを発生させるために、オーディオデバイスにランダムデータを書き込みたいのですが。
ALSAを使用しています。
そこで、ランダムなデータを/ devフォルダーの再生ファイルにパイプするようにcatに指示します...
cat file-of-random-data > /dev/snd/pcmC0D0p
次に、猫からのエラーのように見えるものを受け取ります
cat: write error: File descriptor in bad state
サウンドカードからおいしい静的な再生を聞くことができるように、これを修正するにはどうすればよいですか?
これが機能しない理由は、そのインターフェースが廃止されているためです。少なくともトリッキーなことをしない限り、もはや/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
これにより、以前は機能しなかった理由が明らかになれば幸いです。
個人的には、ランダムスタティックをプレイするよりもマウスとメモリの方が面白いことがわかりました。
cat /dev/urandom | aplay
は、入力する必要があるコマンドです。 「オーディオ」グループに属していない場合は、aplayの前にSudoを付けることができます。これはどのデーモンにも干渉しません(このコマンドがアクティブで「ノイズ」が正しく聞こえている間はpulseaudio
を実行していました)。
編集(2019年8月6日):コマンドの古いバージョンでは、padsp tee
cat
とaplay
の間にあるもの。私が実際に現場で働いている今、それがまったく意味をなさないことに気づきました。また、更新されたコマンド(この回答の冒頭に表示されているもの)が1日に数回使用されているため、機能することもわかっています。
/ dev/audioまたは/ dev/sndの下にある他のデバイスの1つを試してください。それらのすべてがオーディオデータシンクではありません。ミキサー、マイクなどを捕まえた可能性があります
サウンドデーモン(pulseaudio
など)がデバイスにロックをかけていますか?他にlsof
を介してハンドルがあるかどうかを確認できると思います。
TL; DR:データの読み取りまたは書き込みを行う前に、デバイスのパラメーターを設定する必要があります。
ステップバイステップ:
PCMデバイスを開きます。例:fd = open("/dev/snd/pcmC0D0p", O_RDWR)
。開いた後、PCMはOPEN
状態です。
ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)
を使用してパラメーターを設定します。ハードウェアパラメータの構造には、masks(各ビットは値)とintervals([最小、最大]範囲)。設定されていないパラメーターは、塗りつぶして渡す必要があります(マスクに設定されたすべてのビット/値、間隔の全範囲)。ハードウェアパラメータを設定した後、PCMはSETUP
状態になります。コードについては、TinyALSAの pcm_set_config() を参照してください。
ACCESS
、FORMAT
、RATE
、CHANNELS
、_PERIOD_SIZE
_およびPERIODS
を設定するだけで十分です。他のパラメータはこれらのバリアントですが、一部のデバイスでは_BUFFER_SIZE
_の倍数以外に設定される_PERIOD_SIZE
_を除きます。
ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
を呼び出して、デバイスとALSAランタイム変数を準備します。この後、PCMはPREPARED
状態になります。
読み取り(キャプチャ)または書き込み(再生)を開始します。
PCMデバイスの読み取りまたは書き込み用の最小限のアプリケーションには、ハードウェアパラメータ操作に関するコードのほとんどが含まれます。