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

\<para>
Provides a base class for CD digital audio (CDDA) sources, which handles
things like seeking, querying, discid calculation, tags, and buffer
timestamping.
\<\/para>
\<refsect2>
\<title>Using GstAudioCdSrc-based elements in applications\<\/title>
\<para>
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\").
\<\/para>
\<para>
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.
\<\/para>
\<para>
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.
\<\/para>
\<para>
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).
\<\/para>
\<refsect2>
\<\/refsect2>
\<title>Tags and meta-information\<\/title>
\<para>
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.
\<\/para>
\<\/refsect2>
\<refsect2>
\<title>Tracks and Table of Contents (TOC)\<\/title>
\<para>
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.
\<\/para>
\<\/refsect2>
-}

module GI.GstAudio.Objects.AudioCdSrc
    ( 

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


 -- * Methods
-- ** addTrack #method:addTrack#
    AudioCdSrcAddTrackMethodInfo            ,
    audioCdSrcAddTrack                      ,




 -- * Properties
-- ** device #attr:device#
    AudioCdSrcDevicePropertyInfo            ,
    audioCdSrcDevice                        ,
    clearAudioCdSrcDevice                   ,
    constructAudioCdSrcDevice               ,
    getAudioCdSrcDevice                     ,
    setAudioCdSrcDevice                     ,


-- ** mode #attr:mode#
    AudioCdSrcModePropertyInfo              ,
    audioCdSrcMode                          ,
    constructAudioCdSrcMode                 ,
    getAudioCdSrcMode                       ,
    setAudioCdSrcMode                       ,


-- ** track #attr:track#
    AudioCdSrcTrackPropertyInfo             ,
    audioCdSrcTrack                         ,
    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.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP

import qualified GI.GObject.Objects.Object as GObject.Object
import qualified GI.Gst.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

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
    

class GObject o => IsAudioCdSrc o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError AudioCdSrc a) =>
    IsAudioCdSrc a
#endif
instance IsAudioCdSrc AudioCdSrc
instance GstBase.PushSrc.IsPushSrc AudioCdSrc
instance GstBase.BaseSrc.IsBaseSrc AudioCdSrc
instance Gst.Element.IsElement AudioCdSrc
instance Gst.Object.IsObject AudioCdSrc
instance GObject.Object.IsObject AudioCdSrc
instance Gst.URIHandler.IsURIHandler AudioCdSrc

toAudioCdSrc :: IsAudioCdSrc o => o -> IO AudioCdSrc
toAudioCdSrc = unsafeCastTo AudioCdSrc

noAudioCdSrc :: Maybe AudioCdSrc
noAudioCdSrc = Nothing

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 "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    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 "replaceData" o = GObject.Object.ObjectReplaceDataMethodInfo
    ResolveAudioCdSrcMethod "replaceQdata" o = GObject.Object.ObjectReplaceQdataMethodInfo
    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 "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 "getName" o = Gst.Object.ObjectGetNameMethodInfo
    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 "getValueArray" o = Gst.Object.ObjectGetValueArrayMethodInfo
    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) => O.IsLabelProxy t (AudioCdSrc -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveAudioCdSrcMethod t AudioCdSrc, O.MethodInfo info AudioCdSrc p) => O.IsLabel t (AudioCdSrc -> p) where
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

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

getAudioCdSrcDevice :: (MonadIO m, IsAudioCdSrc o) => o -> m (Maybe T.Text)
getAudioCdSrcDevice obj = liftIO $ getObjectPropertyString obj "device"

setAudioCdSrcDevice :: (MonadIO m, IsAudioCdSrc o) => o -> T.Text -> m ()
setAudioCdSrcDevice obj val = liftIO $ setObjectPropertyString obj "device" (Just val)

constructAudioCdSrcDevice :: (IsAudioCdSrc o) => T.Text -> IO (GValueConstruct o)
constructAudioCdSrcDevice val = constructObjectPropertyString "device" (Just val)

clearAudioCdSrcDevice :: (MonadIO m, IsAudioCdSrc o) => o -> m ()
clearAudioCdSrcDevice obj = liftIO $ setObjectPropertyString obj "device" (Nothing :: Maybe T.Text)

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

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

getAudioCdSrcMode :: (MonadIO m, IsAudioCdSrc o) => o -> m GstAudio.Enums.AudioCdSrcMode
getAudioCdSrcMode obj = liftIO $ getObjectPropertyEnum obj "mode"

setAudioCdSrcMode :: (MonadIO m, IsAudioCdSrc o) => o -> GstAudio.Enums.AudioCdSrcMode -> m ()
setAudioCdSrcMode obj val = liftIO $ setObjectPropertyEnum obj "mode" val

constructAudioCdSrcMode :: (IsAudioCdSrc o) => GstAudio.Enums.AudioCdSrcMode -> IO (GValueConstruct o)
constructAudioCdSrcMode val = constructObjectPropertyEnum "mode" val

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

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

getAudioCdSrcTrack :: (MonadIO m, IsAudioCdSrc o) => o -> m Word32
getAudioCdSrcTrack obj = liftIO $ getObjectPropertyUInt32 obj "track"

setAudioCdSrcTrack :: (MonadIO m, IsAudioCdSrc o) => o -> Word32 -> m ()
setAudioCdSrcTrack obj val = liftIO $ setObjectPropertyUInt32 obj "track" val

constructAudioCdSrcTrack :: (IsAudioCdSrc o) => Word32 -> IO (GValueConstruct o)
constructAudioCdSrcTrack val = constructObjectPropertyUInt32 "track" val

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

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, *)])

audioCdSrcDevice :: AttrLabelProxy "device"
audioCdSrcDevice = AttrLabelProxy

audioCdSrcMode :: AttrLabelProxy "mode"
audioCdSrcMode = AttrLabelProxy

audioCdSrcTrack :: AttrLabelProxy "track"
audioCdSrcTrack = AttrLabelProxy

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, *)])

-- 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'

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