Code archives/Audio/Sound Sorter
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This sets up 16 channels (editable by changing the channel constant) that will manage your sound calls to help avoid sounds that interfere with one another. It will first look for an unused channel and if all are in use will look to see if the newly called sound's priority overides that of a currently playing sound and will replace it if it will. This also detects if sound effects are on or off with the SoundOff variable. If SoundOff is true then it will not assign sounds. If you wish to have a seperate MusicOff variable then I would advise making our MusicOff check before calling the RequestSound function. If MusicOff is True then don't let it call the function. You need only to call RequestSound once to play your sound, but multiple calls to it will ignore sounds already played - however if you call the same sound twice with different parameters (volume for example) then it will update the playing sound to change its parameters. In this way you can have sound increase or decrease, change the pitch of a sound, or even continue to hold the priority of a sound. You can also easily have a sound decrease by simply supplying a value in the "silence" parameter. Make calls to the UpdateSound() function with every pass thru your program. It will degrade the priority so that new soundcalls will naturally have priority over older ones. This also searches out used channels that have finished playing sounds and turns them off so that future soundrequests can access the unused channels. To kill a sound simply call a currently playing sound with the job attribute set to "1". To loop a sound have the job attribute set to "2". The sound you send in the RequestSound function should be a previously preloaded sound. Example : Global sndMySound=LoadSound"sound\mySound.wav" The call would look like : RequestSound(sndMySound,100,1,0,-1,0) If you have any questions you can contact me thru http://dewstation.tripod.com | |||||
Const Channels = 15 Type Sound_Struc Field Channel ;Channel used to play Field Sound ;Sound to be played Field Priority# ;Importance Rating of Sound Field Volume# ;How loud to play Sound Field silence# ;How fast Volume decreases Field Pitch ;Htz pitch to play sound End Type Global Play.Sound_Struc = New Sound_Struc SeedRnd(MilliSecs()) For a = 0 To channels ;As program starts or reloops we want Delete play ;to make sure all Channels are cleared Next ;of possible old sounds ;Create 16 Empty Channels For a = 0 To channels Play.Sound_Struc = New Sound_Struc Play\Channel =0 ;what sound is being played play\sound =0 ;what sound is remembered play\priority =0 ;sounds priority play\volume =0 ;Sound Volume play\silence =0 ;Volume decrease rate play\Pitch =0 ;Hertz Range Next ;XXXXXXXXXXXXXXXXXXXXX ;Main Program with all sound calls ;XXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Function UpdateSound() ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;Update the channel information For a.sound_struc = Each sound_struc If ChannelPlaying (a\channel) Then a\volume=a\volume-(a\silence*.00001) If a\volume<0 Then a\volume=0 ChannelVolume a\channel,a\volume If a\pitch <> -1 Then ChannelPitch a\channel,a\pitch a\priority=a\priority-.01 If a\priority<1 Then a\priority=1 Else a\sound=0 a\priority=0 a\volume=0 a\silence=0 a\pitch=0 EndIf If a\volume=0 Or a\priority<0 And a\sound <> 0 Then StopChannel a\channel Next End Function ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Function RequestSound(Sound,priority,volume#,silence,pitch,job) ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;sound,priority,volume,silence,pitch,job ;sound - Any sound variable loaded with a sound ;priority - importance of sound in the event that it needs to overide another ;volume - how loud to play the sound ;silence - how fast volume is decreased *.00001 ;pitch - what hertz to play sound at ;job - 0=None 1=kill 2=Loop (only loops new sounds) If (Not soundoff) Then ;Global Sound Flag SoundPlaced=False ;Determine if requested sound already exhists For play.sound_struc = Each sound_struc If play\sound = sound Then SoundPlaced=True If job = 1 Then ;Do we kill the current sound? If ChannelPlaying (play\channel) Then StopChannel play\channel play\priority=0 play\volume=0 play\silence=0 play\pitch=0 Else ;If not a kill then update Sound Variables play\priority=priority play\volume=volume play\silence=silence play\pitch=pitch If play\pitch <> -1 Then ChannelPitch play\channel,play\pitch EndIf EndIf Next ;Is there an open channel? If (Not SoundPlaced) And job <> 1 Then For play.sound_struc = Each sound_struc If (Not ChannelPlaying (play\channel)) And (Not SoundPlaced) Then SoundPlaced = True play\sound = sound play\priority=priority play\volume=volume play\silence=silence play\pitch=pitch ; If play\pitch <> -1 Then ChannelPitch play\channel,play\pitch If job = 2 Then LoopSound(sound) play\channel = PlaySound(sound) EndIf Next EndIf ;Is the priority higher than exhisting Sound? If (Not soundplaced) And job <> 1 Then For play.sound_struc = Each sound_struc If priority >= play\priority Then StopChannel play\channel play\sound = sound play\priority=priority play\volume=volume play\silence=silence play\pitch=pitch ; If play\pitch <> -1 Then ChannelPitch play\channel,play\pitch If job = 2 Then LoopSound(sound) play\channel = PlaySound(sound) EndIf Next EndIf EndIf End Function |
Comments
| ||
How does one claim this as public domain? I put it on here, and I see that there are better examples available, but I have not qualms of anyone using it if they find it useful. |
| ||
As soon as you post the code you claim it as public domain. .. I would assume it applies to all that were made before the license agreement was changed as well. |
| ||
.. I would assume it applies to all that were made before the license agreement was changed as well. Kind of a grey area, since the poster didn't explicitly agree to it at that time. |
| ||
.. I would assume it applies to all that were made before the license agreement was changed as well. Kind of a grey area, since the poster didn't explicitly agree to it at that time. All code archive posters were notified and asked to give their permission when this changed, the ones that didn't agree were removed (from what I recall). |
Code Archives Forum