# WavePlayBack.pl (c) 2002 C. Church # This program is distributed under the same terms # as perl its self. #---------------------------------------- use strict; use warnings; use Win32::Sound; use Audio::Wav; use Tk; use Tk::Toplevel; use Tk::Frame; use Tk::Label; use Tk::Button; my $wave_file = shift; if(!defined($wave_file)) { die("Usage: $0 \n"); } # our main body my $main_window = Tk::MainWindow->new( -title => 'PlayBack Controls'); my $is_paused = 0; my $lbl = $main_window->Label(-text => "Please Wait While $wave_file is Read...")->pack(-side => 'top'); $main_window->update(); my $datRef = read_file($wave_file); $lbl->destroy(); $main_window->update(); play_back($datRef,$main_window); MainLoop(); exit(0); # subroutines sub read_file { my $file = shift; my $wav = Audio::Wav->new(); my $readF = $wav->read($file); die("Unable to read $file\n") if(!defined($readF)); my($tmpf,$data); $data .= $tmpf while(defined($tmpf = $readF->read_raw(4096))); my $hash = $readF->details(); my %tmpH = (); $tmpH{'data'} = $data; $tmpH{'srate'} = $hash->{'sample_rate'}; $tmpH{'bits'} = $hash->{'bits_sample'}; $tmpH{'channels'} = $hash->{'channels'}; return(\%tmpH); } sub play_back { my $hRef = shift; my $mw = shift; my $object; my $dat = $hRef->{'data'}; my $srate = $hRef->{'srate'}; my $bits = $hRef->{'bits'}; my $chan = $hRef->{'channels'}; if(!defined($dat) || !defined($srate) || !defined($bits) || !defined($chan)) { die("ERROR: [play_back] Not enough data to playback.\n"); } eval { $object = new Win32::Sound::WaveOut($srate,$bits,$chan); }; if($@) { die("WARNING: WaveOut Returned: $@\n"); } $is_paused = 0; my $frame1 = $mw->Frame()->pack(-side => 'top'); my $frame2 = $mw->Frame()->pack(-side => 'top'); my $frame3 = $mw->Frame()->pack(-side => 'top'); $frame1->Label(-text => "Playback Controls")->pack(); $frame2->Button(-text => "Play", -command => sub { if($is_paused == 0) { $object->Load($dat); $object->Write(); } else { $object->Restart(); $is_paused = 1; } })->pack(-side => "left"); $frame2->Button(-text => "Pause", -command => sub { $object->Pause(); $is_paused = 1; })->pack(-side => "left"); $frame2->Button(-text => "Stop", -command => sub { $object->Reset(); } )->pack(-side => 'left'); $frame2->Button(-text => "Rew", -command => sub { $object->Reset(); })->pack(-side => 'left'); $frame3->Button(-text => "Close", -command => sub { $object->Reset(); $object->Unload(); $object->CloseDevice(); exit(0); })->pack(-side => 'top'); return(1); }