keid-sound-openal-0.1.0.0: src/Engine/Sound/Device.hs
module Engine.Sound.Device
( OpenAL.Device
, allocate
, create
, destroy
) where
import RIO
import Sound.OpenAL qualified as OpenAL
import UnliftIO.Resource qualified as Resource
allocate
:: ( Resource.MonadResource m
, MonadUnliftIO m
, MonadReader env m
, HasLogFunc env
)
=> m (Resource.ReleaseKey, OpenAL.Device)
allocate = do
soundDevice <- create
soundDeviceDestroy <- toIO $ destroy soundDevice
soundDeviceKey <- Resource.register soundDeviceDestroy
pure (soundDeviceKey, soundDevice)
create
:: ( MonadReader env m
, HasLogFunc env
, MonadUnliftIO m
)
=> m OpenAL.Device
create = do
OpenAL.openDevice Nothing >>= \case
Nothing -> do
logError "OpenAL: no devices"
exitFailure
Just device -> do
OpenAL.createContext device [] >>= \case
Nothing -> do
logError "OpenAL.createContext failed"
exitFailure
Just ctx -> do
OpenAL.currentContext OpenAL.$=! Just ctx
pure device
destroy
:: (MonadIO m, MonadReader env m, HasLogFunc env)
=> OpenAL.Device
-> m ()
destroy device =
OpenAL.closeDevice device >>= \case
True ->
pure ()
False ->
logWarn "OpenAL: closeDevice error"