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

'GI.GstAudio.Objects.AudioFilter.AudioFilter' is a 'GI.GstBase.Objects.BaseTransform.BaseTransform'\<!-- -->-derived base class for simple audio
filters, ie. those that output the same format that they get as input.

'GI.GstAudio.Objects.AudioFilter.AudioFilter' will parse the input format for you (with error checking)
before calling your setup function. Also, elements deriving from
'GI.GstAudio.Objects.AudioFilter.AudioFilter' may use 'GI.GstAudio.Structs.AudioFilterClass.audioFilterClassAddPadTemplates' from
their class_init function to easily configure the set of caps\/formats that
the element is able to handle.

Derived classes should override the 'GI.GstAudio.Structs.AudioFilterClass.AudioFilterClass'.@/setup/@() and
'GI.GstBase.Structs.BaseTransformClass.BaseTransformClass'.@/transform_ip/@() and\/or
'GI.GstBase.Structs.BaseTransformClass.BaseTransformClass'.@/transform/@()
virtual functions in their class_init function.
-}

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

module GI.GstAudio.Objects.AudioFilter
    (

-- * Exported types
    AudioFilter(..)                         ,
    IsAudioFilter                           ,
    toAudioFilter                           ,
    noAudioFilter                           ,


    ) 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.Objects.Element as Gst.Element
import qualified GI.Gst.Objects.Object as Gst.Object
import qualified GI.GstBase.Objects.BaseTransform as GstBase.BaseTransform

-- | Memory-managed wrapper type.
newtype AudioFilter = AudioFilter (ManagedPtr AudioFilter)
foreign import ccall "gst_audio_filter_get_type"
    c_gst_audio_filter_get_type :: IO GType

instance GObject AudioFilter where
    gobjectType = c_gst_audio_filter_get_type


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

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

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

-- | A convenience alias for `Nothing` :: `Maybe` `AudioFilter`.
noAudioFilter :: Maybe AudioFilter
noAudioFilter = Nothing

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

instance (info ~ ResolveAudioFilterMethod t AudioFilter, O.MethodInfo info AudioFilter p) => OL.IsLabel t (AudioFilter -> 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 AudioFilter
type instance O.AttributeList AudioFilter = AudioFilterAttributeList
type AudioFilterAttributeList = ('[ '("name", Gst.Object.ObjectNamePropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo), '("qos", GstBase.BaseTransform.BaseTransformQosPropertyInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
#endif

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

#endif