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

The structure containing the format specification of the ringbuffer.
-}

module GI.GstAudio.Structs.AudioRingBufferSpec
    ( 

-- * Exported types
    AudioRingBufferSpec(..)                 ,
    newZeroAudioRingBufferSpec              ,
    noAudioRingBufferSpec                   ,


 -- * Properties
-- ** bufferTime #attr:bufferTime#
    audioRingBufferSpec_bufferTime          ,
    getAudioRingBufferSpecBufferTime        ,
    setAudioRingBufferSpecBufferTime        ,


-- ** caps #attr:caps#
    audioRingBufferSpec_caps                ,
    clearAudioRingBufferSpecCaps            ,
    getAudioRingBufferSpecCaps              ,
    setAudioRingBufferSpecCaps              ,


-- ** info #attr:info#
    audioRingBufferSpec_info                ,
    getAudioRingBufferSpecInfo              ,


-- ** latencyTime #attr:latencyTime#
    audioRingBufferSpec_latencyTime         ,
    getAudioRingBufferSpecLatencyTime       ,
    setAudioRingBufferSpecLatencyTime       ,


-- ** seglatency #attr:seglatency#
    audioRingBufferSpec_seglatency          ,
    getAudioRingBufferSpecSeglatency        ,
    setAudioRingBufferSpecSeglatency        ,


-- ** segsize #attr:segsize#
    audioRingBufferSpec_segsize             ,
    getAudioRingBufferSpecSegsize           ,
    setAudioRingBufferSpecSegsize           ,


-- ** segtotal #attr:segtotal#
    audioRingBufferSpec_segtotal            ,
    getAudioRingBufferSpecSegtotal          ,
    setAudioRingBufferSpecSegtotal          ,


-- ** type #attr:type#
    audioRingBufferSpec_type                ,
    getAudioRingBufferSpecType              ,
    setAudioRingBufferSpecType              ,




    ) 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.Caps as Gst.Caps
import {-# SOURCE #-} qualified GI.GstAudio.Enums as GstAudio.Enums
import {-# SOURCE #-} qualified GI.GstAudio.Structs.AudioInfo as GstAudio.AudioInfo

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

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

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


noAudioRingBufferSpec :: Maybe AudioRingBufferSpec
noAudioRingBufferSpec = Nothing

getAudioRingBufferSpecCaps :: MonadIO m => AudioRingBufferSpec -> m (Maybe Gst.Caps.Caps)
getAudioRingBufferSpecCaps s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 0) :: IO (Ptr Gst.Caps.Caps)
    result <- SP.convertIfNonNull val $ \val' -> do
        val'' <- (newBoxed Gst.Caps.Caps) val'
        return val''
    return result

setAudioRingBufferSpecCaps :: MonadIO m => AudioRingBufferSpec -> Ptr Gst.Caps.Caps -> m ()
setAudioRingBufferSpecCaps s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 0) (val :: Ptr Gst.Caps.Caps)

clearAudioRingBufferSpecCaps :: MonadIO m => AudioRingBufferSpec -> m ()
clearAudioRingBufferSpecCaps s = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 0) (FP.nullPtr :: Ptr Gst.Caps.Caps)

data AudioRingBufferSpecCapsFieldInfo
instance AttrInfo AudioRingBufferSpecCapsFieldInfo where
    type AttrAllowedOps AudioRingBufferSpecCapsFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint AudioRingBufferSpecCapsFieldInfo = (~) (Ptr Gst.Caps.Caps)
    type AttrBaseTypeConstraint AudioRingBufferSpecCapsFieldInfo = (~) AudioRingBufferSpec
    type AttrGetType AudioRingBufferSpecCapsFieldInfo = Maybe Gst.Caps.Caps
    type AttrLabel AudioRingBufferSpecCapsFieldInfo = "caps"
    type AttrOrigin AudioRingBufferSpecCapsFieldInfo = AudioRingBufferSpec
    attrGet _ = getAudioRingBufferSpecCaps
    attrSet _ = setAudioRingBufferSpecCaps
    attrConstruct = undefined
    attrClear _ = clearAudioRingBufferSpecCaps

