ヘッドフォンの取り外し/接続時に音量レベルを自動的に変更する方法は?


36

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

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

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

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

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

オーディオデバイス:インテルHDA、オーディオコーデック:Conexant社CX20585


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

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

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


素晴らしい質問です、私もこれをやりたいです!
スティーブンPaulger

素敵な...しかし、私はALSAにパッチプラグ/アンプラグ上の所望の「インスタント」応答のために必要になると思います。それ以外の場合は、仕事や仕事に思えるが、負荷や他の条件の下で、応答が遅れる可能性があります。あなたはプラグイベントおよび出力トグルの間に取得することがあると思います。おそらく可能性が、個々のパッチごとすっごく価値がないALSA devが、それはトランクにコミットされますと言う場合を除きます。
RobotHumans

1つのアプローチは、モジュールをgdbにロードし、「通常の」サウンドイベントが停止するのを待ち、録音オプションを使用し、ヘッドフォンのプラグを抜き、デバッグ録音で何が起こったかを確認することです。
RobotHumans

あなたはどれくらいの遅延に満足していますか?
RobotHumans

回答:


3

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

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

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

ヘッドフォンを接続したときにこれを変更する方法がわかりません...しかし、誰かがあなたを助けることができるかもしれません


3

OneiricのUDS中に、ジャック検出に関するセッションがありました。詳細については、設計図を参照してください。これは私が探しているものを正確に行うように聞こえます:すべてのハードウェアではなく、さまざまなデバイスのさまざまな音量レベル:

<htorque>気になること:すぐにいつでも異なるデバイス(たとえば、内部サウンドのミュート、ヘッドフォン75%)ごとに異なる音量レベルを使用できますか?

<coling>これはサポートされます(一部のハードウェアで)はい。タイムスケールは「すぐに」:p
<coling>(ジャックが接続されている/接続されていないときにOSDが(現在の音量で)表示されることも期待しています)

11.10の更新

これは現在、Oneiric動作しているはずです -残念ながら、私のThinkPad T510は現在サポートされていないシステムの1つであるようです。

デビッド・ヘニングソンからの別のフォローアップ:

要するに、これは望ましい機能であり、私たちはその方向に向かっていますが、機能は一見すると思われるよりも複雑なので、ゆっくりと進んでいます。

良いニュース:今後のUbuntu Oneiric(11.10)では、これは実際に機能しています。悪いニュース:それは皆のために働いていません。

詳細はこちら

12.04の更新

現在、Ubuntu 12.04(開発版)のThinkPad T510(および他の多くのモデル)で動作しています。


現在サポートされているハードウェアを追跡するもの、またはその結果をもたらすものはありますか?
ムーマインド


2

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


残念ながら、イベント*はどれも私のヘッドフォンに接続されていませんでした。とにかく、+ 1-他のユーザーの助けになるかもしれません。
htorque

+1、私のために動作し、event.value実際に切り替えられます...しかし、read操作は値が変更されたときにのみ戻ります...多分あなたはそれをブロックしないようにする方法を知っていますか?とにかくありがとう!
ケビン

O_NONBLOCKデバイスを開くときに追加し、の戻り値を確認しますread。負の場合、読み取りがブロックされているか、他のエラーが発生しました。これをより大きなプログラムに組み込む場合、ポーリングなしでそれを行うより複雑な他の方法があります。
カールビーレフェルト

1

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

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


1

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

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

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


別のアプローチになりますが、残念ながら、スピーカーボリュームチャンネルはなく、マスターとPCMしかありません。
htorque

1

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



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.