module Data.ZoomCache.Dump (
zoomDumpFile
, zoomDumpSummary
, zoomDumpSummaryLevel
, zoomInfoFile
) where
import Control.Applicative ((<$>))
import qualified Data.IntMap as IM
import qualified Data.Iteratee as I
import qualified Data.Iteratee.IO.OffsetFd as OffI
import Data.Offset
import Text.Printf
import Data.ZoomCache
zoomInfoFile :: [IdentifyCodec]
-> FilePath -> IO ()
zoomInfoFile identifiers path =
OffI.fileDriverRandomOBS (iterHeaders identifiers) path >>= info
zoomDumpFile :: [IdentifyCodec] -> TrackNo -> FilePath -> IO ()
zoomDumpFile = dumpSomething dumpData
zoomDumpSummary :: [IdentifyCodec] -> TrackNo -> FilePath -> IO ()
zoomDumpSummary = dumpSomething dumpSummary
zoomDumpSummaryLevel :: Int
-> [IdentifyCodec] -> TrackNo -> FilePath -> IO ()
zoomDumpSummaryLevel lvl = dumpSomething (dumpSummaryLevel lvl)
dumpSomething :: (Offset Block -> IO ()) -> [IdentifyCodec] -> TrackNo -> FilePath -> IO ()
dumpSomething f identifiers trackNo = OffI.fileDriverRandomOBS
(I.joinI . enumCacheFile identifiers . I.joinI . filterTracks [trackNo] . I.mapM_ $ f)
info :: CacheFile -> IO ()
info CacheFile{..} = do
putStrLn . prettyGlobal $ cfGlobal
mapM_ (putStrLn . uncurry prettyTrackSpec) . IM.assocs $ cfSpecs
blockRate :: Block -> Maybe Rational
blockRate b = specRate <$> IM.lookup (blkTrack b) (cfSpecs (blkFile b))
dumpData :: Offset Block -> IO ()
dumpData (Offset o b@(Block _ _ (BlockPacket p))) = do
putStrLn $ printf "%07x:" (fromIntegral o :: Integer)
mapM_ (\(t,d) -> putStrLn $ printf "%s: %s" t d) tds
where
pretty = case blockRate b of
Just r -> prettySampleOffset r
Nothing -> show . unSO
tds = zip (map pretty (packetSOSampleOffsets p)) vals
vals = f (packetSOData p)
f (ZoomRaw a) = map prettyRaw a
dumpData _ = return ()
dumpSummary :: Offset Block -> IO ()
dumpSummary (Offset o b@(Block _ _ (BlockSummary s))) = case blockRate b of
Just r -> putStrLn $ ox ++ f r s
Nothing -> return ()
where
ox = printf "%07x: " (fromIntegral o :: Integer)
f r (ZoomSummarySO a) = prettySummarySO r a
dumpSummary _ = return ()
dumpSummaryLevel :: Int -> Offset Block -> IO ()
dumpSummaryLevel level o@(Offset _ (Block _ _ (BlockSummary s)))
| level == opLevel s = dumpSummary o
| otherwise = return ()
where opLevel (ZoomSummarySO a) = summarySOLevel a
dumpSummaryLevel _ _ = return ()