audioRingBufferSpec_caps :: AttrLabelProxy "caps"
audioRingBufferSpec_caps = AttrLabelProxy


getAudioRingBufferSpecType :: MonadIO m => AudioRingBufferSpec -> m GstAudio.Enums.AudioRingBufferFormatType
getAudioRingBufferSpecType s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 8) :: IO CUInt
    let val' = (toEnum . fromIntegral) val
    return val'

setAudioRingBufferSpecType :: MonadIO m => AudioRingBufferSpec -> GstAudio.Enums.AudioRingBufferFormatType -> m ()
setAudioRingBufferSpecType s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = (fromIntegral . fromEnum) val
    poke (ptr `plusPtr` 8) (val' :: CUInt)

data AudioRingBufferSpecTypeFieldInfo
instance AttrInfo AudioRingBufferSpecTypeFieldInfo where
    type AttrAllowedOps AudioRingBufferSpecTypeFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioRingBufferSpecTypeFieldInfo = (~) GstAudio.Enums.AudioRingBufferFormatType
    type AttrBaseTypeConstraint AudioRingBufferSpecTypeFieldInfo = (~) AudioRingBufferSpec
    type AttrGetType AudioRingBufferSpecTypeFieldInfo = GstAudio.Enums.AudioRingBufferFormatType
    type AttrLabel AudioRingBufferSpecTypeFieldInfo = "type"
    type AttrOrigin AudioRingBufferSpecTypeFieldInfo = AudioRingBufferSpec
    attrGet _ = getAudioRingBufferSpecType
    attrSet _ = setAudioRingBufferSpecType
    attrConstruct = undefined
    attrClear _ = undefined

audioRingBufferSpec_type :: AttrLabelProxy "type"
audioRingBufferSpec_type = AttrLabelProxy


getAudioRingBufferSpecInfo :: MonadIO m => AudioRingBufferSpec -> m GstAudio.AudioInfo.AudioInfo
getAudioRingBufferSpecInfo s = liftIO $ withManagedPtr s $ \ptr -> do
    let val = ptr `plusPtr` 16 :: (Ptr GstAudio.AudioInfo.AudioInfo)
    val' <- (newBoxed GstAudio.AudioInfo.AudioInfo) val
    return val'

data AudioRingBufferSpecInfoFieldInfo
instance AttrInfo AudioRingBufferSpecInfoFieldInfo where
    type AttrAllowedOps AudioRingBufferSpecInfoFieldInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint AudioRingBufferSpecInfoFieldInfo = (~) (Ptr GstAudio.AudioInfo.AudioInfo)
    type AttrBaseTypeConstraint AudioRingBufferSpecInfoFieldInfo = (~) AudioRingBufferSpec
    type AttrGetType AudioRingBufferSpecInfoFieldInfo = GstAudio.AudioInfo.AudioInfo
    type AttrLabel AudioRingBufferSpecInfoFieldInfo = "info"
    type AttrOrigin AudioRingBufferSpecInfoFieldInfo = AudioRingBufferSpec
    attrGet _ = getAudioRingBufferSpecInfo
    attrSet _ = undefined
    attrConstruct = undefined
    attrClear _ = undefined

audioRingBufferSpec_info :: AttrLabelProxy "info"
audioRingBufferSpec_info = AttrLabelProxy


getAudioRingBufferSpecLatencyTime :: MonadIO m => AudioRingBufferSpec -> m Word64
getAudioRingBufferSpecLatencyTime s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 336) :: IO Word64
    return val

setAudioRingBufferSpecLatencyTime :: MonadIO m => AudioRingBufferSpec -> Word64 -> m ()
setAudioRingBufferSpecLatencyTime s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 336) (val :: Word64)

