{- Copyright 2016 Markus Ongyerth This file is part of pulseaudio-hs. Monky is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Monky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with pulseaudio-hs. If not, see . -} {-# LANGUAGE ForeignFunctionInterface #-} {-| Module : Sound.Pulse.Serverinfo Description : provides the time type used for pa_server_info. Maintianer : ongy Stability : experimental -} module Sound.Pulse.Serverinfo ( ServerInfo(..) , getServerInfo ) where #if __GLASGOW_HASKELL__ < 800 #let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__) #endif #include import Control.Applicative ((<$>), (<*>)) import Data.Word (Word32, Word) import Sound.Pulse.SampleSpec import Sound.Pulse.ChannelPosition import Sound.Pulse.Context import Sound.Pulse.Userdata import Sound.Pulse.Operation import Foreign.Storable import Foreign.Ptr import Foreign.C.String -- |The type used for pa_server_info data ServerInfo = ServerInfo { userName :: String , hostName :: String , serverVersion :: String , serverName :: String , sampleSpec :: SampleSpec , defaultSinkName :: String , defaultSourceName :: String , cookie :: Word32 , channelMap :: ChannelMap } deriving (Eq, Show) instance Storable ServerInfo where sizeOf _ = #{size struct pa_server_info} alignment _ = #{alignment struct pa_server_info} peek p = ServerInfo <$> (peekCString =<< #{peek struct pa_server_info, user_name} p) <*> (peekCString =<< #{peek struct pa_server_info, host_name} p) <*> (peekCString =<< #{peek struct pa_server_info, server_version} p) <*> (peekCString =<< #{peek struct pa_server_info, server_name} p) <*> #{peek struct pa_server_info, sample_spec} p <*> (peekCString =<< #{peek struct pa_server_info, default_sink_name} p) <*> (peekCString =<< #{peek struct pa_server_info, default_source_name} p) <*> #{peek struct pa_server_info, cookie} p <*> #{peek struct pa_server_info, channel_map} p poke _ _ = error "PA: no poke for ServerInfo yet" -- TODO type ServerInfoCB = Context -> Ptr ServerInfo -> Ptr Userdata -> IO () foreign import ccall "wrapper" mkServerInfoCB :: ServerInfoCB -> IO (FunPtr ServerInfoCB) foreign import ccall "pa_context_get_server_info" pa_context_get_server_info :: Context -> FunPtr ServerInfoCB -> Ptr Userdata -> IO (Ptr UOperation) -- |Get the server info. getServerInfo :: Context -- ^Context for the server connection -> (ServerInfo -> IO ()) -> IO () getServerInfo cxt fun = do funP <- mkServerInfoCB $ \_ ptr fP -> do fun =<< peek ptr freeHaskellFunPtr (castPtrToFunPtr fP) _ <- ptrToOperation =<< pa_context_get_server_info cxt funP (castFunPtrToPtr funP) return ()