{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

Extra buffer metadata describing audio downmixing matrix. This metadata is
attached to audio buffers and contains a matrix to downmix the buffer number
of channels to /@channels@/.

/@matrix@/ is an two-dimensional array of /@toChannels@/ times /@fromChannels@/
coefficients, i.e. the i-th output channels is constructed by multiplicating
the input channels with the coefficients in /@matrix@/[i] and taking the sum
of the results.
-}

module GI.GstAudio.Structs.AudioDownmixMeta
    ( 

-- * Exported types
    AudioDownmixMeta(..)                    ,
    newZeroAudioDownmixMeta                 ,
    noAudioDownmixMeta                      ,


 -- * Methods
-- ** getInfo #method:getInfo#
    audioDownmixMetaGetInfo                 ,




 -- * Properties
-- ** fromChannels #attr:fromChannels#
    audioDownmixMeta_fromChannels           ,
    getAudioDownmixMetaFromChannels         ,
    setAudioDownmixMetaFromChannels         ,


-- ** fromPosition #attr:fromPosition#
    audioDownmixMeta_fromPosition           ,
    getAudioDownmixMetaFromPosition         ,
    setAudioDownmixMetaFromPosition         ,


-- ** matrix #attr:matrix#
    audioDownmixMeta_matrix                 ,
    getAudioDownmixMetaMatrix               ,
    setAudioDownmixMetaMatrix               ,


-- ** meta #attr:meta#
    audioDownmixMeta_meta                   ,
    getAudioDownmixMetaMeta                 ,


-- ** toChannels #attr:toChannels#
    audioDownmixMeta_toChannels             ,
    getAudioDownmixMetaToChannels           ,
    setAudioDownmixMetaToChannels           ,


-- ** toPosition #attr:toPosition#
    audioDownmixMeta_toPosition             ,
    getAudioDownmixMetaToPosition           ,
    setAudioDownmixMetaToPosition           ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP

import qualified GI.Gst.Structs.Meta as Gst.Meta
import qualified GI.Gst.Structs.MetaInfo as Gst.MetaInfo
import {-# SOURCE #-} qualified GI.GstAudio.Enums as GstAudio.Enums

newtype AudioDownmixMeta = AudioDownmixMeta (ManagedPtr AudioDownmixMeta)
instance WrappedPtr AudioDownmixMeta where
    wrappedPtrCalloc = callocBytes 48
    wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 48 >=> wrapPtr AudioDownmixMeta)
    wrappedPtrFree = Just ptr_to_g_free

-- | Construct a `AudioDownmixMeta` struct initialized to zero.
newZeroAudioDownmixMeta :: MonadIO m => m AudioDownmixMeta
newZeroAudioDownmixMeta = liftIO $ wrappedPtrCalloc >>= wrapPtr AudioDownmixMeta

instance tag ~ 'AttrSet => Constructible AudioDownmixMeta tag where
    new _ attrs = do
        o <- newZeroAudioDownmixMeta
        GI.Attributes.set o attrs
        return o


noAudioDownmixMeta :: Maybe AudioDownmixMeta
noAudioDownmixMeta = Nothing

getAudioDownmixMetaMeta :: MonadIO m => AudioDownmixMeta -> m Gst.Meta.Meta
getAudioDownmixMetaMeta s = liftIO $ withManagedPtr s $ \ptr -> do
    let val = ptr `plusPtr` 0 :: (Ptr Gst.Meta.Meta)
    val' <- (newPtr Gst.Meta.Meta) val
    return val'

data AudioDownmixMetaMetaFieldInfo
instance AttrInfo AudioDownmixMetaMetaFieldInfo where
    type AttrAllowedOps AudioDownmixMetaMetaFieldInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint AudioDownmixMetaMetaFieldInfo = (~) (Ptr Gst.Meta.Meta)
    type AttrBaseTypeConstraint AudioDownmixMetaMetaFieldInfo = (~) AudioDownmixMeta
    type AttrGetType AudioDownmixMetaMetaFieldInfo = Gst.Meta.Meta
    type AttrLabel AudioDownmixMetaMetaFieldInfo = "meta"
    type AttrOrigin AudioDownmixMetaMetaFieldInfo = AudioDownmixMeta
    attrGet _ = getAudioDownmixMetaMeta
    attrSet _ = undefined
    attrConstruct = undefined
    attrClear _ = undefined

audioDownmixMeta_meta :: AttrLabelProxy "meta"
audioDownmixMeta_meta = AttrLabelProxy


getAudioDownmixMetaFromPosition :: MonadIO m => AudioDownmixMeta -> m GstAudio.Enums.AudioChannelPosition
getAudioDownmixMetaFromPosition s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 16) :: IO CUInt
    let val' = (toEnum . fromIntegral) val
    return val'

