2011/03/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); }
関連リンク