in reply to Re: win32 sound problem
in thread win32 sound problem

the code is supposed to make play and save a wav file each time you enter a repeat value. on win32, if your sound is turned up you should hear the number of clicks that repeats is set to. temp.wav is also created in the working folder. this all works. the only problem is that something is not resetting. if you enter 2 repeats it does 2 repeats. then enter 5 and it does 5 but if you then enter 1, it does 5 again. here is the script with the variables localized. also tried it with warnings and get back warnings that i do not understand about the data packing.
use strict; #use warnings; use Win32::Sound; my $input = 1; while ($input){ print "\nenter number of repetitions of pulse \"enter\" to quit.\ +n"; $input=<STDIN>; chomp $input; make_wav($input); } sub make_wav{ my $repeats = shift; my $data = ""; my $counter = 0; my $increment = 440/44100; my $WAV = new Win32::Sound::WaveOut(44100, 8, 2); $data = ""; $counter = 0; for ( my $i = 1 ; $i < $repeats + 1 ; $i++ ) { print "\ndoing repeat number $i"; for my $j (1..4410) { my $v = sin($counter/2*3.14) * 128 + 128; $data .= pack("cc", $v, $v); $counter += $increment; } for my $k (1..440) { #silence between pulses my $v = 128; $data .= pack("cc", $v, $v); } } $WAV->Unload(); # drop it $WAV->Load($data); # get it $WAV->Write(); # hear it 1 until $WAV->Status(); # wait for completion $WAV->Save("temp.wav",$data); # write to disk $WAV->Close();

Replies are listed 'Best First'.
Re^3: win32 sound problem
by toolic (Bishop) on Feb 27, 2011 at 21:44 UTC
    Did you try calling CloseDevice()?

    Maybe it's a bug in Win32::Sound. Try looking at the module's source code to see why it seems to retain state from a previous call. If it is a bug, maybe you'll be able to submit a patch and report it on CPAN.

    A Super Search finds a similar issue: Win32::Sound buffer problems

      i tried close() and every other function i could find and never could get it to work. it does seem like a bug in win32 sound. i looked at the source code but could not figure out where the problem is, if it is there. it would help if someone who understands windows better than i do could look at the source code and maybe identify the problem.

        spencold:

        Perhaps it's allocating a buffer internally, and not shrinking it when you load a new sound. Do you get the remains of the first track after the second track plays? (Might be easier to tell if you play a song and then load your track.) If that's the case, it might lead you to a bugfix. Or perhaps load an appropriately long empty file (i.e. silence) before loading your tracks to work around the problem

        Finally, the docs show a Play(from, to) method. You might just use that method to play only the track you just loaded/created. It also shows a Reset() method. Perhaps the pointer in the device isn't being reset, so it's loading data into the wrong part of the buffer?

        ...roboticus

        When your only tool is a hammer, all problems look like your thumb.