Obter o nível de volume atual no OS X Terminal CLI?

17

Gostaria de verificar o nível de volume atual da CLI no meu Mac. Eu sei que posso configurá-lo assim:

osascript -e 'set volume <N>'

Mas isso não parece funcionar ao tentar obter o nível de volume atual.

$ osascript -e 'get volume'
4:10: execution error: The variable volume is not defined. (-2753)
Cory Klein
fonte

Respostas:

18

Você deve achar que get volume settingsretornará um objeto que contém, entre outras coisas, o volume de saída e o volume de alerta. Então, por exemplo, você pode fazer isso para recuperar o objeto inteiro:

osascript -e 'get volume settings'

ou melhor, talvez isso para capturar apenas o volume de saída (por exemplo, em vez do volume de alerta):

osascript -e 'set ovol to output volume of (get volume settings)'

... mas observe que nem todos os dispositivos de áudio terão controle direto do software sobre as configurações de volume. Por exemplo, o áudio do seu monitor deve ter controle; no entanto, uma placa de E / S firewire ou USB provavelmente não teria essas configurações sob controle de software (pois podem ser botões físicos). Se a configuração específica não estiver sob o controle do software, ela será exibida no objeto retornado get volume settingscomo "valor ausente" ou algo parecido.

tmart
fonte
get volume settingsrealmente não diferencia entre 0, 0,1 e 0,01. Ele não mostra valores decimais, tornando-o bastante inútil.
Acumenus 18/04
@ ABB, ótima sugestão. Obrigado por contribuir.
ghoti
5

Eu cometi um script bash muito humilde chamado "chut". Como eu estava farto do volume sys exigindo um ponto de flutuação como entrada (0 a 10 etapa 0,1), mas produzindo um número inteiro com uma etapa 14 variando de 0 a 100.

Vai entender ... Se alguém estiver interessado: http://github.com/docgyneco69/chut

Em toda a sua glória:

#!/bin/bash
## CHUT script
## Note: regex [[:digit:]] requires a relatively recent shell
## easy to change with a sed cmd if needed
## applescript arg is not fully bullet proofed for sneaky cmds
## but as no outside arg is passed by the script I kept the usual
## arg format for code readibility (and pure laziness)

# init _x and curr_vol with defaults values (muting)
_x='- 100' ; curr_vol='0' ;

function _usage {echo -e "CHUT is a simple cmd exe to change the system audio volume.
USAGE chut [][-][--][+][++]
      no arg will mute (default)
      [-][+] [--][++] to decrease or increase the volume
      [+++] to set to the maximum
      [-h][--help] display this message
NOTE sys sets volume as float (0-10/0.1) but outputs int (0-100/14)" ; exit 1 ; } ;

# set _x by looping $1 then break as we only use 1st arg, -h or --help to print usage
while [[ "$1" ]]; do case "$1" in
    "-h"|"--help")  _usage      ;;
    "-")        _x='- 0.5'  ;;
    "--")       _x='- 1.0'  ;;
    "+")        _x='+ 0.5'  ;;
    "++")       _x='+ 1.0'  ;;
    "+++")      _x='+ 100'  ;;
    *)      _x='- 100'  ;; # unrecognized values will mute
esac ; break ; done ;

# get current volume value from system (sys volume is 0 to 100 step 14)
curr_vol=$(/usr/bin/osascript -e "get volume settings" | cut -d ',' -f1 | tr -dc [[:digit:]]) ;

# set new volume via _x - use bc for floating point, escape potential errors, 
# print value with one decimal - test & echo the new volume value via applescript
curr_vol=$( printf "%.1f" "$( echo "$curr_vol / 14 $_x" | bc -l 2>&-)" ) ;
(/usr/bin/osascript -e "set Volume "\"$curr_vol"\" ") && \
echo $(/usr/bin/osascript -e "get volume settings" | cut -d ',' -f1 | tr -dc [[:digit:]]) ;

exit 0 ;
docgyneco69
fonte
0

Obtendo e configurando o volume usando a mesma escala 1..100:

# Get current volume as a number from 0 to 100
current_vol=$(osascript -e 'output volume of (get volume settings)')

# Prank co-worker by playing loud noise/music
osascript -e "set volume output volume 100"
afplay sabotage.m4a

# (Re-)set to saved volume as a number from 0 to 100
osascript -e "set volume output volume $current_vol"
iolsmit
fonte