私が欲しいのは次のとおりです:
音量レベルの設定は問題ではありませんが、ヘッドフォンの取り外し/接続時に何らかの理由でこれを行う必要があるため、これらのイベントを通知する方法を探しています。
ヘッドフォンが接続されているかどうかを示す/proc/asound/card0/codec#0
をすぐに見つけたので、inotifywait
を使用してそれを監視し、modified通知。 procは通常のファイルシステムではないため、残念ながらinotifywait
は失敗しました。
これを行う他の方法はありますか?
オーディオデバイス: Intel HDA 、オーディオコーデック: Conexant CX20585 。
これまでに試したことをまとめると:
だから、私はまだこれを行う簡単な方法を探しています。
OneiricのUDSの間に、ジャック検出に関するセッションがありました。詳細については、 blueprint を参照してください。これは私が探していることを正確に行うように聞こえます:すべてのハードウェアではなく、デバイスごとに異なるボリュームレベル:
<htorque>興味があること:すぐにいつでも異なるデバイス(たとえば、内部サウンドのミュート、ヘッドフォン75%)ごとに異なる音量レベルを使用できますか?
<coling>これはサポートされます(一部のハードウェアで)はい。タイムスケールは「もうすぐ」です:p
<coling>(ジャックが接続されている/接続されていない場合、OSDが(現在の音量で)表示されることも期待しています)
11.10の更新
これは Oneiricで動作 になっているはずです-残念ながら、私のThinkPad T510は現在サポートされていないシステムの1つであるようです。
デビッド・ヘニングソンからの別のフォローアップ:
簡単に言えば、これは望ましい機能であり、その方向に向かっていますが、機能は一見すると思われるよりも複雑なので、ゆっくりと進んでいます。
良いニュース:今後のUbuntu Oneiric(11.10)では、これは実際に機能しています。悪いニュース:それは皆のために働いていません。
もっと こちら 。
12.04の更新
現在、Ubuntu 12.04(開発版)のThinkPad T510(および他の多くのモデル)で動作しています。
コンソールからボリュームレベルを設定するには、コマンドamixerを使用します。例えば:
ミキサーセットマスター再生0%
レベルを0%に設定します
ヘッドフォンを接続したときにこれを変更する方法はわかりません...
Ear Candy には、ヘッドフォンの挿入/取り外しを処理する機能があります。
どれだけのコーディング経験があるかわかりませんが、inotifywait
に言及しているので、少なくともシェルスクリプトに慣れていると仮定します。 この記事 に基づいた次のCプログラムは、ヘッドフォンが接続されているか、接続されていないかを検出できます。その後、必要なアクションを実行できます。
#include <linux/input.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
int main(int argc, char* argv[])
{
int fd = -1;
char name[256]= "Unknown";
struct input_event event;
if ((fd = open(argv[1], O_RDONLY)) < 0) {
perror("evdev open");
exit(1);
}
if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) {
perror("evdev ioctl");
}
printf("The device on %s says its name is %s\n",
argv[1], name);
read(fd, &event, sizeof(struct input_event));
printf("Event type is %d\n", event.type);
printf("Event code is %d\n", event.code);
printf("Event value is %d\n", event.value);
close(fd);
return 0;
}
プログラムは1つの引数を取ります。この引数は、ヘッドフォンの入力イベントデバイスへのパスでなければなりません。これは私にとって/dev/input/event7
ですが、システム上にあるものを見つけるためにいくつか試してみる必要があるかもしれません。そのデバイスの読み取り権限が必要です。プログラムは、終了する前に、デバイスの名前、最初のイベントのタイプ、コード、および値を出力します。
Dmesgおよびその他のログファイルを確認します。おそらくプラグイン/アウトは、いくつかの特定のメッセージを起動します。
次に、デーモンを使用してそのログファイルを解析し、イベントを検出できます。この時点から何をすべきか知っていると思います:)
もしあなたがそうするなら
amixer sset 'Speaker' playback 0%
スピーカーの音量はミュートされますが、ヘッドフォンは機能し続けます。ヘッドフォンを抜くと音が出なくなります。これはほとんどあなたが望むものです...
ただし、...
音量コントロールを変更すると、「スピーカー」の音量設定が再度設定されます。これは、pulseaudioがボリュームの設定を賢くしようとするためです(詳細については http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes を参照してください)。ただし、ボリュームが乱れるのを防ぐことができます。
/etc/Pulse/default.paを開きます
そして、行を見つけます
load-module module-udev-detect
に変更します
load-module module-udev-detect ignore_dB=1
Pulseaudioを再起動します。
killall pulseaudio
スピーカーの音量をミュートしても、マスター音量を変更しても影響はありません。そのため、ヘッドフォンは機能しますが、スピーカーは静かになります。
ACPIDソケットの変更を確認します。pythonまたはCまたはシェルスクリプトを使用して実行できます( Pythonコード リズムボックスでイヤホンプラグインの再生と一時停止を制御するため)。イヤホンプラグインとイヤホンプラグアウトを検出するために、ACPID電圧の変化を確認します。ただし、数秒の遅延が予想されます。
これを使用して必要なものを達成できると思います: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458
Pulseaudioにはデフォルトで出荷されているモジュールがあり、これはまさにこれを達成するように設計されています: