- let Right bf
- = runBitGet (S.reverse bs) $
- do BG.skip 1 -- reserved
- falseStereo ← getBit
- iirShaping ← getBit
- BG.skip 2 -- reserved
- samplingRate ← getAsWord8 4
- maxMagnitude ← getAsWord8 5
- leftShift ← getAsWord8 5
- finalBlock ← getBit
- initialBlock ← getBit
- hybridBalance ← getBit
- hybridBitrate ← getBit
- extendedInt ← getBit
- floatData ← getBit
- hybridShape ← getBit
- crossDecorr ← getBit
- jointStereo ← getBit
- hybrid ← getBit
- mono ← getBit
- bytesPerSample ← getAsWord8 2
- return BlockFlags {
- bfBytesPerSample = bytesPerSample + 1
- , bfMono = mono
- , bfHybrid = hybrid
- , bfJointStereo = jointStereo
- , bfCrossDecorr = crossDecorr
- , bfHybridShape = hybridShape
- , bfFloatData = floatData
- , bfExtendedInt = extendedInt
- , bfHybridBitrate = hybridBitrate
- , bfHybridBalance = hybridBalance
- , bfInitialBlock = initialBlock
- , bfFinalBlock = finalBlock
- , bfLeftShift = leftShift
- , bfMaxMagnitude = maxMagnitude
- , bfSamplingRate = decodeSamplingRate samplingRate
- , bfIIRShaping = iirShaping
- , bfFalseStereo = falseStereo
- }
- return bf
+ let !r = runBitGet (S.reverse bs) $
+ do BG.skip 1 -- reserved
+ falseStereo ← getBit
+ iirShaping ← getBit
+ BG.skip 2 -- reserved
+ samplingRate ← getAsWord8 4
+ maxMagnitude ← getAsWord8 5
+ leftShift ← getAsWord8 5
+ finalBlock ← getBit
+ initialBlock ← getBit
+ hybridBalance ← getBit
+ hybridBitrate ← getBit
+ extendedInt ← getBit
+ floatData ← getBit
+ hybridShape ← getBit
+ crossDecorr ← getBit
+ jointStereo ← getBit
+ hybrid ← getBit
+ mono ← getBit
+ bytesPerSample ← getAsWord8 2
+ return $! BlockFlags {
+ bfBytesPerSample = bytesPerSample + 1
+ , bfMono = mono
+ , bfHybrid = hybrid
+ , bfJointStereo = jointStereo
+ , bfCrossDecorr = crossDecorr
+ , bfHybridShape = hybridShape
+ , bfFloatData = floatData
+ , bfExtendedInt = extendedInt
+ , bfHybridBitrate = hybridBitrate
+ , bfHybridBalance = hybridBalance
+ , bfInitialBlock = initialBlock
+ , bfFinalBlock = finalBlock
+ , bfLeftShift = leftShift
+ , bfMaxMagnitude = maxMagnitude
+ , bfSamplingRate = decodeSamplingRate samplingRate
+ , bfIIRShaping = iirShaping
+ , bfFalseStereo = falseStereo
+ }
+ case r of
+ Left err → fail err
+ Right bf → return $! bf
+
+encodeSamplingRate ∷ S.Maybe Int → Word8
+encodeSamplingRate (S.Just 6000) = 0x00
+encodeSamplingRate (S.Just 8000) = 0x01
+encodeSamplingRate (S.Just 9600) = 0x02
+encodeSamplingRate (S.Just 11025) = 0x03
+encodeSamplingRate (S.Just 12000) = 0x04
+encodeSamplingRate (S.Just 16000) = 0x05
+encodeSamplingRate (S.Just 22050) = 0x06
+encodeSamplingRate (S.Just 24000) = 0x07
+encodeSamplingRate (S.Just 32000) = 0x08
+encodeSamplingRate (S.Just 44100) = 0x09
+encodeSamplingRate (S.Just 48000) = 0x0A
+encodeSamplingRate (S.Just 64000) = 0x0B
+encodeSamplingRate (S.Just 88200) = 0x0C
+encodeSamplingRate (S.Just 96000) = 0x0D
+encodeSamplingRate (S.Just 192000) = 0x0E
+encodeSamplingRate _ = 0x0F