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

Provides a base class for adding tags at the beginning or end of a
stream.

== Deriving from GstTagMux

Subclasses have to do the following things:

 * In their base init function, they must add pad templates for the sink
   pad and the source pad to the element class, describing the media type
   they accept and output in the caps of the pad template.
 * In their class init function, they must override the
   GST_TAG_MUX_CLASS(mux_klass)->render_start_tag and\/or
   GST_TAG_MUX_CLASS(mux_klass)->render_end_tag vfuncs and set up a render
   function.
-}

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

module GI.GstTag.Objects.TagMux
    (

-- * Exported types
    TagMux(..)                              ,
    IsTagMux                                ,
    toTagMux                                ,
    noTagMux                                ,


    ) 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.GObject.Objects.Object as GObject.Object
import qualified GI.Gst.Interfaces.TagSetter as Gst.TagSetter
import qualified GI.Gst.Objects.Element as Gst.Element
import qualified GI.Gst.Objects.Object as Gst.Object

-- | Memory-managed wrapper type.
newtype TagMux = TagMux (ManagedPtr TagMux)
foreign import ccall "gst_tag_mux_get_type"
    c_gst_tag_mux_get_type :: IO GType

instance GObject TagMux where
    gobjectType = c_gst_tag_mux_get_type


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

instance O.HasParentTypes TagMux
type instance O.ParentTypes TagMux = '[Gst.Element.Element, Gst.Object.Object, GObject.Object.Object, Gst.TagSetter.TagSetter]

-- | Cast to `TagMux`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toTagMux :: (MonadIO m, IsTagMux o) => o -> m TagMux
toTagMux = liftIO . unsafeCastTo TagMux

-- | A convenience alias for `Nothing` :: `Maybe` `TagMux`.
noTagMux :: Maybe TagMux
noTagMux = Nothing

