module JSDOM.Custom.AudioContext (
module Generated
, DecodeAudioError(..)
, decodeAudioData
) where
import Prelude ()
import Prelude.Compat
import Data.Typeable (Typeable)
import Control.Exception (Exception(..), throwIO)
import Control.Monad.IO.Class (MonadIO(..))
import JSDOM.Types
import Control.Concurrent.MVar (takeMVar, putMVar, newEmptyMVar)
import JSDOM.Generated.AudioBufferCallback
(newAudioBufferCallback)
import JSDOM.Generated.AudioContext as Generated hiding (decodeAudioData)
import qualified JSDOM.Generated.AudioContext
as Generated (decodeAudioData)
data DecodeAudioError = DecodeAudioError deriving (Show, Eq, Typeable)
instance Exception DecodeAudioError
decodeAudioData :: (MonadDOM m, IsAudioContext self, IsArrayBuffer audioData) =>
self -> audioData -> m AudioBuffer
decodeAudioData self audioData = do
result <- liftIO newEmptyMVar
success <- newAudioBufferCallback $ \buffer -> liftIO $ putMVar result (Just buffer)
error <- newAudioBufferCallback . const . liftIO $ putMVar result Nothing
Generated.decodeAudioData self audioData (Just success) (Just error)
liftIO $ takeMVar result >>= maybe (throwIO DecodeAudioError) return