2009-09-19 6 views
5

Contexteboutons de mise en œuvre de contrôle du volume du clavier dans AppleScript - réglage du volume intérieur de la boucle ne fonctionne pas

J'ai un clavier MacAlly IceKey. Ce clavier a des boutons de volume qui nécessitent un pilote pour fonctionner. Ce pilote n'a pas été mis à jour depuis 2006, et je le soupçonne d'être à l'origine d'une récente recrudescence des paniques de noyau récurrentes sous Mac OS X 10.6.1. Donc, ça va; mais je veux récupérer mes touches de volume!

En utilisant le merveilleux ControllerMate, je peux programmer ces touches pour faire n'importe quoi, y compris lancer un script applescript. Donc, j'essaye d'implémenter cette fonctionnalité. La commande set volume (qui fait partie de Standard Additions) vous permet de régler le volume sur une valeur comprise entre 0 et 100. Les touches de volume du clavier Apple permettent de sélectionner au total 17 réglages de volume (y compris 0). Je pense que la façon la plus simple de dupliquer ce comportement est de conserver une liste des paramètres de volume autorisés et d'en extraire le plus gros (ou le plus petit) suivant.

Le problème

Il ne fonctionne pas. Le script suivant:

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 

... ne fonctionne que si le niveau du volume du système se trouve être inférieur à 43. Le système semble interpréter « 50 » comme « 49 »; c'est aussi élevé que le volume ira avec mon script. Si le volume commence supérieur à 50, mon script n'a aucun effet. Le kicker? Si l'instruction "exit repeat" est supprimée, le volume système est défini sur 100, comme vous le souhaitez.

(Bon sang, AppleScript est bizarre parfois.)

Toutes les idées?

Points Bonus

Ce serait super génial pour obtenir cette option pour afficher la superposition du volume ainsi. Est-ce que quelqu'un sait comment accomplir cela? Il n'a même pas besoin d'être à travers AppleScript; Je suis content de coller du code Cocoa dans un outil de ligne de commande si c'est ce qu'il faut.

Répondre

6

Je ne sais pas comment obtenir la superposition translucide pour apparaître, mais au moins joue le bip du système tout en tournant le volume:

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

Remplacer le + avec un - dans votre volume vers le bas scénario.

set volume output semble être ajuster automatiquement les valeurs en dehors de la limite (0, 100).

Mise à jour: Vous pouvez utiliser Growl's AppleScript support pour montrer certains type de revêtement:

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 
+0

Il cherche comme je vais devoir prendre votre approche. Il ne réplique pas le comportement du pilote d'Apple (qui semble utiliser l'approche list-of-valid-values), mais il devrait être «assez bon». –

1

Avec un de ballot payé des suggestions pour l'élaboration d'une notification Growl, je fait une version Mute/Unmute de ce qui affiche une notification Growl, mais seulement pour un bref instant.Comme je n'arrivais pas à trouver un moyen de spécifier une durée et un style de growl, j'ai utilisé applescript pour lire les valeurs par défaut de growl, passer à un style Growl simple (Smoke, car il montre juste une petite fenêtre dans la partie supérieure). coin droit, bien que vous puissiez adapter ce script à Bezel pour un comportement qui reflète mieux le système), laisse tomber le délai à 0.3 secondes, grogne, puis rétablit les préférences de growl.

Le script est un peu bavard, car j'ai surtout oublié l'applescript. Je suis sûr qu'il y a un moyen de simplifier cela beaucoup plus.

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 
1

Vous pouvez également utiliser le dans la notification

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)