#if ENABLE_OVERLOADING
type family ResolveTagMuxMethod (t :: Symbol) (o :: *) :: * where
    ResolveTagMuxMethod "abortState" o = Gst.Element.ElementAbortStateMethodInfo
    ResolveTagMuxMethod "addControlBinding" o = Gst.Object.ObjectAddControlBindingMethodInfo
    ResolveTagMuxMethod "addPad" o = Gst.Element.ElementAddPadMethodInfo
    ResolveTagMuxMethod "addPropertyDeepNotifyWatch" o = Gst.Element.ElementAddPropertyDeepNotifyWatchMethodInfo
    ResolveTagMuxMethod "addPropertyNotifyWatch" o = Gst.Element.ElementAddPropertyNotifyWatchMethodInfo
    ResolveTagMuxMethod "addTagValue" o = Gst.TagSetter.TagSetterAddTagValueMethodInfo
    ResolveTagMuxMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveTagMuxMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveTagMuxMethod "callAsync" o = Gst.Element.ElementCallAsyncMethodInfo
    ResolveTagMuxMethod "changeState" o = Gst.Element.ElementChangeStateMethodInfo
    ResolveTagMuxMethod "continueState" o = Gst.Element.ElementContinueStateMethodInfo
    ResolveTagMuxMethod "createAllPads" o = Gst.Element.ElementCreateAllPadsMethodInfo
    ResolveTagMuxMethod "defaultError" o = Gst.Object.ObjectDefaultErrorMethodInfo
    ResolveTagMuxMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveTagMuxMethod "foreachPad" o = Gst.Element.ElementForeachPadMethodInfo
    ResolveTagMuxMethod "foreachSinkPad" o = Gst.Element.ElementForeachSinkPadMethodInfo
    ResolveTagMuxMethod "foreachSrcPad" o = Gst.Element.ElementForeachSrcPadMethodInfo
    ResolveTagMuxMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveTagMuxMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolveTagMuxMethod "hasActiveControlBindings" o = Gst.Object.ObjectHasActiveControlBindingsMethodInfo
    ResolveTagMuxMethod "hasAncestor" o = Gst.Object.ObjectHasAncestorMethodInfo
    ResolveTagMuxMethod "hasAsAncestor" o = Gst.Object.ObjectHasAsAncestorMethodInfo
    ResolveTagMuxMethod "hasAsParent" o = Gst.Object.ObjectHasAsParentMethodInfo
    ResolveTagMuxMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveTagMuxMethod "isLockedState" o = Gst.Element.ElementIsLockedStateMethodInfo
    ResolveTagMuxMethod "iteratePads" o = Gst.Element.ElementIteratePadsMethodInfo
    ResolveTagMuxMethod "iterateSinkPads" o = Gst.Element.ElementIterateSinkPadsMethodInfo
    ResolveTagMuxMethod "iterateSrcPads" o = Gst.Element.ElementIterateSrcPadsMethodInfo
    ResolveTagMuxMethod "link" o = Gst.Element.ElementLinkMethodInfo
    ResolveTagMuxMethod "linkFiltered" o = Gst.Element.ElementLinkFilteredMethodInfo
    ResolveTagMuxMethod "linkPads" o = Gst.Element.ElementLinkPadsMethodInfo
    ResolveTagMuxMethod "linkPadsFiltered" o = Gst.Element.ElementLinkPadsFilteredMethodInfo
    ResolveTagMuxMethod "linkPadsFull" o = Gst.Element.ElementLinkPadsFullMethodInfo
    ResolveTagMuxMethod "lostState" o = Gst.Element.ElementLostStateMethodInfo
    ResolveTagMuxMethod "mergeTags" o = Gst.TagSetter.TagSetterMergeTagsMethodInfo
    ResolveTagMuxMethod "messageFull" o = Gst.Element.ElementMessageFullMethodInfo
    ResolveTagMuxMethod "messageFullWithDetails" o = Gst.Element.ElementMessageFullWithDetailsMethodInfo
    ResolveTagMuxMethod "noMorePads" o = Gst.Element.ElementNoMorePadsMethodInfo
    ResolveTagMuxMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveTagMuxMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveTagMuxMethod "postMessage" o = Gst.Element.ElementPostMessageMethodInfo
    ResolveTagMuxMethod "provideClock" o = Gst.Element.ElementProvideClockMethodInfo
    ResolveTagMuxMethod "query" o = Gst.Element.ElementQueryMethodInfo
    ResolveTagMuxMethod "queryConvert" o = Gst.Element.ElementQueryConvertMethodInfo
    ResolveTagMuxMethod "queryDuration" o = Gst.Element.ElementQueryDurationMethodInfo
    ResolveTagMuxMethod "queryPosition" o = Gst.Element.ElementQueryPositionMethodInfo
    ResolveTagMuxMethod "ref" o = Gst.Object.ObjectRefMethodInfo
    ResolveTagMuxMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveTagMuxMethod "releaseRequestPad" o = Gst.Element.ElementReleaseRequestPadMethodInfo
    ResolveTagMuxMethod "removeControlBinding" o = Gst.Object.ObjectRemoveControlBindingMethodInfo
    ResolveTagMuxMethod "removePad" o = Gst.Element.ElementRemovePadMethodInfo
    ResolveTagMuxMethod "removePropertyNotifyWatch" o = Gst.Element.ElementRemovePropertyNotifyWatchMethodInfo
    ResolveTagMuxMethod "requestPad" o = Gst.Element.ElementRequestPadMethodInfo
    ResolveTagMuxMethod "resetTags" o = Gst.TagSetter.TagSetterResetTagsMethodInfo
    ResolveTagMuxMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveTagMuxMethod "seek" o = Gst.Element.ElementSeekMethodInfo
    ResolveTagMuxMethod "seekSimple" o = Gst.Element.ElementSeekSimpleMethodInfo
    ResolveTagMuxMethod "sendEvent" o = Gst.Element.ElementSendEventMethodInfo
    ResolveTagMuxMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveTagMuxMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveTagMuxMethod "suggestNextSync" o = Gst.Object.ObjectSuggestNextSyncMethodInfo
    ResolveTagMuxMethod "syncStateWithParent" o = Gst.Element.ElementSyncStateWithParentMethodInfo
    ResolveTagMuxMethod "syncValues" o = Gst.Object.ObjectSyncValuesMethodInfo
    ResolveTagMuxMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveTagMuxMethod "unlink" o = Gst.Element.ElementUnlinkMethodInfo
    ResolveTagMuxMethod "unlinkPads" o = Gst.Element.ElementUnlinkPadsMethodInfo
    ResolveTagMuxMethod "unparent" o = Gst.Object.ObjectUnparentMethodInfo
    ResolveTagMuxMethod "unref" o = Gst.Object.ObjectUnrefMethodInfo
    ResolveTagMuxMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveTagMuxMethod "getBaseTime" o = Gst.Element.ElementGetBaseTimeMethodInfo
    ResolveTagMuxMethod "getBus" o = Gst.Element.ElementGetBusMethodInfo
    ResolveTagMuxMethod "getClock" o = Gst.Element.ElementGetClockMethodInfo
    ResolveTagMuxMethod "getCompatiblePad" o = Gst.Element.ElementGetCompatiblePadMethodInfo
    ResolveTagMuxMethod "getCompatiblePadTemplate" o = Gst.Element.ElementGetCompatiblePadTemplateMethodInfo
    ResolveTagMuxMethod "getContext" o = Gst.Element.ElementGetContextMethodInfo
    ResolveTagMuxMethod "getContextUnlocked" o = Gst.Element.ElementGetContextUnlockedMethodInfo
    ResolveTagMuxMethod "getContexts" o = Gst.Element.ElementGetContextsMethodInfo
    ResolveTagMuxMethod "getControlBinding" o = Gst.Object.ObjectGetControlBindingMethodInfo
    ResolveTagMuxMethod "getControlRate" o = Gst.Object.ObjectGetControlRateMethodInfo
    ResolveTagMuxMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveTagMuxMethod "getFactory" o = Gst.Element.ElementGetFactoryMethodInfo
    ResolveTagMuxMethod "getGValueArray" o = Gst.Object.ObjectGetGValueArrayMethodInfo
    ResolveTagMuxMethod "getMetadata" o = Gst.Element.ElementGetMetadataMethodInfo
    ResolveTagMuxMethod "getName" o = Gst.Object.ObjectGetNameMethodInfo
    ResolveTagMuxMethod "getPadTemplate" o = Gst.Element.ElementGetPadTemplateMethodInfo
    ResolveTagMuxMethod "getPadTemplateList" o = Gst.Element.ElementGetPadTemplateListMethodInfo
    ResolveTagMuxMethod "getParent" o = Gst.Object.ObjectGetParentMethodInfo
    ResolveTagMuxMethod "getPathString" o = Gst.Object.ObjectGetPathStringMethodInfo
    ResolveTagMuxMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveTagMuxMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveTagMuxMethod "getRequestPad" o = Gst.Element.ElementGetRequestPadMethodInfo
    ResolveTagMuxMethod "getStartTime" o = Gst.Element.ElementGetStartTimeMethodInfo
    ResolveTagMuxMethod "getState" o = Gst.Element.ElementGetStateMethodInfo
    ResolveTagMuxMethod "getStaticPad" o = Gst.Element.ElementGetStaticPadMethodInfo
    ResolveTagMuxMethod "getTagList" o = Gst.TagSetter.TagSetterGetTagListMethodInfo
    ResolveTagMuxMethod "getTagMergeMode" o = Gst.TagSetter.TagSetterGetTagMergeModeMethodInfo
    ResolveTagMuxMethod "getValue" o = Gst.Object.ObjectGetValueMethodInfo
    ResolveTagMuxMethod "setBaseTime" o = Gst.Element.ElementSetBaseTimeMethodInfo
    ResolveTagMuxMethod "setBus" o = Gst.Element.ElementSetBusMethodInfo
    ResolveTagMuxMethod "setClock" o = Gst.Element.ElementSetClockMethodInfo
    ResolveTagMuxMethod "setContext" o = Gst.Element.ElementSetContextMethodInfo
    ResolveTagMuxMethod "setControlBindingDisabled" o = Gst.Object.ObjectSetControlBindingDisabledMethodInfo
    ResolveTagMuxMethod "setControlBindingsDisabled" o = Gst.Object.ObjectSetControlBindingsDisabledMethodInfo
    ResolveTagMuxMethod "setControlRate" o = Gst.Object.ObjectSetControlRateMethodInfo
    ResolveTagMuxMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveTagMuxMethod "setLockedState" o = Gst.Element.ElementSetLockedStateMethodInfo
    ResolveTagMuxMethod "setName" o = Gst.Object.ObjectSetNameMethodInfo
    ResolveTagMuxMethod "setParent" o = Gst.Object.ObjectSetParentMethodInfo
    ResolveTagMuxMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveTagMuxMethod "setStartTime" o = Gst.Element.ElementSetStartTimeMethodInfo
    ResolveTagMuxMethod "setState" o = Gst.Element.ElementSetStateMethodInfo
    ResolveTagMuxMethod "setTagMergeMode" o = Gst.TagSetter.TagSetterSetTagMergeModeMethodInfo
    ResolveTagMuxMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveTagMuxMethod t TagMux, O.MethodInfo info TagMux p) => OL.IsLabel t (TagMux -> 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

#if ENABLE_OVERLOADING
instance O.HasAttributeList TagMux
type instance O.AttributeList TagMux = TagMuxAttributeList
type TagMuxAttributeList = ('[ '("name", Gst.Object.ObjectNamePropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
#endif

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

#endif