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

Provides a base class for CD digital audio (CDDA) sources, which handles
things like seeking, querying, discid calculation, tags, and buffer
timestamping.

== Using GstAudioCdSrc-based elements in applications

GstAudioCdSrc registers two 'GI.Gst.Enums.Format'\<!-- -->s of its own, namely
the \"track\" format and the \"sector\" format. Applications will usually
only find the \"track\" format interesting. You can retrieve that 'GI.Gst.Enums.Format'
for use in seek events or queries with gst_format_get_by_nick(\"track\").

In order to query the number of tracks, for example, an application would
set the CDDA source element to READY or PAUSED state and then query the
the number of tracks via 'GI.Gst.Objects.Element.elementQueryDuration' using the track
format acquired above. Applications can query the currently playing track
in the same way.

Alternatively, applications may retrieve the currently playing track and
the total number of tracks from the taglist that will posted on the bus
whenever the CD is opened or the currently playing track changes. The
taglist will contain GST_TAG_TRACK_NUMBER and GST_TAG_TRACK_COUNT tags.

Applications playing back CD audio using playbin and cdda:\/\/n URIs should
issue a seek command in track format to change between tracks, rather than
setting a new cdda:\/\/n+1 URI on playbin (as setting a new URI on playbin
involves closing and re-opening the CD device, which is much much slower).

== Tags and meta-information

CDDA sources will automatically emit a number of tags, details about which
can be found in the libgsttag documentation. Those tags are:
'GI.GstTag.Constants.TAG_CDDA_CDDB_DISCID', 'GI.GstTag.Constants.TAG_CDDA_CDDB_DISCID_FULL',
'GI.GstTag.Constants.TAG_CDDA_MUSICBRAINZ_DISCID', 'GI.GstTag.Constants.TAG_CDDA_MUSICBRAINZ_DISCID_FULL',
among others.

== Tracks and Table of Contents (TOC)

Applications will be informed of the available tracks via a TOC message
on the pipeline\'s 'GI.Gst.Objects.Bus.Bus'. The 'GI.Gst.Structs.Toc.Toc' will contain a 'GI.Gst.Structs.TocEntry.TocEntry' for
each track, with information about each track. The duration for each
track can be retrieved via the 'GI.Gst.Constants.TAG_DURATION' tag from each entry\'s
tag list, or calculated via 'GI.Gst.Structs.TocEntry.tocEntryGetStartStopTimes'.
The track entries in the TOC will be sorted by track number.
-}

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

module GI.GstAudio.Objects.AudioCdSrc
    (

-- * Exported types
    AudioCdSrc(..)                          ,
    IsAudioCdSrc                            ,
    toAudioCdSrc                            ,
    noAudioCdSrc                            ,


 -- * Methods
-- ** addTrack #method:addTrack#

#if ENABLE_OVERLOADING
    AudioCdSrcAddTrackMethodInfo            ,
#endif
    audioCdSrcAddTrack                      ,




 -- * Properties
-- ** device #attr:device#
{- | /No description available in the introspection data./
-}
#if ENABLE_OVERLOADING
    AudioCdSrcDevicePropertyInfo            ,
#endif
#if ENABLE_OVERLOADING
    audioCdSrcDevice                        ,
#endif
    clearAudioCdSrcDevice                   ,
    constructAudioCdSrcDevice               ,
    getAudioCdSrcDevice                     ,
    setAudioCdSrcDevice                     ,


-- ** mode #attr:mode#
{- | /No description available in the introspection data./
-}
#if ENABLE_OVERLOADING
    AudioCdSrcModePropertyInfo              ,
#endif
#if ENABLE_OVERLOADING
    audioCdSrcMode                          ,
#endif
    constructAudioCdSrcMode                 ,
    getAudioCdSrcMode                       ,
    setAudioCdSrcMode                       ,


-- ** track #attr:track#
{- | /No description available in the introspection data./
-}
#if ENABLE_OVERLOADING
    AudioCdSrcTrackPropertyInfo             ,
#endif
#if ENABLE_OVERLOADING
    audioCdSrcTrack                         ,
#endif
    constructAudioCdSrcTrack                ,
    getAudioCdSrcTrack                      ,
    setAudioCdSrcTrack                      ,




    ) 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.Interfaces.URIHandler as Gst.URIHandler
