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

This class is mostly useful for elements that cannot do
random access, or at least very slowly. The source usually
prefers to push out a fixed size buffer.

Subclasses usually operate in a format that is different from the
default GST_FORMAT_BYTES format of 'GI.GstBase.Objects.BaseSrc.BaseSrc'.

Classes extending this base class will usually be scheduled
in a push based mode. If the peer accepts to operate without
offsets and within the limits of the allowed block size, this
class can operate in getrange based mode automatically. To make
this possible, the subclass should implement and override the
SCHEDULING query.

The subclass should extend the methods from the baseclass in
addition to the ::create method.

Seeking, flushing, scheduling and sync is all handled by this
base class.
-}

module GI.GstBase.Objects.PushSrc
    ( 

-- * Exported types
    PushSrc(..)                             ,
    IsPushSrc                               ,
    toPushSrc                               ,
    noPushSrc                               ,


    ) 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.GObject.Objects.Object as GObject.Object
import qualified GI.Gst.Objects.Element as Gst.Element
import qualified GI.Gst.Objects.Object as Gst.Object
import {-# SOURCE #-} qualified GI.GstBase.Objects.BaseSrc as GstBase.BaseSrc

newtype PushSrc = PushSrc (ManagedPtr PushSrc)
foreign import ccall "gst_push_src_get_type"
    c_gst_push_src_get_type :: IO GType

instance GObject PushSrc where
    gobjectType _ = c_gst_push_src_get_type
    

class GObject o => IsPushSrc o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError PushSrc a) =>
    IsPushSrc a
#endif
instance IsPushSrc PushSrc
instance GstBase.BaseSrc.IsBaseSrc PushSrc
instance Gst.Element.IsElement PushSrc
instance Gst.Object.IsObject PushSrc
instance GObject.Object.IsObject PushSrc

toPushSrc :: (MonadIO m, IsPushSrc o) => o -> m PushSrc
toPushSrc = liftIO . unsafeCastTo PushSrc

