{-# OPTIONS -Wall #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module Raylib.Audio where
import Control.Monad (void)
import Foreign
( FunPtr,
Ptr,
Storable (peek, sizeOf),
newForeignPtr,
peekArray,
toBool,
withArrayLen,
)
import Foreign.C (CUChar, CUInt, withCString)
import qualified Foreign.Concurrent as C
import Raylib.Native
( c'exportWave,
c'exportWaveAsCode,
c'getMusicTimeLength,
c'getMusicTimePlayed,
c'getSoundsPlaying,
c'isAudioDeviceReady,
c'isAudioStreamPlaying,
c'isAudioStreamProcessed,
c'isAudioStreamReady,
c'isMusicReady,
c'isMusicStreamPlaying,
c'isSoundPlaying,
c'isSoundReady,
c'isWaveReady,
c'loadAudioStream,
c'loadMusicStream,
c'loadMusicStreamFromMemory,
c'loadSound,
c'loadSoundFromWave,
c'loadWave,
c'loadWaveFromMemory,
c'loadWaveSamples,
c'pauseAudioStream,
c'pauseMusicStream,
c'pauseSound,
c'playAudioStream,
c'playMusicStream,
c'playSound,
c'playSoundMulti,
c'resumeAudioStream,
c'resumeMusicStream,
c'resumeSound,
c'seekMusicStream,
c'setAudioStreamPan,
c'setAudioStreamPitch,
c'setAudioStreamVolume,
c'setMasterVolume,
c'setMusicPan,
c'setMusicPitch,
c'setMusicVolume,
c'setSoundPan,
c'setSoundPitch,
c'setSoundVolume,
c'stopAudioStream,
c'stopMusicStream,
c'stopSound,
c'unloadAudioStream,
c'unloadMusicStream,
c'unloadMusicStreamData,
c'unloadSound,
c'unloadWave,
c'unloadWaveSamples,
c'updateAudioStream,
c'updateMusicStream,
c'updateSound,
c'waveCopy,
c'waveCrop,
c'waveFormat,
p'unloadAudioBuffer,
)
import Raylib.Types
( AudioStream (audioStream'buffer),
Music (music'ctxData, music'ctxType, music'stream),
Sound,
Wave (wave'channels, wave'frameCount),
)
import Raylib.Util
( pop,
withFreeable,
)
foreign import ccall safe "raylib.h InitAudioDevice"
initAudioDevice ::
IO ()
foreign import ccall safe "raylib.h CloseAudioDevice"
closeAudioDevice ::
IO ()
type AudioCallback = FunPtr (Ptr () -> CUInt -> IO ())
isAudioDeviceReady :: IO Bool
isAudioDeviceReady :: IO Bool
isAudioDeviceReady = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO CBool
c'isAudioDeviceReady
setMasterVolume :: Float -> IO ()
setMasterVolume :: Float -> IO ()
setMasterVolume Float
volume = CFloat -> IO ()
c'setMasterVolume (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
volume)
loadWave :: String -> IO Wave
loadWave :: String -> IO Wave
loadWave String
fileName = forall a. String -> (CString -> IO a) -> IO a
withCString String
fileName CString -> IO (Ptr Wave)
c'loadWave forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (Freeable a, Storable a) => Ptr a -> IO a
pop
loadWaveFromMemory :: String -> [Integer] -> IO Wave
loadWaveFromMemory :: String -> [Integer] -> IO Wave
loadWaveFromMemory String
fileType [Integer]
fileData = forall a. String -> (CString -> IO a) -> IO a
withCString String
fileType (\CString
f -> forall a b. Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b
withArrayLen (forall a b. (a -> b) -> [a] -> [b]
map forall a b. (Integral a, Num b) => a -> b
fromIntegral [Integer]
fileData) (\Int
size Ptr CUChar
d -> CString -> Ptr CUChar -> CInt -> IO (Ptr Wave)
c'loadWaveFromMemory CString
f Ptr CUChar
d (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ Int
size forall a. Num a => a -> a -> a
* forall a. Storable a => a -> Int
sizeOf (CUChar
0 :: CUChar)))) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (Freeable a, Storable a) => Ptr a -> IO a
pop
loadSound :: String -> IO Sound
loadSound :: String -> IO Sound
loadSound String
fileName = forall a. String -> (CString -> IO a) -> IO a
withCString String
fileName CString -> IO (Ptr Sound)
c'loadSound forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (Freeable a, Storable a) => Ptr a -> IO a
pop
loadSoundFromWave :: Wave -> IO Sound
loadSoundFromWave :: Wave -> IO Sound
loadSoundFromWave Wave
wave = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Wave
wave Ptr Wave -> IO (Ptr Sound)
c'loadSoundFromWave forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (Freeable a, Storable a) => Ptr a -> IO a
pop
updateSound :: Sound -> Ptr () -> Int -> IO ()
updateSound :: Sound -> Ptr () -> Int -> IO ()
updateSound Sound
sound Ptr ()
dataValue Int
sampleCount = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound (\Ptr Sound
s -> Ptr Sound -> Ptr () -> CInt -> IO ()
c'updateSound Ptr Sound
s Ptr ()
dataValue (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
sampleCount))
isWaveReady :: Wave -> IO Bool
isWaveReady :: Wave -> IO Bool
isWaveReady Wave
wave = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Wave
wave Ptr Wave -> IO CBool
c'isWaveReady
unloadWave :: Wave -> IO ()
unloadWave :: Wave -> IO ()
unloadWave Wave
wave = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Wave
wave Ptr Wave -> IO ()
c'unloadWave
isSoundReady :: Sound -> IO Bool
isSoundReady :: Sound -> IO Bool
isSoundReady Sound
sound = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound Ptr Sound -> IO CBool
c'isSoundReady
unloadSound :: Sound -> IO ()
unloadSound :: Sound -> IO ()
unloadSound Sound
sound = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound Ptr Sound -> IO ()
c'unloadSound
exportWave :: Wave -> String -> IO Bool
exportWave :: Wave -> String -> IO Bool
exportWave Wave
wave String
fileName = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Wave
wave (forall a. String -> (CString -> IO a) -> IO a
withCString String
fileName forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr Wave -> CString -> IO CBool
c'exportWave)
exportWaveAsCode :: Wave -> String -> IO Bool
exportWaveAsCode :: Wave -> String -> IO Bool
exportWaveAsCode Wave
wave String
fileName = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Wave
wave (forall a. String -> (CString -> IO a) -> IO a
withCString String
fileName forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr Wave -> CString -> IO CBool
c'exportWaveAsCode)
playSound :: Sound -> IO ()
playSound :: Sound -> IO ()
playSound Sound
sound = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound Ptr Sound -> IO ()
c'playSound
stopSound :: Sound -> IO ()
stopSound :: Sound -> IO ()
stopSound Sound
sound = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound Ptr Sound -> IO ()
c'stopSound
pauseSound :: Sound -> IO ()
pauseSound :: Sound -> IO ()
pauseSound Sound
sound = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound Ptr Sound -> IO ()
c'pauseSound
resumeSound :: Sound -> IO ()
resumeSound :: Sound -> IO ()
resumeSound Sound
sound = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound Ptr Sound -> IO ()
c'resumeSound
playSoundMulti :: Sound -> IO ()
playSoundMulti :: Sound -> IO ()
playSoundMulti Sound
sound = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound Ptr Sound -> IO ()
c'playSoundMulti
foreign import ccall safe "raylib.h StopSoundMulti"
stopSoundMulti ::
IO ()
getSoundsPlaying :: IO Int
getSoundsPlaying :: IO Int
getSoundsPlaying = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO CInt
c'getSoundsPlaying
isSoundPlaying :: Sound -> IO Bool
isSoundPlaying :: Sound -> IO Bool
isSoundPlaying Sound
sound = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound Ptr Sound -> IO CBool
c'isSoundPlaying
setSoundVolume :: Sound -> Float -> IO ()
setSoundVolume :: Sound -> Float -> IO ()
setSoundVolume Sound
sound Float
volume = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound (\Ptr Sound
s -> Ptr Sound -> CFloat -> IO ()
c'setSoundVolume Ptr Sound
s (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
volume))
setSoundPitch :: Sound -> Float -> IO ()
setSoundPitch :: Sound -> Float -> IO ()
setSoundPitch Sound
sound Float
pitch = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound (\Ptr Sound
s -> Ptr Sound -> CFloat -> IO ()
c'setSoundPitch Ptr Sound
s (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
pitch))
setSoundPan :: Sound -> Float -> IO ()
setSoundPan :: Sound -> Float -> IO ()
setSoundPan Sound
sound Float
pan = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Sound
sound (\Ptr Sound
s -> Ptr Sound -> CFloat -> IO ()
c'setSoundPan Ptr Sound
s (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
pan))
waveCopy :: Wave -> IO Wave
waveCopy :: Wave -> IO Wave
waveCopy Wave
wave = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Wave
wave Ptr Wave -> IO (Ptr Wave)
c'waveCopy forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (Freeable a, Storable a) => Ptr a -> IO a
pop
waveCrop :: Wave -> Int -> Int -> IO Wave
waveCrop :: Wave -> Int -> Int -> IO Wave
waveCrop Wave
wave Int
initSample Int
finalSample = do
Wave
new <- Wave -> IO Wave
waveCopy Wave
wave
forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Wave
new (\Ptr Wave
w -> Ptr Wave -> CInt -> CInt -> IO ()
c'waveCrop Ptr Wave
w (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
initSample) (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
finalSample) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall a. Storable a => Ptr a -> IO a
peek Ptr Wave
w)
waveFormat :: Wave -> Int -> Int -> Int -> IO ()
waveFormat :: Wave -> Int -> Int -> Int -> IO ()
waveFormat Wave
wave Int
sampleRate Int
sampleSize Int
channels = do
Wave
new <- Wave -> IO Wave
waveCopy Wave
wave
forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Wave
new (\Ptr Wave
n -> Ptr Wave -> CInt -> CInt -> CInt -> IO ()
c'waveFormat Ptr Wave
n (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
sampleRate) (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
sampleSize) (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
channels))
loadWaveSamples :: Wave -> IO [Float]
loadWaveSamples :: Wave -> IO [Float]
loadWaveSamples Wave
wave =
forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable
Wave
wave
( \Ptr Wave
w -> do
Ptr CFloat
ptr <- Ptr Wave -> IO (Ptr CFloat)
c'loadWaveSamples Ptr Wave
w
[CFloat]
arr <- forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ Wave -> Integer
wave'frameCount Wave
wave forall a. Num a => a -> a -> a
* Wave -> Integer
wave'channels Wave
wave) Ptr CFloat
ptr
Ptr CFloat -> IO ()
c'unloadWaveSamples Ptr CFloat
ptr
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (Real a, Fractional b) => a -> b
realToFrac [CFloat]
arr
)
loadMusicStream :: String -> IO Music
loadMusicStream :: String -> IO Music
loadMusicStream String
fileName = do
Music
music <- forall a. String -> (CString -> IO a) -> IO a
withCString String
fileName CString -> IO (Ptr Music)
c'loadMusicStream forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (Freeable a, Storable a) => Ptr a -> IO a
pop
AudioStream -> IO ()
addFinalizerToAudioStream forall a b. (a -> b) -> a -> b
$ Music -> AudioStream
music'stream Music
music
Music -> IO ()
addFinalizerToMusicStream Music
music
forall (m :: * -> *) a. Monad m => a -> m a
return Music
music
loadMusicStreamFromMemory :: String -> [Integer] -> IO Music
loadMusicStreamFromMemory :: String -> [Integer] -> IO Music
loadMusicStreamFromMemory String
fileType [Integer]
streamData = do
Music
music <- forall a. String -> (CString -> IO a) -> IO a
withCString String
fileType (\CString
t -> forall a b. Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b
withArrayLen (forall a b. (a -> b) -> [a] -> [b]
map forall a b. (Integral a, Num b) => a -> b
fromIntegral [Integer]
streamData) (\Int
size Ptr CUChar
d -> CString -> Ptr CUChar -> CInt -> IO (Ptr Music)
c'loadMusicStreamFromMemory CString
t Ptr CUChar
d (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ Int
size forall a. Num a => a -> a -> a
* forall a. Storable a => a -> Int
sizeOf (CUChar
0 :: CUChar)))) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (Freeable a, Storable a) => Ptr a -> IO a
pop
AudioStream -> IO ()
addFinalizerToAudioStream forall a b. (a -> b) -> a -> b
$ Music -> AudioStream
music'stream Music
music
Music -> IO ()
addFinalizerToMusicStream Music
music
forall (m :: * -> *) a. Monad m => a -> m a
return Music
music
isMusicReady :: Music -> IO Bool
isMusicReady :: Music -> IO Bool
isMusicReady Music
music = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music Ptr Music -> IO CBool
c'isMusicReady
unloadMusicStream :: Music -> IO ()
unloadMusicStream :: Music -> IO ()
unloadMusicStream Music
music = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music Ptr Music -> IO ()
c'unloadMusicStream
playMusicStream :: Music -> IO ()
playMusicStream :: Music -> IO ()
playMusicStream Music
music = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music Ptr Music -> IO ()
c'playMusicStream
isMusicStreamPlaying :: Music -> IO Bool
isMusicStreamPlaying :: Music -> IO Bool
isMusicStreamPlaying Music
music = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music Ptr Music -> IO CBool
c'isMusicStreamPlaying
updateMusicStream :: Music -> IO ()
updateMusicStream :: Music -> IO ()
updateMusicStream Music
music = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music Ptr Music -> IO ()
c'updateMusicStream
stopMusicStream :: Music -> IO ()
stopMusicStream :: Music -> IO ()
stopMusicStream Music
music = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music Ptr Music -> IO ()
c'stopMusicStream
pauseMusicStream :: Music -> IO ()
pauseMusicStream :: Music -> IO ()
pauseMusicStream Music
music = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music Ptr Music -> IO ()
c'pauseMusicStream
resumeMusicStream :: Music -> IO ()
resumeMusicStream :: Music -> IO ()
resumeMusicStream Music
music = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music Ptr Music -> IO ()
c'resumeMusicStream
seekMusicStream :: Music -> Float -> IO ()
seekMusicStream :: Music -> Float -> IO ()
seekMusicStream Music
music Float
position = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music (\Ptr Music
m -> Ptr Music -> CFloat -> IO ()
c'seekMusicStream Ptr Music
m (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
position))
setMusicVolume :: Music -> Float -> IO ()
setMusicVolume :: Music -> Float -> IO ()
setMusicVolume Music
music Float
volume = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music (\Ptr Music
m -> Ptr Music -> CFloat -> IO ()
c'setMusicVolume Ptr Music
m (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
volume))
setMusicPitch :: Music -> Float -> IO ()
setMusicPitch :: Music -> Float -> IO ()
setMusicPitch Music
music Float
pitch = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music (\Ptr Music
m -> Ptr Music -> CFloat -> IO ()
c'setMusicPitch Ptr Music
m (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
pitch))
setMusicPan :: Music -> Float -> IO ()
setMusicPan :: Music -> Float -> IO ()
setMusicPan Music
music Float
pan = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music (\Ptr Music
m -> Ptr Music -> CFloat -> IO ()
c'setMusicPan Ptr Music
m (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
pan))
getMusicTimeLength :: Music -> IO Float
getMusicTimeLength :: Music -> IO Float
getMusicTimeLength Music
music = forall a b. (Real a, Fractional b) => a -> b
realToFrac forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music Ptr Music -> IO CFloat
c'getMusicTimeLength
getMusicTimePlayed :: Music -> IO Float
getMusicTimePlayed :: Music -> IO Float
getMusicTimePlayed Music
music = forall a b. (Real a, Fractional b) => a -> b
realToFrac forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Music
music Ptr Music -> IO CFloat
c'getMusicTimePlayed
loadAudioStream :: Integer -> Integer -> Integer -> IO AudioStream
loadAudioStream :: Integer -> Integer -> Integer -> IO AudioStream
loadAudioStream Integer
sampleRate Integer
sampleSize Integer
channels = do
AudioStream
stream <- CUInt -> CUInt -> CUInt -> IO (Ptr AudioStream)
c'loadAudioStream (forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
sampleRate) (forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
sampleSize) (forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
channels) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (Freeable a, Storable a) => Ptr a -> IO a
pop
AudioStream -> IO ()
addFinalizerToAudioStream AudioStream
stream
forall (m :: * -> *) a. Monad m => a -> m a
return AudioStream
stream
isAudioStreamReady :: AudioStream -> IO Bool
isAudioStreamReady :: AudioStream -> IO Bool
isAudioStreamReady AudioStream
stream = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream Ptr AudioStream -> IO CBool
c'isAudioStreamReady
unloadAudioStream :: AudioStream -> IO ()
unloadAudioStream :: AudioStream -> IO ()
unloadAudioStream AudioStream
stream = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream Ptr AudioStream -> IO ()
c'unloadAudioStream
updateAudioStream :: AudioStream -> Ptr () -> Int -> IO ()
updateAudioStream :: AudioStream -> Ptr () -> Int -> IO ()
updateAudioStream AudioStream
stream Ptr ()
value Int
frameCount = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream (\Ptr AudioStream
s -> Ptr AudioStream -> Ptr () -> CInt -> IO ()
c'updateAudioStream Ptr AudioStream
s Ptr ()
value (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
frameCount))
isAudioStreamProcessed :: AudioStream -> IO Bool
isAudioStreamProcessed :: AudioStream -> IO Bool
isAudioStreamProcessed AudioStream
stream = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream Ptr AudioStream -> IO CBool
c'isAudioStreamProcessed
playAudioStream :: AudioStream -> IO ()
playAudioStream :: AudioStream -> IO ()
playAudioStream AudioStream
stream = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream Ptr AudioStream -> IO ()
c'playAudioStream
pauseAudioStream :: AudioStream -> IO ()
pauseAudioStream :: AudioStream -> IO ()
pauseAudioStream AudioStream
stream = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream Ptr AudioStream -> IO ()
c'pauseAudioStream
resumeAudioStream :: AudioStream -> IO ()
resumeAudioStream :: AudioStream -> IO ()
resumeAudioStream AudioStream
stream = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream Ptr AudioStream -> IO ()
c'resumeAudioStream
isAudioStreamPlaying :: AudioStream -> IO Bool
isAudioStreamPlaying :: AudioStream -> IO Bool
isAudioStreamPlaying AudioStream
stream = forall a. (Eq a, Num a) => a -> Bool
toBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream Ptr AudioStream -> IO CBool
c'isAudioStreamPlaying
stopAudioStream :: AudioStream -> IO ()
stopAudioStream :: AudioStream -> IO ()
stopAudioStream AudioStream
stream = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream Ptr AudioStream -> IO ()
c'stopAudioStream
setAudioStreamVolume :: AudioStream -> Float -> IO ()
setAudioStreamVolume :: AudioStream -> Float -> IO ()
setAudioStreamVolume AudioStream
stream Float
volume = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream (\Ptr AudioStream
s -> Ptr AudioStream -> CFloat -> IO ()
c'setAudioStreamVolume Ptr AudioStream
s (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
volume))
setAudioStreamPitch :: AudioStream -> Float -> IO ()
setAudioStreamPitch :: AudioStream -> Float -> IO ()
setAudioStreamPitch AudioStream
stream Float
pitch = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream (\Ptr AudioStream
s -> Ptr AudioStream -> CFloat -> IO ()
c'setAudioStreamPitch Ptr AudioStream
s (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
pitch))
setAudioStreamPan :: AudioStream -> Float -> IO ()
setAudioStreamPan :: AudioStream -> Float -> IO ()
setAudioStreamPan AudioStream
stream Float
pan = forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable AudioStream
stream (\Ptr AudioStream
s -> Ptr AudioStream -> CFloat -> IO ()
c'setAudioStreamPan Ptr AudioStream
s (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
pan))
setAudioStreamBufferSizeDefault :: Int -> IO ()
setAudioStreamBufferSizeDefault :: Int -> IO ()
setAudioStreamBufferSizeDefault = Int -> IO ()
setAudioStreamBufferSizeDefault forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
addFinalizerToAudioStream :: AudioStream -> IO ()
addFinalizerToAudioStream :: AudioStream -> IO ()
addFinalizerToAudioStream AudioStream
stream = forall (f :: * -> *) a. Functor f => f a -> f ()
void (forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FunPtr (Ptr RAudioBuffer -> IO ())
p'unloadAudioBuffer (AudioStream -> Ptr RAudioBuffer
audioStream'buffer AudioStream
stream))
addFinalizerToMusicStream :: Music -> IO ()
addFinalizerToMusicStream :: Music -> IO ()
addFinalizerToMusicStream Music
music = do
let ctxData :: Ptr ()
ctxData = Music -> Ptr ()
music'ctxData Music
music
ForeignPtr ()
_ <-
forall a. Ptr a -> IO () -> IO (ForeignPtr a)
C.newForeignPtr
Ptr ()
ctxData
(CInt -> Ptr () -> IO ()
c'unloadMusicStreamData (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. Enum a => a -> Int
fromEnum forall a b. (a -> b) -> a -> b
$ Music -> MusicContextType
music'ctxType Music
music) Ptr ()
ctxData)
forall (m :: * -> *) a. Monad m => a -> m a
return ()