{- |
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 'GI.Gst.Objects.DeviceProvider.DeviceProvider' subclass is provided by a plugin that handles devices
if there is a way to programmatically list connected devices. It can also
optionally provide updates to the list of connected devices.

Each 'GI.Gst.Objects.DeviceProvider.DeviceProvider' subclass is a singleton, a plugin should
normally provide a single subclass for all devices.

Applications would normally use a 'GI.Gst.Objects.DeviceMonitor.DeviceMonitor' to monitor devices
from all relevant providers.

/Since: 1.4/
-}

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

module GI.Gst.Objects.DeviceProvider
    (

-- * Exported types
    DeviceProvider(..)                      ,
    IsDeviceProvider                        ,
    toDeviceProvider                        ,
    noDeviceProvider                        ,


 -- * Methods
-- ** canMonitor #method:canMonitor#

#if ENABLE_OVERLOADING
    DeviceProviderCanMonitorMethodInfo      ,
#endif
    deviceProviderCanMonitor                ,


-- ** deviceAdd #method:deviceAdd#

#if ENABLE_OVERLOADING
    DeviceProviderDeviceAddMethodInfo       ,
#endif
    deviceProviderDeviceAdd                 ,


-- ** deviceChanged #method:deviceChanged#

#if ENABLE_OVERLOADING
    DeviceProviderDeviceChangedMethodInfo   ,
#endif
    deviceProviderDeviceChanged             ,


-- ** deviceRemove #method:deviceRemove#

#if ENABLE_OVERLOADING
    DeviceProviderDeviceRemoveMethodInfo    ,
#endif
    deviceProviderDeviceRemove              ,


-- ** getBus #method:getBus#

#if ENABLE_OVERLOADING
    DeviceProviderGetBusMethodInfo          ,
#endif
    deviceProviderGetBus                    ,


-- ** getDevices #method:getDevices#

#if ENABLE_OVERLOADING
    DeviceProviderGetDevicesMethodInfo      ,
#endif
    deviceProviderGetDevices                ,


-- ** getFactory #method:getFactory#

#if ENABLE_OVERLOADING
    DeviceProviderGetFactoryMethodInfo      ,
#endif
    deviceProviderGetFactory                ,


-- ** getHiddenProviders #method:getHiddenProviders#

#if ENABLE_OVERLOADING
    DeviceProviderGetHiddenProvidersMethodInfo,
#endif
    deviceProviderGetHiddenProviders        ,


-- ** getMetadata #method:getMetadata#

#if ENABLE_OVERLOADING
    DeviceProviderGetMetadataMethodInfo     ,
#endif
    deviceProviderGetMetadata               ,


-- ** hideProvider #method:hideProvider#

#if ENABLE_OVERLOADING
    DeviceProviderHideProviderMethodInfo    ,
#endif
    deviceProviderHideProvider              ,


-- ** register #method:register#

    deviceProviderRegister                  ,


-- ** start #method:start#

#if ENABLE_OVERLOADING
    DeviceProviderStartMethodInfo           ,
#endif
    deviceProviderStart                     ,


-- ** stop #method:stop#

#if ENABLE_OVERLOADING
    DeviceProviderStopMethodInfo            ,
#endif
    deviceProviderStop                      ,


-- ** unhideProvider #method:unhideProvider#

#if ENABLE_OVERLOADING
    DeviceProviderUnhideProviderMethodInfo  ,
#endif
    deviceProviderUnhideProvider            ,




 -- * Signals
-- ** providerHidden #signal:providerHidden#

    C_DeviceProviderProviderHiddenCallback  ,
    DeviceProviderProviderHiddenCallback    ,
#if ENABLE_OVERLOADING
    DeviceProviderProviderHiddenSignalInfo  ,
#endif
    afterDeviceProviderProviderHidden       ,
    genClosure_DeviceProviderProviderHidden ,
    mk_DeviceProviderProviderHiddenCallback ,
    noDeviceProviderProviderHiddenCallback  ,
    onDeviceProviderProviderHidden          ,
    wrap_DeviceProviderProviderHiddenCallback,


-- ** providerUnhidden #signal:providerUnhidden#

    C_DeviceProviderProviderUnhiddenCallback,
    DeviceProviderProviderUnhiddenCallback  ,
#if ENABLE_OVERLOADING
    DeviceProviderProviderUnhiddenSignalInfo,
#endif
    afterDeviceProviderProviderUnhidden     ,
    genClosure_DeviceProviderProviderUnhidden,
    mk_DeviceProviderProviderUnhiddenCallback,
    noDeviceProviderProviderUnhiddenCallback,
    onDeviceProviderProviderUnhidden        ,
    wrap_DeviceProviderProviderUnhiddenCallback,




    ) 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 {-# SOURCE #-} qualified GI.Gst.Objects.Bus as Gst.Bus
import {-# SOURCE #-} qualified GI.Gst.Objects.Device as Gst.Device
import {-# SOURCE #-} qualified GI.Gst.Objects.DeviceProviderFactory as Gst.DeviceProviderFactory
import {-# SOURCE #-} qualified GI.Gst.Objects.Object as Gst.Object
import {-# SOURCE #-} qualified GI.Gst.Objects.Plugin as Gst.Plugin

-- | Memory-managed wrapper type.
newtype DeviceProvider = DeviceProvider (ManagedPtr DeviceProvider)
foreign import ccall "gst_device_provider_get_type"
    c_gst_device_provider_get_type :: IO GType

instance GObject DeviceProvider where
    gobjectType = c_gst_device_provider_get_type


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

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

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

-- | A convenience alias for `Nothing` :: `Maybe` `DeviceProvider`.
noDeviceProvider :: Maybe DeviceProvider
noDeviceProvider = Nothing

#if ENABLE_OVERLOADING
type family ResolveDeviceProviderMethod (t :: Symbol) (o :: *) :: * where
    ResolveDeviceProviderMethod "addControlBinding" o = Gst.Object.ObjectAddControlBindingMethodInfo
    ResolveDeviceProviderMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveDeviceProviderMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveDeviceProviderMethod "canMonitor" o = DeviceProviderCanMonitorMethodInfo
    ResolveDeviceProviderMethod "defaultError" o = Gst.Object.ObjectDefaultErrorMethodInfo
    ResolveDeviceProviderMethod "deviceAdd" o = DeviceProviderDeviceAddMethodInfo
    ResolveDeviceProviderMethod "deviceChanged" o = DeviceProviderDeviceChangedMethodInfo
    ResolveDeviceProviderMethod "deviceRemove" o = DeviceProviderDeviceRemoveMethodInfo
    ResolveDeviceProviderMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveDeviceProviderMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveDeviceProviderMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolveDeviceProviderMethod "hasActiveControlBindings" o = Gst.Object.ObjectHasActiveControlBindingsMethodInfo
    ResolveDeviceProviderMethod "hasAncestor" o = Gst.Object.ObjectHasAncestorMethodInfo
    ResolveDeviceProviderMethod "hasAsAncestor" o = Gst.Object.ObjectHasAsAncestorMethodInfo
    ResolveDeviceProviderMethod "hasAsParent" o = Gst.Object.ObjectHasAsParentMethodInfo
    ResolveDeviceProviderMethod "hideProvider" o = DeviceProviderHideProviderMethodInfo
    ResolveDeviceProviderMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveDeviceProviderMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveDeviceProviderMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveDeviceProviderMethod "ref" o = Gst.Object.ObjectRefMethodInfo
    ResolveDeviceProviderMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveDeviceProviderMethod "removeControlBinding" o = Gst.Object.ObjectRemoveControlBindingMethodInfo
    ResolveDeviceProviderMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveDeviceProviderMethod "start" o = DeviceProviderStartMethodInfo
    ResolveDeviceProviderMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveDeviceProviderMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveDeviceProviderMethod "stop" o = DeviceProviderStopMethodInfo
    ResolveDeviceProviderMethod "suggestNextSync" o = Gst.Object.ObjectSuggestNextSyncMethodInfo
    ResolveDeviceProviderMethod "syncValues" o = Gst.Object.ObjectSyncValuesMethodInfo
    ResolveDeviceProviderMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveDeviceProviderMethod "unhideProvider" o = DeviceProviderUnhideProviderMethodInfo
    ResolveDeviceProviderMethod "unparent" o = Gst.Object.ObjectUnparentMethodInfo
    ResolveDeviceProviderMethod "unref" o = Gst.Object.ObjectUnrefMethodInfo
    ResolveDeviceProviderMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveDeviceProviderMethod "getBus" o = DeviceProviderGetBusMethodInfo
    ResolveDeviceProviderMethod "getControlBinding" o = Gst.Object.ObjectGetControlBindingMethodInfo
    ResolveDeviceProviderMethod "getControlRate" o = Gst.Object.ObjectGetControlRateMethodInfo
    ResolveDeviceProviderMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveDeviceProviderMethod "getDevices" o = DeviceProviderGetDevicesMethodInfo
    ResolveDeviceProviderMethod "getFactory" o = DeviceProviderGetFactoryMethodInfo
    ResolveDeviceProviderMethod "getGValueArray" o = Gst.Object.ObjectGetGValueArrayMethodInfo
    ResolveDeviceProviderMethod "getHiddenProviders" o = DeviceProviderGetHiddenProvidersMethodInfo
    ResolveDeviceProviderMethod "getMetadata" o = DeviceProviderGetMetadataMethodInfo
    ResolveDeviceProviderMethod "getName" o = Gst.Object.ObjectGetNameMethodInfo
    ResolveDeviceProviderMethod "getParent" o = Gst.Object.ObjectGetParentMethodInfo
    ResolveDeviceProviderMethod "getPathString" o = Gst.Object.ObjectGetPathStringMethodInfo
    ResolveDeviceProviderMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveDeviceProviderMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveDeviceProviderMethod "getValue" o = Gst.Object.ObjectGetValueMethodInfo
    ResolveDeviceProviderMethod "setControlBindingDisabled" o = Gst.Object.ObjectSetControlBindingDisabledMethodInfo
    ResolveDeviceProviderMethod "setControlBindingsDisabled" o = Gst.Object.ObjectSetControlBindingsDisabledMethodInfo
    ResolveDeviceProviderMethod "setControlRate" o = Gst.Object.ObjectSetControlRateMethodInfo
    ResolveDeviceProviderMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveDeviceProviderMethod "setName" o = Gst.Object.ObjectSetNameMethodInfo
    ResolveDeviceProviderMethod "setParent" o = Gst.Object.ObjectSetParentMethodInfo
    ResolveDeviceProviderMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveDeviceProviderMethod l o = O.MethodResolutionFailed l o

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

-- signal DeviceProvider::provider-hidden
{- |
/No description available in the introspection data./
-}
type DeviceProviderProviderHiddenCallback =
    T.Text
    -> IO ()

-- | A convenience synonym for @`Nothing` :: `Maybe` `DeviceProviderProviderHiddenCallback`@.
noDeviceProviderProviderHiddenCallback :: Maybe DeviceProviderProviderHiddenCallback
noDeviceProviderProviderHiddenCallback = Nothing

-- | Type for the callback on the (unwrapped) C side.
type C_DeviceProviderProviderHiddenCallback =
    Ptr () ->                               -- object
    CString ->
    Ptr () ->                               -- user_data
    IO ()

-- | Generate a function pointer callable from C code, from a `C_DeviceProviderProviderHiddenCallback`.
foreign import ccall "wrapper"
    mk_DeviceProviderProviderHiddenCallback :: C_DeviceProviderProviderHiddenCallback -> IO (FunPtr C_DeviceProviderProviderHiddenCallback)

-- | Wrap the callback into a `GClosure`.
genClosure_DeviceProviderProviderHidden :: MonadIO m => DeviceProviderProviderHiddenCallback -> m (GClosure C_DeviceProviderProviderHiddenCallback)
genClosure_DeviceProviderProviderHidden cb = liftIO $ do
    let cb' = wrap_DeviceProviderProviderHiddenCallback cb
    mk_DeviceProviderProviderHiddenCallback cb' >>= B.GClosure.newGClosure


-- | Wrap a `DeviceProviderProviderHiddenCallback` into a `C_DeviceProviderProviderHiddenCallback`.
wrap_DeviceProviderProviderHiddenCallback ::
    DeviceProviderProviderHiddenCallback ->
    C_DeviceProviderProviderHiddenCallback
wrap_DeviceProviderProviderHiddenCallback _cb _ object _ = do
    object' <- cstringToText object
    _cb  object'


{- |
Connect a signal handler for the “@provider-hidden@” signal, to be run before the default handler.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Signals.on' deviceProvider #providerHidden callback
@
-}
onDeviceProviderProviderHidden :: (IsDeviceProvider a, MonadIO m) => a -> DeviceProviderProviderHiddenCallback -> m SignalHandlerId
onDeviceProviderProviderHidden obj cb = liftIO $ do
    let cb' = wrap_DeviceProviderProviderHiddenCallback cb
    cb'' <- mk_DeviceProviderProviderHiddenCallback cb'
    connectSignalFunPtr obj "provider-hidden" cb'' SignalConnectBefore

{- |
Connect a signal handler for the “@provider-hidden@” signal, to be run after the default handler.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Signals.after' deviceProvider #providerHidden callback
@
-}
afterDeviceProviderProviderHidden :: (IsDeviceProvider a, MonadIO m) => a -> DeviceProviderProviderHiddenCallback -> m SignalHandlerId
afterDeviceProviderProviderHidden obj cb = liftIO $ do
    let cb' = wrap_DeviceProviderProviderHiddenCallback cb
    cb'' <- mk_DeviceProviderProviderHiddenCallback cb'
    connectSignalFunPtr obj "provider-hidden" cb'' SignalConnectAfter


-- signal DeviceProvider::provider-unhidden
{- |
/No description available in the introspection data./
-}
type DeviceProviderProviderUnhiddenCallback =
    T.Text
    -> IO ()

-- | A convenience synonym for @`Nothing` :: `Maybe` `DeviceProviderProviderUnhiddenCallback`@.
noDeviceProviderProviderUnhiddenCallback :: Maybe DeviceProviderProviderUnhiddenCallback
noDeviceProviderProviderUnhiddenCallback = Nothing

-- | Type for the callback on the (unwrapped) C side.
type C_DeviceProviderProviderUnhiddenCallback =
    Ptr () ->                               -- object
    CString ->
    Ptr () ->                               -- user_data
    IO ()

-- | Generate a function pointer callable from C code, from a `C_DeviceProviderProviderUnhiddenCallback`.
foreign import ccall "wrapper"
    mk_DeviceProviderProviderUnhiddenCallback :: C_DeviceProviderProviderUnhiddenCallback -> IO (FunPtr C_DeviceProviderProviderUnhiddenCallback)

-- | Wrap the callback into a `GClosure`.
genClosure_DeviceProviderProviderUnhidden :: MonadIO m => DeviceProviderProviderUnhiddenCallback -> m (GClosure C_DeviceProviderProviderUnhiddenCallback)
genClosure_DeviceProviderProviderUnhidden cb = liftIO $ do
    let cb' = wrap_DeviceProviderProviderUnhiddenCallback cb
    mk_DeviceProviderProviderUnhiddenCallback cb' >>= B.GClosure.newGClosure


-- | Wrap a `DeviceProviderProviderUnhiddenCallback` into a `C_DeviceProviderProviderUnhiddenCallback`.
wrap_DeviceProviderProviderUnhiddenCallback ::
    DeviceProviderProviderUnhiddenCallback ->
    C_DeviceProviderProviderUnhiddenCallback
wrap_DeviceProviderProviderUnhiddenCallback _cb _ object _ = do
    object' <- cstringToText object
    _cb  object'


{- |
Connect a signal handler for the “@provider-unhidden@” signal, to be run before the default handler.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Signals.on' deviceProvider #providerUnhidden callback
@
-}
onDeviceProviderProviderUnhidden :: (IsDeviceProvider a, MonadIO m) => a -> DeviceProviderProviderUnhiddenCallback -> m SignalHandlerId
onDeviceProviderProviderUnhidden obj cb = liftIO $ do
    let cb' = wrap_DeviceProviderProviderUnhiddenCallback cb
    cb'' <- mk_DeviceProviderProviderUnhiddenCallback cb'
    connectSignalFunPtr obj "provider-unhidden" cb'' SignalConnectBefore

{- |
Connect a signal handler for the “@provider-unhidden@” signal, to be run after the default handler.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Signals.after' deviceProvider #providerUnhidden callback
@
-}
afterDeviceProviderProviderUnhidden :: (IsDeviceProvider a, MonadIO m) => a -> DeviceProviderProviderUnhiddenCallback -> m SignalHandlerId
afterDeviceProviderProviderUnhidden obj cb = liftIO $ do
    let cb' = wrap_DeviceProviderProviderUnhiddenCallback cb
    cb'' <- mk_DeviceProviderProviderUnhiddenCallback cb'
    connectSignalFunPtr obj "provider-unhidden" cb'' SignalConnectAfter


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

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
data DeviceProviderProviderHiddenSignalInfo
instance SignalInfo DeviceProviderProviderHiddenSignalInfo where
    type HaskellCallbackType DeviceProviderProviderHiddenSignalInfo = DeviceProviderProviderHiddenCallback
    connectSignal _ obj cb connectMode = do
        let cb' = wrap_DeviceProviderProviderHiddenCallback cb
        cb'' <- mk_DeviceProviderProviderHiddenCallback cb'
        connectSignalFunPtr obj "provider-hidden" cb'' connectMode

data DeviceProviderProviderUnhiddenSignalInfo
instance SignalInfo DeviceProviderProviderUnhiddenSignalInfo where
    type HaskellCallbackType DeviceProviderProviderUnhiddenSignalInfo = DeviceProviderProviderUnhiddenCallback
    connectSignal _ obj cb connectMode = do
        let cb' = wrap_DeviceProviderProviderUnhiddenCallback cb
        cb'' <- mk_DeviceProviderProviderUnhiddenCallback cb'
        connectSignalFunPtr obj "provider-unhidden" cb'' connectMode

type instance O.SignalList DeviceProvider = DeviceProviderSignalList
type DeviceProviderSignalList = ('[ '("deepNotify", Gst.Object.ObjectDeepNotifySignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo), '("providerHidden", DeviceProviderProviderHiddenSignalInfo), '("providerUnhidden", DeviceProviderProviderUnhiddenSignalInfo)] :: [(Symbol, *)])

#endif

-- method DeviceProvider::can_monitor
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Nothing, sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_can_monitor" gst_device_provider_can_monitor ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    IO CInt

{- |
/No description available in the introspection data./
-}
deviceProviderCanMonitor ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a) =>
    a
    -> m Bool
deviceProviderCanMonitor provider = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    result <- gst_device_provider_can_monitor provider'
    let result' = (/= 0) result
    touchManagedPtr provider
    return result'

#if ENABLE_OVERLOADING
data DeviceProviderCanMonitorMethodInfo
instance (signature ~ (m Bool), MonadIO m, IsDeviceProvider a) => O.MethodInfo DeviceProviderCanMonitorMethodInfo a signature where
    overloadedMethod _ = deviceProviderCanMonitor

#endif

-- method DeviceProvider::device_add
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProvider", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "device", argType = TInterface (Name {namespace = "Gst", name = "Device"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDevice that has been added", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_device_add" gst_device_provider_device_add ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    Ptr Gst.Device.Device ->                -- device : TInterface (Name {namespace = "Gst", name = "Device"})
    IO ()

{- |
Posts a message on the provider\'s 'GI.Gst.Objects.Bus.Bus' to inform applications that
a new device has been added.

This is for use by subclasses.

/@device@/\'s reference count will be incremented, and any floating reference
will be removed (see @/gst_object_ref_sink()/@).

/Since: 1.4/
-}
deviceProviderDeviceAdd ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a, Gst.Device.IsDevice b) =>
    a
    {- ^ /@provider@/: a 'GI.Gst.Objects.DeviceProvider.DeviceProvider' -}
    -> b
    {- ^ /@device@/: a 'GI.Gst.Objects.Device.Device' that has been added -}
    -> m ()
deviceProviderDeviceAdd provider device = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    device' <- unsafeManagedPtrCastPtr device
    gst_device_provider_device_add provider' device'
    touchManagedPtr provider
    touchManagedPtr device
    return ()

#if ENABLE_OVERLOADING
data DeviceProviderDeviceAddMethodInfo
instance (signature ~ (b -> m ()), MonadIO m, IsDeviceProvider a, Gst.Device.IsDevice b) => O.MethodInfo DeviceProviderDeviceAddMethodInfo a signature where
    overloadedMethod _ = deviceProviderDeviceAdd

#endif

-- method DeviceProvider::device_changed
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Nothing, sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "device", argType = TInterface (Name {namespace = "Gst", name = "Device"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the new version of @changed_device", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "changed_device", argType = TInterface (Name {namespace = "Gst", name = "Device"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the old version of the device that has been udpated", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_device_changed" gst_device_provider_device_changed ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    Ptr Gst.Device.Device ->                -- device : TInterface (Name {namespace = "Gst", name = "Device"})
    Ptr Gst.Device.Device ->                -- changed_device : TInterface (Name {namespace = "Gst", name = "Device"})
    IO ()

{- |
This function is used when /@changedDevice@/ was modified into its new form
/@device@/. This will post a @DEVICE_CHANGED@ message on the bus to let
the application know that the device was modified. 'GI.Gst.Objects.Device.Device' is immutable
for MT. safety purposes so this is an \"atomic\" way of letting the application
know when a device was modified.

/Since: 1.16/
-}
deviceProviderDeviceChanged ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a, Gst.Device.IsDevice b, Gst.Device.IsDevice c) =>
    a
    -> b
    {- ^ /@device@/: the new version of /@changedDevice@/ -}
    -> c
    {- ^ /@changedDevice@/: the old version of the device that has been udpated -}
    -> m ()
deviceProviderDeviceChanged provider device changedDevice = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    device' <- unsafeManagedPtrCastPtr device
    changedDevice' <- unsafeManagedPtrCastPtr changedDevice
    gst_device_provider_device_changed provider' device' changedDevice'
    touchManagedPtr provider
    touchManagedPtr device
    touchManagedPtr changedDevice
    return ()

#if ENABLE_OVERLOADING
data DeviceProviderDeviceChangedMethodInfo
instance (signature ~ (b -> c -> m ()), MonadIO m, IsDeviceProvider a, Gst.Device.IsDevice b, Gst.Device.IsDevice c) => O.MethodInfo DeviceProviderDeviceChangedMethodInfo a signature where
    overloadedMethod _ = deviceProviderDeviceChanged

#endif

-- method DeviceProvider::device_remove
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProvider", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "device", argType = TInterface (Name {namespace = "Gst", name = "Device"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDevice that has been removed", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_device_remove" gst_device_provider_device_remove ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    Ptr Gst.Device.Device ->                -- device : TInterface (Name {namespace = "Gst", name = "Device"})
    IO ()

{- |
Posts a message on the provider\'s 'GI.Gst.Objects.Bus.Bus' to inform applications that
a device has been removed.

This is for use by subclasses.

/Since: 1.4/
-}
deviceProviderDeviceRemove ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a, Gst.Device.IsDevice b) =>
    a
    {- ^ /@provider@/: a 'GI.Gst.Objects.DeviceProvider.DeviceProvider' -}
    -> b
    {- ^ /@device@/: a 'GI.Gst.Objects.Device.Device' that has been removed -}
    -> m ()
deviceProviderDeviceRemove provider device = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    device' <- unsafeManagedPtrCastPtr device
    gst_device_provider_device_remove provider' device'
    touchManagedPtr provider
    touchManagedPtr device
    return ()

#if ENABLE_OVERLOADING
data DeviceProviderDeviceRemoveMethodInfo
instance (signature ~ (b -> m ()), MonadIO m, IsDeviceProvider a, Gst.Device.IsDevice b) => O.MethodInfo DeviceProviderDeviceRemoveMethodInfo a signature where
    overloadedMethod _ = deviceProviderDeviceRemove

#endif

-- method DeviceProvider::get_bus
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProvider", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gst", name = "Bus"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_get_bus" gst_device_provider_get_bus ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    IO (Ptr Gst.Bus.Bus)

{- |
Gets the 'GI.Gst.Objects.Bus.Bus' of this 'GI.Gst.Objects.DeviceProvider.DeviceProvider'

/Since: 1.4/
-}
deviceProviderGetBus ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a) =>
    a
    {- ^ /@provider@/: a 'GI.Gst.Objects.DeviceProvider.DeviceProvider' -}
    -> m Gst.Bus.Bus
    {- ^ __Returns:__ a 'GI.Gst.Objects.Bus.Bus' -}
deviceProviderGetBus provider = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    result <- gst_device_provider_get_bus provider'
    checkUnexpectedReturnNULL "deviceProviderGetBus" result
    result' <- (wrapObject Gst.Bus.Bus) result
    touchManagedPtr provider
    return result'

#if ENABLE_OVERLOADING
data DeviceProviderGetBusMethodInfo
instance (signature ~ (m Gst.Bus.Bus), MonadIO m, IsDeviceProvider a) => O.MethodInfo DeviceProviderGetBusMethodInfo a signature where
    overloadedMethod _ = deviceProviderGetBus

#endif

-- method DeviceProvider::get_devices
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GstDeviceProvider", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TGList (TInterface (Name {namespace = "Gst", name = "Device"})))
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_get_devices" gst_device_provider_get_devices ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    IO (Ptr (GList (Ptr Gst.Device.Device)))

{- |
Gets a list of devices that this provider understands. This may actually
probe the hardware if the provider is not currently started.

/Since: 1.4/
-}
deviceProviderGetDevices ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a) =>
    a
    {- ^ /@provider@/: A 'GI.Gst.Objects.DeviceProvider.DeviceProvider' -}
    -> m [Gst.Device.Device]
    {- ^ __Returns:__ a 'GI.GLib.Structs.List.List' of
  'GI.Gst.Objects.Device.Device' -}