import qualified GI.Gst.Objects.Element as Gst.Element
import qualified GI.Gst.Objects.Object as Gst.Object
import {-# SOURCE #-} qualified GI.GstAudio.Enums as GstAudio.Enums
import {-# SOURCE #-} qualified GI.GstAudio.Structs.AudioCdSrcTrack as GstAudio.AudioCdSrcTrack
import qualified GI.GstBase.Objects.BaseSrc as GstBase.BaseSrc
import qualified GI.GstBase.Objects.PushSrc as GstBase.PushSrc

-- | Memory-managed wrapper type.
newtype AudioCdSrc = AudioCdSrc (ManagedPtr AudioCdSrc)
foreign import ccall "gst_audio_cd_src_get_type"
    c_gst_audio_cd_src_get_type :: IO GType

instance GObject AudioCdSrc where
    gobjectType = c_gst_audio_cd_src_get_type


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

instance O.HasParentTypes AudioCdSrc
type instance O.ParentTypes AudioCdSrc = '[GstBase.PushSrc.PushSrc, GstBase.BaseSrc.BaseSrc, Gst.Element.Element, Gst.Object.Object, GObject.Object.Object, Gst.URIHandler.URIHandler]

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

-- | A convenience alias for `Nothing` :: `Maybe` `AudioCdSrc`.
noAudioCdSrc :: Maybe AudioCdSrc
noAudioCdSrc = Nothing

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

instance (info ~ ResolveAudioCdSrcMethod t AudioCdSrc, O.MethodInfo info AudioCdSrc p) => OL.IsLabel t (AudioCdSrc -> 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 "device"
   -- Type: TBasicType TUTF8
   -- Flags: [PropertyReadable,PropertyWritable]
   -- Nullable: (Nothing,Nothing)

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

@
'Data.GI.Base.Attributes.get' audioCdSrc #device
@
-}
getAudioCdSrcDevice :: (MonadIO m, IsAudioCdSrc o) => o -> m (Maybe T.Text)
getAudioCdSrcDevice obj = liftIO $ B.Properties.getObjectPropertyString obj "device"

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

@
'Data.GI.Base.Attributes.set' audioCdSrc [ #device 'Data.GI.Base.Attributes.:=' value ]
@
-}
setAudioCdSrcDevice :: (MonadIO m, IsAudioCdSrc o) => o -> T.Text -> m ()
setAudioCdSrcDevice obj val = liftIO $ B.Properties.setObjectPropertyString obj "device" (Just val)

{- |
Construct a `GValueConstruct` with valid value for the “@device@” property. This is rarely needed directly, but it is used by `Data.GI.Base.Constructible.new`.
-}
constructAudioCdSrcDevice :: (IsAudioCdSrc o) => T.Text -> IO (GValueConstruct o)
constructAudioCdSrcDevice val = B.Properties.constructObjectPropertyString "device" (Just val)

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

@
'Data.GI.Base.Attributes.clear' #device
@
-}
clearAudioCdSrcDevice :: (MonadIO m, IsAudioCdSrc o) => o -> m ()
clearAudioCdSrcDevice obj = liftIO $ B.Properties.setObjectPropertyString obj "device" (Nothing :: Maybe T.Text)

#if ENABLE_OVERLOADING
data AudioCdSrcDevicePropertyInfo
instance AttrInfo AudioCdSrcDevicePropertyInfo where
    type AttrAllowedOps AudioCdSrcDevicePropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint AudioCdSrcDevicePropertyInfo = (~) T.Text
    type AttrBaseTypeConstraint AudioCdSrcDevicePropertyInfo = IsAudioCdSrc
    type AttrGetType AudioCdSrcDevicePropertyInfo = (Maybe T.Text)
    type AttrLabel AudioCdSrcDevicePropertyInfo = "device"
    type AttrOrigin AudioCdSrcDevicePropertyInfo = AudioCdSrc
    attrGet _ = getAudioCdSrcDevice
    attrSet _ = setAudioCdSrcDevice
    attrConstruct _ = constructAudioCdSrcDevice
    attrClear _ = clearAudioCdSrcDevice
#endif

-- VVV Prop "mode"
   -- Type: TInterface (Name {namespace = "GstAudio", name = "AudioCdSrcMode"})
   -- Flags: [PropertyReadable,PropertyWritable]
   -- Nullable: (Nothing,Nothing)

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

@
'Data.GI.Base.Attributes.get' audioCdSrc #mode
@
-}
getAudioCdSrcMode :: (MonadIO m, IsAudioCdSrc o) => o -> m GstAudio.Enums.AudioCdSrcMode
getAudioCdSrcMode obj = liftIO $ B.Properties.getObjectPropertyEnum obj "mode"

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

@
'Data.GI.Base.Attributes.set' audioCdSrc [ #mode 'Data.GI.Base.Attributes.:=' value ]
@
-}
setAudioCdSrcMode :: (MonadIO m, IsAudioCdSrc o) => o -> GstAudio.Enums.AudioCdSrcMode -> m ()
setAudioCdSrcMode obj val = liftIO $ B.Properties.setObjectPropertyEnum obj "mode" val

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

#if ENABLE_OVERLOADING
data AudioCdSrcModePropertyInfo
instance AttrInfo AudioCdSrcModePropertyInfo where
    type AttrAllowedOps AudioCdSrcModePropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint AudioCdSrcModePropertyInfo = (~) GstAudio.Enums.AudioCdSrcMode
    type AttrBaseTypeConstraint AudioCdSrcModePropertyInfo = IsAudioCdSrc
    type AttrGetType AudioCdSrcModePropertyInfo = GstAudio.Enums.AudioCdSrcMode
    type AttrLabel AudioCdSrcModePropertyInfo = "mode"
    type AttrOrigin AudioCdSrcModePropertyInfo = AudioCdSrc
    attrGet _ = getAudioCdSrcMode
    attrSet _ = setAudioCdSrcMode
    attrConstruct _ = constructAudioCdSrcMode
    attrClear _ = undefined