data AudioRingBufferSpecLatencyTimeFieldInfo
instance AttrInfo AudioRingBufferSpecLatencyTimeFieldInfo where
    type AttrAllowedOps AudioRingBufferSpecLatencyTimeFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioRingBufferSpecLatencyTimeFieldInfo = (~) Word64
    type AttrBaseTypeConstraint AudioRingBufferSpecLatencyTimeFieldInfo = (~) AudioRingBufferSpec
    type AttrGetType AudioRingBufferSpecLatencyTimeFieldInfo = Word64
    type AttrLabel AudioRingBufferSpecLatencyTimeFieldInfo = "latency_time"
    type AttrOrigin AudioRingBufferSpecLatencyTimeFieldInfo = AudioRingBufferSpec
    attrGet _ = getAudioRingBufferSpecLatencyTime
    attrSet _ = setAudioRingBufferSpecLatencyTime
    attrConstruct = undefined
    attrClear _ = undefined

audioRingBufferSpec_latencyTime :: AttrLabelProxy "latencyTime"
audioRingBufferSpec_latencyTime = AttrLabelProxy


getAudioRingBufferSpecBufferTime :: MonadIO m => AudioRingBufferSpec -> m Word64
getAudioRingBufferSpecBufferTime s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 344) :: IO Word64
    return val

setAudioRingBufferSpecBufferTime :: MonadIO m => AudioRingBufferSpec -> Word64 -> m ()
setAudioRingBufferSpecBufferTime s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 344) (val :: Word64)

data AudioRingBufferSpecBufferTimeFieldInfo
instance AttrInfo AudioRingBufferSpecBufferTimeFieldInfo where
    type AttrAllowedOps AudioRingBufferSpecBufferTimeFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioRingBufferSpecBufferTimeFieldInfo = (~) Word64
    type AttrBaseTypeConstraint AudioRingBufferSpecBufferTimeFieldInfo = (~) AudioRingBufferSpec
    type AttrGetType AudioRingBufferSpecBufferTimeFieldInfo = Word64
    type AttrLabel AudioRingBufferSpecBufferTimeFieldInfo = "buffer_time"
    type AttrOrigin AudioRingBufferSpecBufferTimeFieldInfo = AudioRingBufferSpec
    attrGet _ = getAudioRingBufferSpecBufferTime
    attrSet _ = setAudioRingBufferSpecBufferTime
    attrConstruct = undefined
    attrClear _ = undefined

audioRingBufferSpec_bufferTime :: AttrLabelProxy "bufferTime"
audioRingBufferSpec_bufferTime = AttrLabelProxy


getAudioRingBufferSpecSegsize :: MonadIO m => AudioRingBufferSpec -> m Int32
getAudioRingBufferSpecSegsize s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 352) :: IO Int32
    return val

setAudioRingBufferSpecSegsize :: MonadIO m => AudioRingBufferSpec -> Int32 -> m ()
setAudioRingBufferSpecSegsize s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 352) (val :: Int32)

data AudioRingBufferSpecSegsizeFieldInfo
instance AttrInfo AudioRingBufferSpecSegsizeFieldInfo where
    type AttrAllowedOps AudioRingBufferSpecSegsizeFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioRingBufferSpecSegsizeFieldInfo = (~) Int32
    type AttrBaseTypeConstraint AudioRingBufferSpecSegsizeFieldInfo = (~) AudioRingBufferSpec
    type AttrGetType AudioRingBufferSpecSegsizeFieldInfo = Int32
    type AttrLabel AudioRingBufferSpecSegsizeFieldInfo = "segsize"
    type AttrOrigin AudioRingBufferSpecSegsizeFieldInfo = AudioRingBufferSpec
    attrGet _ = getAudioRingBufferSpecSegsize
    attrSet _ = setAudioRingBufferSpecSegsize
    attrConstruct = undefined
    attrClear _ = undefined

