wavy-0.1.0.0: Sound/Wav/WaveFormat.hs
-- | This module handles parsing the "fmt " header of a WaveFile.
module Sound.Wav.WaveFormat
( getWaveFormat
, putWaveFormat
) where
import Sound.Wav.Data
import Sound.Wav.AudioFormats
import Data.Binary
import Data.Binary.Get
import Data.Binary.Put
instance Binary WaveFormat where
get = getWaveFormat
put = putWaveFormat
-- | Will successfully parse the format header of a WaveFile. They are very well specified leaving
-- little room for error.
getWaveFormat :: Get WaveFormat
getWaveFormat = do
-- TODO use the correct endian based on the correct parsing context
audioFormat <- fmap getAudioFormat getWord16le
numChannels <- getWord16le
sampleRate <- getWord32le
byteRate <- getWord32le
blockAlignment <- getWord16le
bitsPerSample <- getWord16le
return WaveFormat
{ waveAudioFormat = audioFormat
, waveNumChannels = numChannels
, waveSampleRate = sampleRate
, waveByteRate = byteRate
, waveBlockAlignment = blockAlignment
, waveBitsPerSample = bitsPerSample
}
-- | Will successfully place a WaveFile fmt chunk into a binary stream. Follows the WAVE
-- specifications.
putWaveFormat :: WaveFormat-> Put
putWaveFormat format = do
putWord16le . putAudioFormat . waveAudioFormat $ format
putWord16le . waveNumChannels $ format
putWord32le . waveSampleRate $ format
putWord32le . waveByteRate $ format
putWord16le . waveBlockAlignment $ format
putWord16le . waveBitsPerSample $ format