Code archives/Audio/Sound Engine
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| The bulk of this code was written by someone else on this forum. It's a great bit of code but was missing something I needed. I needed to be able to chain sounds together, for example I needed snippits of speech to follow one another and I wanted this to happen without any interaction, other than some simple commands to set it up. Anyway here it is... No comments I'm afriad, I've got too much other work to do... | |||||
; ****************************************************************************
; MOD_SoundEngine
DebugLog "MOD_SoundEngine.bb"
; AUDIO CHANNEL CONSTANTS
Const CH_ANY = - 1
Const CH1 = 1
Const CH2 = 2
Const CH3 = 3
Const CH4 = 4
Const CH5 = 5
Const CH6 = 6
Const CH7 = 7
Const CH8 = 8
Const CH9 = 9
Const CH10 = 10
; ****************************************************************************
Type ActiveChannel
Field SampleID
Field Address ; Channel handle
Field FadeTime#
Field FadeStart#
Field Volume#
Field VolumeS# ; Start Volume
Field Queue[4]
Field QueueCount
End Type
; ****************************************************************************
Function PlaySample ( SampleAddress% , SampleID% = -1, Volume# = 1, Queue% = False )
Local Channel.ActiveChannel
Local Simultaneous% = False
Local Playing% = False
If SampleID < 0 Then Simultaneous = True
For Channel = Each ActiveChannel
If Channel\SampleID = SampleID
If Queue = True
Channel\QueueCount = Channel\QueueCount + 1
Channel\Queue[Channel\QueueCount] = SampleAddress
Playing = True
Else
Playing = True
EndIf
EndIf
If Not ChannelPlaying ( Channel\Address ) Then Delete Channel
Next
If Not ( Simultaneous = False And Playing = True )
Channel = New ActiveChannel
Channel\SampleID = SampleID
Channel\Address = PlaySound ( SampleAddress )
ChannelVolume Channel\Address,Volume
Channel\Volume# = Volume
Channel\Volumes# = Volume
channel\FadeTime = 0
EndIf
End Function
; ****************************************************************************
Function UpdateChannels ()
Local Channel.ActiveChannel
For Channel = Each ActiveChannel
If Not ChannelPlaying ( Channel\Address ) Then
If Channel\QueueCount = 0 Then
Delete Channel
Return
Else
Channel\Address = PlaySound(Channel\Queue[1])
For a = 1 To Channel\QueueCount - 1
Channel\Queue[a] = Channel\Queue[a+1]
Next
Channel\QueueCount = Channel\QueueCount - 1
EndIf
EndIf
If Channel\FadeTime
If MilliSecs () - Channel\FadeStart >= Channel\FadeTime
StopChannel Channel\Address
Delete Channel
Else
Channel\Volume = Channel\VolumeS - Float ( MilliSecs () - Channel\FadeStart ) / Channel\FadeTime
ChannelVolume Channel\Address , Channel\Volume
End If
End If
Next
End Function
; ****************************************************************************
Function SoundOff ()
Local Channel.ActiveChannel
For Channel = Each ActiveChannel
StopChannel Channel\Address
Delete Channel
Next
End Function
; ****************************************************************************
Function ReleaseSample ( SampleID , TimeOut# = 0 )
Local Channel.ActiveChannel
For Channel = Each ActiveChannel
If Not Channel\FadeTime
If Channel\SampleID = SampleID
If TimeOut
Channel\FadeTime = TimeOut
Channel\FadeStart = MilliSecs ()
Else
StopChannel Channel\Address
Delete Channel
End If
End If
End If
Next
End Function |
Comments
None.
Code Archives Forum