Tweak sound
This commit is contained in:
@@ -19,9 +19,10 @@ soundOnceOrigin :: Int -> SoundOrigin -> World -> World
|
|||||||
soundOnceOrigin sType so = over sounds (M.insertWith (flip const) so sound)
|
soundOnceOrigin sType so = over sounds (M.insertWith (flip const) so sound)
|
||||||
where
|
where
|
||||||
sound = Sound
|
sound = Sound
|
||||||
{ _soundType = sType
|
{ _soundChunkID = sType
|
||||||
, _soundTime = Nothing
|
, _soundTime = Nothing
|
||||||
, _soundFadeTime = 0
|
, _soundFadeTime = 0
|
||||||
|
, _soundIsFadingOut = False
|
||||||
, _soundChannel = Nothing
|
, _soundChannel = Nothing
|
||||||
, _soundPos = Nothing
|
, _soundPos = Nothing
|
||||||
}
|
}
|
||||||
@@ -30,8 +31,9 @@ soundFrom :: SoundOrigin -> Int -> Int -> Int -> World -> World
|
|||||||
soundFrom so sType time fadeTime w = over sounds (M.insertWith f so sound) w
|
soundFrom so sType time fadeTime w = over sounds (M.insertWith f so sound) w
|
||||||
where
|
where
|
||||||
sound = Sound
|
sound = Sound
|
||||||
{ _soundType = sType
|
{ _soundChunkID = sType
|
||||||
, _soundTime = Just time
|
, _soundTime = Just time
|
||||||
|
, _soundIsFadingOut = False
|
||||||
, _soundFadeTime = fadeTime
|
, _soundFadeTime = fadeTime
|
||||||
, _soundChannel = Nothing
|
, _soundChannel = Nothing
|
||||||
, _soundPos = Nothing
|
, _soundPos = Nothing
|
||||||
@@ -43,7 +45,7 @@ soundMultiFrom [] _ _ _ w = w
|
|||||||
soundMultiFrom (so:sos) sType time fadeTime w
|
soundMultiFrom (so:sos) sType time fadeTime w
|
||||||
| so `M.member` _sounds w = soundMultiFrom sos sType time fadeTime w
|
| so `M.member` _sounds w = soundMultiFrom sos sType time fadeTime w
|
||||||
| otherwise = over sounds (M.insert so sound) w
|
| otherwise = over sounds (M.insert so sound) w
|
||||||
where sound = Sound { _soundType = sType
|
where sound = Sound { _soundChunkID = sType
|
||||||
, _soundTime = Nothing
|
, _soundTime = Nothing
|
||||||
, _soundFadeTime = fadeTime
|
, _soundFadeTime = fadeTime
|
||||||
, _soundChannel = Nothing
|
, _soundChannel = Nothing
|
||||||
|
|||||||
+32
-1
@@ -33,6 +33,33 @@ there may be a leak in the current typical usage.
|
|||||||
playAndUpdate :: Ord a => M.Map a Sound -> SoundData a -> IO (SoundData a)
|
playAndUpdate :: Ord a => M.Map a Sound -> SoundData a -> IO (SoundData a)
|
||||||
playAndUpdate new sd = playSounds $ over playingSounds (updatePlaying new) sd
|
playAndUpdate new sd = playSounds $ over playingSounds (updatePlaying new) sd
|
||||||
|
|
||||||
|
--updateSound :: Sound -> Sound -> IO Sound
|
||||||
|
--updateSound newS oldS
|
||||||
|
-- | _soundIsFadingOut oldS
|
||||||
|
-- = Mix.playOn i times
|
||||||
|
-- | otherwise = newS & soundChannel .~ _soundChannel oldS
|
||||||
|
|
||||||
|
startPlaying :: SoundData a -> Sound -> IO (Maybe Sound)
|
||||||
|
startPlaying sd s = case _soundChannel s of
|
||||||
|
Just _ -> return $ Just s
|
||||||
|
Nothing -> playSoundIfFree (_loadedChunks sd IM.! _soundChunkID s) s
|
||||||
|
|
||||||
|
decrimentTimer :: Sound -> IO Sound
|
||||||
|
decrimentTimer s = case _soundTime s of
|
||||||
|
Just t | t > 0 -> return $ s & soundTime ?~ t - 1
|
||||||
|
| otherwise -> fadeOutMaybe (_soundChannel s) (_soundFadeTime s)
|
||||||
|
>> return (s & soundTime .~ Nothing
|
||||||
|
& soundIsFadingOut .~ True)
|
||||||
|
|
||||||
|
cleanupHalted :: Sound -> IO (Maybe Sound)
|
||||||
|
cleanupHalted s = case _soundChannel s of
|
||||||
|
Nothing -> return Nothing
|
||||||
|
Just i -> do
|
||||||
|
isPlaying <- Mix.playing i
|
||||||
|
if isPlaying
|
||||||
|
then return $ Just s
|
||||||
|
else return Nothing
|
||||||
|
|
||||||
{- | Given a chunk, attempt to play this on a free channel a given number of
|
{- | Given a chunk, attempt to play this on a free channel a given number of
|
||||||
times. Returns 'Just' the channel if succeeds.
|
times. Returns 'Just' the channel if succeeds.
|
||||||
-}
|
-}
|
||||||
@@ -61,6 +88,10 @@ haltMaybe :: Maybe Mix.Channel -> IO (Maybe Sound)
|
|||||||
haltMaybe (Just x) = Mix.halt x >> return Nothing
|
haltMaybe (Just x) = Mix.halt x >> return Nothing
|
||||||
haltMaybe Nothing = return Nothing
|
haltMaybe Nothing = return Nothing
|
||||||
|
|
||||||
|
fadeOutMaybe :: Maybe Mix.Channel -> Int -> IO ()
|
||||||
|
fadeOutMaybe (Just x) fadeT = Mix.fadeOut (fromIntegral fadeT) x
|
||||||
|
fadeOutMaybe _ _ = return ()
|
||||||
|
|
||||||
{- | Play a sound according to it's specification.
|
{- | Play a sound according to it's specification.
|
||||||
Logic: check if sound is playing:
|
Logic: check if sound is playing:
|
||||||
|
|
||||||
@@ -79,7 +110,7 @@ updateOrStartSound sd s = case _soundChannel s of
|
|||||||
then return (Just s)
|
then return (Just s)
|
||||||
else return Nothing
|
else return Nothing
|
||||||
)
|
)
|
||||||
Nothing -> playSoundIfFree (_loadedChunks sd IM.! _soundType s) s
|
Nothing -> playSoundIfFree (_loadedChunks sd IM.! _soundChunkID s) s
|
||||||
|
|
||||||
{- | Play all sounds and create new sound data.
|
{- | Play all sounds and create new sound data.
|
||||||
-}
|
-}
|
||||||
|
|||||||
@@ -12,11 +12,12 @@ data SoundData a = SoundData
|
|||||||
,_playingSounds :: M.Map a Sound
|
,_playingSounds :: M.Map a Sound
|
||||||
}
|
}
|
||||||
data Sound = Sound
|
data Sound = Sound
|
||||||
{ _soundTime :: Maybe Int
|
{ _soundTime :: Maybe Int
|
||||||
, _soundFadeTime :: Int
|
, _soundFadeTime :: Int
|
||||||
, _soundChannel :: Maybe Mix.Channel
|
, _soundIsFadingOut :: Bool
|
||||||
, _soundPos :: Maybe Point2
|
, _soundChannel :: Maybe Mix.Channel
|
||||||
, _soundType :: Int
|
, _soundPos :: Maybe Point2
|
||||||
|
, _soundChunkID :: Int
|
||||||
}
|
}
|
||||||
deriving (Eq,Ord,Show)
|
deriving (Eq,Ord,Show)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user