setAudioDownmixMetaFromPosition :: MonadIO m => AudioDownmixMeta -> GstAudio.Enums.AudioChannelPosition -> m ()
setAudioDownmixMetaFromPosition s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = (fromIntegral . fromEnum) val
    poke (ptr `plusPtr` 16) (val' :: CUInt)

data AudioDownmixMetaFromPositionFieldInfo
instance AttrInfo AudioDownmixMetaFromPositionFieldInfo where
    type AttrAllowedOps AudioDownmixMetaFromPositionFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioDownmixMetaFromPositionFieldInfo = (~) GstAudio.Enums.AudioChannelPosition
    type AttrBaseTypeConstraint AudioDownmixMetaFromPositionFieldInfo = (~) AudioDownmixMeta
    type AttrGetType AudioDownmixMetaFromPositionFieldInfo = GstAudio.Enums.AudioChannelPosition
    type AttrLabel AudioDownmixMetaFromPositionFieldInfo = "from_position"
    type AttrOrigin AudioDownmixMetaFromPositionFieldInfo = AudioDownmixMeta
    attrGet _ = getAudioDownmixMetaFromPosition
    attrSet _ = setAudioDownmixMetaFromPosition
    attrConstruct = undefined
    attrClear _ = undefined

audioDownmixMeta_fromPosition :: AttrLabelProxy "fromPosition"
audioDownmixMeta_fromPosition = AttrLabelProxy


getAudioDownmixMetaToPosition :: MonadIO m => AudioDownmixMeta -> m GstAudio.Enums.AudioChannelPosition
getAudioDownmixMetaToPosition s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 24) :: IO CUInt
    let val' = (toEnum . fromIntegral) val
    return val'

setAudioDownmixMetaToPosition :: MonadIO m => AudioDownmixMeta -> GstAudio.Enums.AudioChannelPosition -> m ()
setAudioDownmixMetaToPosition s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = (fromIntegral . fromEnum) val
    poke (ptr `plusPtr` 24) (val' :: CUInt)

data AudioDownmixMetaToPositionFieldInfo
instance AttrInfo AudioDownmixMetaToPositionFieldInfo where
    type AttrAllowedOps AudioDownmixMetaToPositionFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioDownmixMetaToPositionFieldInfo = (~) GstAudio.Enums.AudioChannelPosition
    type AttrBaseTypeConstraint AudioDownmixMetaToPositionFieldInfo = (~) AudioDownmixMeta
    type AttrGetType AudioDownmixMetaToPositionFieldInfo = GstAudio.Enums.AudioChannelPosition
    type AttrLabel AudioDownmixMetaToPositionFieldInfo = "to_position"
    type AttrOrigin AudioDownmixMetaToPositionFieldInfo = AudioDownmixMeta
    attrGet _ = getAudioDownmixMetaToPosition
    attrSet _ = setAudioDownmixMetaToPosition
    attrConstruct = undefined
    attrClear _ = undefined

audioDownmixMeta_toPosition :: AttrLabelProxy "toPosition"
audioDownmixMeta_toPosition = AttrLabelProxy


getAudioDownmixMetaFromChannels :: MonadIO m => AudioDownmixMeta -> m Int32
getAudioDownmixMetaFromChannels s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 32) :: IO Int32
    return val

setAudioDownmixMetaFromChannels :: MonadIO m => AudioDownmixMeta -> Int32 -> m ()
setAudioDownmixMetaFromChannels s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 32) (val :: Int32)

data AudioDownmixMetaFromChannelsFieldInfo
instance AttrInfo AudioDownmixMetaFromChannelsFieldInfo where
    type AttrAllowedOps AudioDownmixMetaFromChannelsFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioDownmixMetaFromChannelsFieldInfo = (~) Int32
    type AttrBaseTypeConstraint AudioDownmixMetaFromChannelsFieldInfo = (~) AudioDownmixMeta
    type AttrGetType AudioDownmixMetaFromChannelsFieldInfo = Int32
    type AttrLabel AudioDownmixMetaFromChannelsFieldInfo = "from_channels"
    type AttrOrigin AudioDownmixMetaFromChannelsFieldInfo = AudioDownmixMeta
    attrGet _ = getAudioDownmixMetaFromChannels
    attrSet _ = setAudioDownmixMetaFromChannels
    attrConstruct = undefined
    attrClear _ = undefined

audioDownmixMeta_fromChannels :: AttrLabelProxy "fromChannels"
audioDownmixMeta_fromChannels = AttrLabelProxy


