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


41

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

ALSAを使用しています。

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

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

それから私は猫からのエラーと思われるものを受け取ります

 cat: write error: File descriptor in bad state

これを修正して、サウンドカードからおいしい静的なプレイを聞くことができますか?


1
ランダムなPCMデータを送信する必要があるか、最初にいくつかのioctlを使用してデバイスをセットアップする必要があると思います。ランダムなバイトをダンプすることはできません。
ジル 'SO-悪であるのをやめる'

@Gillesウィキペディアによると、.wavはPCMであり、ランダムファイルを.wavファイルに置き換えるとまったく同じ結果が得られます。いくつかのイン/アウトコントロールの設定を調査します。
ジョーンズ

誰かがioctlの設定方法に関するチュートリアルへのポインタを持っていますか?ioctlと呼ばれるものについては、APIとしてのALSAが入出力用のインターフェースを提供すべきだと思いましたか?
ジョーンズ

次に、デバイスファイルに直接pcm
liferenko

回答:


46

これが機能しない理由は、そのインターフェースが非推奨になったためだと思います。通常/dev/dsp、少なくともトリッキーになることなく、もうオーディオを使用することはできません。

システム上でこれを実現するプログラムがありますpadsp。これにより、/dev/audioor /dev/dspファイルが新しいAudio Serverシステムにマッピングされます。

ターミナルを起動し、でルートモードに入りsudo suます。

次に、cat /dev/urandom出力をパイプで処理しpadspteeコマンドを使用してデータをに送信します/dev/audio。端末に大量のゴミが出るので、にリダイレクトすることもできます/dev/null

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

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

マウスのような他のデバイスで試してみたいと思うかもしれません:Use /dev/psaux:、たとえばusbドライバー。メモリーを実行することもできます。 /dev/mem

これが以前は機能していなかった理由が明らかになることを願っています。

個人的には、マウスとメモリはランダムに静的にプレイするよりもはるかに興味深いことがわかりました!


1
どうもありがとう!これは私が探していたものです。質問を投稿してから7か月間完全に回答しました。:
ジョーンズ

3
これにはsudo特権は必要ないようです。
iyrin

2
どうもありがとう。バイナリが妙に面白いことがわかりました。/ usr / bin / ls / usr / bin / gnome-terminal / usr / bin / mysqlのようなもの
明るくしない

うーん、奇妙な、「tee」はこれを行うことができますが、「dd of = / dev / audio」はできません。
ジェイセン

@Jasen ddは、一度に書きすぎている可能性があります。padpは、/ dev / audioをシミュレートして、alsaを介してリダイレクトします。paddを使用しないddは、カーネル内OSSエミュレーションが有効になっていない限り(およびデフォルトでは無効になっている場合を除いて)、/ dev / audioを参照しません。そして、ドライバー内のバッファーよりもはるかに大きい大きなブロックの書き込みは失敗することさえあると思います。
ポールステリアン

8

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

編集(2019年8月6日):コマンドの古いバージョンでは、padsp teeとの間にもcatありましたaplay。私は実際にフィールドで働いているので、それは全く意味をなさないことを理解しています。また、更新されたコマンド(この回答の冒頭に表示されているコマンド)が機能することは知っています。仕事で1日に何度も使用しているからです。


6
私はALSAを使用していますが、「padsp tee」は必要ありません。
ジェレミア14年

1
私のpulseaudioの経験では(PAがダウンしているときにUbuntuが使用しているものは何でも)padsp tee必要でした(その時点で正確に12.04.2でした)問題は、たとえrootであったとしても、デバイスにデータを直接ダンプしないでください(私が知る限り、/ devフォルダー内で読み取り可能で書き込み可能なファイルはほとんどありません)、エラーが発生する可能性があるため(最良の場合、各更新でより一般的になります)、カーネルをクラッシュさせるか、デバイスを破壊することさえあります。まれに。これを行うには、aplayなどの非特権要素を使用する必要があります(残念ながら、オーディオグルー​​プまたはルートが必要です)。@geremia
ポールステリアン14

おかしなことに、私はそのpadsp tee事が実際にはまったく意味をなさないことがわかりました。職場では、その行なしで似たようなものを使用して、オーディオドライバーの作成が進んでいるかどうかをテストします。今私の答えを更新します。
ポールステリアン

3

/ dev / audioまたは/ dev / sndの下にある他のデバイスのいずれかを試してください。すべてがオーディオデータシンクではありません。ミキサー、マイク、または何かをキャッチした可能性があります。


1
返信いただきありがとうございます。/ proc / asound / devicesによると、/ dev / snd / pcmC0D0pはオーディオ再生に適したデバイスです(そのため 'p')
jones

1
また、よくわかりませんが、再生用に複数の開発用「ファイル」を使用できますか?私はしていない私は「は/ dev /オーディオ」考える「の/ dev /オーディオ」を持っている古いカーネル(2.5の前)に使用されているOSSとは何かがある
ジョーンズ

2

サウンドデーモン(例pulseaudio)がデバイスのロックを保持していますか?を介して他の何かがハンドルを持っているかどうかを見つけることができると思いますlsof


1
役立つ提案をありがとう。とを使用してチェックgrepしましたlsofpulseaudioは使用して/dev/snd/controlC0いますが、オンではありません/dev/snd/pcmC0D0p/var/lockデバイスにロック用のファイルがあるかどうかを確認して、二重チェックを行いました。ls -alフォルダーが空であることを示します。したがって、pcmC0D0pにはロックがないと思います。
ジョーンズ

@jonesドライバーによっては、コントロールのロックを保持するだけで、カード全体をロックできます。(8年後に答えて申し訳ありませんが、今では私は自分自身を知っています)
ポール・ステリアン

0

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)。ハードウェアパラメータ構造には、マスク(各ビットは値)と間隔([最小、最大]範囲)があります。設定されていないパラメーターは、満たされた状態で渡される必要があります(マスクに設定されたすべてのビット/値、間隔の全範囲)。ハードウェアパラメータを設定すると、PCMはSETUP状態になります。コードについては、TinyALSAのpcm_set_config()を参照してください。

    設定ACCESSFORMATRATECHANNELSPERIOD_SIZEそしてPERIODS十分です。他のパラメータはこれらのバリアントです。ただしBUFFER_SIZE、一部のデバイスではの非倍数に設定される場合がありPERIOD_SIZEます。

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

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

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


aplayが(少なくとも私が開発しているシステムで)ioctl(fd、SNDRV_PCM_IOCTL_WRITEI_FRAMES、...)を使用し、再生時の実際のwrite()呼び出しではないため、実際の読み取り/書き込みが機能するかどうかはわかりません。ALSA自体には、読み取り/書き込みエントリポイントを取得し、それらをioctlに変換するラッパーがありますか?
ポールステリアン

@PaulStelianはい。pcmのファイル操作の定義を参照してください。snd_pcm_read()及びsnd_pcm_write()バイトがフレームに変換されます
リカルドビールパスクアリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.