最新 RSS

horiday blog

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);
}

関連リンク