X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=wavpack.git;a=blobdiff_plain;f=Codec%2FAudio%2FWavPack%2FUnpack.hs;fp=Codec%2FAudio%2FWavPack%2FUnpack.hs;h=264072c71f7e3ce6f25dbbf32db5eccd48b49ed2;hp=f816657e9924e8b105b7bf99c232fdf5fb40332f;hb=5f113a044d1a17a7313124802b58c91819bc54eb;hpb=c12220b6ce900bced2b48b1fbc3a098e06d94946 diff --git a/Codec/Audio/WavPack/Unpack.hs b/Codec/Audio/WavPack/Unpack.hs index f816657..264072c 100644 --- a/Codec/Audio/WavPack/Unpack.hs +++ b/Codec/Audio/WavPack/Unpack.hs @@ -1,40 +1,4 @@ -{-# LANGUAGE - BangPatterns - , UnboxedTuples - , UnicodeSyntax - #-} module Codec.Audio.WavPack.Unpack ( ) where -import Codec.Audio.WavPack.Internal -import Data.Bits -import Data.Bitstream.Generic (Bitstream) -import qualified Data.Bitstream.Generic as B -import Data.Word -import Prelude.Unicode - --- 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' #)