Den aktuellen Lautstärkepegel in OS X Terminal CLI abrufen?

17

Ich möchte den aktuellen Lautstärkepegel über die CLI auf meinem Mac überprüfen. Ich weiß, dass ich es so einstellen kann:

osascript -e 'set volume <N>'

Dies scheint jedoch nicht zu funktionieren, wenn versucht wird, den aktuellen Lautstärkepegel zu ermitteln.

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

Antworten:

18

Sie sollten feststellen, dass get volume settingsein Objekt zurückgegeben wird, das unter anderem das Ausgabevolumen und das Alarmvolumen enthält. So können Sie beispielsweise das gesamte Objekt abrufen:

osascript -e 'get volume settings'

oder besser gesagt, um nur das Ausgabevolumen zu erfassen (z. B. anstelle des Alarmvolumens):

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

... aber beachten Sie, dass nicht alle Audiogeräte über eine direkte Software-Steuerung der Lautstärkeeinstellungen verfügen. Zum Beispiel sollte Ihr Display-Audio die Kontrolle haben. Bei einem Firewire- oder USB-I / O-Board werden diese Einstellungen jedoch möglicherweise nicht von der Software gesteuert (da es sich möglicherweise um physische Regler handelt). Wenn die jeweilige Einstellung nicht von der Software gesteuert wird, wird sie im zurückgegebenen Objekt get volume settingsals "fehlender Wert" oder dergleichen angezeigt.

tmart
quelle
get volume settingsunterscheidet nicht wirklich zwischen 0, 0,1 und 0,01. Es werden keine Dezimalwerte angezeigt, was es ziemlich unbrauchbar macht.
Acumenus
@ABB, toller Vorschlag. Vielen Dank für Ihren Beitrag.
Ghoti
5

Ich habe ein sehr bescheidenes Bash-Skript namens "chut" geschrieben. Da ich es satt hatte, dass das sys-Volume einen Gleitkommawert als Eingabe benötigt (0 bis 10, Schritt 0.1), aber eine ganze Zahl mit einem Schritt 14 im Bereich von 0 bis 100 ausgibt.

Go figure ... Wenn jemand Interesse hat: http://github.com/docgyneco69/chut

In seiner vollen Pracht:

#!/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
quelle
0

Abrufen und Einstellen der Lautstärke mit derselben Skala 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"
Ich sage
quelle