{-# LANGUAGE BangPatterns , FlexibleContexts , ScopedTypeVariables , UnboxedTuples , UnicodeSyntax #-} -- | FIXME module Codec.Audio.WavPack.Words ( WordsData(..) ) where import Codec.Audio.WavPack.Entropy import Codec.Audio.WavPack.Internal import Data.Bits import Data.Bitstream.Generic (Bitstream) import qualified Data.Bitstream.Generic as B import Data.Int import qualified Data.Vector.Generic as GV import Data.Word import Prelude.Unicode -- | FIXME data WordsData = WordsData { wdBitrateDelta ∷ !(Word32, Word32) , wdBitrateAcc ∷ !(Word32, Word32) , wdPendingData ∷ !Word32 , wdHoldingOne ∷ !Word32 , wdZeroesAcc ∷ !Word32 , wdHoldingZero ∷ !Bool , wdPendingCount ∷ !Int , wdEntropyData ∷ !(EntropyData, EntropyData) } deriving (Eq, Show) -- | This is an optimized version of 'getWord' that is used for -- lossless only ('edErrorLimit' ≡ 0). Also, rather than obtaining a -- single sample, it can be used to obtain an entire buffer of either -- mono or stereo samples. getWordsLossless ∷ ∀bs n v. (Bitstream bs, Integral n, GV.Vector v Int32) ⇒ Bool -- ^ Is the stream monaural? → WordsData → bs -- ^ WV bitstream. → n -- ^ Number of samples to get. → (# WordsData, bs, v Int32 #) {-# INLINEABLE getWordsLossless #-} getWordsLossless isMono w bs nSamples0 = error "FIXME" where nSamples ∷ n nSamples = if isMono then nSamples0 else nSamples0 ⋅ 2 -- | Read a single unsigned value from the specified bitstream with a -- value from 0 to maxCode. If there are exactly a power of two number -- of possible codes then this will read a fixed number of bits; -- otherwise it reads the minimum number of bits and then determines -- whether another bit is needed to define the code. readCode ∷ Bitstream bs ⇒ bs → Word32 → (# Word32, bs #) {-# INLINEABLE readCode #-} readCode bs 0 = (# 0, bs #) readCode bs 1 = (# b2n (B.head bs), B.tail bs #) readCode bs maxCode = let !bitCount = countBits maxCode !extras = bit bitCount - maxCode - 1 !code = B.toBits (B.take (bitCount - 1) bs) (# code', bitCount' #) = if code ≥ extras then (# (code `shiftL` 1) - extras + b2n (bs B.!! bitCount) , bitCount #) else (# code, bitCount - 1 #) !bs' = B.drop bitCount' bs in (# code', bs' #)