getAudioDownmixMetaToChannels :: MonadIO m => AudioDownmixMeta -> m Int32
getAudioDownmixMetaToChannels s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 36) :: IO Int32
    return val

setAudioDownmixMetaToChannels :: MonadIO m => AudioDownmixMeta -> Int32 -> m ()
setAudioDownmixMetaToChannels s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 36) (val :: Int32)

data AudioDownmixMetaToChannelsFieldInfo
instance AttrInfo AudioDownmixMetaToChannelsFieldInfo where
    type AttrAllowedOps AudioDownmixMetaToChannelsFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioDownmixMetaToChannelsFieldInfo = (~) Int32
    type AttrBaseTypeConstraint AudioDownmixMetaToChannelsFieldInfo = (~) AudioDownmixMeta
    type AttrGetType AudioDownmixMetaToChannelsFieldInfo = Int32
    type AttrLabel AudioDownmixMetaToChannelsFieldInfo = "to_channels"
    type AttrOrigin AudioDownmixMetaToChannelsFieldInfo = AudioDownmixMeta
    attrGet _ = getAudioDownmixMetaToChannels
    attrSet _ = setAudioDownmixMetaToChannels
    attrConstruct = undefined
    attrClear _ = undefined

audioDownmixMeta_toChannels :: AttrLabelProxy "toChannels"
audioDownmixMeta_toChannels = AttrLabelProxy


getAudioDownmixMetaMatrix :: MonadIO m => AudioDownmixMeta -> m Float
getAudioDownmixMetaMatrix s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 40) :: IO CFloat
    let val' = realToFrac val
    return val'

setAudioDownmixMetaMatrix :: MonadIO m => AudioDownmixMeta -> Float -> m ()
setAudioDownmixMetaMatrix s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = realToFrac val
    poke (ptr `plusPtr` 40) (val' :: CFloat)

data AudioDownmixMetaMatrixFieldInfo
instance AttrInfo AudioDownmixMetaMatrixFieldInfo where
    type AttrAllowedOps AudioDownmixMetaMatrixFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioDownmixMetaMatrixFieldInfo = (~) Float
    type AttrBaseTypeConstraint AudioDownmixMetaMatrixFieldInfo = (~) AudioDownmixMeta
    type AttrGetType AudioDownmixMetaMatrixFieldInfo = Float
    type AttrLabel AudioDownmixMetaMatrixFieldInfo = "matrix"
    type AttrOrigin AudioDownmixMetaMatrixFieldInfo = AudioDownmixMeta
    attrGet _ = getAudioDownmixMetaMatrix
    attrSet _ = setAudioDownmixMetaMatrix
    attrConstruct = undefined
    attrClear _ = undefined

audioDownmixMeta_matrix :: AttrLabelProxy "matrix"
audioDownmixMeta_matrix = AttrLabelProxy



instance O.HasAttributeList AudioDownmixMeta
type instance O.AttributeList AudioDownmixMeta = AudioDownmixMetaAttributeList
type AudioDownmixMetaAttributeList = ('[ '("meta", AudioDownmixMetaMetaFieldInfo), '("fromPosition", AudioDownmixMetaFromPositionFieldInfo), '("toPosition", AudioDownmixMetaToPositionFieldInfo), '("fromChannels", AudioDownmixMetaFromChannelsFieldInfo), '("toChannels", AudioDownmixMetaToChannelsFieldInfo), '("matrix", AudioDownmixMetaMatrixFieldInfo)] :: [(Symbol, *)])

-- method AudioDownmixMeta::get_info
-- method type : MemberFunction
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gst", name = "MetaInfo"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_audio_downmix_meta_get_info" gst_audio_downmix_meta_get_info :: 
    IO (Ptr Gst.MetaInfo.MetaInfo)

{- |
/No description available in the introspection data./
-}
audioDownmixMetaGetInfo ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m Gst.MetaInfo.MetaInfo
audioDownmixMetaGetInfo  = liftIO $ do
    result <- gst_audio_downmix_meta_get_info
    checkUnexpectedReturnNULL "audioDownmixMetaGetInfo" result
    result' <- (newPtr Gst.MetaInfo.MetaInfo) result
    return result'

type family ResolveAudioDownmixMetaMethod (t :: Symbol) (o :: *) :: * where
    ResolveAudioDownmixMetaMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveAudioDownmixMetaMethod t AudioDownmixMeta, O.MethodInfo info AudioDownmixMeta p) => O.IsLabelProxy t (AudioDownmixMeta -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveAudioDownmixMetaMethod t AudioDownmixMeta, O.MethodInfo info AudioDownmixMeta p) => O.IsLabel t (AudioDownmixMeta -> p) where
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif