{- |
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 how much audio has to be clipped from
the start or end of a buffer. This is used for compressed formats, where
the first frame usually has some additional samples due to encoder and
decoder delays, and the last frame usually has some additional samples to
be able to fill the complete last frame.

This is used to ensure that decoded data in the end has the same amount of
samples, and multiply decoded streams can be gaplessly concatenated.

Note: If clipping of the start is done by adjusting the segment, this meta
has to be dropped from buffers as otherwise clipping could happen twice.
-}

module GI.GstAudio.Structs.AudioClippingMeta
    ( 

-- * Exported types
    AudioClippingMeta(..)                   ,
    newZeroAudioClippingMeta                ,
    noAudioClippingMeta                     ,


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




 -- * Properties
-- ** end #attr:end#
    audioClippingMeta_end                   ,
    getAudioClippingMetaEnd                 ,
    setAudioClippingMetaEnd                 ,


-- ** format #attr:format#
    audioClippingMeta_format                ,
    getAudioClippingMetaFormat              ,
    setAudioClippingMetaFormat              ,


-- ** meta #attr:meta#
    audioClippingMeta_meta                  ,
    getAudioClippingMetaMeta                ,


-- ** start #attr:start#
    audioClippingMeta_start                 ,
    getAudioClippingMetaStart               ,
    setAudioClippingMetaStart               ,




    ) 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.Enums as Gst.Enums
import qualified GI.Gst.Structs.Meta as Gst.Meta
import qualified GI.Gst.Structs.MetaInfo as Gst.MetaInfo

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

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

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


noAudioClippingMeta :: Maybe AudioClippingMeta
noAudioClippingMeta = Nothing

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

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

audioClippingMeta_meta :: AttrLabelProxy "meta"
audioClippingMeta_meta = AttrLabelProxy


getAudioClippingMetaFormat :: MonadIO m => AudioClippingMeta -> m Gst.Enums.Format
getAudioClippingMetaFormat s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 16) :: IO CUInt
    let val' = (toEnum . fromIntegral) val
    return val'

setAudioClippingMetaFormat :: MonadIO m => AudioClippingMeta -> Gst.Enums.Format -> m ()
setAudioClippingMetaFormat s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = (fromIntegral . fromEnum) val
    poke (ptr `plusPtr` 16) (val' :: CUInt)

data AudioClippingMetaFormatFieldInfo
instance AttrInfo AudioClippingMetaFormatFieldInfo where
    type AttrAllowedOps AudioClippingMetaFormatFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioClippingMetaFormatFieldInfo = (~) Gst.Enums.Format
    type AttrBaseTypeConstraint AudioClippingMetaFormatFieldInfo = (~) AudioClippingMeta
    type AttrGetType AudioClippingMetaFormatFieldInfo = Gst.Enums.Format
    type AttrLabel AudioClippingMetaFormatFieldInfo = "format"
    type AttrOrigin AudioClippingMetaFormatFieldInfo = AudioClippingMeta
    attrGet _ = getAudioClippingMetaFormat
    attrSet _ = setAudioClippingMetaFormat
    attrConstruct = undefined
    attrClear _ = undefined

audioClippingMeta_format :: AttrLabelProxy "format"
audioClippingMeta_format = AttrLabelProxy


getAudioClippingMetaStart :: MonadIO m => AudioClippingMeta -> m Word64
getAudioClippingMetaStart s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 24) :: IO Word64
    return val

setAudioClippingMetaStart :: MonadIO m => AudioClippingMeta -> Word64 -> m ()
setAudioClippingMetaStart s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 24) (val :: Word64)

data AudioClippingMetaStartFieldInfo
instance AttrInfo AudioClippingMetaStartFieldInfo where
    type AttrAllowedOps AudioClippingMetaStartFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioClippingMetaStartFieldInfo = (~) Word64
    type AttrBaseTypeConstraint AudioClippingMetaStartFieldInfo = (~) AudioClippingMeta
    type AttrGetType AudioClippingMetaStartFieldInfo = Word64
    type AttrLabel AudioClippingMetaStartFieldInfo = "start"
    type AttrOrigin AudioClippingMetaStartFieldInfo = AudioClippingMeta
    attrGet _ = getAudioClippingMetaStart
    attrSet _ = setAudioClippingMetaStart
    attrConstruct = undefined
    attrClear _ = undefined

audioClippingMeta_start :: AttrLabelProxy "start"
audioClippingMeta_start = AttrLabelProxy


getAudioClippingMetaEnd :: MonadIO m => AudioClippingMeta -> m Word64
getAudioClippingMetaEnd s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 32) :: IO Word64
    return val

setAudioClippingMetaEnd :: MonadIO m => AudioClippingMeta -> Word64 -> m ()
setAudioClippingMetaEnd s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 32) (val :: Word64)

data AudioClippingMetaEndFieldInfo
instance AttrInfo AudioClippingMetaEndFieldInfo where
    type AttrAllowedOps AudioClippingMetaEndFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioClippingMetaEndFieldInfo = (~) Word64
    type AttrBaseTypeConstraint AudioClippingMetaEndFieldInfo = (~) AudioClippingMeta
    type AttrGetType AudioClippingMetaEndFieldInfo = Word64
    type AttrLabel AudioClippingMetaEndFieldInfo = "end"
    type AttrOrigin AudioClippingMetaEndFieldInfo = AudioClippingMeta
    attrGet _ = getAudioClippingMetaEnd
    attrSet _ = setAudioClippingMetaEnd
    attrConstruct = undefined
    attrClear _ = undefined

audioClippingMeta_end :: AttrLabelProxy "end"
audioClippingMeta_end = AttrLabelProxy



instance O.HasAttributeList AudioClippingMeta
type instance O.AttributeList AudioClippingMeta = AudioClippingMetaAttributeList
type AudioClippingMetaAttributeList = ('[ '("meta", AudioClippingMetaMetaFieldInfo), '("format", AudioClippingMetaFormatFieldInfo), '("start", AudioClippingMetaStartFieldInfo), '("end", AudioClippingMetaEndFieldInfo)] :: [(Symbol, *)])

-- method AudioClippingMeta::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_clipping_meta_get_info" gst_audio_clipping_meta_get_info :: 
    IO (Ptr Gst.MetaInfo.MetaInfo)

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

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

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

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