// my_alsa_mute_change.c
//------------------------------------------------------------------------------
// my_alsa_mute_change : alsaのmuteのon/offを逆転させる
// 1. amixer get Master |grep -v channel | grep -i playback | grep -i left
// で
// " Front Left: Playback 22282 [34%] [on]"
// " Front Left: Playback 22282 [34%] [off]"
// いずれかが返ってくるので、これで現在のミュートon/offを判定し
// 2. 現在on なら、amixer set Master mute
// offなら、amixer set Master unmute
// を実行する
//------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for unlink();
#define TEMP_FILE "/tmp/my_alsa_mute_change.tmp"
#define FIND_PATTERN_1 "\%] ["
#define FIND_PATTERN_2 "]"
typedef enum _MUTE_MODE {
MM_On,
MM_Off,
MM_Unknown,
} MUTE_MODE;
MUTE_MODE get_mute_mode(void)
{
FILE *fp;
char b[256];
char *p, *pp;
MUTE_MODE res_mode;
// 初期化
fp = NULL;
res_mode = MM_Unknown;
// 現在の状態を b[]; に取得
system("amixer get Master | grep -v channel | grep -i playback | grep -i left > " TEMP_FILE
); if (NULL
== (fp
= fopen(TEMP_FILE
, "r"))) { goto END__get_mute_mode;
}
if (NULL
== fgets(b
, sizeof(b
), fp
)) { goto END__get_mute_mode;
}
fp = NULL;
unlink(TEMP_FILE);
// " Front Left: Playback 22282 [34%] [on]"
// " Front Left: Playback 22282 [34%] [off]"
// から、on/off文字列を p に抽出
if (NULL
== (p
= strstr(b
, FIND_PATTERN_1
))) { goto END__get_mute_mode;
}
if (NULL
== (pp
= strstr(p
, FIND_PATTERN_2
))) { goto END__get_mute_mode;
}
*pp = '\0';
// on/off判定
if (0 == strcasecmp(p, "on")) {
res_mode = MM_On;
} else if (0 == strcasecmp(p, "off")) {
res_mode = MM_Off;
} else {
goto END__get_mute_mode;
}
END__get_mute_mode:
if (fp) {
fp = NULL;
}
return res_mode;
}
void set_mute_mode(MUTE_MODE mm)
{
switch (mm) {
case MM_On:
system("amixer set Master unmute"); break;
case MM_Off:
system("amixer set Master mute"); break;
default:
break;
}
}
int main()
{
MUTE_MODE mm;
mm = get_mute_mode();
switch (mm) {
case MM_On:
set_mute_mode(MM_Off);
break;
case MM_Off:
set_mute_mode(MM_On);
break;
default:
fprintf(stderr
, "Mute mode unknown!!\n"); return 1;
}
return 0;
}
// End of my_alsa_mute_change.c
Ly8gbXlfYWxzYV9tdXRlX2NoYW5nZS5jCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBteV9hbHNhX211dGVfY2hhbmdlIDogYWxzYeOBrm11dGXjga5vbi9vZmbjgpLpgIbou6LjgZXjgZvjgosKLy8gIDEuIGFtaXhlciBnZXQgTWFzdGVyIHxncmVwIC12IGNoYW5uZWwgfCBncmVwIC1pIHBsYXliYWNrIHwgZ3JlcCAtaSBsZWZ0Ci8vICAgICAg44GnCi8vICAgICAiICBGcm9udCBMZWZ0OiBQbGF5YmFjayAyMjI4MiBbMzQlXSBbb25dIgovLyAgICAgIiAgRnJvbnQgTGVmdDogUGxheWJhY2sgMjIyODIgWzM0JV0gW29mZl0iCi8vICAgICAg44GE44Ga44KM44GL44GM6L+U44Gj44Gm44GP44KL44Gu44Gn44CB44GT44KM44Gn54++5Zyo44Gu44Of44Ol44O844OIb24vb2Zm44KS5Yik5a6a44GXCi8vICAyLiDnj77lnKhvbiDjgarjgonjgIFhbWl4ZXIgc2V0IE1hc3RlciBtdXRlCi8vICAgICAgICAgb2Zm44Gq44KJ44CBYW1peGVyIHNldCBNYXN0ZXIgdW5tdXRlCi8vICAgICDjgpLlrp/ooYzjgZnjgosKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAvLyBmb3IgdW5saW5rKCk7CgojZGVmaW5lIFRFTVBfRklMRSAgICAgICAiL3RtcC9teV9hbHNhX211dGVfY2hhbmdlLnRtcCIKI2RlZmluZSBGSU5EX1BBVFRFUk5fMSAgIlwlXSBbIgojZGVmaW5lIEZJTkRfUEFUVEVSTl8yICAiXSIKCnR5cGVkZWYgZW51bSBfTVVURV9NT0RFIHsKICAgIE1NX09uLAogICAgTU1fT2ZmLAogICAgTU1fVW5rbm93biwKfSBNVVRFX01PREU7CgpNVVRFX01PREUgZ2V0X211dGVfbW9kZSh2b2lkKQp7CiAgICBGSUxFICpmcDsKICAgIGNoYXIgYlsyNTZdOwogICAgY2hhciAqcCwgKnBwOwogICAgTVVURV9NT0RFIHJlc19tb2RlOwoKICAgIC8vIOWIneacn+WMlgogICAgZnAgPSBOVUxMOwogICAgcmVzX21vZGUgPSBNTV9Vbmtub3duOwoKICAgIC8vIOePvuWcqOOBrueKtuaFi+OCkiBiW107IOOBq+WPluW+lwogICAgc3lzdGVtKCJhbWl4ZXIgZ2V0IE1hc3RlciB8IGdyZXAgLXYgY2hhbm5lbCB8IGdyZXAgLWkgcGxheWJhY2sgfCBncmVwIC1pIGxlZnQgPiAiIFRFTVBfRklMRSk7CiAgICBpZiAoTlVMTCA9PSAoZnAgPSBmb3BlbihURU1QX0ZJTEUsICJyIikpKSB7CiAgICAgICAgZ290byBFTkRfX2dldF9tdXRlX21vZGU7CiAgICB9CiAgICBpZiAoTlVMTCA9PSBmZ2V0cyhiLCBzaXplb2YoYiksIGZwKSkgewogICAgICAgIGdvdG8gRU5EX19nZXRfbXV0ZV9tb2RlOwogICAgfQogICAgZmNsb3NlKGZwKTsKICAgIGZwID0gTlVMTDsKICAgIHVubGluayhURU1QX0ZJTEUpOwogICAgLy8gIiAgRnJvbnQgTGVmdDogUGxheWJhY2sgMjIyODIgWzM0JV0gW29uXSIKICAgIC8vICIgIEZyb250IExlZnQ6IFBsYXliYWNrIDIyMjgyIFszNCVdIFtvZmZdIgogICAgLy8g44GL44KJ44CBb24vb2Zm5paH5a2X5YiX44KSIHAg44Gr5oq95Ye6CiAgICBpZiAoTlVMTCA9PSAocCA9IHN0cnN0cihiLCBGSU5EX1BBVFRFUk5fMSkpKSB7CiAgICAgICAgZ290byBFTkRfX2dldF9tdXRlX21vZGU7CiAgICB9CiAgICBwICs9IHN0cmxlbihGSU5EX1BBVFRFUk5fMSk7CiAgICBpZiAoTlVMTCA9PSAocHAgPSBzdHJzdHIocCwgRklORF9QQVRURVJOXzIpKSkgewogICAgICAgIGdvdG8gRU5EX19nZXRfbXV0ZV9tb2RlOwogICAgfQogICAgKnBwID0gJ1wwJzsKICAgIC8vIG9uL29mZuWIpOWumgogICAgaWYgKDAgPT0gc3RyY2FzZWNtcChwLCAib24iKSkgewogICAgICAgIHJlc19tb2RlID0gTU1fT247CiAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY2FzZWNtcChwLCAib2ZmIikpIHsKICAgICAgICByZXNfbW9kZSA9IE1NX09mZjsKICAgIH0gZWxzZSB7CiAgICAgICAgZ290byBFTkRfX2dldF9tdXRlX21vZGU7CiAgICB9CgpFTkRfX2dldF9tdXRlX21vZGU6CiAgICBpZiAoZnApIHsKICAgICAgICBmY2xvc2UoZnApOwogICAgICAgIGZwID0gTlVMTDsKICAgIH0KICAgIHJldHVybiByZXNfbW9kZTsKfQoKdm9pZCBzZXRfbXV0ZV9tb2RlKE1VVEVfTU9ERSBtbSkKewogICAgc3dpdGNoIChtbSkgewogICAgY2FzZSBNTV9PbjoKICAgICAgICBzeXN0ZW0oImFtaXhlciBzZXQgTWFzdGVyIHVubXV0ZSIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBNTV9PZmY6CiAgICAgICAgc3lzdGVtKCJhbWl4ZXIgc2V0IE1hc3RlciBtdXRlIik7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIE1VVEVfTU9ERSBtbTsKCiAgICBtbSA9IGdldF9tdXRlX21vZGUoKTsKICAgIHN3aXRjaCAobW0pIHsKICAgIGNhc2UgTU1fT246CiAgICAgICAgc2V0X211dGVfbW9kZShNTV9PZmYpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBNTV9PZmY6CiAgICAgICAgc2V0X211dGVfbW9kZShNTV9Pbik7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGZwcmludGYoc3RkZXJyLCAiTXV0ZSBtb2RlIHVua25vd24hIVxuIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCi8vIEVuZCBvZiBteV9hbHNhX211dGVfY2hhbmdlLmMK