{- | Copyright : Will Thompson, Iñaki García Etxebarria and Jonas Platte License : LGPL-2.1 Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc) This is the most simple base class for audio sinks that only requires subclasses to implement a set of simple functions: * @open()@ :Open the device. * @prepare()@ :Configure the device with the specified format. * @write()@ :Write samples to the device. * @reset()@ :Unblock writes and flush the device. * @delay()@ :Get the number of samples written but not yet played by the device. * @unprepare()@ :Undo operations done by prepare. * @close()@ :Close the device. All scheduling of samples and timestamps is done in this base class together with 'GI.GstAudio.Objects.AudioBaseSink.AudioBaseSink' using a default implementation of a 'GI.GstAudio.Objects.AudioRingBuffer.AudioRingBuffer' that uses threads. -} #define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \ && !defined(__HADDOCK_VERSION__)) module GI.GstAudio.Objects.AudioSink ( -- * Exported types AudioSink(..) , IsAudioSink , toAudioSink , noAudioSink , ) where import Data.GI.Base.ShortPrelude import qualified Data.GI.Base.ShortPrelude as SP import qualified Data.GI.Base.Overloading as O import qualified Prelude as P import qualified Data.GI.Base.Attributes as GI.Attributes import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr import qualified Data.GI.Base.GClosure as B.GClosure import qualified Data.GI.Base.GError as B.GError import qualified Data.GI.Base.GVariant as B.GVariant import qualified Data.GI.Base.GValue as B.GValue import qualified Data.GI.Base.GParamSpec as B.GParamSpec import qualified Data.GI.Base.CallStack as B.CallStack import qualified Data.GI.Base.Properties as B.Properties import qualified Data.Text as T import qualified Data.ByteString.Char8 as B import qualified Data.Map as Map import qualified Foreign.Ptr as FP import qualified GHC.OverloadedLabels as OL import qualified GI.GObject.Objects.Object as GObject.Object import qualified GI.Gst.Objects.Element as Gst.Element import qualified GI.Gst.Objects.Object as Gst.Object import {-# SOURCE #-} qualified GI.GstAudio.Objects.AudioBaseSink as GstAudio.AudioBaseSink import qualified GI.GstBase.Objects.BaseSink as GstBase.BaseSink -- | Memory-managed wrapper type. newtype AudioSink = AudioSink (ManagedPtr AudioSink) foreign import ccall "gst_audio_sink_get_type" c_gst_audio_sink_get_type :: IO GType instance GObject AudioSink where gobjectType = c_gst_audio_sink_get_type -- | Type class for types which can be safely cast to `AudioSink`, for instance with `toAudioSink`. class (GObject o, O.IsDescendantOf AudioSink o) => IsAudioSink o instance (GObject o, O.IsDescendantOf AudioSink o) => IsAudioSink o instance O.HasParentTypes AudioSink type instance O.ParentTypes AudioSink = '[GstAudio.AudioBaseSink.AudioBaseSink, GstBase.BaseSink.BaseSink, Gst.Element.Element, Gst.Object.Object, GObject.Object.Object] -- | Cast to `AudioSink`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`. toAudioSink :: (MonadIO m, IsAudioSink o) => o -> m AudioSink toAudioSink = liftIO . unsafeCastTo AudioSink -- | A convenience alias for `Nothing` :: `Maybe` `AudioSink`. noAudioSink :: Maybe AudioSink noAudioSink = Nothing #if ENABLE_OVERLOADING type family ResolveAudioSinkMethod (t :: Symbol) (o :: *) :: * where ResolveAudioSinkMethod "abortState" o = Gst.Element.ElementAbortStateMethodInfo ResolveAudioSinkMethod "addControlBinding" o = Gst.Object.ObjectAddControlBindingMethodInfo ResolveAudioSinkMethod "addPad" o = Gst.Element.ElementAddPadMethodInfo ResolveAudioSinkMethod "addPropertyDeepNotifyWatch" o = Gst.Element.ElementAddPropertyDeepNotifyWatchMethodInfo ResolveAudioSinkMethod "addPropertyNotifyWatch" o = Gst.Element.ElementAddPropertyNotifyWatchMethodInfo ResolveAudioSinkMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo ResolveAudioSinkMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo ResolveAudioSinkMethod "callAsync" o = Gst.Element.ElementCallAsyncMethodInfo ResolveAudioSinkMethod "changeState" o = Gst.Element.ElementChangeStateMethodInfo ResolveAudioSinkMethod "continueState" o = Gst.Element.ElementContinueStateMethodInfo ResolveAudioSinkMethod "createAllPads" o = Gst.Element.ElementCreateAllPadsMethodInfo ResolveAudioSinkMethod "createRingbuffer" o = GstAudio.AudioBaseSink.AudioBaseSinkCreateRingbufferMethodInfo ResolveAudioSinkMethod "defaultError" o = Gst.Object.ObjectDefaultErrorMethodInfo ResolveAudioSinkMethod "doPreroll" o = GstBase.BaseSink.BaseSinkDoPrerollMethodInfo ResolveAudioSinkMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo ResolveAudioSinkMethod "foreachPad" o = Gst.Element.ElementForeachPadMethodInfo ResolveAudioSinkMethod "foreachSinkPad" o = Gst.Element.ElementForeachSinkPadMethodInfo ResolveAudioSinkMethod "foreachSrcPad" o = Gst.Element.ElementForeachSrcPadMethodInfo ResolveAudioSinkMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo ResolveAudioSinkMethod "getv" o = GObject.Object.ObjectGetvMethodInfo ResolveAudioSinkMethod "hasActiveControlBindings" o = Gst.Object.ObjectHasActiveControlBindingsMethodInfo ResolveAudioSinkMethod "hasAncestor" o = Gst.Object.ObjectHasAncestorMethodInfo ResolveAudioSinkMethod "hasAsAncestor" o = Gst.Object.ObjectHasAsAncestorMethodInfo ResolveAudioSinkMethod "hasAsParent" o = Gst.Object.ObjectHasAsParentMethodInfo ResolveAudioSinkMethod "isAsyncEnabled" o = GstBase.BaseSink.BaseSinkIsAsyncEnabledMethodInfo ResolveAudioSinkMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo ResolveAudioSinkMethod "isLastSampleEnabled" o = GstBase.BaseSink.BaseSinkIsLastSampleEnabledMethodInfo ResolveAudioSinkMethod "isLockedState" o = Gst.Element.ElementIsLockedStateMethodInfo ResolveAudioSinkMethod "isQosEnabled" o = GstBase.BaseSink.BaseSinkIsQosEnabledMethodInfo ResolveAudioSinkMethod "iteratePads" o = Gst.Element.ElementIteratePadsMethodInfo ResolveAudioSinkMethod "iterateSinkPads" o = Gst.Element.ElementIterateSinkPadsMethodInfo ResolveAudioSinkMethod "iterateSrcPads" o = Gst.Element.ElementIterateSrcPadsMethodInfo ResolveAudioSinkMethod "link" o = Gst.Element.ElementLinkMethodInfo ResolveAudioSinkMethod "linkFiltered" o = Gst.Element.ElementLinkFilteredMethodInfo ResolveAudioSinkMethod "linkPads" o = Gst.Element.ElementLinkPadsMethodInfo ResolveAudioSinkMethod "linkPadsFiltered" o = Gst.Element.ElementLinkPadsFilteredMethodInfo ResolveAudioSinkMethod "linkPadsFull" o = Gst.Element.ElementLinkPadsFullMethodInfo ResolveAudioSinkMethod "lostState" o = Gst.Element.ElementLostStateMethodInfo ResolveAudioSinkMethod "messageFull" o = Gst.Element.ElementMessageFullMethodInfo ResolveAudioSinkMethod "messageFullWithDetails" o = Gst.Element.ElementMessageFullWithDetailsMethodInfo ResolveAudioSinkMethod "noMorePads" o = Gst.Element.ElementNoMorePadsMethodInfo ResolveAudioSinkMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo ResolveAudioSinkMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo ResolveAudioSinkMethod "postMessage" o = Gst.Element.ElementPostMessageMethodInfo ResolveAudioSinkMethod "provideClock" o = Gst.Element.ElementProvideClockMethodInfo ResolveAudioSinkMethod "query" o = Gst.Element.ElementQueryMethodInfo ResolveAudioSinkMethod "queryConvert" o = Gst.Element.ElementQueryConvertMethodInfo ResolveAudioSinkMethod "queryDuration" o = Gst.Element.ElementQueryDurationMethodInfo ResolveAudioSinkMethod "queryLatency" o = GstBase.BaseSink.BaseSinkQueryLatencyMethodInfo ResolveAudioSinkMethod "queryPosition" o = Gst.Element.ElementQueryPositionMethodInfo ResolveAudioSinkMethod "ref" o = Gst.Object.ObjectRefMethodInfo ResolveAudioSinkMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo ResolveAudioSinkMethod "releaseRequestPad" o = Gst.Element.ElementReleaseRequestPadMethodInfo ResolveAudioSinkMethod "removeControlBinding" o = Gst.Object.ObjectRemoveControlBindingMethodInfo ResolveAudioSinkMethod "removePad" o = Gst.Element.ElementRemovePadMethodInfo ResolveAudioSinkMethod "removePropertyNotifyWatch" o = Gst.Element.ElementRemovePropertyNotifyWatchMethodInfo ResolveAudioSinkMethod "reportDeviceFailure" o = GstAudio.AudioBaseSink.AudioBaseSinkReportDeviceFailureMethodInfo ResolveAudioSinkMethod "requestPad" o = Gst.Element.ElementRequestPadMethodInfo ResolveAudioSinkMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo ResolveAudioSinkMethod "seek" o = Gst.Element.ElementSeekMethodInfo ResolveAudioSinkMethod "seekSimple" o = Gst.Element.ElementSeekSimpleMethodInfo ResolveAudioSinkMethod "sendEvent" o = Gst.Element.ElementSendEventMethodInfo ResolveAudioSinkMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo ResolveAudioSinkMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo ResolveAudioSinkMethod "suggestNextSync" o = Gst.Object.ObjectSuggestNextSyncMethodInfo ResolveAudioSinkMethod "syncStateWithParent" o = Gst.Element.ElementSyncStateWithParentMethodInfo ResolveAudioSinkMethod "syncValues" o = Gst.Object.ObjectSyncValuesMethodInfo ResolveAudioSinkMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo ResolveAudioSinkMethod "unlink" o = Gst.Element.ElementUnlinkMethodInfo ResolveAudioSinkMethod "unlinkPads" o = Gst.Element.ElementUnlinkPadsMethodInfo ResolveAudioSinkMethod "unparent" o = Gst.Object.ObjectUnparentMethodInfo ResolveAudioSinkMethod "unref" o = Gst.Object.ObjectUnrefMethodInfo ResolveAudioSinkMethod "wait" o = GstBase.BaseSink.BaseSinkWaitMethodInfo ResolveAudioSinkMethod "waitClock" o = GstBase.BaseSink.BaseSinkWaitClockMethodInfo ResolveAudioSinkMethod "waitPreroll" o = GstBase.BaseSink.BaseSinkWaitPrerollMethodInfo ResolveAudioSinkMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo ResolveAudioSinkMethod "getAlignmentThreshold" o = GstAudio.AudioBaseSink.AudioBaseSinkGetAlignmentThresholdMethodInfo ResolveAudioSinkMethod "getBaseTime" o = Gst.Element.ElementGetBaseTimeMethodInfo ResolveAudioSinkMethod "getBlocksize" o = GstBase.BaseSink.BaseSinkGetBlocksizeMethodInfo ResolveAudioSinkMethod "getBus" o = Gst.Element.ElementGetBusMethodInfo ResolveAudioSinkMethod "getClock" o = Gst.Element.ElementGetClockMethodInfo ResolveAudioSinkMethod "getCompatiblePad" o = Gst.Element.ElementGetCompatiblePadMethodInfo ResolveAudioSinkMethod "getCompatiblePadTemplate" o = Gst.Element.ElementGetCompatiblePadTemplateMethodInfo ResolveAudioSinkMethod "getContext" o = Gst.Element.ElementGetContextMethodInfo ResolveAudioSinkMethod "getContextUnlocked" o = Gst.Element.ElementGetContextUnlockedMethodInfo ResolveAudioSinkMethod "getContexts" o = Gst.Element.ElementGetContextsMethodInfo ResolveAudioSinkMethod "getControlBinding" o = Gst.Object.ObjectGetControlBindingMethodInfo ResolveAudioSinkMethod "getControlRate" o = Gst.Object.ObjectGetControlRateMethodInfo ResolveAudioSinkMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo ResolveAudioSinkMethod "getDiscontWait" o = GstAudio.AudioBaseSink.AudioBaseSinkGetDiscontWaitMethodInfo ResolveAudioSinkMethod "getDriftTolerance" o = GstAudio.AudioBaseSink.AudioBaseSinkGetDriftToleranceMethodInfo ResolveAudioSinkMethod "getDropOutOfSegment" o = GstBase.BaseSink.BaseSinkGetDropOutOfSegmentMethodInfo ResolveAudioSinkMethod "getFactory" o = Gst.Element.ElementGetFactoryMethodInfo ResolveAudioSinkMethod "getGValueArray" o = Gst.Object.ObjectGetGValueArrayMethodInfo ResolveAudioSinkMethod "getLastSample" o = GstBase.BaseSink.BaseSinkGetLastSampleMethodInfo ResolveAudioSinkMethod "getLatency" o = GstBase.BaseSink.BaseSinkGetLatencyMethodInfo ResolveAudioSinkMethod "getMaxBitrate" o = GstBase.BaseSink.BaseSinkGetMaxBitrateMethodInfo ResolveAudioSinkMethod "getMaxLateness" o = GstBase.BaseSink.BaseSinkGetMaxLatenessMethodInfo ResolveAudioSinkMethod "getMetadata" o = Gst.Element.ElementGetMetadataMethodInfo ResolveAudioSinkMethod "getName" o = Gst.Object.ObjectGetNameMethodInfo ResolveAudioSinkMethod "getPadTemplate" o = Gst.Element.ElementGetPadTemplateMethodInfo ResolveAudioSinkMethod "getPadTemplateList" o = Gst.Element.ElementGetPadTemplateListMethodInfo ResolveAudioSinkMethod "getParent" o = Gst.Object.ObjectGetParentMethodInfo ResolveAudioSinkMethod "getPathString" o = Gst.Object.ObjectGetPathStringMethodInfo ResolveAudioSinkMethod "getProcessingDeadline" o = GstBase.BaseSink.BaseSinkGetProcessingDeadlineMethodInfo ResolveAudioSinkMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo ResolveAudioSinkMethod "getProvideClock" o = GstAudio.AudioBaseSink.AudioBaseSinkGetProvideClockMethodInfo ResolveAudioSinkMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo ResolveAudioSinkMethod "getRenderDelay" o = GstBase.BaseSink.BaseSinkGetRenderDelayMethodInfo ResolveAudioSinkMethod "getRequestPad" o = Gst.Element.ElementGetRequestPadMethodInfo ResolveAudioSinkMethod "getSlaveMethod" o = GstAudio.AudioBaseSink.AudioBaseSinkGetSlaveMethodMethodInfo ResolveAudioSinkMethod "getStartTime" o = Gst.Element.ElementGetStartTimeMethodInfo ResolveAudioSinkMethod "getState" o = Gst.Element.ElementGetStateMethodInfo ResolveAudioSinkMethod "getStaticPad" o = Gst.Element.ElementGetStaticPadMethodInfo ResolveAudioSinkMethod "getSync" o = GstBase.BaseSink.BaseSinkGetSyncMethodInfo ResolveAudioSinkMethod "getThrottleTime" o = GstBase.BaseSink.BaseSinkGetThrottleTimeMethodInfo ResolveAudioSinkMethod "getTsOffset" o = GstBase.BaseSink.BaseSinkGetTsOffsetMethodInfo ResolveAudioSinkMethod "getValue" o = Gst.Object.ObjectGetValueMethodInfo ResolveAudioSinkMethod "setAlignmentThreshold" o = GstAudio.AudioBaseSink.AudioBaseSinkSetAlignmentThresholdMethodInfo ResolveAudioSinkMethod "setAsyncEnabled" o = GstBase.BaseSink.BaseSinkSetAsyncEnabledMethodInfo ResolveAudioSinkMethod "setBaseTime" o = Gst.Element.ElementSetBaseTimeMethodInfo ResolveAudioSinkMethod "setBlocksize" o = GstBase.BaseSink.BaseSinkSetBlocksizeMethodInfo ResolveAudioSinkMethod "setBus" o = Gst.Element.ElementSetBusMethodInfo ResolveAudioSinkMethod "setClock" o = Gst.Element.ElementSetClockMethodInfo ResolveAudioSinkMethod "setContext" o = Gst.Element.ElementSetContextMethodInfo ResolveAudioSinkMethod "setControlBindingDisabled" o = Gst.Object.ObjectSetControlBindingDisabledMethodInfo ResolveAudioSinkMethod "setControlBindingsDisabled" o = Gst.Object.ObjectSetControlBindingsDisabledMethodInfo ResolveAudioSinkMethod "setControlRate" o = Gst.Object.ObjectSetControlRateMethodInfo ResolveAudioSinkMethod "setCustomSlavingCallback" o = GstAudio.AudioBaseSink.AudioBaseSinkSetCustomSlavingCallbackMethodInfo ResolveAudioSinkMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo ResolveAudioSinkMethod "setDiscontWait" o = GstAudio.AudioBaseSink.AudioBaseSinkSetDiscontWaitMethodInfo ResolveAudioSinkMethod "setDriftTolerance" o = GstAudio.AudioBaseSink.AudioBaseSinkSetDriftToleranceMethodInfo ResolveAudioSinkMethod "setDropOutOfSegment" o = GstBase.BaseSink.BaseSinkSetDropOutOfSegmentMethodInfo ResolveAudioSinkMethod "setLastSampleEnabled" o = GstBase.BaseSink.BaseSinkSetLastSampleEnabledMethodInfo ResolveAudioSinkMethod "setLockedState" o = Gst.Element.ElementSetLockedStateMethodInfo ResolveAudioSinkMethod "setMaxBitrate" o = GstBase.BaseSink.BaseSinkSetMaxBitrateMethodInfo ResolveAudioSinkMethod "setMaxLateness" o = GstBase.BaseSink.BaseSinkSetMaxLatenessMethodInfo ResolveAudioSinkMethod "setName" o = Gst.Object.ObjectSetNameMethodInfo ResolveAudioSinkMethod "setParent" o = Gst.Object.ObjectSetParentMethodInfo ResolveAudioSinkMethod "setProcessingDeadline" o = GstBase.BaseSink.BaseSinkSetProcessingDeadlineMethodInfo ResolveAudioSinkMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo ResolveAudioSinkMethod "setProvideClock" o = GstAudio.AudioBaseSink.AudioBaseSinkSetProvideClockMethodInfo ResolveAudioSinkMethod "setQosEnabled" o = GstBase.BaseSink.BaseSinkSetQosEnabledMethodInfo ResolveAudioSinkMethod "setRenderDelay" o = GstBase.BaseSink.BaseSinkSetRenderDelayMethodInfo ResolveAudioSinkMethod "setSlaveMethod" o = GstAudio.AudioBaseSink.AudioBaseSinkSetSlaveMethodMethodInfo ResolveAudioSinkMethod "setStartTime" o = Gst.Element.ElementSetStartTimeMethodInfo ResolveAudioSinkMethod "setState" o = Gst.Element.ElementSetStateMethodInfo ResolveAudioSinkMethod "setSync" o = GstBase.BaseSink.BaseSinkSetSyncMethodInfo ResolveAudioSinkMethod "setThrottleTime" o = GstBase.BaseSink.BaseSinkSetThrottleTimeMethodInfo ResolveAudioSinkMethod "setTsOffset" o = GstBase.BaseSink.BaseSinkSetTsOffsetMethodInfo ResolveAudioSinkMethod l o = O.MethodResolutionFailed l o instance (info ~ ResolveAudioSinkMethod t AudioSink, O.MethodInfo info AudioSink p) => OL.IsLabel t (AudioSink -> p) where #if MIN_VERSION_base(4,10,0) fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info) #else fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info) #endif #endif #if ENABLE_OVERLOADING instance O.HasAttributeList AudioSink type instance O.AttributeList AudioSink = AudioSinkAttributeList type AudioSinkAttributeList = ('[ '("alignmentThreshold", GstAudio.AudioBaseSink.AudioBaseSinkAlignmentThresholdPropertyInfo), '("async", GstBase.BaseSink.BaseSinkAsyncPropertyInfo), '("blocksize", GstBase.BaseSink.BaseSinkBlocksizePropertyInfo), '("bufferTime", GstAudio.AudioBaseSink.AudioBaseSinkBufferTimePropertyInfo), '("canActivatePull", GstAudio.AudioBaseSink.AudioBaseSinkCanActivatePullPropertyInfo), '("discontWait", GstAudio.AudioBaseSink.AudioBaseSinkDiscontWaitPropertyInfo), '("driftTolerance", GstAudio.AudioBaseSink.AudioBaseSinkDriftTolerancePropertyInfo), '("enableLastSample", GstBase.BaseSink.BaseSinkEnableLastSamplePropertyInfo), '("lastSample", GstBase.BaseSink.BaseSinkLastSamplePropertyInfo), '("latencyTime", GstAudio.AudioBaseSink.AudioBaseSinkLatencyTimePropertyInfo), '("maxBitrate", GstBase.BaseSink.BaseSinkMaxBitratePropertyInfo), '("maxLateness", GstBase.BaseSink.BaseSinkMaxLatenessPropertyInfo), '("name", Gst.Object.ObjectNamePropertyInfo), '("parent", Gst.Object.ObjectParentPropertyInfo), '("processingDeadline", GstBase.BaseSink.BaseSinkProcessingDeadlinePropertyInfo), '("provideClock", GstAudio.AudioBaseSink.AudioBaseSinkProvideClockPropertyInfo), '("qos", GstBase.BaseSink.BaseSinkQosPropertyInfo), '("renderDelay", GstBase.BaseSink.BaseSinkRenderDelayPropertyInfo), '("slaveMethod", GstAudio.AudioBaseSink.AudioBaseSinkSlaveMethodPropertyInfo), '("sync", GstBase.BaseSink.BaseSinkSyncPropertyInfo), '("throttleTime", GstBase.BaseSink.BaseSinkThrottleTimePropertyInfo), '("tsOffset", GstBase.BaseSink.BaseSinkTsOffsetPropertyInfo)] :: [(Symbol, *)]) #endif #if ENABLE_OVERLOADING #endif #if ENABLE_OVERLOADING type instance O.SignalList AudioSink = AudioSinkSignalList type AudioSinkSignalList = ('[ '("deepNotify", Gst.Object.ObjectDeepNotifySignalInfo), '("noMorePads", Gst.Element.ElementNoMorePadsSignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo), '("padAdded", Gst.Element.ElementPadAddedSignalInfo), '("padRemoved", Gst.Element.ElementPadRemovedSignalInfo)] :: [(Symbol, *)]) #endif