1: # WavePlayBack.pl (c) 2002 C. Church 2: # This program is distributed under the same terms 3: # as perl its self. 4: #---------------------------------------- 5: 6: use strict; 7: use warnings; 8: 9: use Win32::Sound; 10: use Audio::Wav; 11: 12: use Tk; 13: use Tk::Toplevel; 14: use Tk::Frame; 15: use Tk::Label; 16: use Tk::Button; 17: 18: my $wave_file = shift; 19: 20: if(!defined($wave_file)) { 21: die("Usage: $0 <wave file to play>\n"); 22: } 23: 24: # our main body 25: 26: my $main_window = Tk::MainWindow->new( -title => 'PlayBack Controls'); 27: 28: my $is_paused = 0; 29: 30: my $lbl = $main_window->Label(-text => "Please Wait While $wave_file is Read...")->pack(-side => 'top'); 31: 32: $main_window->update(); 33: 34: my $datRef = read_file($wave_file); 35: 36: $lbl->destroy(); 37: $main_window->update(); 38: 39: play_back($datRef,$main_window); 40: 41: MainLoop(); 42: 43: exit(0); 44: 45: # subroutines 46: 47: sub read_file { 48: 49: my $file = shift; 50: 51: my $wav = Audio::Wav->new(); 52: my $readF = $wav->read($file); 53: 54: die("Unable to read $file\n") if(!defined($readF)); 55: 56: my($tmpf,$data); 57: 58: $data .= $tmpf while(defined($tmpf = $readF->read_raw(4096))); 59: 60: my $hash = $readF->details(); 61: my %tmpH = (); 62: 63: $tmpH{'data'} = $data; 64: $tmpH{'srate'} = $hash->{'sample_rate'}; 65: $tmpH{'bits'} = $hash->{'bits_sample'}; 66: $tmpH{'channels'} = $hash->{'channels'}; 67: 68: return(\%tmpH); 69: } 70: 71: sub play_back { 72: 73: my $hRef = shift; 74: my $mw = shift; 75: 76: my $object; 77: 78: my $dat = $hRef->{'data'}; 79: my $srate = $hRef->{'srate'}; 80: my $bits = $hRef->{'bits'}; 81: my $chan = $hRef->{'channels'}; 82: 83: if(!defined($dat) || !defined($srate) || !defined($bits) || !defined($chan)) { 84: die("ERROR: [play_back] Not enough data to playback.\n"); 85: } 86: 87: eval { $object = new Win32::Sound::WaveOut($srate,$bits,$chan); }; 88: 89: if($@) { 90: die("WARNING: WaveOut Returned: $@\n"); 91: } 92: 93: 94: $is_paused = 0; 95: 96: my $frame1 = $mw->Frame()->pack(-side => 'top'); 97: my $frame2 = $mw->Frame()->pack(-side => 'top'); 98: my $frame3 = $mw->Frame()->pack(-side => 'top'); 99: 100: $frame1->Label(-text => "Playback Controls")->pack(); 101: 102: $frame2->Button(-text => "Play", -command => sub { if($is_paused == 0) { $object->Load($dat); $object->Write(); } else { $object->Restart(); $is_paused = 1; } })->pack(-side => "left"); 103: 104: $frame2->Button(-text => "Pause", -command => sub { $object->Pause(); $is_paused = 1; })->pack(-side => "left"); 105: 106: $frame2->Button(-text => "Stop", -command => sub { $object->Reset(); } )->pack(-side => 'left'); 107: 108: $frame2->Button(-text => "Rew", -command => sub { $object->Reset(); })->pack(-side => 'left'); 109: 110: $frame3->Button(-text => "Close", -command => sub { $object->Reset(); $object->Unload(); $object->CloseDevice(); exit(0); })->pack(-side => 'top'); 111: 112: return(1); 113: }
Back to
Craft