sdl2-2.5.5.0: Both high- and low-level bindings to the SDL library (version 2.0.6+).
Safe HaskellSafe-Inferred
LanguageHaskell2010

SDL.Audio

Description

SDL.Audio provides a high-level API to SDL's audio device capabilities.

Synopsis

Managing AudioDevices

data AudioDevice Source #

An open audio device. These can be created via openAudioDevice and should be closed with closeAudioDevice

Instances

Instances details
Eq AudioDevice Source # 
Instance details

Defined in SDL.Audio

Opening and Closing AudioDevices

openAudioDevice :: MonadIO m => OpenDeviceSpec -> m (AudioDevice, AudioSpec) Source #

Attempt to open the closest matching AudioDevice, as specified by the given OpenDeviceSpec.

See SDL_OpenAudioDevice for C documentation.

closeAudioDevice :: MonadIO m => AudioDevice -> m () Source #

See SDL_CloseAudioDevice for C documentation.

data OpenDeviceSpec Source #

A specification to openAudioDevice, indicating the desired output format. Note that many of these properties are Changeable, meaning that you can choose whether or not SDL should interpret your specification as an unbreakable request (Mandate), or as an approximation Desire.

Constructors

forall sampleType. OpenDeviceSpec 

Fields

data AudioDeviceUsage Source #

How you intend to use an AudioDevice

Constructors

ForPlayback

The device will be used for sample playback.

ForCapture

The device will be used for sample capture.

Instances

Instances details
Data AudioDeviceUsage Source # 
Instance details

Defined in SDL.Audio

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> AudioDeviceUsage -> c AudioDeviceUsage Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c AudioDeviceUsage Source #

toConstr :: AudioDeviceUsage -> Constr Source #

dataTypeOf :: AudioDeviceUsage -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c AudioDeviceUsage) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c AudioDeviceUsage) Source #

gmapT :: (forall b. Data b => b -> b) -> AudioDeviceUsage -> AudioDeviceUsage Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> AudioDeviceUsage -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> AudioDeviceUsage -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> AudioDeviceUsage -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> AudioDeviceUsage -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> AudioDeviceUsage -> m AudioDeviceUsage Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> AudioDeviceUsage -> m AudioDeviceUsage Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> AudioDeviceUsage -> m AudioDeviceUsage Source #

Bounded AudioDeviceUsage Source # 
Instance details

Defined in SDL.Audio

Enum AudioDeviceUsage Source # 
Instance details

Defined in SDL.Audio

Generic AudioDeviceUsage Source # 
Instance details

Defined in SDL.Audio

Associated Types

type Rep AudioDeviceUsage :: Type -> Type Source #

Read AudioDeviceUsage Source # 
Instance details

Defined in SDL.Audio

Show AudioDeviceUsage Source # 
Instance details

Defined in SDL.Audio

Eq AudioDeviceUsage Source # 
Instance details

Defined in SDL.Audio

Ord AudioDeviceUsage Source # 
Instance details

Defined in SDL.Audio

type Rep AudioDeviceUsage Source # 
Instance details

Defined in SDL.Audio

type Rep AudioDeviceUsage = D1 ('MetaData "AudioDeviceUsage" "SDL.Audio" "sdl2-2.5.5.0-inplace" 'False) (C1 ('MetaCons "ForPlayback" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ForCapture" 'PrefixI 'False) (U1 :: Type -> Type))

data Channels Source #

How many channels audio should be played on

Constructors

Mono

A single speaker configuration

Stereo

A traditional left/right stereo system

Quad 
FivePointOne
  1. 1 surround sound

Instances

Instances details
Data Channels Source # 
Instance details

Defined in SDL.Audio

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Channels -> c Channels Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Channels Source #

toConstr :: Channels -> Constr Source #

dataTypeOf :: Channels -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Channels) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Channels) Source #

gmapT :: (forall b. Data b => b -> b) -> Channels -> Channels Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Channels -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Channels -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> Channels -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Channels -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Channels -> m Channels Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Channels -> m Channels Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Channels -> m Channels Source #

Bounded Channels Source # 
Instance details

Defined in SDL.Audio

Enum Channels Source # 
Instance details

Defined in SDL.Audio

Generic Channels Source # 
Instance details

Defined in SDL.Audio

Associated Types

type Rep Channels :: Type -> Type Source #

Read Channels Source # 
Instance details

Defined in SDL.Audio

Show Channels Source # 
Instance details

Defined in SDL.Audio

Eq Channels Source # 
Instance details

Defined in SDL.Audio

