(27. Februar 2005 — tk)

»Startton« unterdrücken

Vielen Leuten geht der Startton des Macs gehörig auf die Nerven, sei es weil er zu laut über eine evtl. angeschlossene Anlage oder Kopfhörer wiedergegeben wird oder aber beim Starten in öffentlichen Einrichtungen wie Bibliotheken andere stören könnte. Leider hat Apple bis heute keine Möglichkeit eingebaut, den Startton wahlweise auszuschalten. Aber Abhilfe ist möglich.

Bei älteren Macs wurde die Systemlautstärke im Parameter-RAM (PRAM) gespeichert, bei neueren kommt sie im NVRAM unter, damit sie Neustarts übersteht. Es werden dafür 3 Bits belegt, was insgesamt 8 Abstufungen ermöglicht (0=ausgeschaltet, 7=volle Lautstärke). Parallel verwaltet MacOS X aber die Lautstärke viel feiner granulierbar (0-100), so daß immer nur annäherungsweise zwischen der Systemlautstärke und der im nichtflüchtigen RAM abgelegten (die die Lautstärke des Starttons bestimmt) abgeglichen wird.

Eine Möglichkeit, den Startton auszuschalten (oder auch zu dimmen) bestünde also darin, einfach vor dem Herunterfahren die Systemlautstärke im NVRAM auf 0 oder einen geringen Wert zu stellen und nach dem nächsten Start wieder auf den ursprünglichen zu setzen. Es gibt existiert bereits ein Werkzeug namens StartupSound, welches genau das bewerkstelligen soll. Dieses vermutlich als Programmierübung entstandende Tool benötigt dazu eine Kernel Extension und ein PrefPane. Zu allem Überfluß versaut einem der Installer auch noch die Berechtigungen auf der Platte, so daß ohne anschließende Anwendungen von »Rechte Reparieren« der Rechner unsicherer konfiguriert ist als vorher.

Wir sehen uns daher im Folgenden den simplen Weg via sogenannter Login und Logout Hooks an. Mechanismen, die Apple zur Verfügung gestellt hat, um eben beim Ein- bzw. Ausloggen spezifische Tasks automatisch laufen zu lassen. Die Lautstärke-Einstellungen lesen und setzen wir mit AppleScript (mittels Umweg über osascript(1) und die jeweils letzten Lautstärke-Settings speichern wir in einer »PropertyList« im Benutzerverzeichnis.

#!/bin/sh
#
# The main purpose of this script is to be called as a LoginHook or LogoutHook 
# repectively. As a LoginHook the script tries to read the volume preferences 
# saved before and restores them to the former values. When called as LogoutHook 
# the script stores the user's settings in a preference and sets the system 
# volume setting to 0 thereby eliminating the startup sound the next time the 
# mac is booted.

Main() {
	# Check how we are called and act accordingly

	case $(basename "$0") in
		de.kaiser-edv.mute-startupsound*)
			Logout
			;;
		de.kaiser-edv.restore-sound-settings*)
			Login
			;;
	esac
} # Main

Login() {
	# This function restores the formerly saved volume settings.
	# In case, we can not read our preferences or we never saved 
	# them before we do nothing

	OutputVolume=$(defaults read /Library/Preferences/de.kaiser-edv.NoStartupSound OutputVolume 2>/dev/null)
	OutputMuted=$(defaults read /Library/Preferences/de.kaiser-edv.NoStartupSound OutputMuted 2>/dev/null)

	if [ ! "X${OutputVolume}" = "X" ]; then
		osascript -e "set volume output volume ${OutputVolume}"
		osascript -e "set volume output muted ${OutputMuted}"
	fi
} # Login

Logout() {
	# This function saves the current volume settings in a per user preference
	# and sets the system volume to zero

	OutputVolume=$(osascript -e 'get output volume of (get volume settings)')
	OutputMuted=$(osascript -e 'get output muted of (get volume settings)')

	defaults write /Library/Preferences/de.kaiser-edv.NoStartupSound OutputVolume ${OutputVolume}
	defaults write /Library/Preferences/de.kaiser-edv.NoStartupSound OutputMuted ${OutputMuted}
	chmod 644 /Library/Preferences/de.kaiser-edv.NoStartupSound.plist

	osascript -e 'set volume 0'
} # Logout

Main "$@"