Description
Simple audio library for Windows, Linux, OSX.
Description
Simple audio library for Windows, Linux, OSX. Supports PCM, Ogg, Mp3 and Wav playback and multichannel mixing.
README.md
Overview
ProteaAudio is a stereo audio mixer/playback library for
- Linux (PulseAudio)
- MacOS (CoreAudio)
- Windows (DirectSound)
Supported audio formats:
- Wav
- Ogg
- Mp3
- Raw linear PCM
Samples can be loaded from file or memory.
Setup
On Linux you need to install the pulse audio library:
sudo apt install libpulse-dev
Build
Stack
stack setup
stack build
Nix:
stack --nix build
Example
import Control.Monad
import System.Environment
import System.FilePath
import qualified Data.ByteString as SB
import Control.Concurrent
import Sound.ProteaAudio
waitPlayback = do
n <- soundActiveAll
when (n > 0) $ do
threadDelay oneSec
waitPlayback
oneSec :: Int
oneSec = 1000000 -- micro seconds
main = do
args <- getArgs
filename <- case args of
a : _ -> pure a
_ -> fail "usage: proteaaudio-play SAMPLE_FILE_NAME"
result <- initAudio 64 44100 1024 -- max channels, mixing frequency, mixing buffer size
unless result $ fail "failed to initialize the audio system"
-- (A) load sample from file
sampleA <- sampleFromFile filename 1.0 -- volume
-- start two sound tracks with shared sample data
sndTrkA <- soundPlay sampleA 1 1 0 1 -- left volume, right volume, time difference between left and right, pitch factor for playback
threadDelay oneSec -- wait 1 sec
sndTrkB <- soundPlay sampleA 1 1 0 1 -- left volume, right volume, time difference between left and right, pitch factor for playback
soundActive sndTrkB >>= print
-- play 3 sec
threadDelay $ 3 * oneSec
soundStop sndTrkB
soundActive sndTrkB >>= print
soundUpdate sndTrkA True 1 1 0 1
putStrLn "pause sound, press enter to continue"
getLine
soundUpdate sndTrkA False 1 1 0 1
-- wait sndTrkA to finish
waitPlayback
-- (B) load from memory buffer
buffer <- SB.readFile filename
sampleB <- case takeExtension filename of
".ogg" -> sampleFromMemoryOgg buffer 1.0
".wav" -> sampleFromMemoryWav buffer 1.0
".mp3" -> sampleFromMemoryMp3 buffer 1.0
soundPlay sampleB 1 1 0 1 -- left volume, right volume, time difference between left and right, pitch factor for playback
waitPlayback
sampleDestroy sampleB
soundPlay sampleB 1 1 0 1 -- we have invalidated the handle; nothing should happen now
waitPlayback
finishAudio