Ord Channels Source # 
Instance details

Defined in SDL.Audio

type Rep Channels Source # 
Instance details

Defined in SDL.Audio

type Rep Channels = D1 ('MetaData "Channels" "SDL.Audio" "sdl2-2.5.5.0-inplace" 'False) ((C1 ('MetaCons "Mono" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Stereo" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "Quad" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "FivePointOne" 'PrefixI 'False) (U1 :: Type -> Type)))

data Changeable a Source #

Used to indicate to SDL whether it is allowed to open other audio devices (if a property is marked as a Desire) or if it should fail if the device is unavailable (Mandate).

Constructors

Mandate !a

Mandate this exact property value, and fail if a matching audio device cannot be found.

Desire !a

Desire this property value, but allow other audio devices to be opened.

Instances

Instances details
Foldable Changeable Source # 
Instance details

Defined in SDL.Audio

Methods

fold :: Monoid m => Changeable m -> m Source #

foldMap :: Monoid m => (a -> m) -> Changeable a -> m Source #

foldMap' :: Monoid m => (a -> m) -> Changeable a -> m Source #

foldr :: (a -> b -> b) -> b -> Changeable a -> b Source #

foldr' :: (a -> b -> b) -> b -> Changeable a -> b Source #

foldl :: (b -> a -> b) -> b -> Changeable a -> b Source #

foldl' :: (b -> a -> b) -> b -> Changeable a -> b Source #

foldr1 :: (a -> a -> a) -> Changeable a -> a Source #

foldl1 :: (a -> a -> a) -> Changeable a -> a Source #

toList :: Changeable a -> [a] Source #

null :: Changeable a -> Bool Source #

length :: Changeable a -> Int Source #

elem :: Eq a => a -> Changeable a -> Bool Source #

maximum :: Ord a => Changeable a -> a Source #

minimum :: Ord a => Changeable a -> a Source #

sum :: Num a => Changeable a -> a Source #

product :: Num a => Changeable a -> a Source #

Traversable Changeable Source # 
Instance details

Defined in SDL.Audio

Methods

traverse :: Applicative f => (a -> f b) -> Changeable a -> f (Changeable b) Source #

sequenceA :: Applicative f => Changeable (f a) -> f (Changeable a) Source #

mapM :: Monad m => (a -> m b) -> Changeable a -> m (Changeable b) Source #

sequence :: Monad m => Changeable (m a) -> m (Changeable a) Source #

Functor Changeable Source # 
Instance details

Defined in SDL.Audio

Methods

fmap :: (a -> b) -> Changeable a -> Changeable b Source #

(<$) :: a -> Changeable b -> Changeable a Source #

Data a => Data (Changeable a) Source # 
Instance details

Defined in SDL.Audio

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Changeable a -> c (Changeable a) Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Changeable a) Source #

toConstr :: Changeable a -> Constr Source #

dataTypeOf :: Changeable a -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Changeable a)) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Changeable a)) Source #

gmapT :: (forall b. Data b => b -> b) -> Changeable a -> Changeable a Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Changeable a -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Changeable a -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> Changeable a -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Changeable a -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Changeable a -> m (Changeable a) Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Changeable a -> m (Changeable a) Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Changeable a -> m (Changeable a) Source #

Generic (Changeable a) Source # 
Instance details

Defined in SDL.Audio

Associated Types

type Rep (Changeable a) :: Type -> Type Source #

Methods

from :: Changeable a -> Rep (Changeable a) x Source #

to :: Rep (Changeable a) x -> Changeable a Source #

Read a => Read (Changeable a) Source # 
Instance details

Defined in SDL.Audio

Show a => Show (Changeable a) Source # 
Instance details

Defined in SDL.Audio

Eq a => Eq (Changeable a) Source # 
Instance details

Defined in SDL.Audio

type Rep (Changeable a) Source # 
Instance details

Defined in SDL.Audio

type Rep (Changeable a) = D1 ('MetaData "Changeable" "SDL.Audio" "sdl2-2.5.5.0-inplace" 'False) (C1 ('MetaCons "Mandate" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 a)) :+: C1 ('MetaCons "Desire" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 a)))

Working with Opened Devices

Locking AudioDevices

setAudioDeviceLocked :: MonadIO m => AudioDevice -> LockState -> m () Source #

Lock an AudioDevice such that its associated callback will not be called until the device is unlocked.

data LockState Source #

Whether a device should be locked or unlocked.

Constructors

Locked

Lock the device, preventing the callback from producing data.

