MyNixOS website logo
Description

Simple audio library for Windows, Linux, OSX.

Simple audio library for Windows, Linux, OSX. Supports PCM, Ogg, Mp3 and Wav playback and multichannel mixing.

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
Metadata

Version

0.10.1

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows