#!/usr/local/bin/perl

@ARGV or die "Usage: $0 <0..255>\n";
$vol = shift;

sub AUDIO_GETINFO { 0x40844101 }
sub AUDIO_SETINFO { 0xC0844102 }
$template = "LLLL LLLLL L LL CCCC S CC";
$template = "$template $template L CCCC LLL";

open AC, "+</dev/audioctl"              or die "cannot open /dev/audioctl\n";
select((select(AC), $| = 1)[0]);
ioctl AC, AUDIO_GETINFO, $buf           or die "AUDIO_GETINFO failed: $!\n";

@au_info = unpack $template, $buf;
$au_info[4]  = $vol;
$buf = pack $template, @au_info;
ioctl AC, AUDIO_SETINFO, $buf           or die "AUDIO_SETINFO failed: $!\n";
close AC;