audioRingBufferSpec_segsize :: AttrLabelProxy "segsize"
audioRingBufferSpec_segsize = AttrLabelProxy


getAudioRingBufferSpecSegtotal :: MonadIO m => AudioRingBufferSpec -> m Int32
getAudioRingBufferSpecSegtotal s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 356) :: IO Int32
    return val

setAudioRingBufferSpecSegtotal :: MonadIO m => AudioRingBufferSpec -> Int32 -> m ()
setAudioRingBufferSpecSegtotal s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 356) (val :: Int32)

data AudioRingBufferSpecSegtotalFieldInfo
instance AttrInfo AudioRingBufferSpecSegtotalFieldInfo where
    type AttrAllowedOps AudioRingBufferSpecSegtotalFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioRingBufferSpecSegtotalFieldInfo = (~) Int32
    type AttrBaseTypeConstraint AudioRingBufferSpecSegtotalFieldInfo = (~) AudioRingBufferSpec
    type AttrGetType AudioRingBufferSpecSegtotalFieldInfo = Int32
    type AttrLabel AudioRingBufferSpecSegtotalFieldInfo = "segtotal"
    type AttrOrigin AudioRingBufferSpecSegtotalFieldInfo = AudioRingBufferSpec
    attrGet _ = getAudioRingBufferSpecSegtotal
    attrSet _ = setAudioRingBufferSpecSegtotal
    attrConstruct = undefined
    attrClear _ = undefined

audioRingBufferSpec_segtotal :: AttrLabelProxy "segtotal"
audioRingBufferSpec_segtotal = AttrLabelProxy


getAudioRingBufferSpecSeglatency :: MonadIO m => AudioRingBufferSpec -> m Int32
getAudioRingBufferSpecSeglatency s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 360) :: IO Int32
    return val

setAudioRingBufferSpecSeglatency :: MonadIO m => AudioRingBufferSpec -> Int32 -> m ()
setAudioRingBufferSpecSeglatency s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 360) (val :: Int32)

data AudioRingBufferSpecSeglatencyFieldInfo
instance AttrInfo AudioRingBufferSpecSeglatencyFieldInfo where
    type AttrAllowedOps AudioRingBufferSpecSeglatencyFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint AudioRingBufferSpecSeglatencyFieldInfo = (~) Int32
    type AttrBaseTypeConstraint AudioRingBufferSpecSeglatencyFieldInfo = (~) AudioRingBufferSpec
    type AttrGetType AudioRingBufferSpecSeglatencyFieldInfo = Int32
    type AttrLabel AudioRingBufferSpecSeglatencyFieldInfo = "seglatency"
    type AttrOrigin AudioRingBufferSpecSeglatencyFieldInfo = AudioRingBufferSpec
    attrGet _ = getAudioRingBufferSpecSeglatency
    attrSet _ = setAudioRingBufferSpecSeglatency
    attrConstruct = undefined
    attrClear _ = undefined

audioRingBufferSpec_seglatency :: AttrLabelProxy "seglatency"
audioRingBufferSpec_seglatency = AttrLabelProxy



instance O.HasAttributeList AudioRingBufferSpec
type instance O.AttributeList AudioRingBufferSpec = AudioRingBufferSpecAttributeList
type AudioRingBufferSpecAttributeList = ('[ '("caps", AudioRingBufferSpecCapsFieldInfo), '("type", AudioRingBufferSpecTypeFieldInfo), '("info", AudioRingBufferSpecInfoFieldInfo), '("latencyTime", AudioRingBufferSpecLatencyTimeFieldInfo), '("bufferTime", AudioRingBufferSpecBufferTimeFieldInfo), '("segsize", AudioRingBufferSpecSegsizeFieldInfo), '("segtotal", AudioRingBufferSpecSegtotalFieldInfo), '("seglatency", AudioRingBufferSpecSeglatencyFieldInfo)] :: [(Symbol, *)])

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

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

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