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

A baseclass for scopes (visualizers). It takes care of re-fitting the
audio-rate to video-rate and handles renegotiation (downstream video size
changes).

It also provides several background shading effects. These effects are
applied to a previous picture before the @/render()/@ implementation can draw a
new frame.
-}

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

module GI.GstPbutils.Objects.AudioVisualizer
    (

-- * Exported types
    AudioVisualizer(..)                     ,
    IsAudioVisualizer                       ,
    toAudioVisualizer                       ,
    noAudioVisualizer                       ,


 -- * Properties
-- ** shadeAmount #attr:shadeAmount#
{- | /No description available in the introspection data./
-}
#if ENABLE_OVERLOADING
    AudioVisualizerShadeAmountPropertyInfo  ,
#endif
#if ENABLE_OVERLOADING
    audioVisualizerShadeAmount              ,
#endif
    constructAudioVisualizerShadeAmount     ,
    getAudioVisualizerShadeAmount           ,
    setAudioVisualizerShadeAmount           ,


-- ** shader #attr:shader#
{- | /No description available in the introspection data./
-}
#if ENABLE_OVERLOADING
    AudioVisualizerShaderPropertyInfo       ,
#endif
#if ENABLE_OVERLOADING
    audioVisualizerShader                   ,
#endif
    constructAudioVisualizerShader          ,
    getAudioVisualizerShader                ,
    setAudioVisualizerShader                ,




    ) 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 {-# SOURCE #-} qualified GI.GstPbutils.Enums as GstPbutils.Enums

-- | Memory-managed wrapper type.
newtype AudioVisualizer = AudioVisualizer (ManagedPtr AudioVisualizer)
foreign import ccall "gst_audio_visualizer_get_type"
    c_gst_audio_visualizer_get_type :: IO GType

instance GObject AudioVisualizer where
    gobjectType = c_gst_audio_visualizer_get_type


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

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

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

-- | A convenience alias for `Nothing` :: `Maybe` `AudioVisualizer`.
noAudioVisualizer :: Maybe AudioVisualizer
noAudioVisualizer = Nothing

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

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

-- VVV Prop "shade-amount"
   -- Type: TBasicType TUInt
   -- Flags: [PropertyReadable,PropertyWritable]
   -- Nullable: (Nothing,Nothing)

{- |
Get the value of the “@shade-amount@” property.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' audioVisualizer #shadeAmount
@
-}
getAudioVisualizerShadeAmount :: (MonadIO m, IsAudioVisualizer o) => o -> m Word32
getAudioVisualizerShadeAmount obj = liftIO $ B.Properties.getObjectPropertyUInt32 obj "shade-amount"

{- |
Set the value of the “@shade-amount@” property.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' audioVisualizer [ #shadeAmount 'Data.GI.Base.Attributes.:=' value ]
@
-}
setAudioVisualizerShadeAmount :: (MonadIO m, IsAudioVisualizer o) => o -> Word32 -> m ()
setAudioVisualizerShadeAmount obj val = liftIO $ B.Properties.setObjectPropertyUInt32 obj "shade-amount" val

{- |
Construct a `GValueConstruct` with valid value for the “@shade-amount@” property. This is rarely needed directly, but it is used by `Data.GI.Base.Constructible.new`.
-}
constructAudioVisualizerShadeAmount :: (IsAudioVisualizer o) => Word32 -> IO (GValueConstruct o)
constructAudioVisualizerShadeAmount val = B.Properties.constructObjectPropertyUInt32 "shade-amount" val

#if ENABLE_OVERLOADING
data AudioVisualizerShadeAmountPropertyInfo
instance AttrInfo AudioVisualizerShadeAmountPropertyInfo where
    type AttrAllowedOps AudioVisualizerShadeAmountPropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint AudioVisualizerShadeAmountPropertyInfo = (~) Word32
    type AttrBaseTypeConstraint AudioVisualizerShadeAmountPropertyInfo = IsAudioVisualizer
    type AttrGetType AudioVisualizerShadeAmountPropertyInfo = Word32
    type AttrLabel AudioVisualizerShadeAmountPropertyInfo = "shade-amount"
    type AttrOrigin AudioVisualizerShadeAmountPropertyInfo = AudioVisualizer
    attrGet _ = getAudioVisualizerShadeAmount
    attrSet _ = setAudioVisualizerShadeAmount
    attrConstruct _ = constructAudioVisualizerShadeAmount
    attrClear _ = undefined
#endif

-- VVV Prop "shader"
   -- Type: TInterface (Name {namespace = "GstPbutils", name = "AudioVisualizerShader"})
   -- Flags: [PropertyReadable,PropertyWritable]
   -- Nullable: (Nothing,Nothing)

{- |
Get the value of the “@shader@” property.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' audioVisualizer #shader
@
-}
getAudioVisualizerShader :: (MonadIO m, IsAudioVisualizer o) => o -> m GstPbutils.Enums.AudioVisualizerShader
getAudioVisualizerShader obj = liftIO $ B.Properties.getObjectPropertyEnum obj "shader"

{- |
Set the value of the “@shader@” property.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' audioVisualizer [ #shader 'Data.GI.Base.Attributes.:=' value ]
@
-}
setAudioVisualizerShader :: (MonadIO m, IsAudioVisualizer o) => o -> GstPbutils.Enums.AudioVisualizerShader -> m ()
setAudioVisualizerShader obj val = liftIO $ B.Properties.setObjectPropertyEnum obj "shader" val

{- |
Construct a `GValueConstruct` with valid value for the “@shader@” property. This is rarely needed directly, but it is used by `Data.GI.Base.Constructible.new`.
-}
constructAudioVisualizerShader :: (IsAudioVisualizer o) => GstPbutils.Enums.AudioVisualizerShader -> IO (GValueConstruct o)
constructAudioVisualizerShader val = B.Properties.constructObjectPropertyEnum "shader" val

#if ENABLE_OVERLOADING
data AudioVisualizerShaderPropertyInfo
instance AttrInfo AudioVisualizerShaderPropertyInfo where
    type AttrAllowedOps AudioVisualizerShaderPropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint AudioVisualizerShaderPropertyInfo = (~) GstPbutils.Enums.AudioVisualizerShader
    type AttrBaseTypeConstraint AudioVisualizerShaderPropertyInfo = IsAudioVisualizer
    type AttrGetType AudioVisualizerShaderPropertyInfo = GstPbutils.Enums.AudioVisualizerShader
    type AttrLabel AudioVisualizerShaderPropertyInfo = "shader"
    type AttrOrigin AudioVisualizerShaderPropertyInfo = AudioVisualizer
    attrGet _ = getAudioVisualizerShader
    attrSet _ = setAudioVisualizerShader
    attrConstruct _ = constructAudioVisualizerShader
    attrClear _ = undefined
#endif

#if ENABLE_OVERLOADING
instance O.HasAttributeList AudioVisualizer
type instance O.AttributeList AudioVisualizer = AudioVisualizerAttributeList
type AudioVisualizerAttributeList = ('[ '("name", Gst.Object.ObjectNamePropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo), '("shadeAmount", AudioVisualizerShadeAmountPropertyInfo), '("shader", AudioVisualizerShaderPropertyInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
audioVisualizerShadeAmount :: AttrLabelProxy "shadeAmount"
audioVisualizerShadeAmount = AttrLabelProxy

audioVisualizerShader :: AttrLabelProxy "shader"
audioVisualizerShader = AttrLabelProxy

#endif

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

#endif