Add support for one time sounds, crashes if more than 8 play at once

This commit is contained in:
jgk
2021-02-23 15:50:02 +01:00
parent c188512abb
commit 93ab10e77e
4 changed files with 107 additions and 6 deletions
+3
View File
@@ -21,6 +21,8 @@ import Picture
import Picture.Render import Picture.Render
import Picture.Preload import Picture.Preload
import Sound
import Preload import Preload
import Control.Concurrent import Control.Concurrent
@@ -61,6 +63,7 @@ main = do
(wallsForGloom' w) (wallsForGloom' w)
(lightsForGloom' w) (lightsForGloom' w)
(draw blank w) (draw blank w)
playSoundQueue (_soundData preData) (_soundQueue w)
return preData return preData
--renderPicture' preData (_windowX w,_windowY w) (Circle 5) --renderPicture' preData (_windowX w,_windowY w) (Circle 5)
-- renderPicture' preData -- renderPicture' preData
+3
View File
@@ -33,6 +33,7 @@ update w
$ updateCreatures $ updateCreatures
$ updateBlocks -- $ zoning $ updateBlocks -- $ zoning
$ updateSeenWalls $ updateSeenWalls
$ updateSoundQueue
w w
w2 = -- updateWeaponCounters $ w2 = -- updateWeaponCounters $
simpleCrSprings simpleCrSprings
@@ -61,6 +62,8 @@ update w
where (x,y) = zoneOfPoint $ _clPos cr where (x,y) = zoneOfPoint $ _clPos cr
cid = _clID cr cid = _clID cr
updateSoundQueue = set soundQueue []
--updateSound :: World -> World --updateSound :: World -> World
--updateSound = set soundQueue [] . stepSoundTimers --updateSound = set soundQueue [] . stepSoundTimers
--stepSoundTimers :: World -> IO World --stepSoundTimers :: World -> IO World
+8 -2
View File
@@ -1,7 +1,13 @@
module Sound module Sound
where where
import Sound.Preload
-- ok, the problem here is that we need to be able to return the playing channel import Control.Monad
-- so this thread cannot be a simple observer
import qualified SDL.Mixer as Mix
import qualified Data.IntMap as IM
playSoundQueue :: SoundData -> [Int] -> IO ()
playSoundQueue sd ns =
forM_ ns $ \n -> Mix.play (sd IM.! n)
+93 -4
View File
@@ -6,8 +6,97 @@ import qualified Data.IntMap as IM
type SoundData = IM.IntMap Mix.Chunk type SoundData = IM.IntMap Mix.Chunk
preloadSound :: IO SoundData
preloadSound = return IM.empty
cleanUpSoundPreload :: SoundData -> IO () cleanUpSoundPreload :: SoundData -> IO ()
cleanUpSoundPreload sd = return () cleanUpSoundPreload sd = Mix.closeAudio
preloadSound :: IO SoundData
preloadSound = do
Mix.openAudio Mix.defaultAudio 256
-- pFireSound <- Mix.loadWAV "./data/sound/tap3.wav"
pFireSound <- Mix.load "./data/sound/tap3.wav"
click <- Mix.load "./data/sound/click1.wav"
reloadSound' <- Mix.load "./data/sound/reload1.wav"
tone440 <- Mix.load "./data/sound/tone440.wav"
pickupSound' <- Mix.load "./data/sound/pickUp.wav"
putdownSound' <- Mix.load "./data/sound/whiteNoiseFadeOut.wav"
fireSound' <- Mix.load "./data/sound/fire1.wav"
grenadeBang' <- Mix.load "./data/sound/grenade.wav"
tapQuiet' <- Mix.load "./data/sound/tapQuiet.wav"
twoStep' <- Mix.load "./data/sound/twoStep.wav"
healSound' <- Mix.load "./data/sound/heal.wav"
doorSound' <- Mix.load "./data/sound/slideDoor.wav"
twoStepSlow' <- Mix.load "./data/sound/twoStepSlow.wav"
knifeSound' <- Mix.load "./data/sound/knife.wav"
buzzSound' <- Mix.load "./data/sound/buzz.wav"
hitSound' <- Mix.load "./data/sound/hit1.wav"
autoGunSound' <- Mix.load "./data/sound/autoGun.wav"
shotgunSound' <- Mix.load "./data/sound/shotgun.wav"
teleSound' <- Mix.load "./data/sound/tele.wav"
longGunSound' <- Mix.load "./data/sound/longTap.wav"
launcherSound' <- Mix.load "./data/sound/tap4.wav"
smokeTrailSound' <- Mix.load "./data/sound/missileLaunch.wav"
foot1Sound' <- Mix.load "./data/sound/foot1.wav"
foot2Sound' <- Mix.load "./data/sound/foot2.wav"
lasSound' <- Mix.load "./data/sound/tone440sawtooth.wav"
teslaSound' <- Mix.load "./data/sound/Electrical-Welding.wav"
crankSlow' <- Mix.load "./data/sound/crankSlow.wav"
autoB' <- Mix.load "./data/sound/autoB.wav"
mini' <- Mix.load "./data/sound/mini1.wav"
impactA' <- Mix.load "./data/sound/Impact-A.wav"
impactB' <- Mix.load "./data/sound/Impact-B.wav"
impactC' <- Mix.load "./data/sound/Impact-C.wav"
impactD' <- Mix.load "./data/sound/Impact-D.wav"
glassShat1' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A1.wav"
glassShat2' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A2.wav"
glassShat3' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A3.wav"
glassShat4' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A4.wav"
glass1' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A1.wav"
glass2' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A2.wav"
glass3' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A3.wav"
glass4' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A4.wav"
foamSpray' <- Mix.load "./data/sound/foamSprayLoop.wav"
return $ IM.fromList $ zip [0..]
$ [ pFireSound
, click
, reloadSound'
, tone440
, pickupSound'
, putdownSound'
, fireSound'
, grenadeBang'
, tapQuiet'
, twoStep'
, healSound'
, doorSound'
, twoStepSlow'
, knifeSound'
, buzzSound'
, hitSound' --15
, autoGunSound'
, shotgunSound'
, teleSound'
, longGunSound'
, launcherSound'
, smokeTrailSound'
, foot1Sound'
, foot2Sound'
, lasSound'
, teslaSound' --25
, crankSlow'
, autoB'
, mini'
, impactA'
, impactB' --30
, impactC'
, impactD'
, glassShat1' --33
, glassShat2'
, glassShat3'
, glassShat4'
, glass1' --37
, glass2'
, glass3'
, glass4' --40
, foamSpray'
]