proteaaudio-0.9.2: Sound/ProteaAudio.chs
{-#LANGUAGE ForeignFunctionInterface,CPP#-}
#include "proteaaudio_binding.h"
#if defined PROTEAAUDIO_SDL
{-|
ProteaAudio-SDL is a stereo audio mixer and playback library for SDL /(platform independent)/
-}
module Sound.ProteaAudio.SDL (
#elif defined PROTEAAUDIO_RT
{-|
ProteaAudio is a stereo audio mixer/playback library for
* Linux /(PusleAudio)/
* Macintosh OS X /(CoreAudio)/
* Windows /(DirectSound)/
-}
module Sound.ProteaAudio (
#else
#error "I can't decide which binding to compile; please define either PROTEAAUDIO_SDL or PROTEAAUDIO_RT"
#endif
-- * Sample
Sample(),
Sound(),
-- * Audio System Setup
initAudio,
finishAudio,
-- * Main Mixer
volume,
soundActiveAll,
soundStopAll,
-- * Sample Loading
loaderAvailable,
sampleFromMemoryPcm,
sampleFromMemoryWav,
sampleFromMemoryOgg,
sampleFromFile,
sampleDestroy,
-- * Sample Playback
soundLoop,
soundPlay,
soundLoopOn,
soundPlayOn,
soundUpdate,
soundStop,
soundActive
) where
import Foreign
import Foreign.C
import Data.ByteString (ByteString, useAsCStringLen)
-- | Audio sample resource handle. A sample can be shared between multiple Sound tracks. (abstraction for data)
newtype Sample = Sample{ fromSample :: {#type sample_t#} }
-- | Sound track handle. It is used to control the audio playback. (abstraction for playback)
newtype Sound = Sound{ fromSound :: {#type sound_t#} }
-- | Initializes the audio system.
{#fun initAudio
{ `Int' -- ^ the maximum number of sounds that are played parallely, at most 1024. Computation time is linearly correlated to this factor.
, `Int' -- ^ sample frequency of the playback in Hz. 22050 corresponds to FM radio 44100 is CD quality. Computation time is linearly correlated to this factor.
, `Int' -- ^ the number of bytes that are sent to the sound card at once. Low numbers lead to smaller latencies but need more computation time (thread switches). If a too small number is chosen, the sounds might not be played continuously. The default value 512 guarantees a good latency below 40 ms at 22050 Hz sample frequency.
} -> `Bool' -- ^ returns True on success
#}
-- *
-- | Releases the audio device and cleans up resources.
{#fun finishAudio {} -> `()'#}
-- | Checks if loader for this file type is available.
{#fun loaderAvailable
{ `String' -- ^ file extension (e.g. ogg)
} -> `Bool'
#}
-- | Loads raw linear pcm sound sample from memory buffer.
{#fun _sampleFromMemoryPcm
{ id `Ptr CChar' -- ^ memory buffer pointer
, `Int' -- ^ memory buffer size in bytes
, `Int' -- ^ number of channels, e.g. 1 for mono, 2 for stereo.
, `Int' -- ^ sample rate, i.e. 44100 Hz
, `Int' -- ^ bits per sample, i.e. 8, 16, 32
, `Float' -- ^ volume
} -> `Sample' Sample -- ^ returns handle
#}
-- | Loads wav sound sample from memory buffer.
{#fun _sampleFromMemoryWav
{ id `Ptr CChar' -- ^ memory buffer pointer
, `Int' -- ^ memory buffer size in bytes
, `Float' -- ^ volume
} -> `Sample' Sample -- ^ returns handle
#}
-- | Loads ogg sound sample from memory buffer.
{#fun _sampleFromMemoryOgg
{ id `Ptr CChar' -- ^ memory buffer pointer
, `Int' -- ^ memory buffer size in bytes
, `Float' -- ^ volume
} -> `Sample' Sample -- ^ returns handle
#}
-- | Loads raw linear pcm sound sample from memory buffer.
sampleFromMemoryPcm :: ByteString -- ^ pcm sample data; array of pcm samples (signed 8 bit int, signed 16 bit int or 32 bit float)
-> Int -- ^ number of channels, e.g. 1 for mono, 2 for stereo.
-> Int -- ^ sample rate, i.e. 44100 Hz
-> Int -- ^ bits per sample, i.e. 8, 16, 32
-> Float -- ^ volume
-> IO Sample -- ^ return sample handle
sampleFromMemoryPcm pcmData channels sampleRate bitsPerSample volume =
useAsCStringLen pcmData $ \(ptr, size) -> _sampleFromMemoryPcm ptr size channels sampleRate bitsPerSample volume
-- | Loads wav sound sample from memory buffer.
sampleFromMemoryWav :: ByteString -- ^ wav sample data
-> Float -- ^ volume
-> IO Sample -- ^ return sample handle
sampleFromMemoryWav wavData volume = useAsCStringLen wavData $ \(ptr, size) -> _sampleFromMemoryWav ptr size volume
-- | Loads ogg sound sample from memory buffer.
sampleFromMemoryOgg :: ByteString -- ^ ogg sample data
-> Float -- ^ volume
-> IO Sample -- ^ return sample handle
sampleFromMemoryOgg oggData volume = useAsCStringLen oggData $ \(ptr, size) -> _sampleFromMemoryOgg ptr size volume
-- | Loads a sound sample from file.
{#fun sampleFromFile
{ `String' -- ^ sample filepath
, `Float' -- ^ volume
} -> `Sample' Sample -- ^ returns handle
#}
-- | Unloads a previously loaded sample from memory, invalidating the handle.
{#fun sampleDestroy {fromSample `Sample'} -> `Bool'#}
-- | Set main mixer volume.
{#fun volume
{ `Float' -- ^ left
, `Float' -- ^ right
} -> `()'
#}
-- | Return the number of currently active sounds.
{#fun soundActiveAll {} -> `Int'#}
-- | Stops all sounds immediately.
{#fun soundStopAll {} -> `()'#}
-- | Plays a specified sound sample continuously any free channel and sets its parameters.
{#fun soundLoop
{ fromSample `Sample' -- ^ handle of a previously loaded sample
, `Float' -- ^ left volume
, `Float' -- ^ right volume
, `Float' -- ^ time difference between left and right channel in seconds. Use negative values to specify a delay for the left channel, positive for the right
, `Float' -- ^ pitch factor for playback. 0.5 corresponds to one octave below, 2.0 to one above the original sample
} -> `Sound' Sound
#}
-- | Plays a specified sound sample once any free channel and sets its parameters.
{#fun soundPlay
{ fromSample `Sample' -- ^ handle of a previously loaded sample
, `Float' -- ^ left volume
, `Float' -- ^ right volume
, `Float' -- ^ time difference between left and right channel in seconds. Use negative values to specify a delay for the left channel, positive for the right
, `Float' -- ^ pitch factor for playback. 0.5 corresponds to one octave below, 2.0 to one above the original sample
} -> `Sound' Sound
#}
-- | Plays a specified sound sample once on a specific channel and sets its parameters.
{#fun soundPlayOn
{ `Int' -- ^ number of the channel to use for playback with the first channel starting at 0
, fromSample `Sample' -- ^ handle of a previously loaded sample
, `Float' -- ^ left volume
, `Float' -- ^ right volume
, `Float' -- ^ time difference between left and right channel in seconds. Use negative values to specify a delay for the left channel, positive for the right
, `Float' -- ^ pitch factor for playback. 0.5 corresponds to one octave below, 2.0 to one above the original sample
} -> `Sound' Sound
#}
-- | Plays a specified sound sample continuously on a specific channel and sets its parameters.
{#fun soundLoopOn
{ `Int' -- ^ number of the channel to use for playback with the first channel starting at 0
, fromSample `Sample' -- ^ handle of a previously loaded sample
, `Float' -- ^ left volume
, `Float' -- ^ right volume
, `Float' -- ^ time difference between left and right channel in seconds. Use negative values to specify a delay for the left channel, positive for the right
, `Float' -- ^ pitch factor for playback. 0.5 corresponds to one octave below, 2.0 to one above the original sample
} -> `Sound' Sound
#}
-- | Updates parameters of a specified sound.
{#fun soundUpdate
{ fromSound `Sound' -- ^ handle of a currently active sound (if sound has stopped, this is a no-op)
, `Float' -- ^ left volume
, `Float' -- ^ right volume
, `Float' -- ^ time difference between left and right channel in seconds. Use negative values to specify a delay for the left channel, positive for the right
, `Float' -- ^ pitch factor for playback. 0.5 corresponds to one octave below, 2.0 to one above the original sample
} -> `Bool' -- ^ return True in case the parameters have been updated successfully
#}
-- | Stops a specified sound immediately.
{#fun soundStop {fromSound `Sound'} -> `Bool'#}
-- | Checks if a specified sound is still active.
{#fun soundActive{fromSound `Sound'} -> `Bool'#}