Pertanyaan Bagaimana cara mengubah tingkat volume secara otomatis ketika headphone yang tidak tersambung / mencolok?


Yang saya inginkan adalah sebagai berikut:

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

Mengatur level volume bukan masalah, tetapi saya perlu melakukan ini ketika membuka headphone, jadi saya mencari cara untuk mendapatkan pemberitahuan tentang kejadian tersebut.

Saya dengan cepat menemukan /proc/asound/card0/codec#0 untuk menunjukkan apakah headphone terpasang atau tidak, jadi saya mencoba untuk memantaunya inotifywait dan ubah level volume berdasarkan diubah pemberitahuan. Sayangnya inotifywait gagal karena proc bukan filesystem biasa.

Adakah cara lain untuk melakukan ini (mungkin melalui PulseAudio)?

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


Untuk meringkas apa yang sudah saya coba sejauh ini:

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

Jadi, saya masih mencari cara mudah untuk melakukan ini.


36
2018-01-27 12:16


asal


Pertanyaan bagus, saya ingin melakukan ini juga! - Stephen Paulger
bagus ... tapi saya pikir patch untuk alsa akan diperlukan untuk respon "instan" yang diinginkan pada steker / cabut. kalau tidak, itu akan bekerja atau tampak berfungsi, tetapi di bawah beban atau kondisi lain, respons bisa tertinggal. pikir Anda harus masuk antara acara plug dan beralih output. mungkin mungkin, tapi sooooo tidak bernilai secara individual kecuali jika seorang alsa dev mengatakan akan berkomitmen pada bagasi. - RobotHumans
salah satu pendekatannya adalah dengan memuat modul ke dalam gdb, menunggu peristiwa suara "normal" berhenti, gunakan opsi rekam, pasang dan cabut telepon kepala, dan lihat apa yang terjadi dalam perekaman debug. - RobotHumans
berapa lama Anda merasa nyaman? - RobotHumans


Jawaban:


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

amixer sset Master pemutaran 0%

Akan mengatur level Anda menjadi 0%

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


3
2018-01-27 14:30





Selama UDS untuk Oneiric telah ada sesi tentang deteksi jack. Lihat cetak biru itu untuk detailnya. Kedengarannya seperti ini persis 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 tingkat volume yang berbeda untuk perangkat yang berbeda (mis., suara internal diredam, headphone 75%) dalam waktu dekat?

<coling> ini akan didukung (pada beberapa h / w) ya. Timescales adalah "segera": hal
  <coling> (Saya juga mengharapkan OSD ditampilkan (dengan volume saat ini) ketika jack dicolokkan / dicabut

Perbarui untuk 11.10

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

Tindak lanjut lain dari David Henningsson:

Singkat cerita, itu adalah fitur yang diinginkan, dan kami bergerak ke arah itu, tetapi perlahan-lahan, karena fiturnya lebih kompleks daripada kelihatannya pada pandangan pertama.

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

Lebih sini.

Pembaruan untuk 12.04

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


3
2018-05-11 15:42



Adakah yang melacak perangkat keras yang saat ini didukung, atau sesuatu untuk efek itu? - Mu Mind


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


2
2018-01-28 00:08



Sepertinya ini hanya untuk headphone USB ... apakah itu benar? - Mu Mind


Saya tidak tahu berapa banyak pengalaman pengkodean yang Anda miliki, tetapi Anda sebutkan inotifywait jadi saya akan menganggap Anda setidaknya merasa nyaman dengan scripting 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 peristiwa input untuk headphone Anda. Ini adalah /dev/input/event7 bagi saya, tetapi Anda mungkin harus mencoba beberapa untuk menemukan yang ada di sistem Anda. Anda akan perlu membaca izin pada perangkat itu. Program akan mencetak nama perangkat, dan jenis, kode, dan nilai dari acara pertama sebelum keluar.


2
2018-02-03 19:18



Sayangnya tidak ada satu pun dari peristiwa itu yang ternyata terhubung ke headphone saya. Anyways, +1 - mungkin itu membantu untuk pengguna lain. - htorque
+1, berfungsi untuk saya, event.value memang diaktifkan ... tetapi read operasi hanya mengembalikan kapan nilai berubah ... mungkin Anda tahu cara membuatnya tidak memblokir? terima kasih juga! - Kevin
Anda menambahkan O_NONBLOCK saat Anda membuka perangkat, dan periksa nilai kembalinya read. Jika negatif, bacaan akan terhalang, atau beberapa kesalahan lainnya terjadi. Ada cara lain yang lebih rumit untuk melakukannya tanpa pemungutan suara jika Anda memasukkan ini ke dalam program yang lebih besar. - Karl Bielefeldt


Periksa dmesg dan file log lainnya. Mungkin menancapkan / memadamkan beberapa pesan tertentu.

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


1
2018-02-03 15:59





Jika kamu melakukan

amixer sset 'Speaker' playback 0%

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

Namun...

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

Buka /etc/pulse/default.pa

dan temukan garisnya

load-module module-udev-detect

dan mengubahnya menjadi

load-module module-udev-detect ignore_dB=1

Restart pulseaudio.

killall pulseaudio

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


1
2018-01-05 05:33



Akan menjadi pendekatan yang berbeda, tapi sayangnya saya tidak memiliki saluran volume Speaker, hanya Master dan PCM. - htorque


Periksa soket ACPID untuk perubahan, dapat dilakukan dengan bantuan skrip python atau C atau skrip, (Kode Python untuk mengontrol pemutaran plugin earphone dan berhenti di rhythmbox). Periksa perubahan tegangan ACPID untuk mendeteksi plugin earphone dan plug-in earphone. Namun, penundaan detik dapat diharapkan.


1
2018-02-08 21:10





Pulseaudio memiliki modul yang dikirim secara default yang dirancang untuk mencapai hal ini:

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


0
2018-06-05 01:07



Saya tidak melihat bagaimana modul ini seharusnya membantu saya. - htorque


Saya pikir Anda mungkin mencapai apa yang Anda butuhkan menggunakan ini: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458


0



Selamat datang di Tanya Ubuntu! Sementara ini secara teoritis dapat menjawab pertanyaan itu, itu akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan berikan tautan sebagai referensi. - Kevin Bowen