{-# LANGUAGE ForeignFunctionInterface #-} module Bindings.PipeWire where #include #include import Bindings.Util import Data.Text (Text) import Foreign (FunPtr, Ptr, Storable (..)) import Foreign.C (CInt, CString, CUInt) import Foreign.Marshal.Utils (with) data DictItem = DictItem {key :: CString, value :: CString} {#pointer *spa_dict_item as DictItemPtr -> DictItem#} instance Storable DictItem where sizeOf _ = {#sizeof spa_dict_item#} alignment _ = {#alignof spa_dict_item#} peek p = do DictItem <$> {#get spa_dict_item->key#} p <*> {#get spa_dict_item->value#} p poke p a = do {#set spa_dict_item->key#} p a.key {#set spa_dict_item->value#} p a.value data Dict = Dict {flags :: CUInt, nItems :: CUInt, items :: Ptr DictItem} {#pointer *spa_dict as DictPtr -> Dict#} instance Storable Dict where sizeOf _ = {#sizeof spa_dict#} alignment _ = {#alignof spa_dict#} peek p = do Dict <$> {#get spa_dict->flags#} p <*> {#get spa_dict->n_items#} p <*> {#get spa_dict->items#} p poke p a = do {#set spa_dict->flags#} p a.flags {#set spa_dict->n_items#} p a.nItems {#set spa_dict->items#} p a.items {#pointer *spa_hook as SpaHook#} spaHookSize :: Int spaHookSize = {#sizeof spa_hook#} data RegistryEvents = RegistryEvents { version :: CUInt , globalCallback :: FunPtr (Ptr () -> CUInt -> CUInt -> CString -> CUInt -> DictPtr -> IO ()) , globalRemoveCallback :: FunPtr (Ptr () -> CUInt -> IO ()) } instance Storable RegistryEvents where sizeOf _ = {#sizeof pw_registry_events#} alignment _ = {#alignof pw_registry_events#} peek p = do version <- {#get pw_registry_events->version#} p globalCallback <- {#get pw_registry_events->global#} p globalRemoveCallback <- {#get pw_registry_events->global_remove#} p pure RegistryEvents {version, globalCallback, globalRemoveCallback} poke p a = do {#set pw_registry_events->version#} p a.version {#set pw_registry_events->global#} p a.globalCallback {#set pw_registry_events->global_remove#} p a.globalRemoveCallback {#pointer *pw_registry_events as RegistryEventsPtr -> RegistryEvents#} versionRegistry :: CUInt versionRegistry = {#const PW_VERSION_REGISTRY#} versionRegistryEvents :: CUInt versionRegistryEvents = {#const PW_VERSION_REGISTRY_EVENTS#} foreign import ccall "wrapper" registryEventsGlobalCallback :: (Ptr () -> CUInt -> CUInt -> CString -> CUInt -> DictPtr -> IO ()) -> IO (FunPtr (Ptr () -> CUInt -> CUInt -> CString -> CUInt -> DictPtr -> IO ())) foreign import ccall "wrapper" registryEventsGlobalRemoveCallback :: (Ptr () -> CUInt -> IO ()) -> IO (FunPtr (Ptr () -> CUInt -> IO ())) {#pointer *pw_main_loop as MainLoop newtype#} {#pointer *pw_loop as Loop newtype#} {#pointer *pw_properties as Properties newtype#} {#pointer *pw_proxy as Proxy newtype#} {#pointer *pw_stream as Stream newtype#} {#pointer *pw_core as Core newtype#} {#pointer *pw_context as Context newtype#} {#pointer *pw_registry as Registry newtype#} {#fun unsafe pw_init as init {id `Ptr CInt', id `Ptr (Ptr CString)'} -> `()' #} {#fun unsafe pw_deinit as deinit {} -> `()'#} {#fun unsafe pw_main_loop_new as mainLoopNew {`DictPtr'} -> `MainLoop'#} {#fun unsafe pw_main_loop_get_loop as mainLoopGetLoop {`MainLoop'} -> `Loop'#} {#fun pw_main_loop_run as mainLoopRun {`MainLoop'} -> `CInt'#} {#fun unsafe pw_main_loop_destroy as mainLoopDestroy {`MainLoop'} -> `()'#} {#fun unsafe pw_main_loop_quit as mainLoopQuit {`MainLoop'} -> `CInt'#} {#fun unsafe pw_stream_destroy as streamDestroy {`Stream'} -> `()'#} {#fun unsafe pw_core_get_registry_ as coreGetRegistry {`Core', `CUInt', `CUInt'} -> `Registry'#} {#fun unsafe pw_core_disconnect as coreDisconnect {`Core'} -> `CInt'#} {#fun unsafe pw_registry_add_listener_ as registryAddListener {`Registry', `SpaHook', with* `RegistryEvents'} -> `()'#} {#fun unsafe pw_context_new as contextNew {`Loop', `Properties', `CUInt'} -> `Context'#} {#fun unsafe pw_context_connect_fd as contextConnectFd {`Context', `CInt', `Properties', `CInt'} -> `Core'#} {#fun unsafe pw_context_destroy as contextDestroy {`Context'} -> `()'#} {#fun unsafe variadic pw_properties_new[const char *, const char *] as propertiesNew1 {withText* `Text', withText* `Text', withNull- `CString'} -> `Properties'#} {#fun unsafe variadic pw_properties_new[const char *, const char *, const char *, const char *] as propertiesNew2 {withText* `Text', withText* `Text', withText* `Text', withText* `Text', withNull- `CString'} -> `Properties'#} {#fun unsafe variadic pw_properties_new[const char *, const char *, const char *, const char *, const char *, const char *] as propertiesNew3 {withText* `Text', withText* `Text', withText* `Text', withText* `Text', withText* `Text', withText* `Text', withNull- `CString'} -> `Properties'#} {#fun unsafe variadic pw_properties_new[const char *, const char *, const char *, const char *, const char *, const char *, const char *, const char *] as propertiesNew4 {withText* `Text', withText* `Text', withText* `Text', withText* `Text', withText* `Text', withText* `Text', withText* `Text', withText* `Text', withNull- `CString'} -> `Properties'#} {#fun unsafe pw_properties_set as propertiesSet {`Properties', withText* `Text', withText* `Text'} -> `CInt'#} {#fun unsafe pw_proxy_destroy as proxyDestroy {`Proxy'} -> `()'#}