जब अन-प्लगिंग हेडफ़ोन को स्वचालित रूप से वॉल्यूम स्तर कैसे बदला जाए?


36

जो मैं चाहता हूं वह निम्नलिखित है:

  • जब मैं अपने हेडफ़ोन में प्लग करता हूं, तो मैं चाहता हूं कि ध्वनि अन-म्यूट हो और एक विशिष्ट वॉल्यूम स्तर पर सेट हो।
  • जब मैं अपने हेडफ़ोन को अनप्लग करता हूं, तो मैं चाहता हूं कि ध्वनि को म्यूट किया जाए (या एक विशिष्ट वॉल्यूम स्तर पर सेट)।

वॉल्यूम स्तरों को सेट करना समस्या नहीं है, लेकिन हेडफ़ोन को अन-प्लग करने पर मुझे किसी तरह यह करने की आवश्यकता होती है, इसलिए मैं उन घटनाओं के बारे में सूचित करने का तरीका ढूंढ रहा हूं।

मुझे जल्दी /proc/asound/card0/codec#0से संकेत मिलता है कि क्या हेडफ़ोन प्लग किया गया है या नहीं, इसलिए मैंने संशोधित सूचनाओं के inotifywaitआधार पर वॉल्यूम स्तर का उपयोग करने और इसे बदलने की निगरानी करने की कोशिश की । दुर्भाग्य से विफल हो गया क्योंकि proc एक साधारण फाइल सिस्टम नहीं है।inotifywait

क्या ऐसा करने के अन्य तरीके हैं (शायद पल्सएडियो के माध्यम से)?

ऑडियो डिवाइस: Intel HDA , ऑडियो कोडेक: Conexant CX20585


संक्षेप में यह बताने के लिए कि मैंने अब तक क्या किया है:

  • कान कैंडी: मेरे सिस्टम पर बिल्कुल नहीं चला। एक परित्यक्त परियोजना लगता है?
  • Karl Bielefeldt द्वारा पोस्ट किया गया कोड कुछ हार्डवेयर पर काम कर सकता है, यह मेरा नहीं है।
  • 'स्पीकर' चैनल की कमी के कारण स्टीफनपॉलगर का विचार विफल हो गया।
  • Aking1012 द्वारा प्रेरित मैंने इसे कर्नेल कोड ( कोडर के जैक सेंसिंग कोड को खोजने के बाद) के आसपास हैक करके काम किया, लेकिन यह एक बल्कि बोझिल समाधान है।

इसलिए, मैं अभी भी इसे करने का एक आसान तरीका ढूंढ रहा हूं।


बहुत बढ़िया सवाल, मैं यह भी करना चाहता हूँ!
स्टीफन पॉल्जर

अच्छा ... लेकिन मुझे लगता है कि प्लग / अनप्लग पर वांछित "तत्काल" प्रतिक्रिया के लिए अलसा के लिए एक पैच आवश्यक होगा। अन्यथा यह काम करेगा या काम करने लगेगा, लेकिन लोड या अन्य शर्तों के तहत, प्रतिक्रिया पिछड़ सकती है। लगता है कि आपको प्लग इवेंट और आउटपुट टॉगल के बीच में आना होगा। शायद संभव है, लेकिन जब तक कोई अलसा देव नहीं कहता है कि वह ट्रंक के लिए प्रतिबद्ध होगा, तब तक एक व्यक्तिगत पैच आधार के लायक नहीं है।
रोबोट ह्यूमन्स

एक दृष्टिकोण जीडीबी में मॉड्यूल को लोड करने के लिए होगा, "सामान्य" ध्वनि घटनाओं को रोकने के लिए प्रतीक्षा करें, रिकॉर्ड विकल्प का उपयोग करें, प्लग और हेड फोन को अनप्लग करें, और देखें कि डिबग रिकॉर्डिंग में क्या हुआ।
रोबॉटहूमंस

आप कितनी देरी के साथ सहज हैं?
रोबॉटहूमंस

जवाबों:


3

कंसोल से वॉल्यूम स्तर सेट करने के लिए कमांड एमिक्सर का उपयोग करें। उदाहरण के लिए:

एमिक्सरसेट मास्टर प्लेबैक 0%

अपना स्तर 0% पर सेट करेगा

मुझे नहीं पता कि जब आप अपने हेडफ़ोन में प्लग इन करते हैं तो इसे कैसे बदलना है ... लेकिन शायद कोई आपकी मदद कर सकता है


3