deviceProviderGetDevices provider = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    result <- gst_device_provider_get_devices provider'
    result' <- unpackGList result
    result'' <- mapM (wrapObject Gst.Device.Device) result'
    g_list_free result
    touchManagedPtr provider
    return result''

#if ENABLE_OVERLOADING
data DeviceProviderGetDevicesMethodInfo
instance (signature ~ (m [Gst.Device.Device]), MonadIO m, IsDeviceProvider a) => O.MethodInfo DeviceProviderGetDevicesMethodInfo a signature where
    overloadedMethod _ = deviceProviderGetDevices

#endif

-- method DeviceProvider::get_factory
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProvider to request the device provider factory of.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gst", name = "DeviceProviderFactory"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_get_factory" gst_device_provider_get_factory ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    IO (Ptr Gst.DeviceProviderFactory.DeviceProviderFactory)

{- |
Retrieves the factory that was used to create this device provider.

/Since: 1.4/
-}
deviceProviderGetFactory ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a) =>
    a
    {- ^ /@provider@/: a 'GI.Gst.Objects.DeviceProvider.DeviceProvider' to request the device provider factory of. -}
    -> m Gst.DeviceProviderFactory.DeviceProviderFactory
    {- ^ __Returns:__ the 'GI.Gst.Objects.DeviceProviderFactory.DeviceProviderFactory' used for
    creating this device provider. no refcounting is needed. -}
