Bagaimana cara mengubah level volume secara otomatis saat melepas headphone?

36

Yang saya inginkan adalah sebagai berikut:

  • Ketika saya mencolokkan headphone saya, saya ingin suara tidak dibisukan dan diatur ke tingkat volume tertentu.
  • Ketika saya mencabut headphone saya, saya ingin suara dimatikan (atau diatur ke tingkat volume tertentu).

Mengatur level volume bukanlah masalah, tapi entah bagaimana saya perlu melakukan ini ketika melepas headphone, jadi saya mencari cara untuk mendapatkan pemberitahuan tentang peristiwa itu.

Saya dengan cepat menemukan bahwa /proc/asound/card0/codec#0headphone terpasang atau tidak, jadi saya mencoba memantaunya menggunakan inotifywaitdan mengubah level volume berdasarkan notifikasi yang dimodifikasi . Sayangnya inotifywaitgagal karena proc bukan sistem file biasa.

Apakah ada cara lain untuk melakukan ini (mungkin melalui PulseAudio)?

Perangkat audio: Intel HDA , audio codec: Conexant CX20585 .


Untuk meringkas apa yang telah saya coba sejauh ini:

  • Ear Candy: sama sekali tidak berjalan di sistem saya. Tampaknya menjadi proyek yang ditinggalkan?
  • Kode yang diposting oleh Karl Bielefeldt mungkin berfungsi pada beberapa perangkat keras, tidak pada saya.
  • Gagasan dari StephenPaulger gagal karena kurangnya saluran 'Speaker'.
  • Termotivasi oleh aking1012 Saya membuatnya bekerja dengan meretas kode kernel (setelah menemukan kode indera jack dari codec), tapi itu solusi yang agak rumit.

Jadi, saya masih mencari cara mudah untuk melakukan ini.

htorque
sumber
Pertanyaan bagus, saya ingin melakukan ini juga!
Stephen Paulger
bagus ... tapi saya pikir patch ke alsa akan diperlukan untuk respon "instan" yang diinginkan pada plug / cabut. Kalau tidak, itu akan berfungsi atau tampaknya bekerja, tetapi di bawah beban atau kondisi lain, responsnya bisa lambat. pikir Anda harus masuk di antara acara plug dan toggle output. mungkin mungkin, tapi sooooo tidak layak sebagai basis patch individu kecuali seorang dev alsa mengatakan akan berkomitmen untuk trunk.
RobotHumans
salah satu pendekatannya adalah memuat modul di gdb, menunggu acara suara "normal" berhenti, gunakan opsi rekam, pasang dan cabut kabel telepon kepala, dan lihat apa yang terjadi dalam rekaman debug.
RobotHumans
berapa lama Anda merasa nyaman untuk menunda?
RobotHumans

Jawaban:

3

Untuk mengatur level volume dari konsol gunakan perintah amixer. Sebagai contoh:

amixer sset Master playback 0%

Akan mengatur level Anda ke 0%

Saya tidak tahu bagaimana cara mengubahnya ketika Anda mencolokkan headphone Anda ... tapi mungkin seseorang dapat membantu Anda dengan itu

Luciano Facchinelli
sumber
3

Selama UDS untuk Oneiric telah ada sesi tentang deteksi jack. Lihat cetak biru untuk detailnya. Kedengarannya seperti ini akan melakukan apa yang saya cari: tingkat volume yang berbeda untuk perangkat yang berbeda - tidak hanya pada setiap perangkat keras:

<Htorque> sesuatu yang saya ingin tahu tentang: apakah saya dapat memiliki level volume berbeda untuk perangkat yang berbeda (mis., suara internal diredam, headphone 75%) dalam waktu dekat?

<coling> ini akan didukung (pada beberapa jam / malam) ya. Timescales "soonish": p
<coling> (Saya juga berharap OSD akan ditampilkan (dengan volume saat ini) ketika jack dicolokkan / dicabut)

Pembaruan untuk 11.10

Ini sekarang harusnya berfungsi di Oneiric - sayangnya ThinkPad T510 saya tampaknya menjadi salah satu sistem yang saat ini tidak didukung.

Tindak lanjut lain dari David Henningsson:

Singkatnya, itu fitur yang diinginkan, dan kami bergerak ke arah itu, tetapi perlahan-lahan, karena fitur ini lebih kompleks daripada yang terlihat pada pandangan pertama.

