, BlockHeader(..)
, BlockFlags(..)
- , findNextBlock
+ , readBlocks
)
where
import Codec.Audio.WavPack.Metadata
decodeSamplingRate 0x0E = S.Just 192000
decodeSamplingRate _ = S.Nothing
--- | Find a WavPack block in a given stream. Returns 'S.Nothing' if no
--- blocks are found.
-findNextBlock ∷ L.ByteString -- ^ the input
- → (# S.Maybe Block, L.ByteString #) -- ^ the rest of input
+-- | Read WavPack blocks in a given stream lazily.
+readBlocks ∷ L.ByteString → [Block]
+readBlocks src
+ = case findNextBlock src of
+ (# S.Just block, src' #)
+ → block : readBlocks src'
+ (# S.Nothing, _ #)
+ → []
+
+findNextBlock ∷ L.ByteString
+ → (# S.Maybe Block, L.ByteString #)
findNextBlock src
= case L.uncons src of
Nothing
{-# LANGUAGE
- UnboxedTuples
- , UnicodeSyntax
+ UnicodeSyntax
#-}
module Main where
import Codec.Audio.WavPack.Block
import Codec.Audio.WavPack.Metadata
import qualified Data.ByteString.Lazy as L
-import qualified Data.Strict as S
import Data.Maybe
import Prelude.Unicode
import System.Environment
main = do [wvFile] ← getArgs
wvData ← L.readFile wvFile
hSetBuffering stdout NoBuffering
- showWvInfo wvData
-
-showWvInfo ∷ L.ByteString → IO ()
-showWvInfo stream
- = case findNextBlock stream of
- (# S.Just block, _ #)
- → printBlock block
- (# S.Nothing , _ #)
- → fail "Can't find any WavPack block headers."
+ mapM_ printBlock $ readBlocks wvData
+ putStrLn "* End of WavPack blocks"
printBlock ∷ Block → IO ()
printBlock b
- = do putStrLn "- Block header:"
+ = do putStrLn "* WavPack Block"
+ putStrLn "- Block header:"
print $ blockHeader b
putStrLn "- Block metadata sub-blocks:"
mapM_ printSub $ blockMetadata b
)
| otherwise
= print sub
+
+{- % du -sh 01.wv
+ 15716
+
+ When compiled with -O0:
+ % time ./dist/build/hs-wvinfo/hs-wvinfo 01.wv > /dev/null
+ 1.49s user 2.12s system 98% cpu 3.664 total
+
+ When compiled with -O2:
+ % time ./dist/build/hs-wvinfo/hs-wvinfo 01.wv > /dev/null
+ 1.35s user 2.09s system 97% cpu 3.520 total
+
+ Hmm... quite disappointing... The stringification is the
+ bottleneck? If so, I can live with that.
+-}