deviceProviderGetFactory provider = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    result <- gst_device_provider_get_factory provider'
    checkUnexpectedReturnNULL "deviceProviderGetFactory" result
    result' <- (newObject Gst.DeviceProviderFactory.DeviceProviderFactory) result
    touchManagedPtr provider
    return result'

#if ENABLE_OVERLOADING
data DeviceProviderGetFactoryMethodInfo
instance (signature ~ (m Gst.DeviceProviderFactory.DeviceProviderFactory), MonadIO m, IsDeviceProvider a) => O.MethodInfo DeviceProviderGetFactoryMethodInfo a signature where
    overloadedMethod _ = deviceProviderGetFactory

#endif

-- method DeviceProvider::get_hidden_providers
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProvider", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TCArray True (-1) (-1) (TBasicType TUTF8))
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_get_hidden_providers" gst_device_provider_get_hidden_providers ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    IO (Ptr CString)

{- |
Get the provider factory names of the 'GI.Gst.Objects.DeviceProvider.DeviceProvider' instances that
are hidden by /@provider@/.

/Since: 1.6/
-}
deviceProviderGetHiddenProviders ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a) =>
    a
    {- ^ /@provider@/: a 'GI.Gst.Objects.DeviceProvider.DeviceProvider' -}
    -> m [T.Text]
    {- ^ __Returns:__ 
  a list of hidden providers factory names or 'Nothing' when
  nothing is hidden by /@provider@/. Free with g_strfreev. -}