#endif

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

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

@
'Data.GI.Base.Attributes.get' audioCdSrc #track
@
-}
getAudioCdSrcTrack :: (MonadIO m, IsAudioCdSrc o) => o -> m Word32
getAudioCdSrcTrack obj = liftIO $ B.Properties.getObjectPropertyUInt32 obj "track"

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

@
'Data.GI.Base.Attributes.set' audioCdSrc [ #track 'Data.GI.Base.Attributes.:=' value ]
@
-}
setAudioCdSrcTrack :: (MonadIO m, IsAudioCdSrc o) => o -> Word32 -> m ()
setAudioCdSrcTrack obj val = liftIO $ B.Properties.setObjectPropertyUInt32 obj "track" val

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

#if ENABLE_OVERLOADING
data AudioCdSrcTrackPropertyInfo
instance AttrInfo AudioCdSrcTrackPropertyInfo where
    type AttrAllowedOps AudioCdSrcTrackPropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint AudioCdSrcTrackPropertyInfo = (~) Word32
    type AttrBaseTypeConstraint AudioCdSrcTrackPropertyInfo = IsAudioCdSrc
    type AttrGetType AudioCdSrcTrackPropertyInfo = Word32
    type AttrLabel AudioCdSrcTrackPropertyInfo = "track"
    type AttrOrigin AudioCdSrcTrackPropertyInfo = AudioCdSrc
    attrGet _ = getAudioCdSrcTrack
    attrSet _ = setAudioCdSrcTrack
    attrConstruct _ = constructAudioCdSrcTrack
    attrClear _ = undefined
#endif

#if ENABLE_OVERLOADING
instance O.HasAttributeList AudioCdSrc
type instance O.AttributeList AudioCdSrc = AudioCdSrcAttributeList
type AudioCdSrcAttributeList = ('[ '("blocksize", GstBase.BaseSrc.BaseSrcBlocksizePropertyInfo), '("device", AudioCdSrcDevicePropertyInfo), '("doTimestamp", GstBase.BaseSrc.BaseSrcDoTimestampPropertyInfo), '("mode", AudioCdSrcModePropertyInfo), '("name", Gst.Object.ObjectNamePropertyInfo), '("numBuffers", GstBase.BaseSrc.BaseSrcNumBuffersPropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo), '("track", AudioCdSrcTrackPropertyInfo), '("typefind", GstBase.BaseSrc.BaseSrcTypefindPropertyInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
audioCdSrcDevice :: AttrLabelProxy "device"
audioCdSrcDevice = AttrLabelProxy

audioCdSrcMode :: AttrLabelProxy "mode"
audioCdSrcMode = AttrLabelProxy

audioCdSrcTrack :: AttrLabelProxy "track"
audioCdSrcTrack = AttrLabelProxy

#endif

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

#endif

-- method AudioCdSrc::add_track
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "src", argType = TInterface (Name {namespace = "GstAudio", name = "AudioCdSrc"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstAudioCdSrc", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "track", argType = TInterface (Name {namespace = "GstAudio", name = "AudioCdSrcTrack"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "address of #GstAudioCdSrcTrack to add", 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_audio_cd_src_add_track" gst_audio_cd_src_add_track ::
    Ptr AudioCdSrc ->                       -- src : TInterface (Name {namespace = "GstAudio", name = "AudioCdSrc"})
    Ptr GstAudio.AudioCdSrcTrack.AudioCdSrcTrack -> -- track : TInterface (Name {namespace = "GstAudio", name = "AudioCdSrcTrack"})
    IO CInt

{- |
CDDA sources use this function from their start vfunc to announce the
available data and audio tracks to the base source class. The caller
should allocate /@track@/ on the stack, the base source will do a shallow
copy of the structure (and take ownership of the taglist if there is one).
-}
audioCdSrcAddTrack ::
    (B.CallStack.HasCallStack, MonadIO m, IsAudioCdSrc a) =>
    a
    {- ^ /@src@/: a 'GI.GstAudio.Objects.AudioCdSrc.AudioCdSrc' -}
    -> GstAudio.AudioCdSrcTrack.AudioCdSrcTrack
    {- ^ /@track@/: address of 'GI.GstAudio.Structs.AudioCdSrcTrack.AudioCdSrcTrack' to add -}
    -> m Bool
    {- ^ __Returns:__ FALSE on error, otherwise TRUE. -}
audioCdSrcAddTrack src track = liftIO $ do
    src' <- unsafeManagedPtrCastPtr src
    track' <- unsafeManagedPtrGetPtr track
    result <- gst_audio_cd_src_add_track src' track'
    let result' = (/= 0) result
    touchManagedPtr src
    touchManagedPtr track
    return result'

#if ENABLE_OVERLOADING
data AudioCdSrcAddTrackMethodInfo
instance (signature ~ (GstAudio.AudioCdSrcTrack.AudioCdSrcTrack -> m Bool), MonadIO m, IsAudioCdSrc a) => O.MethodInfo AudioCdSrcAddTrackMethodInfo a signature where
    overloadedMethod _ = audioCdSrcAddTrack

#endif