Berita baiknya: di Ubuntu Oneiric (11.10) yang akan datang, ini benar-benar berfungsi. Berita buruknya: ini tidak bekerja untuk semua orang.

Lebih lanjut di sini .

Pembaruan untuk 12,04

Sekarang bekerja dengan ThinkPad T510 saya (dan banyak model lainnya) di Ubuntu 12.04 (versi pengembangan).

htorque
sumber
Apakah ada pelacakan perangkat keras mana yang saat ini didukung, atau sesuatu yang berpengaruh?
Mu Mind
2

Ear Candy memiliki beberapa fungsi untuk menangani pemasangan / pelepasan headphone.

zacharyliu
sumber
1
Sepertinya ini hanya untuk headphone USB ... apakah itu benar?
Mu Mind
2

Saya tidak tahu berapa banyak pengalaman pengkodean yang Anda miliki, tetapi Anda menyebutkannya inotifywaitsehingga saya akan menganggap Anda setidaknya nyaman dengan skrip shell. Program C berikut, berdasarkan artikel ini , harus dapat mendeteksi headphone Anda dicolokkan atau dicabut, setelah itu Anda dapat melakukan tindakan apa pun yang Anda inginkan.

#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;
}

Program ini mengambil satu argumen, yang seharusnya menjadi jalur ke perangkat acara masukan untuk headphone Anda. Ini /dev/input/event7untuk saya, tetapi Anda mungkin harus mencoba beberapa untuk menemukan yang ada di sistem Anda. Anda perlu izin baca di perangkat itu. Program akan mencetak nama perangkat, dan jenis, kode, dan nilai acara pertama sebelum keluar.

Karl Bielefeldt
sumber
Sayangnya tidak ada satu pun dari acara * yang ternyata terhubung ke headphone saya. Anyways, +1 - mungkin itu membantu pengguna lain.
htorque
+1, berfungsi untuk saya, event.valuememang diaktifkan ... tetapi readoperasi hanya kembali saat nilainya berubah ... mungkin Anda tahu cara membuatnya tidak memblokir? terima kasih!
Kevin
Anda menambahkan O_NONBLOCKketika Anda membuka perangkat, dan memeriksa nilai balik dari read. Jika negatif, bacaan akan diblokir, atau beberapa kesalahan lain terjadi. Ada cara lain yang lebih rumit untuk melakukannya tanpa polling jika Anda memasukkan ini ke dalam program yang lebih besar.
Karl Bielefeldt
1

Periksa dmesg dan file log lainnya. Mungkin memasukkan / mengeluarkan fires beberapa pesan tertentu.

Kemudian, Anda bisa menggunakan daemon untuk mem-parsing file log itu dan mendeteksi peristiwa. Saya pikir Anda tahu apa yang harus dilakukan dari titik ini :)

Pedro Loureiro
sumber
1

Jika kamu melakukan

amixer sset 'Speaker' playback 0%

volume speaker akan dibisukan tetapi headphone akan terus bekerja. Mencabut headphone berarti tidak ada suara. Yang hampir seperti yang Anda inginkan ...

Namun ...

Jika Anda mengubah kontrol volume, pengaturan volume 'Speaker' akan diatur kembali. Ini karena pulseaudio mencoba menjadi pandai dengan mengatur volume (Lihat http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes untuk informasi lebih lanjut). Kita bisa menghentikannya dari mengacaukan volume.

Buka /etc/pulse/default.pa

dan temukan garisnya

load-module module-udev-detect

dan ubah ke

load-module module-udev-detect ignore_dB=1

Mulai ulang pulseaudio.

killall pulseaudio

Sekarang jika Anda membisukan volume speaker yang mengubah volume master tidak akan mempengaruhinya. Jadi headphone akan berfungsi tetapi speaker akan tetap diam.

StephenPaulger
sumber
Akan menjadi pendekatan yang berbeda, tetapi sayangnya saya tidak memiliki saluran volume Speaker, hanya Master dan PCM.
htorque
1

Periksa soket ACPID untuk mengetahui perubahan, dapat dilakukan dengan bantuan skrip python atau C atau shell, ( kode Python untuk mengontrol putar plugin earphone dan berhenti di rhythmbox). Periksa perubahan voltase ACPID untuk mendeteksi plugin earphone dan plug earphone. Namun, penundaan beberapa detik dapat terjadi.

t3pleni9
sumber