import Sound.ALSA.PCM (SoundFmt(SoundFmt), sampleFreq, soundSourceRead, SoundSource, alsaSoundSource, withSoundSource, ) import Foreign (allocaArray, peekArray, Storable, Ptr, castPtr, ) import Data.Int (Int16, ) bufSize :: Int bufSize = 1000 inputFormat :: SoundFmt Int16 inputFormat = SoundFmt { sampleFreq = 8000 } main :: IO () main = let source = alsaSoundSource "plughw:0,0" inputFormat in allocaArray bufSize $ \buf -> withSoundSource source $ \from -> loop source from bufSize buf -- FIXME: assumes little-endian machine loop :: SoundSource Int16 h -> h -> Int -> Ptr Int16 -> IO () loop src h n buf = do n' <- soundSourceRead src h (castPtr buf) n avg <- avgBuf buf n' putStrLn (replicate (avg `div` 20) '*') loop src h n buf avgBuf :: (Storable a, Integral a) => Ptr a -> Int -> IO Int avgBuf buf n = do xs <- peekArray n buf let xs' = map (fromIntegral . abs) xs :: [Int] return $ sum xs' `div` fromIntegral n