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

This is the most simple base class for audio sources that only requires
subclasses to implement a set of simple functions:

* @open()@ :Open the device.
* @prepare()@ :Configure the device with the specified format.
* @read()@ :Read samples from the device.
* @reset()@ :Unblock reads and flush the device.
* @delay()@ :Get the number of samples in the device but not yet read.
* @unprepare()@ :Undo operations done by prepare.
* @close()@ :Close the device.

All scheduling of samples and timestamps is done in this base class
together with 'GI.GstAudio.Objects.AudioBaseSrc.AudioBaseSrc' using a default implementation of a
'GI.GstAudio.Objects.AudioRingBuffer.AudioRingBuffer' that uses threads.
-}

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

module GI.GstAudio.Objects.AudioSrc
    (

-- * Exported types
    AudioSrc(..)                            ,
    IsAudioSrc                              ,
    toAudioSrc                              ,
    noAudioSrc                              ,


    ) 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.GstAudio.Objects.AudioBaseSrc as GstAudio.AudioBaseSrc
import qualified GI.GstBase.Objects.BaseSrc as GstBase.BaseSrc
import qualified GI.GstBase.Objects.PushSrc as GstBase.PushSrc

-- | Memory-managed wrapper type.
newtype AudioSrc = AudioSrc (ManagedPtr AudioSrc)
foreign import ccall "gst_audio_src_get_type"
    c_gst_audio_src_get_type :: IO GType

instance GObject AudioSrc where
    gobjectType = c_gst_audio_src_get_type


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

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

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

-- | A convenience alias for `Nothing` :: `Maybe` `AudioSrc`.
noAudioSrc :: Maybe AudioSrc
noAudioSrc = Nothing

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

instance (info ~ ResolveAudioSrcMethod t AudioSrc, O.MethodInfo info AudioSrc p) => OL.IsLabel t (AudioSrc -> 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 AudioSrc
type instance O.AttributeList AudioSrc = AudioSrcAttributeList
type AudioSrcAttributeList = ('[ '("actualBufferTime", GstAudio.AudioBaseSrc.AudioBaseSrcActualBufferTimePropertyInfo), '("actualLatencyTime", GstAudio.AudioBaseSrc.AudioBaseSrcActualLatencyTimePropertyInfo), '("blocksize", GstBase.BaseSrc.BaseSrcBlocksizePropertyInfo), '("bufferTime", GstAudio.AudioBaseSrc.AudioBaseSrcBufferTimePropertyInfo), '("doTimestamp", GstBase.BaseSrc.BaseSrcDoTimestampPropertyInfo), '("latencyTime", GstAudio.AudioBaseSrc.AudioBaseSrcLatencyTimePropertyInfo), '("name", Gst.Object.ObjectNamePropertyInfo), '("numBuffers", GstBase.BaseSrc.BaseSrcNumBuffersPropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo), '("provideClock", GstAudio.AudioBaseSrc.AudioBaseSrcProvideClockPropertyInfo), '("slaveMethod", GstAudio.AudioBaseSrc.AudioBaseSrcSlaveMethodPropertyInfo), '("typefind", GstBase.BaseSrc.BaseSrcTypefindPropertyInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
#endif

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

#endif