deviceProviderGetHiddenProviders provider = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    result <- gst_device_provider_get_hidden_providers provider'
    checkUnexpectedReturnNULL "deviceProviderGetHiddenProviders" result
    result' <- unpackZeroTerminatedUTF8CArray result
    mapZeroTerminatedCArray freeMem result
    freeMem result
    touchManagedPtr provider
    return result'

#if ENABLE_OVERLOADING
data DeviceProviderGetHiddenProvidersMethodInfo
instance (signature ~ (m [T.Text]), MonadIO m, IsDeviceProvider a) => O.MethodInfo DeviceProviderGetHiddenProvidersMethodInfo a signature where
    overloadedMethod _ = deviceProviderGetHiddenProviders

#endif

-- method DeviceProvider::get_metadata
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "provider to get metadata for", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "key", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the key to get", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_get_metadata" gst_device_provider_get_metadata ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    CString ->                              -- key : TBasicType TUTF8
    IO CString

{- |
Get metadata with /@key@/ in /@provider@/.

/Since: 1.14/
-}
deviceProviderGetMetadata ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a) =>
    a
    {- ^ /@provider@/: provider to get metadata for -}
    -> T.Text
    {- ^ /@key@/: the key to get -}
    -> m T.Text
    {- ^ __Returns:__ the metadata for /@key@/. -}
