/Data/ZoomCache/PCM/Int.hs

https://github.com/kfish/zoom-cache-pcm · Haskell · 500 lines · 276 code · 92 blank · 132 comment · 0 complexity · 4359649ca29289d72318d6ddd83f22b1 MD5 · raw file

  1. {-# LANGUAGE BangPatterns #-}
  2. {-# LANGUAGE CPP #-}
  3. {-# LANGUAGE FlexibleContexts #-}
  4. {-# LANGUAGE FlexibleInstances #-}
  5. {-# LANGUAGE OverloadedStrings #-}
  6. {-# LANGUAGE RecordWildCards #-}
  7. {-# LANGUAGE TypeFamilies #-}
  8. {-# OPTIONS_GHC -Wall -fno-warn-orphans #-}
  9. ----------------------------------------------------------------------
  10. {- |
  11. Module : Data.ZoomCache.PCM.Int
  12. Copyright : Conrad Parker
  13. License : BSD3-style (see LICENSE)
  14. Maintainer : Conrad Parker <conrad@metadecks.org>
  15. Stability : unstable
  16. Portability : unknown
  17. Default codec implementation for PCM Audio of type Int. This module
  18. implements the interfaces documented in "Data.ZoomCache.Codec".
  19. The table below describes the encoding of SummaryData for 'PCM Int16':
  20. @
  21. | ... | -35
  22. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  23. | Min (int16) | Max (int16) | 36-39
  24. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  25. | Mean [DC Bias] (double) | 40-43
  26. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  27. | | 44-47
  28. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  29. | RMS (double) | 48-51
  30. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  31. | | 52-55
  32. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  33. @
  34. The table below describes the encoding of SummaryData for 'PCM Int' and
  35. 'PCM Int32':
  36. @
  37. | ... | -35
  38. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  39. | Min (int32) | 36-39
  40. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  41. | Max (int32) | 40-43
  42. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  43. | Mean [DC Bias] (double) | 44-47
  44. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  45. | | 48-51
  46. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  47. | RMS (double) | 52-55
  48. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  49. | | 56-59
  50. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  51. @
  52. The table below describes the encoding of SummaryData for 'PCM Int64':
  53. @
  54. | ... | -35
  55. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  56. | Min (int64) | 36-39
  57. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  58. | | 40-43
  59. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  60. | Max (int64) | 44-47
  61. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  62. | | 48-51
  63. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  64. | Mean [DC Bias] (double) | 52-55
  65. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  66. | | 56-59
  67. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  68. | RMS (double) | 60-63
  69. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  70. | | 64-67
  71. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  72. @
  73. Field encoding formats:
  74. @int32@: 32bit big endian
  75. @int64@: 64bit big endian
  76. @double@: big-endian IEEE 754-2008 binary64 (IEEE 754-1985 double)
  77. -}
  78. ----------------------------------------------------------------------
  79. module Data.ZoomCache.PCM.Int (
  80. SummaryData(..)
  81. , SummaryWork(..)
  82. )where
  83. import Blaze.ByteString.Builder
  84. import Control.Applicative ((<$>))
  85. import Data.ByteString (ByteString)
  86. import Data.Int
  87. import Data.Iteratee (Iteratee)
  88. import Text.Printf
  89. import Data.ZoomCache.Codec
  90. import Data.ZoomCache.PCM.Internal
  91. import Data.ZoomCache.PCM.Types
  92. ----------------------------------------------------------------------
  93. -- Int
  94. instance ZoomReadable (PCM Int) where
  95. data SummaryData (PCM Int) = SummaryPCMInt
  96. { summaryIntMin :: {-# UNPACK #-}!Int
  97. , summaryIntMax :: {-# UNPACK #-}!Int
  98. , summaryIntAvg :: {-# UNPACK #-}!Double
  99. , summaryIntRMS :: {-# UNPACK #-}!Double
  100. }
  101. trackIdentifier = const "ZPCMi32b"
  102. readRaw = PCM <$> readInt32be
  103. readSummary = readSummaryPCM
  104. prettyRaw = prettyPacketPCMInt
  105. prettySummaryData = prettySummaryPCMInt
  106. deltaDecodeRaw = deltaDecodePCM
  107. #if __GLASGOW_HASKELL__ >= 702
  108. {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Int)) #-}
  109. #endif
  110. instance ZoomWrite (PCM Int) where
  111. write = writeData
  112. instance ZoomWrite (SampleOffset, (PCM Int)) where
  113. write = writeDataVBR
  114. instance ZoomWritable (PCM Int) where
  115. data SummaryWork (PCM Int) = SummaryWorkPCMInt
  116. { swPCMIntTime :: {-# UNPACK #-}!SampleOffset
  117. , swPCMIntLast :: {-# UNPACK #-}!Int
  118. , swPCMIntMin :: {-# UNPACK #-}!Int
  119. , swPCMIntMax :: {-# UNPACK #-}!Int
  120. , swPCMIntSum :: {-# UNPACK #-}!Double
  121. , swPCMIntSumSq :: {-# UNPACK #-}!Double
  122. }
  123. fromRaw = pcmFromRaw . unPCM
  124. fromSummaryData = fromSummaryPCM
  125. initSummaryWork = initSummaryPCMBounded
  126. toSummaryData = mkSummaryPCM
  127. updateSummaryData = updateSummaryPCM
  128. appendSummaryData = appendSummaryPCM
  129. deltaEncodeRaw = deltaEncodePCM
  130. instance ZoomPCM Int where
  131. pcmFromRaw = fromIntegral32be
  132. pcmMin = summaryIntMin
  133. pcmMax = summaryIntMax
  134. pcmAvg = summaryIntAvg
  135. pcmRMS = summaryIntRMS
  136. pcmWorkSO = swPCMIntTime
  137. pcmWorkLast = swPCMIntLast
  138. pcmWorkMin = swPCMIntMin
  139. pcmWorkMax = swPCMIntMax
  140. pcmWorkSum = swPCMIntSum
  141. pcmWorkSumSq = swPCMIntSumSq
  142. pcmMkSummary = SummaryPCMInt
  143. pcmMkSummaryWork = SummaryWorkPCMInt
  144. #if __GLASGOW_HASKELL__ >= 702
  145. {-# SPECIALIZE fromSummaryPCM :: SummaryData (PCM Int) -> Builder #-}
  146. {-# SPECIALIZE initSummaryPCMBounded :: SampleOffset -> SummaryWork (PCM Int) #-}
  147. {-# SPECIALIZE mkSummaryPCM :: SampleOffsetDiff -> SummaryWork (PCM Int) -> SummaryData (PCM Int) #-}
  148. {-# SPECIALIZE appendSummaryPCM :: SampleOffsetDiff -> SummaryData (PCM Int) -> SampleOffsetDiff -> SummaryData (PCM Int) -> SummaryData (PCM Int) #-}
  149. {-# SPECIALIZE updateSummaryPCM :: SampleOffset -> PCM Int -> SummaryWork (PCM Int) -> SummaryWork (PCM Int) #-}
  150. #endif
  151. ----------------------------------------------------------------------
  152. -- Int8
  153. instance ZoomReadable (PCM Int8) where
  154. data SummaryData (PCM Int8) = SummaryPCMInt8
  155. { summaryInt8Min :: {-# UNPACK #-}!Int8
  156. , summaryInt8Max :: {-# UNPACK #-}!Int8
  157. , summaryInt8Avg :: {-# UNPACK #-}!Double
  158. , summaryInt8RMS :: {-# UNPACK #-}!Double
  159. }
  160. trackIdentifier = const "ZPCMiS8b"
  161. readRaw = PCM <$> readInt8
  162. readSummary = readSummaryPCM
  163. prettyRaw = prettyPacketPCMInt
  164. prettySummaryData = prettySummaryPCMInt
  165. deltaDecodeRaw = deltaDecodePCM
  166. #if __GLASGOW_HASKELL__ >= 702
  167. {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Int8)) #-}
  168. #endif
  169. instance ZoomWrite (PCM Int8) where
  170. write = writeData
  171. instance ZoomWrite (SampleOffset, (PCM Int8)) where
  172. write = writeDataVBR
  173. instance ZoomWritable (PCM Int8) where
  174. data SummaryWork (PCM Int8) = SummaryWorkPCMInt8
  175. { swPCMInt8Time :: {-# UNPACK #-}!SampleOffset
  176. , swPCMInt8Last :: {-# UNPACK #-}!Int8
  177. , swPCMInt8Min :: {-# UNPACK #-}!Int8
  178. , swPCMInt8Max :: {-# UNPACK #-}!Int8
  179. , swPCMInt8Sum :: {-# UNPACK #-}!Double
  180. , swPCMInt8SumSq :: {-# UNPACK #-}!Double
  181. }
  182. fromRaw = pcmFromRaw . unPCM
  183. fromSummaryData = fromSummaryPCM
  184. initSummaryWork = initSummaryPCMBounded
  185. toSummaryData = mkSummaryPCM
  186. updateSummaryData = updateSummaryPCM
  187. appendSummaryData = appendSummaryPCM
  188. deltaEncodeRaw = deltaEncodePCM
  189. instance ZoomPCM Int8 where
  190. pcmFromRaw = fromInt8
  191. pcmMin = summaryInt8Min
  192. pcmMax = summaryInt8Max
  193. pcmAvg = summaryInt8Avg
  194. pcmRMS = summaryInt8RMS
  195. pcmWorkSO = swPCMInt8Time
  196. pcmWorkLast = swPCMInt8Last
  197. pcmWorkMin = swPCMInt8Min
  198. pcmWorkMax = swPCMInt8Max
  199. pcmWorkSum = swPCMInt8Sum
  200. pcmWorkSumSq = swPCMInt8SumSq
  201. pcmMkSummary = SummaryPCMInt8
  202. pcmMkSummaryWork = SummaryWorkPCMInt8
  203. #if __GLASGOW_HASKELL__ >= 702
  204. {-# SPECIALIZE fromSummaryPCM :: SummaryData (PCM Int8) -> Builder #-}
  205. {-# SPECIALIZE initSummaryPCMBounded :: SampleOffset -> SummaryWork (PCM Int8) #-}
  206. {-# SPECIALIZE mkSummaryPCM :: SampleOffsetDiff -> SummaryWork (PCM Int8) -> SummaryData (PCM Int8) #-}
  207. {-# SPECIALIZE appendSummaryPCM :: SampleOffsetDiff -> SummaryData (PCM Int8) -> SampleOffsetDiff -> SummaryData (PCM Int8) -> SummaryData (PCM Int8) #-}
  208. {-# SPECIALIZE updateSummaryPCM :: SampleOffset -> PCM Int8 -> SummaryWork (PCM Int8) -> SummaryWork (PCM Int8) #-}
  209. #endif
  210. ----------------------------------------------------------------------
  211. -- Int16
  212. instance ZoomReadable (PCM Int16) where
  213. data SummaryData (PCM Int16) = SummaryPCMInt16
  214. { summaryInt16Min :: {-# UNPACK #-}!Int16
  215. , summaryInt16Max :: {-# UNPACK #-}!Int16
  216. , summaryInt16Avg :: {-# UNPACK #-}!Double
  217. , summaryInt16RMS :: {-# UNPACK #-}!Double
  218. }
  219. trackIdentifier = const "ZPCMi16b"
  220. readRaw = PCM <$> readInt16be
  221. readSummary = readSummaryPCM
  222. prettyRaw = prettyPacketPCMInt
  223. prettySummaryData = prettySummaryPCMInt
  224. deltaDecodeRaw = deltaDecodePCM
  225. #if __GLASGOW_HASKELL__ >= 702
  226. {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Int16)) #-}
  227. #endif
  228. instance ZoomWrite (PCM Int16) where
  229. write = writeData
  230. instance ZoomWrite (SampleOffset, (PCM Int16)) where
  231. write = writeDataVBR
  232. instance ZoomWritable (PCM Int16) where
  233. data SummaryWork (PCM Int16) = SummaryWorkPCMInt16
  234. { swPCMInt16Time :: {-# UNPACK #-}!SampleOffset
  235. , swPCMInt16Last :: {-# UNPACK #-}!Int16
  236. , swPCMInt16Min :: {-# UNPACK #-}!Int16
  237. , swPCMInt16Max :: {-# UNPACK #-}!Int16
  238. , swPCMInt16Sum :: {-# UNPACK #-}!Double
  239. , swPCMInt16SumSq :: {-# UNPACK #-}!Double
  240. }
  241. fromRaw = pcmFromRaw . unPCM
  242. fromSummaryData = fromSummaryPCM
  243. initSummaryWork = initSummaryPCMBounded
  244. toSummaryData = mkSummaryPCM
  245. updateSummaryData = updateSummaryPCM
  246. appendSummaryData = appendSummaryPCM
  247. deltaEncodeRaw = deltaEncodePCM
  248. instance ZoomPCM Int16 where
  249. pcmFromRaw = fromInt16be
  250. pcmMin = summaryInt16Min
  251. pcmMax = summaryInt16Max
  252. pcmAvg = summaryInt16Avg
  253. pcmRMS = summaryInt16RMS
  254. pcmWorkSO = swPCMInt16Time
  255. pcmWorkLast = swPCMInt16Last
  256. pcmWorkMin = swPCMInt16Min
  257. pcmWorkMax = swPCMInt16Max
  258. pcmWorkSum = swPCMInt16Sum
  259. pcmWorkSumSq = swPCMInt16SumSq
  260. pcmMkSummary = SummaryPCMInt16
  261. pcmMkSummaryWork = SummaryWorkPCMInt16
  262. #if __GLASGOW_HASKELL__ >= 702
  263. {-# SPECIALIZE fromSummaryPCM :: SummaryData (PCM Int16) -> Builder #-}
  264. {-# SPECIALIZE initSummaryPCMBounded :: SampleOffset -> SummaryWork (PCM Int16) #-}
  265. {-# SPECIALIZE mkSummaryPCM :: SampleOffsetDiff -> SummaryWork (PCM Int16) -> SummaryData (PCM Int16) #-}
  266. {-# SPECIALIZE appendSummaryPCM :: SampleOffsetDiff -> SummaryData (PCM Int16) -> SampleOffsetDiff -> SummaryData (PCM Int16) -> SummaryData (PCM Int16) #-}
  267. {-# SPECIALIZE updateSummaryPCM :: SampleOffset -> PCM Int16 -> SummaryWork (PCM Int16) -> SummaryWork (PCM Int16) #-}
  268. #endif
  269. ----------------------------------------------------------------------
  270. -- Int32
  271. instance ZoomReadable (PCM Int32) where
  272. data SummaryData (PCM Int32) = SummaryPCMInt32
  273. { summaryInt32Min :: {-# UNPACK #-}!Int32
  274. , summaryInt32Max :: {-# UNPACK #-}!Int32
  275. , summaryInt32Avg :: {-# UNPACK #-}!Double
  276. , summaryInt32RMS :: {-# UNPACK #-}!Double
  277. }
  278. trackIdentifier = const "ZPCMi32b"
  279. readRaw = PCM <$> readInt32be
  280. readSummary = readSummaryPCM
  281. prettyRaw = prettyPacketPCMInt
  282. prettySummaryData = prettySummaryPCMInt
  283. deltaDecodeRaw = deltaDecodePCM
  284. #if __GLASGOW_HASKELL__ >= 702
  285. {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Int32)) #-}
  286. #endif
  287. instance ZoomWrite (PCM Int32) where
  288. write = writeData
  289. instance ZoomWrite (SampleOffset, (PCM Int32)) where
  290. write = writeDataVBR
  291. instance ZoomWritable (PCM Int32) where
  292. data SummaryWork (PCM Int32) = SummaryWorkPCMInt32
  293. { swPCMInt32Time :: {-# UNPACK #-}!SampleOffset
  294. , swPCMInt32Last :: {-# UNPACK #-}!Int32
  295. , swPCMInt32Min :: {-# UNPACK #-}!Int32
  296. , swPCMInt32Max :: {-# UNPACK #-}!Int32
  297. , swPCMInt32Sum :: {-# UNPACK #-}!Double
  298. , swPCMInt32SumSq :: {-# UNPACK #-}!Double
  299. }
  300. fromRaw = pcmFromRaw . unPCM
  301. fromSummaryData = fromSummaryPCM
  302. initSummaryWork = initSummaryPCMBounded
  303. toSummaryData = mkSummaryPCM
  304. updateSummaryData = updateSummaryPCM
  305. appendSummaryData = appendSummaryPCM
  306. deltaEncodeRaw = deltaEncodePCM
  307. instance ZoomPCM Int32 where
  308. pcmFromRaw = fromIntegral32be
  309. pcmMin = summaryInt32Min
  310. pcmMax = summaryInt32Max
  311. pcmAvg = summaryInt32Avg
  312. pcmRMS = summaryInt32RMS
  313. pcmWorkSO = swPCMInt32Time
  314. pcmWorkLast = swPCMInt32Last
  315. pcmWorkMin = swPCMInt32Min
  316. pcmWorkMax = swPCMInt32Max
  317. pcmWorkSum = swPCMInt32Sum
  318. pcmWorkSumSq = swPCMInt32SumSq
  319. pcmMkSummary = SummaryPCMInt32
  320. pcmMkSummaryWork = SummaryWorkPCMInt32
  321. #if __GLASGOW_HASKELL__ >= 702
  322. {-# SPECIALIZE fromSummaryPCM :: SummaryData (PCM Int32) -> Builder #-}
  323. {-# SPECIALIZE initSummaryPCMBounded :: SampleOffset -> SummaryWork (PCM Int32) #-}
  324. {-# SPECIALIZE mkSummaryPCM :: SampleOffsetDiff -> SummaryWork (PCM Int32) -> SummaryData (PCM Int32) #-}
  325. {-# SPECIALIZE appendSummaryPCM :: SampleOffsetDiff -> SummaryData (PCM Int32) -> SampleOffsetDiff -> SummaryData (PCM Int32) -> SummaryData (PCM Int32) #-}
  326. {-# SPECIALIZE updateSummaryPCM :: SampleOffset -> PCM Int32 -> SummaryWork (PCM Int32) -> SummaryWork (PCM Int32) #-}
  327. #endif
  328. ----------------------------------------------------------------------
  329. -- Int64
  330. instance ZoomReadable (PCM Int64) where
  331. data SummaryData (PCM Int64) = SummaryPCMInt64
  332. { summaryInt64Min :: {-# UNPACK #-}!Int64
  333. , summaryInt64Max :: {-# UNPACK #-}!Int64
  334. , summaryInt64Avg :: {-# UNPACK #-}!Double
  335. , summaryInt64RMS :: {-# UNPACK #-}!Double
  336. }
  337. trackIdentifier = const "ZPCMi64b"
  338. readRaw = PCM <$> readInt64be
  339. readSummary = readSummaryPCM
  340. prettyRaw = prettyPacketPCMInt
  341. prettySummaryData = prettySummaryPCMInt
  342. deltaDecodeRaw = deltaDecodePCM
  343. #if __GLASGOW_HASKELL__ >= 702
  344. {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Int64)) #-}
  345. #endif
  346. instance ZoomWrite (PCM Int64) where
  347. write = writeData
  348. instance ZoomWrite (SampleOffset, (PCM Int64)) where
  349. write = writeDataVBR
  350. instance ZoomWritable (PCM Int64) where
  351. data SummaryWork (PCM Int64) = SummaryWorkPCMInt64
  352. { swPCMInt64Time :: {-# UNPACK #-}!SampleOffset
  353. , swPCMInt64Last :: {-# UNPACK #-}!Int64
  354. , swPCMInt64Min :: {-# UNPACK #-}!Int64
  355. , swPCMInt64Max :: {-# UNPACK #-}!Int64
  356. , swPCMInt64Sum :: {-# UNPACK #-}!Double
  357. , swPCMInt64SumSq :: {-# UNPACK #-}!Double
  358. }
  359. fromRaw = pcmFromRaw . unPCM
  360. fromSummaryData = fromSummaryPCM
  361. initSummaryWork = initSummaryPCMBounded
  362. toSummaryData = mkSummaryPCM
  363. updateSummaryData = updateSummaryPCM
  364. appendSummaryData = appendSummaryPCM
  365. deltaEncodeRaw = deltaEncodePCM
  366. instance ZoomPCM Int64 where
  367. pcmFromRaw = fromInt64be
  368. pcmMin = summaryInt64Min
  369. pcmMax = summaryInt64Max
  370. pcmAvg = summaryInt64Avg
  371. pcmRMS = summaryInt64RMS
  372. pcmWorkSO = swPCMInt64Time
  373. pcmWorkLast = swPCMInt64Last
  374. pcmWorkMin = swPCMInt64Min
  375. pcmWorkMax = swPCMInt64Max
  376. pcmWorkSum = swPCMInt64Sum
  377. pcmWorkSumSq = swPCMInt64SumSq
  378. pcmMkSummary = SummaryPCMInt64
  379. pcmMkSummaryWork = SummaryWorkPCMInt64
  380. #if __GLASGOW_HASKELL__ >= 702
  381. {-# SPECIALIZE fromSummaryPCM :: SummaryData (PCM Int64) -> Builder #-}
  382. {-# SPECIALIZE initSummaryPCMBounded :: SampleOffset -> SummaryWork (PCM Int64) #-}
  383. {-# SPECIALIZE mkSummaryPCM :: SampleOffsetDiff -> SummaryWork (PCM Int64) -> SummaryData (PCM Int64) #-}
  384. {-# SPECIALIZE appendSummaryPCM :: SampleOffsetDiff -> SummaryData (PCM Int64) -> SampleOffsetDiff -> SummaryData (PCM Int64) -> SummaryData (PCM Int64) #-}
  385. {-# SPECIALIZE updateSummaryPCM :: SampleOffset -> PCM Int64 -> SummaryWork (PCM Int64) -> SummaryWork (PCM Int64) #-}
  386. #endif
  387. ----------------------------------------------------------------------
  388. prettyPacketPCMInt :: Show a => PCM a -> String
  389. prettyPacketPCMInt = show . unPCM
  390. prettySummaryPCMInt :: (PrintfArg a, ZoomPCM a)
  391. => SummaryData (PCM a) -> String
  392. prettySummaryPCMInt s = concat
  393. [ printf "\tmin: %d\tmax: %d\t" (pcmMin s) (pcmMax s)
  394. , printf "avg: %.3f\trms: %.3f" (pcmAvg s) (pcmRMS s)
  395. ]