Kulaklık çıkarırken / takarken ses seviyesi otomatik olarak nasıl değiştirilir?


36

İstediğim şey şu:

  • Kulaklıklarımı taktığımda, sesin kısılmasını ve belirli bir ses seviyesine ayarlanmasını istiyorum.
  • Kulaklığımı çıkardığımda, sesin kapalı olmasını istiyorum (veya belirli bir ses seviyesine ayarlayın).

Ses seviyesini ayarlamak sorun değil, ancak bir şekilde kulaklıkları çıkarırken / takarken bunu yapmam gerekiyor, bu yüzden bu olaylardan haberdar edilmenin bir yolunu arıyorum.

/proc/asound/card0/codec#0Kulaklıkların takılı olup olmadığını hızlı bir şekilde buldum , bu yüzden onu kullanarak izlemeye inotifywaitve ses düzeyini değiştirilmiş bildirimlere göre değiştirmeye çalıştım . Ne yazık ki inotifywaitbaşarısız oldu, çünkü proc sıradan bir dosya sistemi değil.

Bunu yapmanın başka yolları var mı (belki PulseAudio üzerinden)?

Ses cihazı: Intel HDA , ses kodeği: Conexant CX20585 .


Şimdiye kadar denediklerimi özetlemek için:

  • Kulak şekeri: sistemimde hiç çalışmadı. Terkedilmiş bir proje gibi görünüyor?
  • Karl Bielefeldt'in gönderdiği kod bazı donanımlar üzerinde çalışabilir, benim değil.
  • StephenPaulger’ın fikri “Konuşmacı” kanalı olmaması nedeniyle başarısız oluyor.
  • Aking1012 tarafından motive edilmiş (çekirdek kodeki kod algılama kodunu bulduktan sonra) çekirdek kodunda dolaşarak çalışmasını sağladım , ama bu oldukça zahmetli bir çözüm.

Yani, hala bunu yapmak için kolay bir yol arıyorum.


Mükemmel soru, ben de bunu yapmak istiyorum!
Stephen Paulger

güzel ... ama takma / çıkarma işleminde istenen "anında" yanıt için alsa yamasının gerekli olacağını düşünüyorum. Aksi halde işe ya da işe yarayacak gibi gözükse de, yük altında veya diğer şartlar altında yanıt gecikebilir. plug olayı ve çıkış arasında geçiş yapmanız gerektiğini düşünüyorum. Muhtemelen mümkün, ancak sooooo bir alsa dev'in gövdeye bağlanacağını söylemediği sürece bireysel bir yamaya dayanamayacak.
RobotHumans

yaklaşımlardan biri modülü gdb'ye yüklemek, "normal" ses olaylarının durmasını beklemek, kayıt seçeneğini kullanmak, kulaklıkları takıp çıkarmak ve hata ayıklama kaydında ne olduğunu görmek olacaktır.
RobotHumans

ne kadar gecikmeyle rahat edersin?
RobotHumans

Yanıtlar:


3

Konsoldan ses seviyesini ayarlamak için amixer komutunu kullanın. Örneğin:

amixer sset Master oynatma% 0

Seviyeni% 0 olarak ayarlayacak

Kulaklığınızı taktığınızda bunun nasıl değiştirileceğini bilmiyorum ... ama belki biri size yardımcı olabilir


3

Oneiric için UDS sırasında jack algılamasıyla ilgili bir oturum yapıldı. Detaylar için plana bakınız. Kulağa tam olarak aradığım şeyi yapacak gibi geliyor: farklı cihazlar için farklı ses seviyeleri - sadece her donanımda değil:

<htorque> merak ettiğim bir şey: yakın zamanda farklı cihazlar için farklı ses seviyelerine sahip olacak mıyım (örn. dahili ses kapalı,% 75 kulaklıklar)?

