{-# LANGUAGE TypeApplications #-}


-- | Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
-- License    : LGPL-2.1
-- Maintainer : Iñaki García Etxebarria
-- 
-- 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 t'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](#signal:create) method.
-- 
-- Seeking, flushing, scheduling and sync is all handled by this
-- base class.

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

module GI.GstBase.Objects.PushSrc
    ( 

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


 -- * Methods
-- ** Overloaded methods #method:Overloaded methods#

#if defined(ENABLE_OVERLOADING)
    ResolvePushSrcMethod                    ,
#endif




    ) 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.GI.Base.Signals as B.Signals
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.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

-- | Memory-managed wrapper type.
newtype PushSrc = PushSrc (ManagedPtr PushSrc)
    deriving (PushSrc -> PushSrc -> Bool
(PushSrc -> PushSrc -> Bool)
-> (PushSrc -> PushSrc -> Bool) -> Eq PushSrc
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PushSrc -> PushSrc -> Bool
$c/= :: PushSrc -> PushSrc -> Bool
== :: PushSrc -> PushSrc -> Bool
$c== :: PushSrc -> PushSrc -> Bool
Eq)
foreign import ccall "gst_push_src_get_type"
    c_gst_push_src_get_type :: IO GType

instance GObject PushSrc where
    gobjectType :: IO GType
gobjectType = IO GType
c_gst_push_src_get_type
    

-- | Convert 'PushSrc' to and from 'Data.GI.Base.GValue.GValue' with 'Data.GI.Base.GValue.toGValue' and 'Data.GI.Base.GValue.fromGValue'.
instance B.GValue.IsGValue PushSrc where
    toGValue :: PushSrc -> IO GValue
toGValue o :: PushSrc
o = do
        GType
gtype <- IO GType
c_gst_push_src_get_type
        PushSrc -> (Ptr PushSrc -> IO GValue) -> IO GValue
forall a c.
(HasCallStack, ManagedPtrNewtype a) =>
a -> (Ptr a -> IO c) -> IO c
B.ManagedPtr.withManagedPtr PushSrc
o (GType
-> (GValue -> Ptr PushSrc -> IO ()) -> Ptr PushSrc -> IO GValue
forall a. GType -> (GValue -> a -> IO ()) -> a -> IO GValue
B.GValue.buildGValue GType
gtype GValue -> Ptr PushSrc -> IO ()
forall a. GObject a => GValue -> Ptr a -> IO ()
B.GValue.set_object)
        
    fromGValue :: GValue -> IO PushSrc
fromGValue gv :: GValue
gv = do
        Ptr PushSrc
ptr <- GValue -> IO (Ptr PushSrc)
forall b. GObject b => GValue -> IO (Ptr b)
B.GValue.get_object GValue
gv :: IO (Ptr PushSrc)
        (ManagedPtr PushSrc -> PushSrc) -> Ptr PushSrc -> IO PushSrc
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
B.ManagedPtr.newObject ManagedPtr PushSrc -> PushSrc
PushSrc Ptr PushSrc
ptr
        
    

-- | Type class for types which can be safely cast to `PushSrc`, for instance with `toPushSrc`.
class (GObject o, O.IsDescendantOf PushSrc o) => IsPushSrc o
instance (GObject o, O.IsDescendantOf PushSrc o) => IsPushSrc o

instance O.HasParentTypes PushSrc
type instance O.ParentTypes PushSrc = '[GstBase.BaseSrc.BaseSrc, Gst.Element.Element, Gst.Object.Object, GObject.Object.Object]

-- | Cast to `PushSrc`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toPushSrc :: (MonadIO m, IsPushSrc o) => o -> m PushSrc
toPushSrc :: o -> m PushSrc
toPushSrc = IO PushSrc -> m PushSrc
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO PushSrc -> m PushSrc) -> (o -> IO PushSrc) -> o -> m PushSrc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ManagedPtr PushSrc -> PushSrc) -> o -> IO PushSrc
forall o o'.
(HasCallStack, GObject o, GObject o') =>
(ManagedPtr o' -> o') -> o -> IO o'
unsafeCastTo ManagedPtr PushSrc -> PushSrc
PushSrc

-- | A convenience alias for `Nothing` :: `Maybe` `PushSrc`.
noPushSrc :: Maybe PushSrc
noPushSrc :: Maybe PushSrc
noPushSrc = Maybe PushSrc
forall a. Maybe a
Nothing

#if defined(ENABLE_OVERLOADING)
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 "foreachPad" o = Gst.Element.ElementForeachPadMethodInfo
    ResolvePushSrcMethod "foreachSinkPad" o = Gst.Element.ElementForeachSinkPadMethodInfo
    ResolvePushSrcMethod "foreachSrcPad" o = Gst.Element.ElementForeachSrcPadMethodInfo
    ResolvePushSrcMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolvePushSrcMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    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 "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 "submitBufferList" o = GstBase.BaseSrc.BaseSrcSubmitBufferListMethodInfo
    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 "getMetadata" o = Gst.Element.ElementGetMetadataMethodInfo
    ResolvePushSrcMethod "getName" o = Gst.Object.ObjectGetNameMethodInfo
    ResolvePushSrcMethod "getPadTemplate" o = Gst.Element.ElementGetPadTemplateMethodInfo
    ResolvePushSrcMethod "getPadTemplateList" o = Gst.Element.ElementGetPadTemplateListMethodInfo
    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 "setDataFull" o = GObject.Object.ObjectSetDataFullMethodInfo
    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) => OL.IsLabel t (PushSrc -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod @info
#else
    fromLabel _ = O.overloadedMethod @info
#endif

#endif

#if defined(ENABLE_OVERLOADING)
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)
#endif

#if defined(ENABLE_OVERLOADING)
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