2011/3/14
■ [perl] Windows 環境にてコマンドで音量の調節をする
Windows 環境にて,コマンドで音量の調節をしたいと思ったのですが,有効なコマンドがわかりませんでした.
どうしようかなと思ったいたら,cpan で Win32::Sound - cpan というモジュールがあったのでこれを使ってみました.
さっそくこのモジュールを入れて,下記のコードを実行してみると,どうも左右のバランスがズレて設定される模様….
use Win32::Sound;
Win32::Sound::Volume('100%');
調べてみると,Win32::Sound の 0.49 以前にはバグがあるみたいで,下記のようにしないと左右の音量を均等に調節できませんでした.下記のコードで
perl vol-set.pl 100
などとすると音量を 100% にしたり 0% にすることができました.
#!/usr/bin/env perl
# vol-set.pl: perl vol-set.pl 50
use strict;
use Win32::Sound;
my $vol = shift @ARGV || 0;
if ($vol > 100 || $vol < 0) {
$vol = 50;
}
$vol .= "%";
print "vol set $vol\n";
win32_volume($vol);
sub win32_volume {
my(@in) = @_;
if (not scalar @in) {
my $volume = Win32::Sound::_Volume();
if (wantarray) {
my $left = ($volume >> 16) & 0x0000FFFF;
my $right = ($volume ) & 0x0000FFFF;
return ($left, $right);
}
return $volume;
}
# Allows '0%'..'100%'
$in[0] =~ s{ ([\d\.]+)%$ }{ int($1*65535/100) }ex if defined $in[0];
$in[1] =~ s{ ([\d\.]+)%$ }{ int($1*65535/100) }ex if defined $in[1];
$in[1] = $in[0] unless defined $in[1];
my $volume = (($in[0] & 0x0000FFFF) << 16) | ($in[1] & 0x0000FFFF);
return Win32::Sound::_Volume($volume, 0);
}
関連リンク