Unlocked

Unlock the device, resuming calls to the callback.

Instances

Instances details
Data LockState Source # 
Instance details

Defined in SDL.Audio

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> LockState -> c LockState Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c LockState Source #

toConstr :: LockState -> Constr Source #

dataTypeOf :: LockState -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c LockState) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LockState) Source #

gmapT :: (forall b. Data b => b -> b) -> LockState -> LockState Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> LockState -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> LockState -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> LockState -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> LockState -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> LockState -> m LockState Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> LockState -> m LockState Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> LockState -> m LockState Source #

Bounded LockState Source # 
Instance details

Defined in SDL.Audio

Enum LockState Source # 
Instance details

Defined in SDL.Audio

Generic LockState Source # 
Instance details

Defined in SDL.Audio

Associated Types

type Rep LockState :: Type -> Type Source #

Read LockState Source # 
Instance details

Defined in SDL.Audio

Show LockState Source # 
Instance details

Defined in SDL.Audio

Eq LockState Source # 
Instance details

Defined in SDL.Audio

Ord LockState Source # 
Instance details

Defined in SDL.Audio

type Rep LockState Source # 
Instance details

Defined in SDL.Audio

type Rep LockState = D1 ('MetaData "LockState" "SDL.Audio" "sdl2-2.5.5.0-inplace" 'False) (C1 ('MetaCons "Locked" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Unlocked" 'PrefixI 'False) (U1 :: Type -> Type))

Switching Playback States

data PlaybackState Source #

Whether to allow an AudioDevice to play sound or remain paused.

Constructors

Pause

Pause the AudioDevice, which will stop producing/capturing audio.

Play

Resume the AudioDevice.

Instances

Instances details
Data PlaybackState Source # 
Instance details

Defined in SDL.Audio

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> PlaybackState -> c PlaybackState Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c PlaybackState Source #

toConstr :: PlaybackState -> Constr Source #

dataTypeOf :: PlaybackState -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c PlaybackState) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c PlaybackState) Source #

gmapT :: (forall b. Data b => b -> b) -> PlaybackState -> PlaybackState Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> PlaybackState -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> PlaybackState -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> PlaybackState -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> PlaybackState -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> PlaybackState -> m PlaybackState Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> PlaybackState -> m PlaybackState Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> PlaybackState -> m PlaybackState Source #

Bounded PlaybackState Source # 
Instance details

Defined in SDL.Audio

Enum PlaybackState Source # 
Instance details

Defined in SDL.Audio

Generic PlaybackState Source # 
Instance details

Defined in SDL.Audio

Associated Types

type Rep PlaybackState :: Type -> Type Source #

Read PlaybackState Source # 
Instance details

Defined in SDL.Audio

Show PlaybackState Source # 
Instance details

Defined in SDL.Audio

Eq PlaybackState Source # 
Instance details

Defined in SDL.Audio

Ord PlaybackState Source # 
Instance details

Defined in SDL.Audio

type Rep PlaybackState Source # 
Instance details

Defined in SDL.Audio

type Rep PlaybackState = D1 ('MetaData "PlaybackState" "SDL.Audio" "sdl2-2.5.5.0-inplace" 'False) (C1 ('MetaCons "Pause" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Play" 'PrefixI 'False) (U1 :: Type -> Type))

setAudioDevicePlaybackState :: MonadIO m => AudioDevice -> PlaybackState -> m () Source #

Change the playback state of an AudioDevice.

Querying an AudioDevices Status.

data AudioDeviceStatus Source #

Opened devices are always Playing or Paused in normal circumstances. A failing device may change its status to Stopped at any time, and closing a device will progress to Stopped too.

Constructors

Playing

The AudioDevice is playing.

Paused

The AudioDevice is paused.

Stopped

The AudioDevice is stopped.

Instances

Instances details
Data AudioDeviceStatus Source # 
Instance details

Defined in SDL.Audio

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> AudioDeviceStatus -> c AudioDeviceStatus Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c AudioDeviceStatus Source #

toConstr :: AudioDeviceStatus -> Constr Source #

dataTypeOf :: AudioDeviceStatus -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c AudioDeviceStatus) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c AudioDeviceStatus) Source #

gmapT :: (forall b. Data b => b -> b) -> AudioDeviceStatus -> AudioDeviceStatus Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> AudioDeviceStatus -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> AudioDeviceStatus -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> AudioDeviceStatus -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> AudioDeviceStatus -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> AudioDeviceStatus -> m AudioDeviceStatus Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> AudioDeviceStatus -> m AudioDeviceStatus Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> AudioDeviceStatus -> m AudioDeviceStatus Source #

