mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-19 08:57:14 -05:00
Introduce the concept of a Node
Make an object for a processing node. Implement a sink node. Make it possible to implement Sink and Source interfaces to provide input/output from the node. Improve pinosdepay to track fds and handle format changes.
This commit is contained in:
parent
7597e48e02
commit
b885d40390
27 changed files with 3150 additions and 160 deletions
|
|
@ -148,6 +148,7 @@ handle_create_source_channel (PinosClient1 *interface,
|
|||
{
|
||||
PinosClient *client = user_data;
|
||||
PinosClientPrivate *priv = client->priv;
|
||||
PinosNode *node;
|
||||
PinosSource *source;
|
||||
PinosChannel *channel;
|
||||
const gchar *object_path, *sender;
|
||||
|
|
@ -162,11 +163,15 @@ handle_create_source_channel (PinosClient1 *interface,
|
|||
formats = g_bytes_new (arg_accepted_formats, strlen (arg_accepted_formats) + 1);
|
||||
props = pinos_properties_from_variant (arg_properties);
|
||||
|
||||
source = pinos_daemon_find_source (priv->daemon,
|
||||
arg_source,
|
||||
props,
|
||||
formats,
|
||||
&error);
|
||||
node = pinos_daemon_find_node (priv->daemon,
|
||||
arg_source,
|
||||
props,
|
||||
formats,
|
||||
&error);
|
||||
if (node == NULL)
|
||||
goto no_node;
|
||||
|
||||
source = pinos_node_get_source (node);
|
||||
if (source == NULL)
|
||||
goto no_source;
|
||||
|
||||
|
|
@ -190,7 +195,7 @@ handle_create_source_channel (PinosClient1 *interface,
|
|||
client);
|
||||
|
||||
object_path = pinos_channel_get_object_path (channel);
|
||||
g_debug ("client %p: add channel %p, %s", client, channel, object_path);
|
||||
g_debug ("client %p: add source channel %p, %s", client, channel, object_path);
|
||||
g_dbus_method_invocation_return_value (invocation,
|
||||
g_variant_new ("(o)", object_path));
|
||||
|
||||
|
|
@ -203,18 +208,124 @@ not_allowed:
|
|||
"org.pinos.Error", "not client owner");
|
||||
return TRUE;
|
||||
}
|
||||
no_source:
|
||||
no_node:
|
||||
{
|
||||
g_debug ("client %p: could not find source %s, %s", client, arg_source, error->message);
|
||||
g_debug ("client %p: could not find node %s, %s", client, arg_source, error->message);
|
||||
g_dbus_method_invocation_return_gerror (invocation, error);
|
||||
pinos_properties_free (props);
|
||||
g_bytes_unref (formats);
|
||||
g_clear_error (&error);
|
||||
return TRUE;
|
||||
}
|
||||
no_source:
|
||||
{
|
||||
g_debug ("client %p: node %s is not a source", client, arg_source);
|
||||
g_dbus_method_invocation_return_dbus_error (invocation,
|
||||
"org.pinos.Error", "not node is not a source");
|
||||
pinos_properties_free (props);
|
||||
g_bytes_unref (formats);
|
||||
return TRUE;
|
||||
}
|
||||
no_channel:
|
||||
{
|
||||
g_debug ("client %p: could not channel %s", client, error->message);
|
||||
g_debug ("client %p: could not create source channel %s", client, error->message);
|
||||
g_dbus_method_invocation_return_gerror (invocation, error);
|
||||
g_clear_error (&error);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
handle_create_sink_channel (PinosClient1 *interface,
|
||||
GDBusMethodInvocation *invocation,
|
||||
const gchar *arg_sink,
|
||||
const gchar *arg_accepted_formats,
|
||||
GVariant *arg_properties,
|
||||
gpointer user_data)
|
||||
{
|
||||
PinosClient *client = user_data;
|
||||
PinosClientPrivate *priv = client->priv;
|
||||
PinosNode *node;
|
||||
PinosSink *sink;
|
||||
PinosChannel *channel;
|
||||
const gchar *object_path, *sender;
|
||||
GBytes *formats;
|
||||
PinosProperties *props;
|
||||
GError *error = NULL;
|
||||
|
||||
sender = g_dbus_method_invocation_get_sender (invocation);
|
||||
if (g_strcmp0 (pinos_client_get_sender (client), sender) != 0)
|
||||
goto not_allowed;
|
||||
|
||||
formats = g_bytes_new (arg_accepted_formats, strlen (arg_accepted_formats) + 1);
|
||||
props = pinos_properties_from_variant (arg_properties);
|
||||
|
||||
node = pinos_daemon_find_node (priv->daemon,
|
||||
arg_sink,
|
||||
props,
|
||||
formats,
|
||||
&error);
|
||||
if (node == NULL)
|
||||
goto no_node;
|
||||
|
||||
sink = pinos_node_get_sink (node);
|
||||
if (sink == NULL)
|
||||
goto no_sink;
|
||||
|
||||
channel = pinos_sink_create_channel (sink,
|
||||
priv->object_path,
|
||||
formats,
|
||||
props,
|
||||
priv->object_path,
|
||||
&error);
|
||||
pinos_properties_free (props);
|
||||
g_bytes_unref (formats);
|
||||
|
||||
if (channel == NULL)
|
||||
goto no_channel;
|
||||
|
||||
priv->channels = g_list_prepend (priv->channels, channel);
|
||||
|
||||
g_signal_connect (channel,
|
||||
"remove",
|
||||
(GCallback) handle_remove_channel,
|
||||
client);
|
||||
|
||||
object_path = pinos_channel_get_object_path (channel);
|
||||
g_debug ("client %p: add sink channel %p, %s", client, channel, object_path);
|
||||
g_dbus_method_invocation_return_value (invocation,
|
||||
g_variant_new ("(o)", object_path));
|
||||
|
||||
return TRUE;
|
||||
|
||||
/* ERRORS */
|
||||
not_allowed:
|
||||
{
|
||||
g_dbus_method_invocation_return_dbus_error (invocation,
|
||||
"org.pinos.Error", "not client owner");
|
||||
return TRUE;
|
||||
}
|
||||
no_node:
|
||||
{
|
||||
g_debug ("client %p: could not find node %s, %s", client, arg_sink, error->message);
|
||||
g_dbus_method_invocation_return_gerror (invocation, error);
|
||||
pinos_properties_free (props);
|
||||
g_bytes_unref (formats);
|
||||
g_clear_error (&error);
|
||||
return TRUE;
|
||||
}
|
||||
no_sink:
|
||||
{
|
||||
g_debug ("client %p: node %s is not a sink", client, arg_sink);
|
||||
g_dbus_method_invocation_return_dbus_error (invocation,
|
||||
"org.pinos.Error", "node is not a sink");
|
||||
pinos_properties_free (props);
|
||||
g_bytes_unref (formats);
|
||||
return TRUE;
|
||||
}
|
||||
no_channel:
|
||||
{
|
||||
g_debug ("client %p: could not create sink channel %s", client, error->message);
|
||||
g_dbus_method_invocation_return_gerror (invocation, error);
|
||||
g_clear_error (&error);
|
||||
return TRUE;
|
||||
|
|
@ -298,7 +409,7 @@ no_source:
|
|||
}
|
||||
no_channel:
|
||||
{
|
||||
g_debug ("client %p: could not create channel %s", client, error->message);
|
||||
g_debug ("client %p: could not create upload channel %s", client, error->message);
|
||||
g_dbus_method_invocation_return_gerror (invocation, error);
|
||||
g_object_unref (source);
|
||||
g_clear_error (&error);
|
||||
|
|
@ -340,6 +451,9 @@ client_register_object (PinosClient *client,
|
|||
g_signal_connect (priv->client1, "handle-create-source-channel",
|
||||
(GCallback) handle_create_source_channel,
|
||||
client);
|
||||
g_signal_connect (priv->client1, "handle-create-sink-channel",
|
||||
(GCallback) handle_create_sink_channel,
|
||||
client);
|
||||
g_signal_connect (priv->client1, "handle-create-upload-channel",
|
||||
(GCallback) handle_create_upload_channel,
|
||||
client);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue