I’ve recently installed OpenSolaris on my desktop and noticed that my volume settings do not persist between reboots. A quick search revealed that that functionality hasn’t been implemented yet. The thread suggested using the mixerctl command to save and restore the mixer state so I’ve thrown together an SMF service to do it automatically on boot and shutdown.
First, the script which should go into /lib/svc/method/sound-mixer:
. /lib/svc/share/smf_include.sh
smf_is_globalzone || exit $SMF_EXIT_OK
ctl_file=$(svcprop -p options/ctl_file $SMF_FMRI)
case "$1" in
'start')
if [ ! -f $ctl_file ]; then
echo "Mixer control file $ctl_file does not exist."
exit $SMF_EXIT_OK
fi
if ! /usr/sbin/mixerctl -r $ctl_file; then
echo "Error restoring mixer state."
exit $SMF_EXIT_OK
fi
;;
'stop')
if ! /usr/sbin/mixerctl -f -s $ctl_file; then
echo "Error saving mixer state."
exit $SMF_EXIT_OK
fi
;;
*)
echo "Usage: $0 { start | stop }"
exit $SMF_EXIT_ERR_CONFIG
;;
esac
exit $SMF_EXIT_OK
Second, the manifest which can be saved anywhere and loaded with svccfg -v import <manifest>:
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='mixer'>
<service
name='system/sound/mixer'
type='service'
version='1'>
<create_default_instance enabled='true' />
<single_instance />
<dependency
name='fs-local'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/filesystem/local' />
</dependency>
<dependency
name='device-audio'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/device/audio' />
</dependency>
<exec_method
type='method'
name='start'
exec='/lib/svc/method/sound-mixer start'
timeout_seconds='60' />
<exec_method
type='method'
name='stop'
exec='/lib/svc/method/sound-mixer stop'
timeout_seconds='60' />
<property_group name='options' type='application'>
<propval name='ctl_file' type='astring' value='/etc/sound/mixer.state' />
</property_group>
<property_group name='startd' type='framework'>
<propval name='duration' type='astring' value='transient' />
</property_group>
<stability value='Unstable' />
<template>
<common_name>
<loctext xml:lang='C'>Mixer State Saver</loctext>
</common_name>
<documentation>
<manpage title='mixerctl' section='1M'
manpath='/usr/share/man' />
</documentation>
</template>
</service>
</service_bundle>
UPDATE: In b130, the audioctl command replaces mixerctl. In the sound-mixer script above, change /usr/sbin/mixerctl -r $ctl_file to /usr/bin/audioctl load-controls $ctl_file and /usr/sbin/mixerctl -f -s $ctl_file to /usr/bin/audioctl save-controls -f $ctl_file.