web-dev-qa-db-ja.com

ヘッドフォンの取り外し/接続時に音量レベルを自動的に変更するにはどうすればよいですか?

私が欲しいのは次のとおりです:

  • ヘッドフォンを接続するとき、サウンドのミュートを解除し、特定の音量レベルに設定する必要があります。
  • ヘッドフォンのプラグを抜くとき、サウンドをミュート(または特定の音量レベルに設定)する必要があります。

音量レベルの設定は問題ではありませんが、ヘッドフォンの取り外し/接続時に何らかの理由でこれを行う必要があるため、これらのイベントを通知する方法を探しています。

ヘッドフォンが接続されているかどうかを示す/proc/asound/card0/codec#0をすぐに見つけたので、inotifywaitを使用してそれを監視し、modified通知。 procは通常のファイルシステムではないため、残念ながらinotifywaitは失敗しました。

これを行う他の方法はありますか?

オーディオデバイス: Intel HDA 、オーディオコーデック: Conexant CX20585


これまでに試したことをまとめると:

  • Ear Candy:私のシステムではまったく動作しませんでした。放棄されたプロジェクトのようですか?
  • Karl Bielefeldt が投稿したコードは、一部のハードウェアで動作する可能性がありますが、私のハードウェアでは動作しません。
  • StephenPaulger のアイデアは、「スピーカー」チャンネルがないために失敗します。
  • aking1012 によって動機付けられました(コーデックのジャックセンシングコードを見つけた後)カーネルコードをハックすることで機能しましたが、それはかなり面倒な解決策です。

だから、私はまだこれを行う簡単な方法を探しています。

36
htorque

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(および他の多くのモデル)で動作しています。

3
htorque

コンソールからボリュームレベルを設定するには、コマンドamixerを使用します。例えば:

ミキサーセットマスター再生0%

レベルを0%に設定します

ヘッドフォンを接続したときにこれを変更する方法はわかりません...

3

Ear Candy には、ヘッドフォンの挿入/取り外しを処理する機能があります。

2
zacharyliu

どれだけのコーディング経験があるかわかりませんが、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ですが、システム上にあるものを見つけるためにいくつか試してみる必要があるかもしれません。そのデバイスの読み取り権限が必要です。プログラムは、終了する前に、デバイスの名前、最初のイベントのタイプ、コード、および値を出力します。

2
Karl Bielefeldt

Dmesgおよびその他のログファイルを確認します。おそらくプラグイン/アウトは、いくつかの特定のメッセージを起動します。

次に、デーモンを使用してそのログファイルを解析し、イベントを検出できます。この時点から何をすべきか知っていると思います:)

1
Pedro Loureiro

もしあなたがそうするなら

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

スピーカーの音量をミュートしても、マスター音量を変更しても影響はありません。そのため、ヘッドフォンは機能しますが、スピーカーは静かになります。

1
Stephen Paulger

ACPIDソケットの変更を確認します。pythonまたはCまたはシェルスクリプトを使用して実行できます( Pythonコード リズムボックスでイヤホンプラグインの再生と一時停止を制御するため)。イヤホンプラグインとイヤホンプラグアウトを検出するために、ACPID電圧の変化を確認します。ただし、数秒の遅延が予想されます。

1
t3pleni9

これを使用して必要なものを達成できると思います: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458

0
Zilmar

Pulseaudioにはデフォルトで出荷されているモジュールがあり、これはまさにこれを達成するように設計されています:

http://pulseaudio.org/wiki/Modules#module-device-restore

0
towolf