fork download
  1. // my_alsa_mute_change.c
  2.  
  3. //------------------------------------------------------------------------------
  4. // my_alsa_mute_change : alsaのmuteのon/offを逆転させる
  5. // 1. amixer get Master |grep -v channel | grep -i playback | grep -i left
  6. // で
  7. // " Front Left: Playback 22282 [34%] [on]"
  8. // " Front Left: Playback 22282 [34%] [off]"
  9. // いずれかが返ってくるので、これで現在のミュートon/offを判定し
  10. // 2. 現在on なら、amixer set Master mute
  11. // offなら、amixer set Master unmute
  12. // を実行する
  13. //------------------------------------------------------------------------------
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <unistd.h> // for unlink();
  18.  
  19. #define TEMP_FILE "/tmp/my_alsa_mute_change.tmp"
  20. #define FIND_PATTERN_1 "\%] ["
  21. #define FIND_PATTERN_2 "]"
  22.  
  23. typedef enum _MUTE_MODE {
  24. MM_On,
  25. MM_Off,
  26. MM_Unknown,
  27. } MUTE_MODE;
  28.  
  29. MUTE_MODE get_mute_mode(void)
  30. {
  31. FILE *fp;
  32. char b[256];
  33. char *p, *pp;
  34. MUTE_MODE res_mode;
  35.  
  36. // 初期化
  37. fp = NULL;
  38. res_mode = MM_Unknown;
  39.  
  40. // 現在の状態を b[]; に取得
  41. system("amixer get Master | grep -v channel | grep -i playback | grep -i left > " TEMP_FILE);
  42. if (NULL == (fp = fopen(TEMP_FILE, "r"))) {
  43. goto END__get_mute_mode;
  44. }
  45. if (NULL == fgets(b, sizeof(b), fp)) {
  46. goto END__get_mute_mode;
  47. }
  48. fclose(fp);
  49. fp = NULL;
  50. unlink(TEMP_FILE);
  51. // " Front Left: Playback 22282 [34%] [on]"
  52. // " Front Left: Playback 22282 [34%] [off]"
  53. // から、on/off文字列を p に抽出
  54. if (NULL == (p = strstr(b, FIND_PATTERN_1))) {
  55. goto END__get_mute_mode;
  56. }
  57. p += strlen(FIND_PATTERN_1);
  58. if (NULL == (pp = strstr(p, FIND_PATTERN_2))) {
  59. goto END__get_mute_mode;
  60. }
  61. *pp = '\0';
  62. // on/off判定
  63. if (0 == strcasecmp(p, "on")) {
  64. res_mode = MM_On;
  65. } else if (0 == strcasecmp(p, "off")) {
  66. res_mode = MM_Off;
  67. } else {
  68. goto END__get_mute_mode;
  69. }
  70.  
  71. END__get_mute_mode:
  72. if (fp) {
  73. fclose(fp);
  74. fp = NULL;
  75. }
  76. return res_mode;
  77. }
  78.  
  79. void set_mute_mode(MUTE_MODE mm)
  80. {
  81. switch (mm) {
  82. case MM_On:
  83. system("amixer set Master unmute");
  84. break;
  85. case MM_Off:
  86. system("amixer set Master mute");
  87. break;
  88. default:
  89. break;
  90. }
  91. }
  92.  
  93. int main()
  94. {
  95. MUTE_MODE mm;
  96.  
  97. mm = get_mute_mode();
  98. switch (mm) {
  99. case MM_On:
  100. set_mute_mode(MM_Off);
  101. break;
  102. case MM_Off:
  103. set_mute_mode(MM_On);
  104. break;
  105. default:
  106. fprintf(stderr, "Mute mode unknown!!\n");
  107. return 1;
  108. }
  109.  
  110. return 0;
  111. }
  112.  
  113. // End of my_alsa_mute_change.c
  114.  
Runtime error #stdin #stdout #stderr 0s 3824KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
sh: amixer: not found
sh: cannot create /tmp/my_alsa_mute_change.tmp: Permission denied
Mute mode unknown!!