deviceProviderGetMetadata provider key = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    key' <- textToCString key
    result <- gst_device_provider_get_metadata provider' key'
    checkUnexpectedReturnNULL "deviceProviderGetMetadata" result
    result' <- cstringToText result
    touchManagedPtr provider
    freeMem key'
    return result'

#if ENABLE_OVERLOADING
data DeviceProviderGetMetadataMethodInfo
instance (signature ~ (T.Text -> m T.Text), MonadIO m, IsDeviceProvider a) => O.MethodInfo DeviceProviderGetMetadataMethodInfo a signature where
    overloadedMethod _ = deviceProviderGetMetadata

#endif

-- method DeviceProvider::hide_provider
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProvider", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a provider factory name", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_hide_provider" gst_device_provider_hide_provider ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    CString ->                              -- name : TBasicType TUTF8
    IO ()

{- |
Make /@provider@/ hide the devices from the factory with /@name@/.

This function is used when /@provider@/ will also provide the devices reported
by provider factory /@name@/. A monitor should stop monitoring the
device provider with /@name@/ to avoid duplicate devices.

/Since: 1.6/
-}
deviceProviderHideProvider ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a) =>
    a
    {- ^ /@provider@/: a 'GI.Gst.Objects.DeviceProvider.DeviceProvider' -}
    -> T.Text
    {- ^ /@name@/: a provider factory name -}
    -> m ()
