{-# LANGUAGE DeriveDataTypeable #-}
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 (Int -> DecodeAudioError -> ShowS
[DecodeAudioError] -> ShowS
DecodeAudioError -> String
(Int -> DecodeAudioError -> ShowS)
-> (DecodeAudioError -> String)
-> ([DecodeAudioError] -> ShowS)
-> Show DecodeAudioError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DecodeAudioError] -> ShowS
$cshowList :: [DecodeAudioError] -> ShowS
show :: DecodeAudioError -> String
$cshow :: DecodeAudioError -> String
showsPrec :: Int -> DecodeAudioError -> ShowS
$cshowsPrec :: Int -> DecodeAudioError -> ShowS
Show, DecodeAudioError -> DecodeAudioError -> Bool
(DecodeAudioError -> DecodeAudioError -> Bool)
-> (DecodeAudioError -> DecodeAudioError -> Bool)
-> Eq DecodeAudioError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DecodeAudioError -> DecodeAudioError -> Bool
$c/= :: DecodeAudioError -> DecodeAudioError -> Bool
== :: DecodeAudioError -> DecodeAudioError -> Bool
$c== :: DecodeAudioError -> DecodeAudioError -> Bool
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 -> m AudioBuffer
decodeAudioData self
self audioData
audioData = do
    MVar (Maybe AudioBuffer)
result <- IO (MVar (Maybe AudioBuffer)) -> m (MVar (Maybe AudioBuffer))
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO (MVar (Maybe AudioBuffer))
forall a. IO (MVar a)
newEmptyMVar
    AudioBufferCallback
success <- (AudioBuffer -> JSM ()) -> m AudioBufferCallback
forall (m :: * -> *).
MonadDOM m =>
(AudioBuffer -> JSM ()) -> m AudioBufferCallback
newAudioBufferCallback ((AudioBuffer -> JSM ()) -> m AudioBufferCallback)
-> (AudioBuffer -> JSM ()) -> m AudioBufferCallback
forall a b. (a -> b) -> a -> b
$ \AudioBuffer
buffer -> IO () -> JSM ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> JSM ()) -> IO () -> JSM ()
forall a b. (a -> b) -> a -> b
$ MVar (Maybe AudioBuffer) -> Maybe AudioBuffer -> IO ()
forall a. MVar a -> a -> IO ()
putMVar MVar (Maybe AudioBuffer)
result (AudioBuffer -> Maybe AudioBuffer
forall a. a -> Maybe a
Just AudioBuffer
buffer)
    AudioBufferCallback
error <- (AudioBuffer -> JSM ()) -> m AudioBufferCallback
forall (m :: * -> *).
MonadDOM m =>
(AudioBuffer -> JSM ()) -> m AudioBufferCallback
newAudioBufferCallback ((AudioBuffer -> JSM ()) -> m AudioBufferCallback)
-> (IO () -> AudioBuffer -> JSM ())
-> IO ()
-> m AudioBufferCallback
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSM () -> AudioBuffer -> JSM ()
forall a b. a -> b -> a
const (JSM () -> AudioBuffer -> JSM ())
-> (IO () -> JSM ()) -> IO () -> AudioBuffer -> JSM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO () -> JSM ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m AudioBufferCallback) -> IO () -> m AudioBufferCallback
forall a b. (a -> b) -> a -> b
$ MVar (Maybe AudioBuffer) -> Maybe AudioBuffer -> IO ()
forall a. MVar a -> a -> IO ()
putMVar MVar (Maybe AudioBuffer)
result Maybe AudioBuffer
forall a. Maybe a
Nothing
    self
-> audioData
-> Maybe AudioBufferCallback
-> Maybe AudioBufferCallback
-> m ()
forall (m :: * -> *) self audioData.
(MonadDOM m, IsAudioContext self, IsArrayBuffer audioData) =>
self
-> audioData
-> Maybe AudioBufferCallback
-> Maybe AudioBufferCallback
-> m ()
Generated.decodeAudioData self
self audioData
audioData (AudioBufferCallback -> Maybe AudioBufferCallback
forall a. a -> Maybe a
Just AudioBufferCallback
success) (AudioBufferCallback -> Maybe AudioBufferCallback
forall a. a -> Maybe a
Just AudioBufferCallback
error)
    IO AudioBuffer -> m AudioBuffer
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO AudioBuffer -> m AudioBuffer)
-> IO AudioBuffer -> m AudioBuffer
forall a b. (a -> b) -> a -> b
$ MVar (Maybe AudioBuffer) -> IO (Maybe AudioBuffer)
forall a. MVar a -> IO a
takeMVar MVar (Maybe AudioBuffer)
result IO (Maybe AudioBuffer)
-> (Maybe AudioBuffer -> IO AudioBuffer) -> IO AudioBuffer
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IO AudioBuffer
-> (AudioBuffer -> IO AudioBuffer)
-> Maybe AudioBuffer
-> IO AudioBuffer
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (DecodeAudioError -> IO AudioBuffer
forall e a. Exception e => e -> IO a
throwIO DecodeAudioError
DecodeAudioError) AudioBuffer -> IO AudioBuffer
forall (m :: * -> *) a. Monad m => a -> m a
return