वनडीसी के लिए यूडीएस के दौरान जैक डिटेक्शन के बारे में एक सत्र रहा है। देखें खाका जानकारी के लिए। ऐसा लगता है कि यह वही होगा जो मैं देख रहा हूं: विभिन्न उपकरणों के लिए अलग-अलग वॉल्यूम स्तर - बस हर हार्डवेयर पर नहीं:

<htorque> something i'm curious about: क्या मैं जल्द ही अलग-अलग डिवाइसों के लिए अलग-अलग वॉल्यूम लेवल (जैसे, इंटरनल साउंड म्यूट, हेडफोन 75%) ले पाऊंगा?

<coling> यह समर्थित होगा (कुछ h / w पर) हाँ। Timescales "जल्द ही" हैं: p
<coling> (मुझे उम्मीद है कि OSD को दिखाया जाएगा (वर्तमान वॉल्यूम के साथ) जब जैक प्लग / अनप्लग होते हैं)

11.10 के लिए अद्यतन करें

यह अब वनैरिक में काम करना चाहिए - दुर्भाग्य से मेरा थिंकपैड T510 उन प्रणालियों में से एक लगता है जो वर्तमान में समर्थित नहीं है।

डेविड हेनिंगसन से एक और अनुवर्ती:

लंबी कहानी छोटी, यह एक वांछनीय विशेषता है, और हम उस दिशा में आगे बढ़ रहे हैं, लेकिन धीरे-धीरे, क्योंकि यह विशेषता पहली नज़र में की तुलना में अधिक जटिल है।

अच्छी खबर: आगामी उबंटू वनरिक (11.10) में, यह वास्तव में काम कर रहा है। बुरी खबर: यह हर किसी के लिए काम नहीं कर रहा है।

अधिक यहाँ

12.04 के लिए अद्यतन करें

यह अब Ubuntu 12.04 (विकास संस्करण) में मेरे थिंकपैड T510 (और कई अन्य मॉडल) के साथ काम कर रहा है।


क्या कुछ ऐसा है जो वर्तमान में हार्डवेयर का समर्थन करता है, या उस प्रभाव के लिए कुछ है?
मु।


2

मुझे नहीं पता कि आपके पास कितना कोडिंग अनुभव है, लेकिन आपने उल्लेख किया है inotifywaitतो मैं मान सकता हूं कि आप शेल स्क्रिप्टिंग के साथ कम से कम सहज हैं। इस लेख पर आधारित निम्नलिखित सी प्रोग्राम, आपके हेडफ़ोन को प्लग या अनप्लग किए जाने का पता लगाने में सक्षम होना चाहिए, जिसके बाद आप जो चाहें कार्रवाई कर सकते हैं।

#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 - शायद यह अन्य उपयोगकर्ताओं के लिए मदद का हो।
19

+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

पल्सेडियो को पुनः प्रारंभ करें।

killall pulseaudio

अब यदि आप स्पीकर वॉल्यूम को म्यूट करते हैं, तो मास्टर वॉल्यूम को बदलने से यह प्रभावित नहीं होगा। इसलिए हेडफोन काम करेगा लेकिन स्पीकर चुप रहेगा।


एक अलग दृष्टिकोण होगा, लेकिन दुर्भाग्य से मेरे पास स्पीकर वॉल्यूम चैनल नहीं है, केवल मास्टर और पीसीएम।
18

1

परिवर्तनों के लिए एसीपीआईडी ​​सॉकेट की जांच करें, पायथन या सी या शेल स्क्रिप्ट की मदद से किया जा सकता है, ( ईयरफ़ोन प्लगइन प्ले को नियंत्रित करने के लिए पायथन कोड और ताल पर पोज़ करें)। ACPID वोल्टेज में बदलाव के लिए चेक करें इयरफ़ोन प्लगइन और ईयरफ़ोन प्लग आउट का पता लगाने के लिए। एक सेकंड की देरी की उम्मीद की जा सकती है।


0

Pulseaudio में डिफ़ॉल्ट रूप से शिप किया गया एक मॉड्यूल होता है जिसे वास्तव में इसे प्राप्त करने के लिए डिज़ाइन किया गया है:

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


मैं यह नहीं देखता कि यह मॉड्यूल मेरी मदद कैसे करेगा।
htorque

0

मुझे लगता है कि आपको इसका उपयोग करने की आवश्यकता हो सकती है: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458


उबंटू पूछने के लिए आपका स्वागत है! जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
केविन बोवेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.