Bounded AudioDeviceStatus Source # 
Instance details

Defined in SDL.Audio

Enum AudioDeviceStatus Source # 
Instance details

Defined in SDL.Audio

Generic AudioDeviceStatus Source # 
Instance details

Defined in SDL.Audio

Associated Types

type Rep AudioDeviceStatus :: Type -> Type Source #

Read AudioDeviceStatus Source # 
Instance details

Defined in SDL.Audio

Show AudioDeviceStatus Source # 
Instance details

Defined in SDL.Audio

Eq AudioDeviceStatus Source # 
Instance details

Defined in SDL.Audio

Ord AudioDeviceStatus Source # 
Instance details

Defined in SDL.Audio

type Rep AudioDeviceStatus Source # 
Instance details

Defined in SDL.Audio

type Rep AudioDeviceStatus = D1 ('MetaData "AudioDeviceStatus" "SDL.Audio" "sdl2-2.5.5.0-inplace" 'False) (C1 ('MetaCons "Playing" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "Paused" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Stopped" 'PrefixI 'False) (U1 :: Type -> Type)))

AudioFormat

data AudioFormat sampleType where Source #

Information about what format an audio bytestream is. The type variable t indicates the type used for audio buffer samples. It is determined by the choice of the provided SampleBitSize. For example:

AudioFormat UnsignedInteger Sample8Bit Native :: AudioFormat Word8

Indicating that an 8-bit audio format in the platforms native endianness uses a buffer of Word8 values.

Instances

Instances details
Show (AudioFormat sampleType) Source # 
Instance details

Defined in SDL.Audio

Methods

showsPrec :: Int -> AudioFormat sampleType -> ShowS Source #

show :: AudioFormat sampleType -> String Source #

showList :: [AudioFormat sampleType] -> ShowS Source #

Eq (AudioFormat sampleType) Source # 
Instance details

Defined in SDL.Audio

Methods

(==) :: AudioFormat sampleType -> AudioFormat sampleType -> Bool Source #

(/=) :: AudioFormat sampleType -> AudioFormat sampleType -> Bool Source #

Ord (AudioFormat sampleType) Source # 
Instance details

Defined in SDL.Audio

Methods

compare :: AudioFormat sampleType -> AudioFormat sampleType -> Ordering Source #

(<) :: AudioFormat sampleType -> AudioFormat sampleType -> Bool Source #

(<=) :: AudioFormat sampleType -> AudioFormat sampleType -> Bool Source #

(>) :: AudioFormat sampleType -> AudioFormat sampleType -> Bool Source #

(>=) :: AudioFormat sampleType -> AudioFormat sampleType -> Bool Source #

max :: AudioFormat sampleType -> AudioFormat sampleType -> AudioFormat sampleType Source #

min :: AudioFormat sampleType -> AudioFormat sampleType -> AudioFormat sampleType Source #

Enumerating AudioDevices

getAudioDeviceNames :: MonadIO m => AudioDeviceUsage -> m (Maybe (Vector Text)) Source #

Enumerate all AudioDevices attached to this system, that can be used as specified by the given AudioDeviceUsage. SDL cannot always guarantee that this list can be produced, in which case Nothing will be returned.

AudioSpec

data AudioSpec Source #

AudioSpec is the concrete specification of how an AudioDevice was sucessfully opened. Unlike OpenDeviceSpec, which specifies what you want, AudioSpec specifies what you have.

Constructors

forall sampleType. AudioSpec 

Fields

Audio Drivers

getAudioDrivers :: MonadIO m => m (Vector AudioDriver) Source #

Obtain a list of all possible audio drivers for this system. These drivers can be used to specificially initialize the audio system.

currentAudioDriver :: MonadIO m => m (Maybe Text) Source #

Query SDL for the name of the currently initialized audio driver, if possible. This will return Nothing if no driver has been initialized.

data AudioDriver Source #

An abstract description of an audio driver on the host machine.

Instances

Instances details
Show AudioDriver Source # 
Instance details

Defined in SDL.Audio

Eq AudioDriver Source # 
Instance details

Defined in SDL.Audio

audioDriverName :: AudioDriver -> Text Source #

Get the human readable name of an AudioDriver

Explicit Initialization

audioInit :: MonadIO m => AudioDriver -> m () Source #

Explicitly initialize the audio system against a specific AudioDriver. Note that most users will not need to do this, as the normal initialization routines will already take care of this for you.