From 93ab10e77ef3553b3c3b9a5e92f08e8066a93ef7 Mon Sep 17 00:00:00 2001 From: jgk Date: Tue, 23 Feb 2021 15:50:02 +0100 Subject: [PATCH] Add support for one time sounds, crashes if more than 8 play at once --- app/Main.hs | 3 ++ src/Dodge/Update.hs | 3 ++ src/Sound.hs | 10 ++++- src/Sound/Preload.hs | 97 ++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 107 insertions(+), 6 deletions(-) diff --git a/app/Main.hs b/app/Main.hs index 90f1dcfe8..9be966fcd 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -21,6 +21,8 @@ import Picture import Picture.Render import Picture.Preload +import Sound + import Preload import Control.Concurrent @@ -61,6 +63,7 @@ main = do (wallsForGloom' w) (lightsForGloom' w) (draw blank w) + playSoundQueue (_soundData preData) (_soundQueue w) return preData --renderPicture' preData (_windowX w,_windowY w) (Circle 5) -- renderPicture' preData diff --git a/src/Dodge/Update.hs b/src/Dodge/Update.hs index ac2421333..aa764631d 100644 --- a/src/Dodge/Update.hs +++ b/src/Dodge/Update.hs @@ -33,6 +33,7 @@ update w $ updateCreatures $ updateBlocks -- $ zoning $ updateSeenWalls + $ updateSoundQueue w w2 = -- updateWeaponCounters $ simpleCrSprings @@ -61,6 +62,8 @@ update w where (x,y) = zoneOfPoint $ _clPos cr cid = _clID cr +updateSoundQueue = set soundQueue [] + --updateSound :: World -> World --updateSound = set soundQueue [] . stepSoundTimers --stepSoundTimers :: World -> IO World diff --git a/src/Sound.hs b/src/Sound.hs index 1bca904d9..6571b39bd 100644 --- a/src/Sound.hs +++ b/src/Sound.hs @@ -1,7 +1,13 @@ module Sound where +import Sound.Preload --- ok, the problem here is that we need to be able to return the playing channel --- so this thread cannot be a simple observer +import Control.Monad +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) diff --git a/src/Sound/Preload.hs b/src/Sound/Preload.hs index ffcf8f242..80b4605f1 100644 --- a/src/Sound/Preload.hs +++ b/src/Sound/Preload.hs @@ -6,8 +6,97 @@ import qualified Data.IntMap as IM type SoundData = IM.IntMap Mix.Chunk -preloadSound :: IO SoundData -preloadSound = return IM.empty - 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' + ]