-- | Encode audio data.
module Sound.File.Encode (interleave,encode) where

import qualified Data.ByteString.Lazy as B {- bytestring -}
import Data.List {- base -}
import Sound.OSC.Coding.Byte {- hosc -}

import Sound.File.Encoding

-- | Interleave channel data, ie. 'concat' '.' 'transpose'.
--
-- > interleave [[0,2..8],[1,3..9]] == [0,1,2,3,4,5,6,7,8,9]
interleave :: [[a]] -> [a]
interleave = concat . transpose

encodef32 :: (Real n,Floating n) => [[n]] -> B.ByteString
encodef32 = B.concat . map (encode_f32 . realToFrac) . interleave

encodef64 :: (Real n,Floating n) => [[n]] -> B.ByteString
encodef64 = B.concat . map (encode_f64 . realToFrac) . interleave

-- | Given 'Encoding' and a set of channels, 'interleave' and encode
-- as 'B.ByteString'.
encode :: (Real n,Floating n) => Encoding -> [[n]] -> B.ByteString
encode enc d =
    case enc of
      Float -> encodef32 d
      Double -> encodef64 d
      _ -> error "hsc3-sf: encode"