วิธีการเปลี่ยนระดับเสียงโดยอัตโนมัติเมื่อถอด / เสียบหูฟัง?


36

สิ่งที่ฉันต้องการคือ:

  • เมื่อฉันเสียบหูฟังฉันต้องการยกเลิกการปิดเสียงและตั้งค่าระดับเสียงเฉพาะ
  • เมื่อฉันถอดปลั๊กหูฟังของฉันฉันต้องการให้เสียงถูกปิดเสียง (หรือตั้งค่าเป็นระดับเสียงเฉพาะ)

การตั้งค่าระดับเสียงไม่ได้เป็นปัญหา แต่อย่างใดฉันต้องทำสิ่งนี้เมื่อถอด / เสียบหูฟังดังนั้นฉันจึงมองหาวิธีที่จะได้รับการแจ้งเตือนจากเหตุการณ์เหล่านั้น

ฉันพบอย่างรวดเร็ว/proc/asound/card0/codec#0เพื่อระบุว่ามีการเสียบหูฟังหรือไม่ดังนั้นฉันจึงพยายามตรวจสอบโดยใช้inotifywaitและเปลี่ยนระดับเสียงตามการแจ้งเตือนที่แก้ไข น่าเสียดายที่inotifywaitล้มเหลวเพราะprocไม่ใช่ระบบไฟล์ธรรมดา

มีวิธีอื่นในการทำเช่นนี้ (อาจจะผ่าน PulseAudio)

อุปกรณ์เสียง: Intel HDA , ตัวแปลงสัญญาณเสียง: Conexant CX20585


เพื่อสรุปสิ่งที่ฉันได้ลองไปแล้ว:

  • Ear Candy: ไม่ได้ทำงานเลยในระบบของฉัน ดูเหมือนว่าจะเป็นโครงการที่ถูกทิ้งร้าง?
  • รหัสที่โพสต์โดยKarl Bielefeldtอาจใช้ได้กับฮาร์ดแวร์บางตัว แต่ไม่สามารถทำได้
  • แนวคิดจากStephenPaulgerล้มเหลวเนื่องจากขาดช่อง 'ลำโพง'
  • ได้แรงบันดาลใจจากaking1012ฉันทำให้มันทำงานได้โดยการแฮ็กในโค้ดเคอร์เนล (หลังจากค้นหาโค้ดตัวแปลงสัญญาณแจ็คของตัวแปลงสัญญาณ) แต่นั่นเป็นวิธีที่ค่อนข้างยุ่งยาก

ดังนั้นฉันยังคงมองหาวิธีที่ง่ายในการทำเช่นนี้


คำถามยอดเยี่ยมฉันต้องการทำเช่นนี้ด้วย!
Stephen Paulger

ดี ... แต่ฉันคิดว่าแพทช์ถึงอัลซาจะเป็นสิ่งจำเป็นสำหรับการตอบสนอง "ทันที" ที่ต้องการบนปลั๊ก / ถอดปลั๊ก ไม่เช่นนั้นจะใช้งานได้หรือดูเหมือนจะทำงานได้ แต่ภายใต้ภาระหรือเงื่อนไขอื่นการตอบสนองอาจล่าช้า คิดว่าคุณต้องเข้าร่วมระหว่างเหตุการณ์ปลั๊กและสลับการส่งออก อาจเป็นไปได้ แต่ไม่ควรเสียค่าใช้จ่ายในการติดตั้งแพตช์แต่ละตัวเว้นแต่ว่า alsa dev จะบอกว่ามันจะถูกส่งไปที่ลำต้น
RobotHumans

วิธีหนึ่งคือการโหลดโมดูลขึ้นใน gdb รอเหตุการณ์เสียง "ปกติ" เพื่อหยุดใช้ตัวเลือกบันทึกปลั๊กและถอดปลั๊กโทรศัพท์หัวและดูสิ่งที่เกิดขึ้นในการบันทึกการดีบัก
RobotHumans

คุณพอใจกับความล่าช้าเท่าไร
RobotHumans

คำตอบ:


3

ในการตั้งค่าระดับเสียงจากคอนโซลให้ใช้คำสั่ง amixer ตัวอย่างเช่น:

amixer sset การเล่นระดับมาสเตอร์ 0%

จะตั้งค่าระดับของคุณเป็น 0%

ฉันไม่ทราบวิธีการเปลี่ยนแปลงนี้เมื่อคุณเสียบหูฟัง ... แต่อาจมีบางคนสามารถช่วยคุณได้


3

ระหว่าง UDS สำหรับ Oneiric มีเซสชันเกี่ยวกับการตรวจหาแจ็ค ดูรายละเอียดพิมพ์เขียว ดูเหมือนว่าสิ่งนี้จะทำในสิ่งที่ฉันกำลังมองหา: ระดับเสียงที่แตกต่างกันสำหรับอุปกรณ์ที่แตกต่าง - ไม่ได้อยู่บนฮาร์ดแวร์ทุกตัว:

<เรื่อง> สิ่งที่ฉันอยากรู้: ฉันจะสามารถมีระดับเสียงที่แตกต่างกันสำหรับอุปกรณ์ต่าง ๆ (เช่นปิดเสียงภายในหูฟัง 75%) ได้เร็ว ๆ นี้ไหม

