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

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.
-}

module GI.GstPbutils.Objects.AudioVisualizer
    ( 

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


 -- * Properties
-- ** shadeAmount #attr:shadeAmount#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    AudioVisualizerShadeAmountPropertyInfo  ,
#endif
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    audioVisualizerShadeAmount              ,
#endif
    constructAudioVisualizerShadeAmount     ,
    getAudioVisualizerShadeAmount           ,
    setAudioVisualizerShadeAmount           ,


-- ** shader #attr:shader#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    AudioVisualizerShaderPropertyInfo       ,
#endif
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    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.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.GstPbutils.Enums as GstPbutils.Enums

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
    

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

toAudioVisualizer :: (MonadIO m, IsAudioVisualizer o) => o -> m AudioVisualizer
toAudioVisualizer = liftIO . unsafeCastTo AudioVisualizer

noAudioVisualizer :: Maybe AudioVisualizer
noAudioVisualizer = Nothing

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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 "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    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 "replaceData" o = GObject.Object.ObjectReplaceDataMethodInfo
    ResolveAudioVisualizerMethod "replaceQdata" o = GObject.Object.ObjectReplaceQdataMethodInfo
    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 "getName" o = Gst.Object.ObjectGetNameMethodInfo
    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) => O.IsLabelProxy t (AudioVisualizer -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

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

#endif

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

getAudioVisualizerShadeAmount :: (MonadIO m, IsAudioVisualizer o) => o -> m Word32
getAudioVisualizerShadeAmount obj = liftIO $ getObjectPropertyUInt32 obj "shade-amount"

setAudioVisualizerShadeAmount :: (MonadIO m, IsAudioVisualizer o) => o -> Word32 -> m ()
setAudioVisualizerShadeAmount obj val = liftIO $ setObjectPropertyUInt32 obj "shade-amount" val

constructAudioVisualizerShadeAmount :: (IsAudioVisualizer o) => Word32 -> IO (GValueConstruct o)
constructAudioVisualizerShadeAmount val = constructObjectPropertyUInt32 "shade-amount" val

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

getAudioVisualizerShader :: (MonadIO m, IsAudioVisualizer o) => o -> m GstPbutils.Enums.AudioVisualizerShader
getAudioVisualizerShader obj = liftIO $ getObjectPropertyEnum obj "shader"

setAudioVisualizerShader :: (MonadIO m, IsAudioVisualizer o) => o -> GstPbutils.Enums.AudioVisualizerShader -> m ()
setAudioVisualizerShader obj val = liftIO $ setObjectPropertyEnum obj "shader" val

constructAudioVisualizerShader :: (IsAudioVisualizer o) => GstPbutils.Enums.AudioVisualizerShader -> IO (GValueConstruct o)
constructAudioVisualizerShader val = constructObjectPropertyEnum "shader" val

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
audioVisualizerShadeAmount :: AttrLabelProxy "shadeAmount"
audioVisualizerShadeAmount = AttrLabelProxy

audioVisualizerShader :: AttrLabelProxy "shader"
audioVisualizerShader = AttrLabelProxy

#endif

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