deviceProviderHideProvider provider name = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    name' <- textToCString name
    gst_device_provider_hide_provider provider' name'
    touchManagedPtr provider
    freeMem name'
    return ()

#if ENABLE_OVERLOADING
data DeviceProviderHideProviderMethodInfo
instance (signature ~ (T.Text -> m ()), MonadIO m, IsDeviceProvider a) => O.MethodInfo DeviceProviderHideProviderMethodInfo a signature where
    overloadedMethod _ = deviceProviderHideProvider

#endif

-- method DeviceProvider::start
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GstDeviceProvider", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_start" gst_device_provider_start ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    IO CInt

{- |
Starts providering the devices. This will cause @/GST_MESSAGE_DEVICE_ADDED/@
and @/GST_MESSAGE_DEVICE_REMOVED/@ messages to be posted on the provider\'s bus
when devices are added or removed from the system.

Since the 'GI.Gst.Objects.DeviceProvider.DeviceProvider' is a singleton,
'GI.Gst.Objects.DeviceProvider.deviceProviderStart' may already have been called by another
user of the object, 'GI.Gst.Objects.DeviceProvider.deviceProviderStop' needs to be called the same
number of times.

/Since: 1.4/
-}
deviceProviderStart ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a) =>
    a
    {- ^ /@provider@/: A 'GI.Gst.Objects.DeviceProvider.DeviceProvider' -}
    -> m Bool
    {- ^ __Returns:__ 'True' if the device providering could be started -}
