2010
Jako posiadacz laptopa miałem z ciągły problem z jednoczesnym dźwiękiem z wbudowanych głośników i podpiętych słuchawek. Próbowałem wielu sposobów, kombinowałem z Alsą, z Pulseaudio... nic. Do czasu! Do czasu natknięcia się na skrypt, który automatycznie wyciszy wbudowane głośniki, gdy zostaną podpięte słuchawki/głośniki w gniazdo.
Autorem skryptu jest xtr.
Otwórz edytor tekstu i wklej do niego kod:
/*
* File: main.cpp
* Author: xtr
*
* Created on April 26, 2010, 5:26 PM
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/io.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <syslog.h>
#include <signal.h>
#include <sys/stat.h>
#include <stdint.h>
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;
#define HDA_VERB(nid,verb,param) ((nid)<<24 | (verb)<<8 | (param))
#define HDA_IOCTL_VERB_WRITE _IOWR('H', 0x11, struct hda_verb_ioctl)
struct hda_verb_ioctl {
u32 verb; /* HDA_VERB() */
u32 res; /* response */
};
void daemonize()
{
pid_t pid, sid;
/* Fork off the parent process */
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
/* If we got a good PID, then
we can exit the parent process. */
if (pid > 0) {
exit(EXIT_SUCCESS);
}
/* Change the file mode mask */
umask(0);
/* Open any logs here */
openlog("pinsensed", LOG_PID, LOG_DAEMON);
/* Create a new SID for the child process */
sid = setsid();
if (sid < 0) {
/* Log any failure here */
exit(EXIT_FAILURE);
}
/* Change the current working directory */
if ((chdir("/")) < 0) {
/* Log any failure here */
exit(EXIT_FAILURE);
}
/* Close out the standard file descriptors */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
}
bool done = false;
void trpsig(int)
{
done = true;
}
int main(int argc, char** argv) {
daemonize();
signal(SIGTERM, &trpsig);
int fd, state;
struct hda_verb_ioctl val;
syslog(LOG_INFO, "Daemon started.");
fd = open("/dev/snd/hwC0D0", O_RDWR);
if (fd < 0) {
syslog(LOG_ERR, "Failed to open snd device.");
exit(EXIT_FAILURE);
}
val.verb = HDA_VERB(0x19, 0x0f09, 0x0);
if (ioctl(fd, HDA_IOCTL_VERB_WRITE, &val) < 0)
syslog(LOG_ERR, "Failed to write hda verb.");
state = val.res >> 31;
syslog(LOG_INFO, "Starting input value: %0x", state);
while(!done)
{
sleep(1);
val.verb = HDA_VERB(0x19, 0x0f09, 0x0);
if (ioctl(fd, HDA_IOCTL_VERB_WRITE, &val) < 0)
syslog(LOG_ERR, "Failed to write hda verb.");
if(state != (val.res >> 31))
{
state = (val.res >> 31);
syslog(LOG_INFO, "New input value: %0x", state);
if(state == 0x1)
val.verb = HDA_VERB(0x1f, 0x701, 0x1);
else
val.verb = HDA_VERB(0x1f, 0x701, 0x0);
if (ioctl(fd, HDA_IOCTL_VERB_WRITE, &val) < 0)
syslog(LOG_ERR, "Failed to write hda verb.");
}
}
close(fd);
syslog(LOG_INFO, "Daemon stopped.");
exit(EXIT_SUCCESS);
}
Zapisz plik jako pinsensed.cpp. Przejdź do katalogu, w którym zapisałeś ten plik i go skompiluj:
g++ pinsensed.cpp -o pinsensed
Skopiuj plik do katalogu /usr/local/bin/:
sudo cp pinsensed /usr/local/bin/pinsensed
Uruchom skrypt:
sudo pinsensed
Sprawdź czy działa - nie ma innego wyjścia
Teraz dodaj skrypt do autostartu:
sudo gedit /etc/init.d/rc.local
I pod ostatnią linijką komentarza w nagłówku, czyli:
### END INIT INFO
Dodaj:
/usr/local/bin/pinsensed
Zapisz plik i uruchom ponownie komputer, aby sprawdzić czy skrypt startuje prawidłowo.
Zobacz także:
Na każdy komentarz postaramy się udzielić odpowiedzi w ciągu 24 godzin od momentu wysłania.
Mile widziane komentarze z uwagami lub informacjami o rozwiązaniu problemu.




Rejestracja
Zapomniane hasło






Hmm, zwykle jest to automatycznie robione. W sensie, że problem w ogóle się nie pojawia. Ale widać to kwestia karty dźwiękowej.
Potwierdzam. Też nie mam z tym problemu.
Widocznie macie porządne laptopy
mój laptop nie jest porządny, hp compaq nx6110. skrypt nie działa. w wersji ubuntu 8.04 udało mi się to załatwić poprzez regulację głośności - zakładka przełączniki - zaznaczenie headphone jack sense
a teraz?
Zwróć uwagę na początek kodu, są tam gwiazdki, które należy usunąć, zrobiłeś to?
Takie moje małe spostrzeżenia:
- skrypt nie zaskoczył, w przypadku gdy po wykonaniu wszystkich instrukcji, w czasie resetu głośniki były podłączone (zadziałał dopiero reset z odłączonymi głośnikami).
- przy pierwszej regulacji głośności (za pomocą skrótu klawiszowego), ponownie załączyły się głośniki wbudowane, jednak po wyciągnięciu i ponownym włożeniu wtyczki od głośników wszystko znów działało jak należy.
Teraz wszystko śmiga
Niestety u mnie nie zaskoczył wcale. Skrypt skompilował się, skopiował do katalogu, natomiast po odpaleniu go ręcznie poleceniem nie ma żadnego efektu (nie wyświetla się też błąd). Nie widzę też procesu o nazwie "pinsensed" w Monitorze Systemu. Pracuję na HP Pavilion dv6.
Mi też nie działa ten skrypt na Amilo Pro
nie działa. Acer Aspire One 722
Znalazłem o wiele prostszy i skuteczny (przynajmniej u mnie) sposób!
Mianowicie:
1) Otworzyć terminal
2) WPISAĆ alsamixer
3) Przesuwając strzłkami zaznaczyć Headphon
4) Nacisnąć klawisz m żeby uaktywnić wyciszanie głośników
Zrobiłem wszystko jak w opisie i niestety nic to nie dało, aczkolwiek na podstawie innych rozwiazan znalazłem sposób, wystarczy podłączyć słuchawki, badz jak w moim przypadku wieżę, odpalic terminal, wpisać alsamixer w moim przypadku mam ustawione Master F 00 a Front na MM i działa, oczywiście Front trzeba zgłośnić.
No tak, ale cały pic o to, żeby to działo się automatycznie... Bo nie uśmiecha mi się za każdym razem otwierać terminala, tylko po to żeby głośniki wyciszać. Ten i kilka innych problemów spowodował u mnie powrót do Windowsa, przynajmniej do czasu następnej reinstalacji systemu.
skrypt też mam dodany do autostartu, aczkolwiek nie wiem, czy to coś daje, u mnie trzeba ręcznie przełączyć, ale myślę, że duży problem to nie jest, słuchawek raczej nie podłącza się na 2 minuty.