packages feed

jsaddle-dom-0.1.0.1: src/Language/Javascript/JSaddle/DOM/Custom/AudioContext.hs

{-# LANGUAGE DeriveDataTypeable #-}
module Language.Javascript.JSaddle.DOM.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 Language.Javascript.JSaddle.DOM.Types

import Control.Concurrent.MVar (takeMVar, putMVar, newEmptyMVar)
import Language.Javascript.JSaddle.DOM.Generated.AudioBufferCallback
       (newAudioBufferCallback)
import Language.Javascript.JSaddle.DOM.Generated.AudioContext as Generated hiding (decodeAudioData)
import qualified Language.Javascript.JSaddle.DOM.Generated.AudioContext
       as Generated (decodeAudioData)

data DecodeAudioError = DecodeAudioError deriving (Show, Eq, Typeable)

instance Exception DecodeAudioError

-- | <https://developer.mozilla.org/en-US/docs/Web/API/AudioContext.decodeAudioData Mozilla AudioContext.decodeAudioData documentation>
decodeAudioData :: (MonadDOM m, IsAudioContext self, IsArrayBuffer audioData) =>
                   self -> audioData -> m AudioBuffer
decodeAudioData self audioData = do
    result <- liftIO newEmptyMVar
    success <- newAudioBufferCallback $ \buffer -> liftIO $ putMVar result buffer
    error <- newAudioBufferCallback . const . liftIO $ putMVar result Nothing
    Generated.decodeAudioData self (Just audioData) (Just success) (Just error)
    liftIO $ takeMVar result >>= maybe (throwIO DecodeAudioError) return