deviceProviderStart provider = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    result <- gst_device_provider_start provider'
    let result' = (/= 0) result
    touchManagedPtr provider
    return result'

#if ENABLE_OVERLOADING
data DeviceProviderStartMethodInfo
instance (signature ~ (m Bool), MonadIO m, IsDeviceProvider a) => O.MethodInfo DeviceProviderStartMethodInfo a signature where
    overloadedMethod _ = deviceProviderStart

#endif

-- method DeviceProvider::stop
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GstDeviceProvider", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_stop" gst_device_provider_stop ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    IO ()

{- |
Decreases the use-count by one. If the use count reaches zero, this
'GI.Gst.Objects.DeviceProvider.DeviceProvider' will stop providering the devices. This needs to be
called the same number of times that 'GI.Gst.Objects.DeviceProvider.deviceProviderStart' was called.

/Since: 1.4/
-}
deviceProviderStop ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a) =>
    a
    {- ^ /@provider@/: A 'GI.Gst.Objects.DeviceProvider.DeviceProvider' -}
    -> m ()
deviceProviderStop provider = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    gst_device_provider_stop provider'
    touchManagedPtr provider
    return ()

#if ENABLE_OVERLOADING
data DeviceProviderStopMethodInfo
instance (signature ~ (m ()), MonadIO m, IsDeviceProvider a) => O.MethodInfo DeviceProviderStopMethodInfo a signature where
    overloadedMethod _ = deviceProviderStop