<coling> bu desteklenecektir (bazı s / b üzerinde) evet. Zaman çizelgeleri "yakında" dır: p
<coling> (jaklar takılı / çıkarılmış durumdayken OSD'nin de gösterilmesini beklerdim)

11.10 Güncellemesi

Bu şimdi Oneiric'de çalışıyor olmalı - ne yazık ki ThinkPad T510'um şu anda desteklenmeyen sistemlerden biri gibi görünüyor.

David Henningsson'dan başka bir takip:

Uzun lafın kısası, bu arzu edilen bir özellik ve biz bu yöne doğru ilerliyoruz, ancak özellik ilk bakışta göründüğünden daha karmaşık olduğundan yavaşça.

İyi haber: Yaklaşan Ubuntu Oneiric'te (11.10) bu gerçekten işe yarıyor. Kötü haber: herkes için çalışmıyor.

Daha burada .

12.04 Güncellemesi

Şimdi ThinkPad T510'umla (ve diğer birçok modelle) Ubuntu 12.04'te (geliştirme sürümü) çalışıyor.


Şu anda hangi donanımın desteklendiğini izleyen herhangi bir şey var mı, yoksa bu etkiye neden olan bir şey var mı?
Mu Mind


2

Ne kadar kodlama deneyimine sahip olduğunuzu bilmiyorum, ama siz bahsettiniz, inotifywaitbu yüzden en azından kabuk komut dosyası yazarken rahat edeceğinizi varsayacağım. Bu makaleye dayanan aşağıdaki C programı, kulaklıklarınızın takılı veya çıkarılmış olduğunu tespit edebilmeli ve sonrasında istediğiniz işlemi gerçekleştirebilmeli.

#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, kulaklıklarınız için giriş olayı aygıtına bir yol olması gereken bir argüman alır. Bu benim /dev/input/event7için, ancak sisteminizde hangisi olduğunu bulmak için birkaç deneme yapmanız gerekebilir. Bu cihazda okuma izinlerine ihtiyacınız olacak. Program, aygıtın adını ve çıkmadan önce ilk olayın türünü, kodunu ve değerini yazdırır.


Maalesef, olayın hiçbiri * kulaklıkma bağlı değildi. Neyse, +1 - belki de diğer kullanıcılara yardımcı olabilir.
htorque

1, benim için çalışıyor event.valuegerçekten açık ... ama readoperasyon sadece döner zaman değeri değiştiğinde ... belki o engellemediğini yapmak için biliyorum? yine de teşekkürler!
Kevin,

O_NONBLOCKCihazı açtığınızda eklersiniz ve geri dönüş değerini kontrol edin read. Negatifse, okuma ya engellenir ya da başka bir hata oluşur. Bunu daha büyük bir programa dahil ediyorsanız, yoklamadan yapmanın daha karmaşık yolları da var.
Karl Bielefeldt

1

Dmesg ve diğer günlük dosyalarını kontrol edin. Muhtemelen içeri / dışarı takarak bazı mesajları iletir.

Ardından, bu günlük dosyasını ayrıştırmak ve olayları tespit etmek için bir daemon kullanabilirsiniz. Bence bu noktadan ne yapacağınızı biliyorsunuz :)


1

Yaparsan

amixer sset 'Speaker' playback 0%

Hoparlör sesi kısılır, ancak kulaklık çalışmaya devam eder. Kulaklıkların çıkarılması, ses gelmediği anlamına gelir. Neredeyse istediğin şey bu ...

Ancak ...

Ses kontrolünü değiştirirseniz, 'Hoparlör' ses ayarı tekrar kurulur. Bunun nedeni, pulseaudio'nun ses seviyesini ayarlama konusunda akıllı olmaya çalışmasıdır ( daha fazla bilgi için bkz. Http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes ). Yine de hacimlerle uğraşmasını engelleyebiliriz.

/Etc/pulse/default.pa dosyasını açın.

ve çizgiyi bulmak

load-module module-udev-detect

ve değiştirin

load-module module-udev-detect ignore_dB=1

Pulseaudio'yu tekrar başlatın.

killall pulseaudio

Şimdi hoparlör sesini kapatırsanız ana ses seviyesini değiştirmek onu etkilemez. Böylece kulaklıklar çalışacak, fakat hoparlör sessiz kalacaktır.


Farklı bir yaklaşım olurdu, ama ne yazık ki bir Hoparlör ses kanalım yok, sadece Master ve PCM.
htorque

1

ACPID soketinde değişiklik olup olmadığını kontrol edin, python veya C veya shell script yardımı ile yapılabilir ( kulaklık eklentisi oynatımını kontrol etmek için Python kodu ve ritim kutusunda duraklatma). Kulaklık eklentisini ve kulaklık prizini tespit etmek için ACPID voltajındaki değişiklikleri kontrol edin. Yine de bir saniye gecikme beklenebilir.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.