在Applescript中实现键盘音量控制按钮 - 在循环内设置音量不起作用

时间:2009-09-19 21:14:29

标签: list applescript

背景

我有一个MacAlly IceKey键盘。此键盘具有音量按钮,需要驱动程序才能运行。这个驱动程序自2006年以来一直没有更新,我怀疑它是最近在Mac OS X 10.6.1下遇到的反复出现的内核恐慌的根源。所以,它走了;但是我想要我的音量键!

使用精彩的ControllerMate,我可以对这些键进行编程以执行任何操作,包括运行AppleScript脚本。所以,我正在尝试实现这个功能。

set volume命令(Standard Additions的一部分)允许您将音量设置为0到100之间的任何值.Apple键盘音量键允许选择总共17个音量设置(包括0)。我认为复制此行为的最简单方法是保留允许的卷设置列表,并抓住其中最大(或最小)的一个。

问题

它不起作用。以下脚本:

set volumesList to {0, 6, 12, 18, 25, 31, 37, 43, 50, 56, 62, 68, 75, 81, 87, 93, 100}
set sysVolume to get volume settings

repeat with curVolume in volumesList
    if (curVolume > (output volume of sysVolume)) then
        set volume output volume (contents of curVolume)
        exit repeat
    end if
end repeat

get volume settings

...仅在系统音量水平低于43时才有效。系统似乎将“50”解释为“49”;这与我的剧本的音量一样高。如果卷启动高于50,则我的脚本无效。踢球者?如果删除“退出重复”语句,系统卷将设置为100 - 正如您所期望的那样。

(好悲伤,AppleScript有时会怪异。)

有什么想法吗?

奖励积分

让它显示音量叠加层也是非常棒的。有谁知道如何实现这一目标?它甚至不需要通过AppleScript;我很高兴在命令行工具中添加一些Cocoa代码,如果这就是它。

3 个答案:

答案 0 :(得分:7)

我不知道如何让半透明叠加层出现,但这至少会在调高音量时播放系统发出的蜂鸣声:

set currentVolume to output volume of (get volume settings)
set newVolume to (currentVolume + (100 / 17)) as integer
set volume output volume newVolume
beep

在您的音量减小脚本中将+替换为-

set volume output似乎会自动调整超出(0,100)限制的值。

更新:您可以使用Growl's AppleScript support来显示一些类型的叠加层:

tell application "GrowlHelperApp"

    register as application "Volume Change" ¬
        all notifications {"Volume Change"} ¬
        default notifications {"Volume Change"} ¬
        icon of application "Script Editor"

    notify with name "Volume Change" ¬
        title "Volume Up" ¬
        description "Volume is now " & output volume of (get volume settings) ¬
        application name "Volume Change"

end tell

答案 1 :(得分:2)

您还可以使用内置通知

set vol to ((output volume of (get volume settings)) + 5)
if (vol > 100) then set vol to 100
set volume output volume (vol)

display notification ((vol) as string)

答案 2 :(得分:1)

由于付费的书呆子建议制作一个低吼通知,我制作了一个静音/取消静音版本,显示了一个低吼通知,但只是片刻。

由于我找不到指定咆哮持续时间和样式的方法,我使用applescript来读取当前的咆哮默认值,切换到简单的Growl样式(Smoke,因为它只显示右上角的一个小窗口虽然您可以将此脚本调整为Bezel以获得更完美地反映系统的行为,但是将延迟降低到0.3秒,咆哮,然后恢复咆哮的首选。

脚本有点冗长,因为我大多忘记了AppleScript。我确信有一种方法可以简化这一点。

set _muted to (get (output muted of (get volume settings)))
set str to "Muted"
if _muted is false then
    set volume with output muted
else
    set volume without output muted
    set str to "" & output volume of (get volume settings)
end if

set oldStyle to (do shell script "defaults read com.Growl.GrowlHelperApp GrowlDisplayPluginName")

do shell script "defaults write com.Growl.GrowlHelperApp GrowlDisplayPluginName Smoke"

set alpha to (do shell script "defaults read com.Growl.GrowlHelperApp com.growl.SmokeNotificationView | awk '$3 ~ /Alpha/' | sed -E 's/[^0-9.]*//g'")

set duration to (do shell script "defaults read com.Growl.GrowlHelperApp com.growl.SmokeNotificationView | awk '$3 ~ /Duration/' | sed -E 's/[^0-9.]*//g'")

set cmd to "defaults write com.Growl.GrowlHelperApp \"com.growl.SmokeNotificationView\" -dict "
set params to "\"Smoke - Alpha\" -float " & alpha & " \"Smoke - Duration\" -float 0.3"

do shell script cmd & params

tell application "GrowlHelperApp"
    register as application ¬
        "Volume Change" all notifications {"Volume Change"} ¬
        default notifications {"Volume Change"} ¬
        icon of application "Script Editor"

    notify with name ¬
        "Volume Change" title "Volume" description str application name ¬
        "Volume Change" identifier "MuteUnmute"
end tell

do shell script "defaults write com.Growl.GrowlHelperApp GrowlDisplayPluginName " & oldStyle

set params to "\"Smoke - Alpha\" -float " & alpha & " \"Smoke - Duration\" -float " & duration
do shell script cmd & params