#-}
module Main where
import Codec.Audio.WavPack.Block
+import Codec.Audio.WavPack.Metadata
import qualified Data.ByteString.Lazy as L
+import Data.Maybe
+import Prelude.Unicode
import System.Environment
+import System.IO
main ∷ IO ()
main = do [wvFile] ← getArgs
- wvStream ← L.readFile wvFile
- showWvInfo wvStream
+ wvData ← L.readFile wvFile
+ hSetBuffering stdout NoBuffering
+ mapM_ printBlock $ readBlocks wvData
+ putStrLn "* End of WavPack blocks"
-showWvInfo ∷ L.ByteString → IO ()
-showWvInfo stream
- = case findNextHeader stream of
- Just (bh, _)
- → print bh
- Nothing
- → fail "Can't find any WavPack block headers."
+printBlock ∷ Block → IO ()
+printBlock b
+ = do putStrLn "* WavPack Block"
+ putStrLn "- Block header:"
+ print $ blockHeader b
+ putStrLn "- Block metadata sub-blocks:"
+ mapM_ printSub $ blockMetadata b
+ where
+ printSub ∷ SubBlock → IO ()
+ printSub sub
+ | isJust (fromSubBlock sub ∷ Maybe WVBitstream)
+ = putStrLn ( "(WV Bitstream omitted: " ⧺
+ show (metaSize sub) ⧺
+ " bytes)"
+ )
+ | 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.
+-}