gul_kiev: (buddha eyes)
[personal profile] gul_kiev
Я время от времени общаюсь голосом в скайпе или через sip, и часто хочется на какое-то время отключать микрофон.
Соответственно, хочется для этого иметь hotkey. Наиболее удобно было бы использовать малтимедийные кнопки, тем более, что они есть и на гарнитуре. Но, к сожалению, Apple не сделала действия по ним конфигурируемыми, и при их нажатии запускается iTunes. :-(

Выход есть. Их всё-таки можно переопределить, хотя для этого и нужно затратить несколько больше времени, чем на обычные shortcuts.

Нажатия малтимедийных кнопок отлавливает демон rcd (/System/Library/CoreServices/rcd.app/Contents/MacOS/rcd), он же предпринимает действия по ним. Причём эти действия жёстко в нём прошиты. Этот демон запускается через launchd.
Для начала можно запустить
strings /System/Library/CoreServices/rcd.app/Contents/MacOS/rcd | less
и посмотреть, что интересного там есть. Поиск по "iTunes" показывает строки вроде
tell application id "com.apple.iTunes" to launch
tell application id "com.apple.iTunes" to get player state
tell application id "com.apple.iTunes" to playpause
tell application id "com.apple.iTunes" to stop
tell application id "com.apple.iTunes" to resume
tell application id "com.apple.iTunes" to next track
и подобные. Это хорошо - это значит, что он общается с iTunes через Apple Events (это такой способ взаимодействия между процессами в макоси), а написаны это команды applescript. И их можно заменить на другие, нужные нам команды.

Значит, нам нужно создать скрипт, который будет включать/выключать микрофон. Кроме того, нам нужно каким-то образом знать, выключил он микрофон или, наоборот, включил. Наш скрипт будет выглядеть так:
#! /bin/sh
/usr/bin/osascript -e '
set inputVolume to input volume of (get volume settings)
if inputVolume = 0 then
    set inputVolume to 100
    display notification "" with title "Mic ON"
else
    set inputVolume to 0
    display notification "" with title "Mic MUTE"
end if
set volume input volume inputVolume
'

и положим мы его в /usr/local/bin/toggle-mic.sh.
В принципе, было бы несколько быстрее запустить applescript из applescript командой "run script", но там нужно указывать полный путь в маковской нотации ("Macintosh HD:usr:local:bin:toggle-mic.scpt"), это получается слишком длинно и на место команды запуска iTunes уже не помещается. Но не беда - через shell задержка на глаз незаметна.

Скачиваем какой-нибудь hex editor, например, "port install hexedit", делаем резервную копию rcd, и заменяем в нём строку
tell application id "com.apple.iTunes" to launch
на
do shell script "/usr/local/bin/toggle-mic.sh"
В конце строки должен быть нулевой символ. После редактирования размер бинарника измениться не должен. На всякий случай можно проверить, что изменилось только то, что нам нужно, например, через hexdiff (тоже можно установить из портов).
Бинарник защищён от модификации подписью, поэтому после исправления нужно его подписать:
codesign -f -s - /System/Library/CoreServices/rcd.app/Contents/MacOS/rcd
Перезапускаем rcd (делаем ему "kill -9" и ждём, пока launchd его запустит).

Открываем настройки звука, нажимаем мультимедийную кнопку "play/pause" и убеждаемся, что всё работает так, как мы хотели, т.е. микрофон включается и отключается, и об этом мы видим всплывающую нотификацию. Этот хоткей работает глобально для системы, т.е. для skype, telephone и всего прочего, и независимо от того, какое приложение в данный момент активно.

Осталось только добавить, что если iTunes запущен, то действия малтимедийных кнопок остаются прежними - ими, как и раньше, можно делать pause/resume, next track, previous track. Поведение меняется только в том случае, если iTunes не запущен.

В следующей части могу рассказать, как записывать звук из приложений типа Skype и Telephone в mp3. Можно и с разделением собеседников на левый и правый каналы.
From:
Anonymous( )Anonymous This account has disabled anonymous posting.
OpenID( )OpenID You can comment on this post while signed in with an account from many other sites, once you have confirmed your email address. Sign in using OpenID.
User
Account name:
Password:
If you don't have an account you can create one now.
Subject:
HTML doesn't work in the subject.

Message:

 
Notice: This account is set to log the IP addresses of everyone who comments.
Links will be displayed as unclickable URLs to help prevent spam.

September 2017

S M T W T F S
     12
3456789
10111213 141516
17181920212223
24252627282930

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 20th, 2017 09:07 am
Powered by Dreamwidth Studios