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

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.

/Since: 1.8/
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.GstAudio.Structs.AudioClippingMeta
    (

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


 -- * Methods
-- ** getInfo #method:getInfo#

    audioClippingMetaGetInfo                ,




 -- * Properties
-- ** end #attr:end#
{- | Amount of  to clip from end of buffer
-}
#if ENABLE_OVERLOADING
    audioClippingMeta_end                   ,
#endif
    getAudioClippingMetaEnd                 ,
    setAudioClippingMetaEnd                 ,


-- ** format #attr:format#
{- | GstFormat of /@start@/ and /@stop@/, GST_FORMAT_DEFAULT is samples
-}
#if ENABLE_OVERLOADING
    audioClippingMeta_format                ,
#endif
    getAudioClippingMetaFormat              ,
    setAudioClippingMetaFormat              ,


-- ** meta #attr:meta#
{- | parent 'GI.Gst.Structs.Meta.Meta'
-}
#if ENABLE_OVERLOADING
    audioClippingMeta_meta                  ,
#endif
    getAudioClippingMetaMeta                ,


-- ** start #attr:start#
{- | Amount of audio to clip from start of buffer
-}
#if ENABLE_OVERLOADING
    audioClippingMeta_start                 ,
#endif
    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.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.GI.Base.Properties as B.Properties
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 GHC.OverloadedLabels as OL

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

-- | Memory-managed wrapper type.
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


-- | A convenience alias for `Nothing` :: `Maybe` `AudioClippingMeta`.
noAudioClippingMeta :: Maybe AudioClippingMeta
noAudioClippingMeta = Nothing

{- |
Get the value of the “@meta@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' audioClippingMeta #meta
@
-}
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'

#if ENABLE_OVERLOADING
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

#endif


{- |
Get the value of the “@format@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' audioClippingMeta #format
@
-}
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'

{- |
Set the value of the “@format@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' audioClippingMeta [ #format 'Data.GI.Base.Attributes.:=' value ]
@
-}
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)

#if ENABLE_OVERLOADING
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

#endif


{- |
Get the value of the “@start@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' audioClippingMeta #start
@
-}
getAudioClippingMetaStart :: MonadIO m => AudioClippingMeta -> m Word64
getAudioClippingMetaStart s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 24) :: IO Word64
    return val

{- |
Set the value of the “@start@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' audioClippingMeta [ #start 'Data.GI.Base.Attributes.:=' value ]
@
-}
setAudioClippingMetaStart :: MonadIO m => AudioClippingMeta -> Word64 -> m ()
setAudioClippingMetaStart s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 24) (val :: Word64)

#if ENABLE_OVERLOADING
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

#endif


{- |
Get the value of the “@end@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' audioClippingMeta #end
@
-}
getAudioClippingMetaEnd :: MonadIO m => AudioClippingMeta -> m Word64
getAudioClippingMetaEnd s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 32) :: IO Word64
    return val

{- |
Set the value of the “@end@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' audioClippingMeta [ #end 'Data.GI.Base.Attributes.:=' value ]
@
-}
setAudioClippingMetaEnd :: MonadIO m => AudioClippingMeta -> Word64 -> m ()
setAudioClippingMetaEnd s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 32) (val :: Word64)

#if ENABLE_OVERLOADING
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

#endif



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

-- 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'

#if ENABLE_OVERLOADING
#endif

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

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

#endif