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

/No description available in the introspection data./
-}

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

module GI.GstAudio.Structs.AudioChannelMixer
    (

-- * Exported types
    AudioChannelMixer(..)                   ,
    noAudioChannelMixer                     ,


 -- * Methods
-- ** free #method:free#

#if ENABLE_OVERLOADING
    AudioChannelMixerFreeMethodInfo         ,
#endif
    audioChannelMixerFree                   ,


-- ** isPassthrough #method:isPassthrough#

#if ENABLE_OVERLOADING
    AudioChannelMixerIsPassthroughMethodInfo,
#endif
    audioChannelMixerIsPassthrough          ,


-- ** samples #method:samples#

#if ENABLE_OVERLOADING
    AudioChannelMixerSamplesMethodInfo      ,
#endif
    audioChannelMixerSamples                ,




    ) 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


-- | Memory-managed wrapper type.
newtype AudioChannelMixer = AudioChannelMixer (ManagedPtr AudioChannelMixer)
-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
instance WrappedPtr AudioChannelMixer where
    wrappedPtrCalloc = return nullPtr
    wrappedPtrCopy = return
    wrappedPtrFree = Nothing

-- | A convenience alias for `Nothing` :: `Maybe` `AudioChannelMixer`.
noAudioChannelMixer :: Maybe AudioChannelMixer
noAudioChannelMixer = Nothing


#if ENABLE_OVERLOADING
instance O.HasAttributeList AudioChannelMixer
type instance O.AttributeList AudioChannelMixer = AudioChannelMixerAttributeList
type AudioChannelMixerAttributeList = ('[ ] :: [(Symbol, *)])
#endif

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

foreign import ccall "gst_audio_channel_mixer_free" gst_audio_channel_mixer_free ::
    Ptr AudioChannelMixer ->                -- mix : TInterface (Name {namespace = "GstAudio", name = "AudioChannelMixer"})
    IO ()

{- |
Free memory allocated by /@mix@/.
-}
audioChannelMixerFree ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    AudioChannelMixer
    {- ^ /@mix@/: a 'GI.GstAudio.Structs.AudioChannelMixer.AudioChannelMixer' -}
    -> m ()
audioChannelMixerFree mix = liftIO $ do
    mix' <- unsafeManagedPtrGetPtr mix
    gst_audio_channel_mixer_free mix'
    touchManagedPtr mix
    return ()

#if ENABLE_OVERLOADING
data AudioChannelMixerFreeMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo AudioChannelMixerFreeMethodInfo AudioChannelMixer signature where
    overloadedMethod _ = audioChannelMixerFree

#endif

-- method AudioChannelMixer::is_passthrough
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "mix", argType = TInterface (Name {namespace = "GstAudio", name = "AudioChannelMixer"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstAudioChannelMixer", 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_channel_mixer_is_passthrough" gst_audio_channel_mixer_is_passthrough ::
    Ptr AudioChannelMixer ->                -- mix : TInterface (Name {namespace = "GstAudio", name = "AudioChannelMixer"})
    IO CInt

{- |
Check if /@mix@/ is in passthrough.

Only N x N mix identity matrices are considered passthrough,
this is determined by comparing the contents of the matrix
with 0.0 and 1.0.

As this is floating point comparisons, if the values have been
generated, they should be rounded up or down by explicit
assignment of 0.0 or 1.0 to values within a user-defined
epsilon, this code doesn\'t make assumptions as to what may
constitute an appropriate epsilon.
-}
audioChannelMixerIsPassthrough ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    AudioChannelMixer
    {- ^ /@mix@/: a 'GI.GstAudio.Structs.AudioChannelMixer.AudioChannelMixer' -}
    -> m Bool
    {- ^ __Returns:__ 'True' is /@mix@/ is passthrough. -}
audioChannelMixerIsPassthrough mix = liftIO $ do
    mix' <- unsafeManagedPtrGetPtr mix
    result <- gst_audio_channel_mixer_is_passthrough mix'
    let result' = (/= 0) result
    touchManagedPtr mix
    return result'

#if ENABLE_OVERLOADING
data AudioChannelMixerIsPassthroughMethodInfo
instance (signature ~ (m Bool), MonadIO m) => O.MethodInfo AudioChannelMixerIsPassthroughMethodInfo AudioChannelMixer signature where
    overloadedMethod _ = audioChannelMixerIsPassthrough

#endif

-- method AudioChannelMixer::samples
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "mix", argType = TInterface (Name {namespace = "GstAudio", name = "AudioChannelMixer"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstAudioChannelMixer", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "in", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "input samples", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "out", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "output samples", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "samples", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "number of samples", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_audio_channel_mixer_samples" gst_audio_channel_mixer_samples ::
    Ptr AudioChannelMixer ->                -- mix : TInterface (Name {namespace = "GstAudio", name = "AudioChannelMixer"})
    Ptr () ->                               -- in : TBasicType TPtr
    Ptr () ->                               -- out : TBasicType TPtr
    Int32 ->                                -- samples : TBasicType TInt
    IO ()

{- |
In case the samples are interleaved, /@in@/ and /@out@/ must point to an
array with a single element pointing to a block of interleaved samples.

If non-interleaved samples are used, /@in@/ and /@out@/ must point to an
array with pointers to memory blocks, one for each channel.

Perform channel mixing on /@inData@/ and write the result to /@outData@/.
/@inData@/ and /@outData@/ need to be in /@format@/ and /@layout@/.
-}
audioChannelMixerSamples ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    AudioChannelMixer
    {- ^ /@mix@/: a 'GI.GstAudio.Structs.AudioChannelMixer.AudioChannelMixer' -}
    -> Ptr ()
    {- ^ /@in@/: input samples -}
    -> Ptr ()
    {- ^ /@out@/: output samples -}
    -> Int32
    {- ^ /@samples@/: number of samples -}
    -> m ()
audioChannelMixerSamples mix in_ out samples = liftIO $ do
    mix' <- unsafeManagedPtrGetPtr mix
    gst_audio_channel_mixer_samples mix' in_ out samples
    touchManagedPtr mix
    return ()

#if ENABLE_OVERLOADING
data AudioChannelMixerSamplesMethodInfo
instance (signature ~ (Ptr () -> Ptr () -> Int32 -> m ()), MonadIO m) => O.MethodInfo AudioChannelMixerSamplesMethodInfo AudioChannelMixer signature where
    overloadedMethod _ = audioChannelMixerSamples

#endif

#if ENABLE_OVERLOADING
type family ResolveAudioChannelMixerMethod (t :: Symbol) (o :: *) :: * where
    ResolveAudioChannelMixerMethod "free" o = AudioChannelMixerFreeMethodInfo
    ResolveAudioChannelMixerMethod "isPassthrough" o = AudioChannelMixerIsPassthroughMethodInfo
    ResolveAudioChannelMixerMethod "samples" o = AudioChannelMixerSamplesMethodInfo
    ResolveAudioChannelMixerMethod l o = O.MethodResolutionFailed l o

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