noPushSrc :: Maybe PushSrc
noPushSrc = Nothing

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
type family ResolvePushSrcMethod (t :: Symbol) (o :: *) :: * where
    ResolvePushSrcMethod "abortState" o = Gst.Element.ElementAbortStateMethodInfo
    ResolvePushSrcMethod "addControlBinding" o = Gst.Object.ObjectAddControlBindingMethodInfo
    ResolvePushSrcMethod "addPad" o = Gst.Element.ElementAddPadMethodInfo
    ResolvePushSrcMethod "addPropertyDeepNotifyWatch" o = Gst.Element.ElementAddPropertyDeepNotifyWatchMethodInfo
    ResolvePushSrcMethod "addPropertyNotifyWatch" o = Gst.Element.ElementAddPropertyNotifyWatchMethodInfo
    ResolvePushSrcMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolvePushSrcMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolvePushSrcMethod "callAsync" o = Gst.Element.ElementCallAsyncMethodInfo
    ResolvePushSrcMethod "changeState" o = Gst.Element.ElementChangeStateMethodInfo
    ResolvePushSrcMethod "continueState" o = Gst.Element.ElementContinueStateMethodInfo
    ResolvePushSrcMethod "createAllPads" o = Gst.Element.ElementCreateAllPadsMethodInfo
    ResolvePushSrcMethod "defaultError" o = Gst.Object.ObjectDefaultErrorMethodInfo
    ResolvePushSrcMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolvePushSrcMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolvePushSrcMethod "hasActiveControlBindings" o = Gst.Object.ObjectHasActiveControlBindingsMethodInfo
    ResolvePushSrcMethod "hasAncestor" o = Gst.Object.ObjectHasAncestorMethodInfo
    ResolvePushSrcMethod "hasAsAncestor" o = Gst.Object.ObjectHasAsAncestorMethodInfo
    ResolvePushSrcMethod "hasAsParent" o = Gst.Object.ObjectHasAsParentMethodInfo
    ResolvePushSrcMethod "isAsync" o = GstBase.BaseSrc.BaseSrcIsAsyncMethodInfo
    ResolvePushSrcMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolvePushSrcMethod "isLive" o = GstBase.BaseSrc.BaseSrcIsLiveMethodInfo
    ResolvePushSrcMethod "isLockedState" o = Gst.Element.ElementIsLockedStateMethodInfo
    ResolvePushSrcMethod "iteratePads" o = Gst.Element.ElementIteratePadsMethodInfo
    ResolvePushSrcMethod "iterateSinkPads" o = Gst.Element.ElementIterateSinkPadsMethodInfo
    ResolvePushSrcMethod "iterateSrcPads" o = Gst.Element.ElementIterateSrcPadsMethodInfo
    ResolvePushSrcMethod "link" o = Gst.Element.ElementLinkMethodInfo
    ResolvePushSrcMethod "linkFiltered" o = Gst.Element.ElementLinkFilteredMethodInfo
    ResolvePushSrcMethod "linkPads" o = Gst.Element.ElementLinkPadsMethodInfo
    ResolvePushSrcMethod "linkPadsFiltered" o = Gst.Element.ElementLinkPadsFilteredMethodInfo
    ResolvePushSrcMethod "linkPadsFull" o = Gst.Element.ElementLinkPadsFullMethodInfo
    ResolvePushSrcMethod "lostState" o = Gst.Element.ElementLostStateMethodInfo
    ResolvePushSrcMethod "messageFull" o = Gst.Element.ElementMessageFullMethodInfo
    ResolvePushSrcMethod "messageFullWithDetails" o = Gst.Element.ElementMessageFullWithDetailsMethodInfo
    ResolvePushSrcMethod "newSeamlessSegment" o = GstBase.BaseSrc.BaseSrcNewSeamlessSegmentMethodInfo
    ResolvePushSrcMethod "noMorePads" o = Gst.Element.ElementNoMorePadsMethodInfo
    ResolvePushSrcMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolvePushSrcMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolvePushSrcMethod "postMessage" o = Gst.Element.ElementPostMessageMethodInfo
    ResolvePushSrcMethod "provideClock" o = Gst.Element.ElementProvideClockMethodInfo
    ResolvePushSrcMethod "query" o = Gst.Element.ElementQueryMethodInfo
    ResolvePushSrcMethod "queryConvert" o = Gst.Element.ElementQueryConvertMethodInfo
    ResolvePushSrcMethod "queryDuration" o = Gst.Element.ElementQueryDurationMethodInfo
    ResolvePushSrcMethod "queryLatency" o = GstBase.BaseSrc.BaseSrcQueryLatencyMethodInfo
    ResolvePushSrcMethod "queryPosition" o = Gst.Element.ElementQueryPositionMethodInfo
    ResolvePushSrcMethod "ref" o = Gst.Object.ObjectRefMethodInfo
    ResolvePushSrcMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolvePushSrcMethod "releaseRequestPad" o = Gst.Element.ElementReleaseRequestPadMethodInfo
    ResolvePushSrcMethod "removeControlBinding" o = Gst.Object.ObjectRemoveControlBindingMethodInfo
    ResolvePushSrcMethod "removePad" o = Gst.Element.ElementRemovePadMethodInfo
    ResolvePushSrcMethod "removePropertyNotifyWatch" o = Gst.Element.ElementRemovePropertyNotifyWatchMethodInfo
    ResolvePushSrcMethod "replaceData" o = GObject.Object.ObjectReplaceDataMethodInfo
    ResolvePushSrcMethod "replaceQdata" o = GObject.Object.ObjectReplaceQdataMethodInfo
    ResolvePushSrcMethod "requestPad" o = Gst.Element.ElementRequestPadMethodInfo
    ResolvePushSrcMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolvePushSrcMethod "seek" o = Gst.Element.ElementSeekMethodInfo
    ResolvePushSrcMethod "seekSimple" o = Gst.Element.ElementSeekSimpleMethodInfo
    ResolvePushSrcMethod "sendEvent" o = Gst.Element.ElementSendEventMethodInfo
    ResolvePushSrcMethod "startComplete" o = GstBase.BaseSrc.BaseSrcStartCompleteMethodInfo
    ResolvePushSrcMethod "startWait" o = GstBase.BaseSrc.BaseSrcStartWaitMethodInfo
    ResolvePushSrcMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolvePushSrcMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolvePushSrcMethod "suggestNextSync" o = Gst.Object.ObjectSuggestNextSyncMethodInfo
    ResolvePushSrcMethod "syncStateWithParent" o = Gst.Element.ElementSyncStateWithParentMethodInfo
    ResolvePushSrcMethod "syncValues" o = Gst.Object.ObjectSyncValuesMethodInfo
    ResolvePushSrcMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolvePushSrcMethod "unlink" o = Gst.Element.ElementUnlinkMethodInfo
    ResolvePushSrcMethod "unlinkPads" o = Gst.Element.ElementUnlinkPadsMethodInfo
    ResolvePushSrcMethod "unparent" o = Gst.Object.ObjectUnparentMethodInfo
    ResolvePushSrcMethod "unref" o = Gst.Object.ObjectUnrefMethodInfo
    ResolvePushSrcMethod "waitPlaying" o = GstBase.BaseSrc.BaseSrcWaitPlayingMethodInfo
    ResolvePushSrcMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolvePushSrcMethod "getAllocator" o = GstBase.BaseSrc.BaseSrcGetAllocatorMethodInfo
    ResolvePushSrcMethod "getBaseTime" o = Gst.Element.ElementGetBaseTimeMethodInfo
    ResolvePushSrcMethod "getBlocksize" o = GstBase.BaseSrc.BaseSrcGetBlocksizeMethodInfo
    ResolvePushSrcMethod "getBufferPool" o = GstBase.BaseSrc.BaseSrcGetBufferPoolMethodInfo
    ResolvePushSrcMethod "getBus" o = Gst.Element.ElementGetBusMethodInfo
    ResolvePushSrcMethod "getClock" o = Gst.Element.ElementGetClockMethodInfo
    ResolvePushSrcMethod "getCompatiblePad" o = Gst.Element.ElementGetCompatiblePadMethodInfo
    ResolvePushSrcMethod "getCompatiblePadTemplate" o = Gst.Element.ElementGetCompatiblePadTemplateMethodInfo
    ResolvePushSrcMethod "getContext" o = Gst.Element.ElementGetContextMethodInfo
    ResolvePushSrcMethod "getContextUnlocked" o = Gst.Element.ElementGetContextUnlockedMethodInfo
    ResolvePushSrcMethod "getContexts" o = Gst.Element.ElementGetContextsMethodInfo
    ResolvePushSrcMethod "getControlBinding" o = Gst.Object.ObjectGetControlBindingMethodInfo
    ResolvePushSrcMethod "getControlRate" o = Gst.Object.ObjectGetControlRateMethodInfo
    ResolvePushSrcMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolvePushSrcMethod "getDoTimestamp" o = GstBase.BaseSrc.BaseSrcGetDoTimestampMethodInfo
    ResolvePushSrcMethod "getFactory" o = Gst.Element.ElementGetFactoryMethodInfo
    ResolvePushSrcMethod "getGValueArray" o = Gst.Object.ObjectGetGValueArrayMethodInfo
    ResolvePushSrcMethod "getName" o = Gst.Object.ObjectGetNameMethodInfo
    ResolvePushSrcMethod "getParent" o = Gst.Object.ObjectGetParentMethodInfo
    ResolvePushSrcMethod "getPathString" o = Gst.Object.ObjectGetPathStringMethodInfo
    ResolvePushSrcMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolvePushSrcMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolvePushSrcMethod "getRequestPad" o = Gst.Element.ElementGetRequestPadMethodInfo
    ResolvePushSrcMethod "getStartTime" o = Gst.Element.ElementGetStartTimeMethodInfo
    ResolvePushSrcMethod "getState" o = Gst.Element.ElementGetStateMethodInfo
    ResolvePushSrcMethod "getStaticPad" o = Gst.Element.ElementGetStaticPadMethodInfo
    ResolvePushSrcMethod "getValue" o = Gst.Object.ObjectGetValueMethodInfo
    ResolvePushSrcMethod "setAsync" o = GstBase.BaseSrc.BaseSrcSetAsyncMethodInfo
    ResolvePushSrcMethod "setAutomaticEos" o = GstBase.BaseSrc.BaseSrcSetAutomaticEosMethodInfo
    ResolvePushSrcMethod "setBaseTime" o = Gst.Element.ElementSetBaseTimeMethodInfo
    ResolvePushSrcMethod "setBlocksize" o = GstBase.BaseSrc.BaseSrcSetBlocksizeMethodInfo
    ResolvePushSrcMethod "setBus" o = Gst.Element.ElementSetBusMethodInfo
    ResolvePushSrcMethod "setCaps" o = GstBase.BaseSrc.BaseSrcSetCapsMethodInfo
    ResolvePushSrcMethod "setClock" o = Gst.Element.ElementSetClockMethodInfo
    ResolvePushSrcMethod "setContext" o = Gst.Element.ElementSetContextMethodInfo
    ResolvePushSrcMethod "setControlBindingDisabled" o = Gst.Object.ObjectSetControlBindingDisabledMethodInfo
    ResolvePushSrcMethod "setControlBindingsDisabled" o = Gst.Object.ObjectSetControlBindingsDisabledMethodInfo
    ResolvePushSrcMethod "setControlRate" o = Gst.Object.ObjectSetControlRateMethodInfo
    ResolvePushSrcMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolvePushSrcMethod "setDoTimestamp" o = GstBase.BaseSrc.BaseSrcSetDoTimestampMethodInfo
    ResolvePushSrcMethod "setDynamicSize" o = GstBase.BaseSrc.BaseSrcSetDynamicSizeMethodInfo
    ResolvePushSrcMethod "setFormat" o = GstBase.BaseSrc.BaseSrcSetFormatMethodInfo
    ResolvePushSrcMethod "setLive" o = GstBase.BaseSrc.BaseSrcSetLiveMethodInfo
    ResolvePushSrcMethod "setLockedState" o = Gst.Element.ElementSetLockedStateMethodInfo
    ResolvePushSrcMethod "setName" o = Gst.Object.ObjectSetNameMethodInfo
    ResolvePushSrcMethod "setParent" o = Gst.Object.ObjectSetParentMethodInfo
    ResolvePushSrcMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolvePushSrcMethod "setStartTime" o = Gst.Element.ElementSetStartTimeMethodInfo
    ResolvePushSrcMethod "setState" o = Gst.Element.ElementSetStateMethodInfo
    ResolvePushSrcMethod l o = O.MethodResolutionFailed l o

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

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolvePushSrcMethod t PushSrc, O.MethodInfo info PushSrc p) => O.IsLabel t (PushSrc -> 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

#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
instance O.HasAttributeList PushSrc
type instance O.AttributeList PushSrc = PushSrcAttributeList
type PushSrcAttributeList = ('[ '("blocksize", GstBase.BaseSrc.BaseSrcBlocksizePropertyInfo), '("doTimestamp", GstBase.BaseSrc.BaseSrcDoTimestampPropertyInfo), '("name", Gst.Object.ObjectNamePropertyInfo), '("numBuffers", GstBase.BaseSrc.BaseSrcNumBuffersPropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo), '("typefind", GstBase.BaseSrc.BaseSrcTypefindPropertyInfo)] :: [(Symbol, *)])
#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
type instance O.SignalList PushSrc = PushSrcSignalList
type PushSrcSignalList = ('[ '("deepNotify", Gst.Object.ObjectDeepNotifySignalInfo), '("noMorePads", Gst.Element.ElementNoMorePadsSignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo), '("padAdded", Gst.Element.ElementPadAddedSignalInfo), '("padRemoved", Gst.Element.ElementPadRemovedSignalInfo)] :: [(Symbol, *)])

#endif