web-dev-qa-db-ja.com

現在マイクにアクセスしているプロセス(ある場合)を照会できますか?

私はDebian(技術的にはRaspbian)を実行しており、スタートレックスタイルの音声コマンドシステムを取得しようとしています。私はそれをほとんど稼働させていますが、プライバシーとそのすべてのジャズの利益のために、マイクが常に録音されることを望んでいません。

疑問に思っているのですが、現在マイクにアクセスしているプロセスがある場合、それをポーリングする方法はありますか?アイデアは、マイクが現在オーディオを録音しているかどうかを判断するための小さなインジケーターを作成することです。

私の最終的な目標は、テレビのリモコンを使用してマイクのオンとオフを切り替え、オンかオフかを示すLEDインジケーターを用意することです。すべてのハードウェアが機能しているので、ソフトウェアを終了する必要があります。

私は今、PulseAudioではなく純粋なALSAで構成されていると信じていますが、間違っている可能性があります。

10
jmite

まず、マイクデバイスファイルを特定します。 /dev/snd/pcmC0D0cのようなものである必要があります。デバイスファイルを見つけやすくするために、arecordなどでテスト記録を開始してから、lsof | grep '/dev/snd';を実行できます。すべてのプログラムとそれに関連するデバイスファイルが一覧表示されます。

次に、fuser /dev/snd/pcmC0D0cを使用してマイクの使用法を確認できます。デバイスが開かれている場合、デバイスにアクセスしているプログラムのPIDを返します。

代わりに、inotifywait /dev/snd/pcmC0D0cをループして、デバイスのステータスを常にポーリングするのではなく、状態の変化を検出することもできます。

6

PCMデバイスのprocfsファイルstatusのフィールドowner_pidは、どのプログラムがそれを開いたかを示します。

$ grep owner_pid /proc/asound/card*/pcm*/sub*/status
/proc/asound/card2/pcm0p/sub0/status:owner_pid   : 1803
$ ps -p 1803
  PID TTY          TIME CMD
 1803 pts/0    00:00:00 aplay
4
CL.