X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=Codec%2FAudio%2FWavPack%2FWords.hs;h=1321c0725808b340aea6e490ebd1817c627cc021;hb=8637d2f2dc3fcd383d8304160a87a3cf1141e467;hp=a8677fe41437faefa335b69634a66cafa9420e53;hpb=acbce2241afb82b8a21964284dc97f8014e63b42;p=wavpack.git diff --git a/Codec/Audio/WavPack/Words.hs b/Codec/Audio/WavPack/Words.hs index a8677fe..1321c07 100644 --- a/Codec/Audio/WavPack/Words.hs +++ b/Codec/Audio/WavPack/Words.hs @@ -90,8 +90,7 @@ getWordsLossless isMono w0 bs0 nSamples0 let w' = w { wdZeroesAcc = wdZeroesAcc w - 1 } in if wdZeroesAcc w' > 0 then - let v' = New.modify (\mv → MV.unsafeWrite mv n 0) v - n' = n + 1 + let (# n', v' #) = appendWord 0 n v in go0 w' bs n' v' else @@ -111,8 +110,8 @@ getWordsLossless isMono w0 bs0 nSamples0 ( clearMedian $ fst $ wdEntropyData w' , clearMedian $ snd $ wdEntropyData w' ) } - v' = New.modify (\mv → MV.unsafeWrite mv n 0) v - n' = n + 1 + (# n', v' #) + = appendWord 0 n v in go0 w'' bs'' n' v' else @@ -156,14 +155,20 @@ getWordsLossless isMono w0 bs0 nSamples0 in go2 0 w' bs n v | otherwise - = error "FIXME" + = let next8 ∷ Word8 + next8 = B.toBits (B.take (8 ∷ Int) bs) + in + if next8 ≡ 0xFF then + error "FIXME" + else + error "FIXME" go2 ∷ Word32 → WordsData → bs → Int → New v Int32 → (# WordsData, bs, Int, New v Int32 #) go2 0 w bs n v = let ent = getEntropy n w low = 0 - high = getMedian0 ent + high = getMedian0 ent - 1 ent' = decMedian0 ent w' = setEntropy ent' n w in @@ -199,16 +204,23 @@ getWordsLossless isMono w0 bs0 nSamples0 = let (# code, bs' #) = readCode bs (high - low) low' = low + code - a = if B.head bs' then + word = if B.head bs' then fromIntegral $ complement low' else fromIntegral low' bs'' = B.tail bs' - v' = New.modify (\mv → MV.unsafeWrite mv n a) v - n' = n + 1 + (# n', v' #) + = appendWord word n v in go0 w bs'' n' v' + appendWord ∷ Int32 → Int → New v Int32 → (# Int, New v Int32 #) + appendWord word n v + = let v' = New.modify (\mv → MV.unsafeWrite mv n word) v + n' = n + 1 + in + (# n', v' #) + getEntropy ∷ Int → WordsData → EntropyData getEntropy n w | isMono = fst $ wdEntropyData w