#endif

-- method DeviceProvider::unhide_provider
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "provider", argType = TInterface (Name {namespace = "Gst", name = "DeviceProvider"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDeviceProvider", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a provider factory name", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_unhide_provider" gst_device_provider_unhide_provider ::
    Ptr DeviceProvider ->                   -- provider : TInterface (Name {namespace = "Gst", name = "DeviceProvider"})
    CString ->                              -- name : TBasicType TUTF8
    IO ()

{- |
Make /@provider@/ unhide the devices from factory /@name@/.

This function is used when /@provider@/ will no longer provide the devices
reported by provider factory /@name@/. A monitor should start
monitoring the devices from provider factory /@name@/ in order to see
all devices again.

/Since: 1.6/
-}
deviceProviderUnhideProvider ::
    (B.CallStack.HasCallStack, MonadIO m, IsDeviceProvider a) =>
    a
    {- ^ /@provider@/: a 'GI.Gst.Objects.DeviceProvider.DeviceProvider' -}
    -> T.Text
    {- ^ /@name@/: a provider factory name -}
    -> m ()
deviceProviderUnhideProvider provider name = liftIO $ do
    provider' <- unsafeManagedPtrCastPtr provider
    name' <- textToCString name
    gst_device_provider_unhide_provider provider' name'
    touchManagedPtr provider
    freeMem name'
    return ()

#if ENABLE_OVERLOADING
data DeviceProviderUnhideProviderMethodInfo
instance (signature ~ (T.Text -> m ()), MonadIO m, IsDeviceProvider a) => O.MethodInfo DeviceProviderUnhideProviderMethodInfo a signature where
    overloadedMethod _ = deviceProviderUnhideProvider

#endif

-- method DeviceProvider::register
-- method type : MemberFunction
-- Args : [Arg {argCName = "plugin", argType = TInterface (Name {namespace = "Gst", name = "Plugin"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "#GstPlugin to register the device provider with, or %NULL for\n    a static device provider.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "name of device providers of this type", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "rank", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "rank of device provider (higher rank means more importance when autoplugging)", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "GType of device provider to register", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_device_provider_register" gst_device_provider_register ::
    Ptr Gst.Plugin.Plugin ->                -- plugin : TInterface (Name {namespace = "Gst", name = "Plugin"})
    CString ->                              -- name : TBasicType TUTF8
    Word32 ->                               -- rank : TBasicType TUInt
    CGType ->                               -- type : TBasicType TGType
    IO CInt

{- |
Create a new device providerfactory capable of instantiating objects of the
/@type@/ and add the factory to /@plugin@/.

/Since: 1.4/
-}
deviceProviderRegister ::
    (B.CallStack.HasCallStack, MonadIO m, Gst.Plugin.IsPlugin a) =>
    Maybe (a)
    {- ^ /@plugin@/: 'GI.Gst.Objects.Plugin.Plugin' to register the device provider with, or 'Nothing' for
    a static device provider. -}
    -> T.Text
    {- ^ /@name@/: name of device providers of this type -}
    -> Word32
    {- ^ /@rank@/: rank of device provider (higher rank means more importance when autoplugging) -}
    -> GType
    {- ^ /@type@/: GType of device provider to register -}
    -> m Bool
    {- ^ __Returns:__ 'True', if the registering succeeded, 'False' on error -}
deviceProviderRegister plugin name rank type_ = liftIO $ do
    maybePlugin <- case plugin of
        Nothing -> return nullPtr
        Just jPlugin -> do
            jPlugin' <- unsafeManagedPtrCastPtr jPlugin
            return jPlugin'
    name' <- textToCString name
    let type_' = gtypeToCGType type_
    result <- gst_device_provider_register maybePlugin name' rank type_'
    let result' = (/= 0) result
    whenJust plugin touchManagedPtr
    freeMem name'
    return result'

#if ENABLE_OVERLOADING
#endif