packages feed

sdr-0.1.0.13: hs_sources/SDR/NetworkStream.hs

module SDR.NetworkStream (
        udpSendSocket,
        udpRecvSocket,
        udpSource,
        udpSink
    ) where

import Control.Monad
import Network.Socket (Socket, SockAddr)
import qualified Network.Socket as Socket
import Network.Socket.ByteString (sendAllTo, recv)
import Foreign.Storable
import qualified Data.Vector.Storable as VS
import Data.Vector.Storable.ByteString
import Pipes

udpSendSocket :: IO Socket
udpSendSocket = Socket.socket Socket.AF_INET Socket.Datagram Socket.defaultProtocol

udpRecvSocket
    :: SockAddr
    -> IO Socket
udpRecvSocket addr = do
    socket <- udpSendSocket
    Socket.bind socket addr
    return socket

udpSource 
    :: Storable a 
    => Socket 
    -> Int 
    -> Producer (VS.Vector a) IO ()
udpSource sock size = forever $ do
    s <- lift $ recv sock size
    yield $ byteStringToVector s

udpSink 
    :: Storable a 
    => Socket 
    -> SockAddr
    -> Consumer (VS.Vector a) IO ()
udpSink dev addr = for cat $ liftIO . flip (sendAllTo dev) addr . vectorToByteString