最近、私は魔法の/ devフォルダを探しています。ノイズを発生させるためにオーディオデバイスにランダムなデータを書きたいです。
私はALSAを使用しています。
だから私はcatにランダムなデータを/ devフォルダのプレイファイルにパイプするように指示します。
cat file-of-random-data > /dev/snd/pcmC0D0p
その後、猫からエラーが発生しました。
cat: write error: File descriptor in bad state
サウンドカードから素晴らしい静的再生サウンドを得るために、この問題をどのように解決しますか?
答え1
これがうまくいかない理由は、インターフェイスが使用されなくなったためだと思います。/dev/dsp
少なくとも厳しい状況では、通常、これ以上オーディオを作成するために使用することはできません。
あなたのシステムにこれを行うことができるプログラムがありますpadsp
。これにより/dev/audio
、または/dev/dsp
ファイルが新しいオーディオサーバーシステムにマップされます。
端末を起動し、 を使ってルートモードに入ります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
以前はうまくいかなかった理由が明確になることを願っています。
個人的にはランダムな静的なプレイよりもマウスやメモリが楽しいと思います!
答え2
cat /dev/urandom | aplay
入力する必要があるコマンドです。オーディオグループに属していない場合は、aplayの前にsudoを付けることができます。これもデーモンを妨げません(pulseaudio
このコマンドがアクティブな間は実行中で、「ノイズ」が正しく聞こえます)。
編集(2019年8月6日):以前のバージョンのコマンドにはpadsp tee
。実際、この分野で働いて、これがまったく話にならないことに気づきました。また、更新されたコマンド(現在、この回答の冒頭に表示されているコマンド)が職場で1日に複数回使用されるために機能することがわかります。cat
aplay
答え3
/dev/audioまたは/dev/sndで他のデバイスのいずれかを試してください。これらはすべてオーディオデータシンクではなく、ミキサー、マイクなどをキャプチャした可能性があります。
答え4
修正する(2020-12-25):stdinからstdoutにデータを渡し、PCMファイルの場合はstdoutを設定するシェルスクリプトを作成しました。確認するhttps://github.com/psqli/pcmsh。
重要な要約:データを読み書きする前に、デバイスのパラメータを設定する必要があります。
ステップバイステップ:
PCMデバイスの電源を入れます。たとえば:
fd = open("/dev/snd/pcmC0D0p", O_RDWR)
。オンの場合はPCMOPEN
状態です。設定パラメータを使用してください
ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)
。ハードウェアパラメータ構造にはマスク(各ビットは値です)間隔([最小、最大]範囲)。設定されていないパラメータは入力する必要があります(マスクに設定されているすべてのビット/値、範囲全体の間隔)。ハードウェアパラメータを設定した後、PCMSETUP
状態になります。バラよりpcm_set_config()TinyALSAのコードです。ACCESS
、、、FORMAT
およびRATE
設定CHANNELS
で十分PERIOD_SIZE
ですPERIODS
。他のパラメータはこれらのパラメータの変形です。ただし、BUFFER_SIZE
一部の機器では非多重に設定できますPERIOD_SIZE
。ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
デバイスとALSAランタイム変数を準備するために呼び出されます。それ以降はPCM状態になりますPREPARED
。読み取り(キャプチャ)または書き込み(再生)を開始します。
PCMデバイスを読み書きする最小アプリケーションのコードのほとんどは、ハードウェアパラメータを中心にしています。