<การระบายสี> สิ่งนี้จะได้รับการสนับสนุน (ในบางชั่วโมง / ใช่) ใช่ Timescales เป็น "เร็ว ๆ นี้": p
<coling> (ฉันคาดหวังว่า OSD จะแสดง (ด้วยระดับเสียงปัจจุบัน) เมื่อแจ็คเสียบ / ถอดปลั๊ก)

อัพเดทสำหรับ 11.10

ตอนนี้ควรใช้งานได้ใน Oneiricแต่น่าเสียดายที่ ThinkPad T510 ของฉันน่าจะเป็นระบบที่ไม่รองรับในปัจจุบัน

การติดตามผลอื่นจาก David Henningsson:

เรื่องสั้นสั้น ๆ มันเป็นคุณสมบัติที่ต้องการและเรากำลังเคลื่อนที่ไปในทิศทางนั้น แต่อย่างช้า ๆ เนื่องจากคุณลักษณะนั้นซับซ้อนกว่าที่ดูเหมือนเมื่อมองแวบแรก

ข่าวดี: ใน Ubuntu Oneiric (11.10) ที่กำลังมาถึงนี้ใช้งานได้จริง ข่าวร้าย: มันไม่ทำงานสำหรับทุกคน

เพิ่มเติมที่นี่

อัพเดทสำหรับ 12.04

ตอนนี้ทำงานกับ ThinkPad T510 ของฉัน (และรุ่นอื่น ๆ อีกมากมาย) ใน Ubuntu 12.04 (รุ่นพัฒนา)


มีการติดตามอะไรบ้างที่ฮาร์ดแวร์ที่รองรับในขณะนี้
Mu Mind

2

Ear Candyมีฟังก์ชั่นบางอย่างสำหรับจัดการกับการใส่ / ถอดหูฟัง


1
ดูเหมือนว่านี่เป็นเพียงหูฟัง USB ... ถูกต้องไหม?
Mu Mind

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

โปรแกรมใช้เวลาหนึ่งอาร์กิวเมนต์ซึ่งควรเป็นเส้นทางไปยังอุปกรณ์เหตุการณ์อินพุตสำหรับหูฟังของคุณ นี่/dev/input/event7สำหรับฉัน แต่คุณอาจต้องลองสองสามครั้งเพื่อหาว่ามันอยู่ในระบบของคุณหรือไม่ คุณจะต้องมีสิทธิ์อ่านบนอุปกรณ์นั้น โปรแกรมจะพิมพ์ชื่อของอุปกรณ์และประเภทรหัสและค่าของเหตุการณ์แรกก่อนที่จะออก


น่าเสียดายที่ไม่มีกิจกรรม * ที่เชื่อมต่อกับหูฟังของฉัน อย่างไรก็ตาม +1 - อาจช่วยผู้ใช้รายอื่นได้
htorque

+1 ใช้งานได้สำหรับฉันevent.valueถูกเปลี่ยน ... แต่การreadดำเนินการจะส่งกลับเฉพาะเมื่อค่าเปลี่ยนแปลง ... คุณอาจรู้วิธีทำให้ไม่ปิดกั้น ขอบคุณอยู่ดี!
Kevin

คุณสามารถเพิ่มเมื่อคุณเปิดอุปกรณ์และตรวจสอบค่าตอบแทนของO_NONBLOCK readหากเป็นค่าลบการอ่านอาจปิดกั้นหรือเกิดข้อผิดพลาดอื่น ๆ มีวิธีที่ซับซ้อนกว่านี้ในการทำโดยไม่ต้องลงคะแนนเลือกตั้งหากคุณรวมโปรแกรมนี้เข้ากับโปรแกรมที่ใหญ่
Karl Bielefeldt

1

ตรวจสอบ dmesg และไฟล์บันทึกอื่น ๆ การเสียบเข้า / ออกอาจทำให้เกิดข้อความบางอย่าง

จากนั้นคุณสามารถใช้ daemon เพื่อวิเคราะห์ไฟล์บันทึกนั้นและตรวจจับเหตุการณ์ ฉันคิดว่าคุณรู้ว่าจะทำอย่างไรจากจุดนี้ :)


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

ตอนนี้ถ้าคุณปิดเสียงลำโพงเปลี่ยนระดับเสียงหลักจะไม่ส่งผลกระทบ ดังนั้นหูฟังจะทำงาน แต่ลำโพงจะเงียบ


จะเป็นวิธีที่แตกต่างกันไป แต่น่าเสียดายที่ฉันไม่มีแชนเนลระดับเสียงของลำโพงมีเพียง Master และ PCM
htorque

1

ตรวจสอบการเปลี่ยนแปลงซ็อกเก็ต ACPID สามารถทำได้ด้วยความช่วยเหลือของ python หรือ C หรือ shell script ( รหัส Pythonสำหรับการควบคุมการเล่นปลั๊กอินของหูฟังและหยุดชั่วคราวใน rhythmbox) ตรวจสอบการเปลี่ยนแปลงแรงดันไฟฟ้า ACPID เพื่อตรวจสอบปลั๊กหูฟังและปลั๊กหูฟัง สามารถคาดหวังความล่าช้าได้ในไม่กี่วินาที



0

ฉันคิดว่าคุณอาจบรรลุสิ่งที่คุณต้องการโดยใช้สิ่งนี้: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458


ยินดีต้อนรับสู่ถาม Ubuntu! ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Kevin Bowen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.