0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-19 20:32:15 +02:00

linux-pipewire: Allow passing registry events on creation

This will allow consumers of obs_pipewire to handle the device
registry themselves. This is not useful for the screencast code
since there's always only one node in the registry, but it will
be used by the camera and audio code to list hardware devices.
This commit is contained in:
Georges Basile Stavracas Neto 2022-07-02 09:06:07 -03:00 committed by Georges Basile Stavracas Neto
parent a8866fe3fa
commit 6499d01bec
3 changed files with 31 additions and 5 deletions

View File

@ -87,6 +87,9 @@ struct _obs_pipewire {
struct obs_pw_version server_version;
struct pw_registry *registry;
struct spa_hook registry_listener;
GPtrArray *streams;
};
@ -1164,7 +1167,10 @@ static const struct pw_core_events core_events = {
/* obs_source_info methods */
obs_pipewire *obs_pipewire_create(int pipewire_fd)
obs_pipewire *
obs_pipewire_create(int pipewire_fd,
const struct pw_registry_events *registry_events,
void *user_data)
{
obs_pipewire *obs_pw;
@ -1200,6 +1206,18 @@ obs_pipewire *obs_pipewire_create(int pipewire_fd)
obs_pw->server_version_sync = pw_core_sync(obs_pw->core, PW_ID_CORE,
obs_pw->server_version_sync);
pw_thread_loop_wait(obs_pw->thread_loop);
/* Registry */
if (registry_events) {
obs_pw->registry = pw_core_get_registry(obs_pw->core,
PW_VERSION_REGISTRY, 0);
pw_registry_add_listener(obs_pw->registry,
&obs_pw->registry_listener,
registry_events, user_data);
blog(LOG_INFO, "[pipewire] Created registry %p",
obs_pw->registry);
}
pw_thread_loop_unlock(obs_pw->thread_loop);
obs_pw->streams = g_ptr_array_new();
@ -1207,6 +1225,11 @@ obs_pipewire *obs_pipewire_create(int pipewire_fd)
return obs_pw;
}
struct pw_registry *obs_pipewire_get_registry(obs_pipewire *obs_pw)
{
return obs_pw->registry;
}
void obs_pipewire_destroy(obs_pipewire *obs_pw)
{
if (!obs_pw)

View File

@ -22,8 +22,7 @@
#include <obs-module.h>
#include <pipewire/keys.h>
#include <pipewire/properties.h>
#include <pipewire/pipewire.h>
typedef struct _obs_pipewire obs_pipewire;
typedef struct _obs_pipewire_stream obs_pipewire_stream;
@ -36,7 +35,11 @@ struct obs_pipwire_connect_stream_info {
} screencast;
};
obs_pipewire *obs_pipewire_create(int pipewire_fd);
obs_pipewire *
obs_pipewire_create(int pipewire_fd,
const struct pw_registry_events *registry_events,
void *user_data);
struct pw_registry *obs_pipewire_get_registry(obs_pipewire *obs_pw);
void obs_pipewire_destroy(obs_pipewire *obs_pw);
obs_pipewire_stream *obs_pipewire_connect_stream(

View File

@ -188,7 +188,7 @@ static void on_pipewire_remote_opened_cb(GObject *source, GAsyncResult *res,
return;
}
capture->obs_pw = obs_pipewire_create(pipewire_fd);
capture->obs_pw = obs_pipewire_create(pipewire_fd, NULL, NULL);
if (!capture->obs_pw)
return;