Skip to content
Snippets Groups Projects
  1. May 07, 2020
    • George Kiagiadakis's avatar
      global: properly destroy impl proxies that were removed by the server · ded2e34e
      George Kiagiadakis authored
      When a pw_global is removed on the server (by pw_registry_destroy() or other
      means), it triggers the proxy removed & the registry global_remove callbacks,
      but it does not necessarily destroy the pw_proxy.
      
      For client proxies, we were previously destroying them by unrefing the WpProxy
      in wp_global_rm_flags(), since the global was not "owned" by the WpProxy.
      
      For impl proxies, we were not doing anything, as we expected that it would
      only be removed from the registry if the local WpProxy was destroyed first.
      This is not always the case, though, as the server or another client may
      request to destroy this proxy with pw_registry_destroy()
      
      Now we always destroy the pw_proxy as soon as it is removed from the registry,
      no matter if it was a client or an impl proxy. If it was an impl proxy,
      the WpProxy will continue to live and it's up to the code that created it
      to handle the "pw-proxy-destroyed" signal and do something meaningful.
      If it was a client proxy, the global will still unref the WpProxy right after
      destroying the pw_proxy and there is no change in behavior.
      ded2e34e
    • George Kiagiadakis's avatar
      proxy: add _request_destroy() method for destroying remote objects · 3b086167
      George Kiagiadakis authored
      Useful to destroy links and endpoint-links
      3b086167
  2. May 03, 2020
  3. Apr 21, 2020
  4. Apr 14, 2020
  5. Mar 31, 2020
  6. Feb 19, 2020
  7. Feb 17, 2020
  8. Feb 14, 2020
    • George Kiagiadakis's avatar
      registry: safely destroy proxy when its initial augment is still in progress · 813351bc
      George Kiagiadakis authored
      ... in case the global is removed from the registry before
      the initial augment completes
      813351bc
    • George Kiagiadakis's avatar
      registry: use a temporary globals list · 269b9e19
      George Kiagiadakis authored
      When a new global is created, it is not certain
      if the registry global event or the proxy bound event will
      be fired first. In order to make sure we associate all
      proxies to their WpGlobals correctly, we now wait a core sync
      before exposing globals to the object managers, so that in case
      the implementation proxy receives the bound event after the
      registry creates the WpGlobal, we can make sure to use this
      proxy instead of constructing a new one through the object managers
      269b9e19
    • George Kiagiadakis's avatar
      object-manager: refactor to be able to track locally created proxies · 753e7085
      George Kiagiadakis authored
      There are 3 kinds of WpProxy objects:
       * the ones that are created as a result of binding a global
         from the registry
       * the ones that are created as a result of calling into a remote
         factory (wp_node_new_from_factory, etc...)
       * the ones that are a local implementation of an object
         (WpImplNode, etc...) and are exported
      
      Previously the object manager was only able to track the first kind.
      With these changes we can now also have globals associated with
      WpProxies that were created earlier (and caused the creation of the global).
      This saves some resources and reduces round-trips (in case client
      code wants to change properties of an object that is locally
      implemented, it shouldn't need to do a round-trip through the server)
      753e7085
  9. Feb 12, 2020
  10. Feb 11, 2020
    • George Kiagiadakis's avatar
      proxy/core: refactor object creation · 9330208a
      George Kiagiadakis authored
      * core no longer exposes create_remote/local_object
      * node, device & link have constructor methods
        to enable the create_remote_object functionality
      * added WpImplNode to wrap pw_impl_node and allow creating
        "local" node instances
      * added WpSpaDevice to wrap spa_device and allow creating
        "local" device instances
      * exporting objects in all cases now happens by requesting
        FEATURE_BOUND from the proxy, eliminating the need for WpExported
      * replaced WpMonitor by new, simpler code directly in module-monitor
      * the proxy type lookup table in WpProxy is gone, we now
        use a field on the class structure of every WpProxy subclass
        and iterate through all the class structures instead; this is
        more flexible and extensible
      9330208a
  11. Feb 10, 2020
    • George Kiagiadakis's avatar
      proxy: replace global-id with bound-id · d8ae151a
      George Kiagiadakis authored
      + use the pw_proxy API to find the bound id instead
      of relying on WpGlobal
      
      This has the advantage that it works also for exported
      objects and for objects that have been created by calling
      into a remote factory (such as the link-factory), so we can
      now know the global id of all proxies, not only the ones
      that have been created by the registry.
      d8ae151a
  12. Jan 22, 2020
  13. Jan 13, 2020
  14. Jan 10, 2020
  15. Jan 08, 2020
  16. Dec 11, 2019
  17. Dec 04, 2019
  18. Dec 03, 2019
  19. Nov 16, 2019
  20. Nov 13, 2019
    • George Kiagiadakis's avatar
      lib: introduce WpObjectManager · e7e5c668
      George Kiagiadakis authored
      * rework how global objects are stored in the core
      * rework how users get notified about global objects
        and proxies of remote global objects
      
      The purpose of this change is to have a class that can manage
      objects that are registered in the core or signalled through the
      registry. This object can declare interest on certain types
      of global objects and only keep & signal those objects that it is
      interested in. Additionally, it can prepare proxy features and
      asynchronously deliver an 'objects-changed' signal, which is
      basically telling us that the list of objects has changed.
      
      This is useful to simplify port proxies management in WpAudioStream.
      Now the stream object can declare that it is interested in ports
      that have "node.id" == X and the object manager will only maintain
      a list of those. Additionally, it will emit the 'objects-changed'
      signal when the list of ports is complete, so there is no reason to
      do complex operations and core syncs in the WpAudioStream class
      in order to figure out when the list of ports is ready.
      
      As a side effect, this also reduces resource management. Now we
      don't construct a WpProxy for every global that pipewire reports;
      we only construct proxies when there is interest in them!
      
      Another interesting side effect is that we can now register an
      object manager at any point in time and get immediately notified
      about remote globals that already exist. i.e. when you register
      an object manager that is interested in nodes, it will be immediately
      notified about all the existing nodes in the graph. This is useful
      to avoid race conditions between connecting the signal and objects
      beting created in pipewire
      e7e5c668
  21. Nov 11, 2019
  22. Nov 07, 2019
  23. Oct 02, 2019
  24. Sep 17, 2019
    • George Kiagiadakis's avatar
      proxy: destroy the pw_proxy in dispose() · 94b1390d
      George Kiagiadakis authored
      Because the proxy_event_destroy() handler now takes a ref to the
      WpProxy, which is an error to do in finalize()
      94b1390d
    • George Kiagiadakis's avatar
      proxy: fix crash that happens when a client exits very quickly after starting · 340b52fb
      George Kiagiadakis authored
      This is very easy to reproduce when the pipewire-alsa integration
      is installed and you do 'arecord -l'; the alsa plugin connects and
      disconnects again before the proxy is ready.
      
      In this case we have to skip remote-global-added and we also have
      to be careful with the references: the global-removed callback is
      called earlier, so the core's reference to the proxy is gone and
      the GTask is the only thing holding a reference to the proxy.
      When we unref the GTask, the proxy is also unrefed, so we have
      to keep an additional reference in order to avoid crashing
      when accessing the hash table below.
      340b52fb
  25. Sep 07, 2019
    • George Kiagiadakis's avatar
      lib/wp: merge both WpRemote & WpRemotePipewire in WpCore · a63f2bb9
      George Kiagiadakis authored
      In practice we always create a remote and connect to pipewire.
      Any other scenario is invalid, therefore, it is not justified
      to be confused with so many classes for such small functionality.
      This simplifies a lot the modules code.
      
      Also, this commit exposes the pw_core and pw_remote objects
      out of WpCore. This is in practice useful when dealing with low-level
      pw and spa factories, which are used in the monitors. Let's not
      add API wrappers for everything... Bindings will never use this
      functionality anyway, since it depends on low level pipewire C API.
      a63f2bb9
  26. Aug 29, 2019
  27. Aug 27, 2019
  28. Aug 25, 2019
  29. Jul 25, 2019
Loading