mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
introspect: add state and format for output source
Add state and negotiated format to output source properties.
This commit is contained in:
parent
95f479a760
commit
51f18b540a
5 changed files with 77 additions and 8 deletions
|
|
@ -339,6 +339,20 @@ source_output_fill_info (PinosSourceOutputInfo *info, GDBusProxy *proxy)
|
||||||
} else {
|
} else {
|
||||||
info->possible_formats = NULL;
|
info->possible_formats = NULL;
|
||||||
}
|
}
|
||||||
|
if ((variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "State"))) {
|
||||||
|
info->state = g_variant_get_uint32 (variant);
|
||||||
|
g_variant_unref (variant);
|
||||||
|
} else {
|
||||||
|
info->state = PINOS_SOURCE_OUTPUT_STATE_ERROR;
|
||||||
|
}
|
||||||
|
if ((variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Format"))) {
|
||||||
|
gsize len;
|
||||||
|
gchar *format = g_variant_dup_string (variant, &len);
|
||||||
|
info->format = g_bytes_new_take (format, len + 1);
|
||||||
|
g_variant_unref (variant);
|
||||||
|
} else {
|
||||||
|
info->format = NULL;
|
||||||
|
}
|
||||||
info->properties = pinos_properties_from_variant (
|
info->properties = pinos_properties_from_variant (
|
||||||
g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Properties"));
|
g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Properties"));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -164,12 +164,30 @@ void pinos_context_get_source_info_by_id (PinosContext *context,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PinosSourceState:
|
||||||
|
* @PINOS_SOURCE_OUTPUT_STATE_ERROR: the source output is in error
|
||||||
|
* @PINOS_SOURCE_OUTPUT_STATE_IDLE: the source output is idle
|
||||||
|
* @PINOS_SOURCE_OUTPUT_STATE_STARTING: the source output is starting
|
||||||
|
* @PINOS_SOURCE_OUTPUT_STATE_STREAMING: the source output is streaming
|
||||||
|
*
|
||||||
|
* The different source output states
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
PINOS_SOURCE_OUTPUT_STATE_ERROR = -1,
|
||||||
|
PINOS_SOURCE_OUTPUT_STATE_IDLE = 0,
|
||||||
|
PINOS_SOURCE_OUTPUT_STATE_STARTING = 1,
|
||||||
|
PINOS_SOURCE_OUTPUT_STATE_STREAMING = 2,
|
||||||
|
} PinosSourceOutputState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PinosSourceOutputInfo:
|
* PinosSourceOutputInfo:
|
||||||
* @id: generic id of the output
|
* @id: generic id of the output
|
||||||
* @client_path: the owner client
|
* @client_path: the owner client
|
||||||
* @source_path: the source path
|
* @source_path: the source path
|
||||||
* @possible_formats: the possible formats
|
* @possible_formats: the possible formats
|
||||||
|
* @state: the state
|
||||||
|
* @format: when streaming, the current format
|
||||||
* @properties: the properties of the source
|
* @properties: the properties of the source
|
||||||
*
|
*
|
||||||
* The source information. Extra information can be added in later
|
* The source information. Extra information can be added in later
|
||||||
|
|
@ -180,6 +198,8 @@ typedef struct {
|
||||||
const char *client_path;
|
const char *client_path;
|
||||||
const char *source_path;
|
const char *source_path;
|
||||||
GBytes *possible_formats;
|
GBytes *possible_formats;
|
||||||
|
PinosSourceOutputState state;
|
||||||
|
GBytes *format;
|
||||||
PinosProperties *properties;
|
PinosProperties *properties;
|
||||||
} PinosSourceOutputInfo;
|
} PinosSourceOutputInfo;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -93,12 +93,12 @@
|
||||||
<!-- Properties: extra source properties -->
|
<!-- Properties: extra source properties -->
|
||||||
<property name='Properties' type='a{sv}' access='read' />
|
<property name='Properties' type='a{sv}' access='read' />
|
||||||
<!-- state: state of the source
|
<!-- state: state of the source
|
||||||
0 = the source is in error
|
-1 = the source is in error
|
||||||
|
0 = the source is suspended, this means the device is closed
|
||||||
1 = the source is initializing
|
1 = the source is initializing
|
||||||
2 = the source is suspended, this means the device is closed
|
2 = the source is idle, this means the device is opened but
|
||||||
3 = the source is idle, this means the device is opened but
|
|
||||||
no source-output is consuming the data
|
no source-output is consuming the data
|
||||||
4 = the source is running
|
3 = the source is running
|
||||||
-->
|
-->
|
||||||
<property name='State' type='u' access='read' />
|
<property name='State' type='u' access='read' />
|
||||||
<!-- PossibleFormats:
|
<!-- PossibleFormats:
|
||||||
|
|
@ -128,6 +128,17 @@
|
||||||
|
|
||||||
<!-- Properties: extra source output properties -->
|
<!-- Properties: extra source output properties -->
|
||||||
<property name='Properties' type='a{sv}' access='read' />
|
<property name='Properties' type='a{sv}' access='read' />
|
||||||
|
|
||||||
|
<!-- state: state of the source output
|
||||||
|
-1 = the source output is in error
|
||||||
|
0 = the source output is idle
|
||||||
|
1 = the source output is starting
|
||||||
|
2 = the source output is streaming
|
||||||
|
-->
|
||||||
|
<property name='State' type='u' access='read' />
|
||||||
|
<!-- Format: the current streaming format -->
|
||||||
|
<property name='Format' type='s' access='read' />
|
||||||
|
|
||||||
<!-- Start:
|
<!-- Start:
|
||||||
@requested_format: requested formats
|
@requested_format: requested formats
|
||||||
@fd: output file descriptor
|
@fd: output file descriptor
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ struct _PinosSourceOutputPrivate
|
||||||
GBytes *possible_formats;
|
GBytes *possible_formats;
|
||||||
PinosProperties *properties;
|
PinosProperties *properties;
|
||||||
GBytes *requested_format;
|
GBytes *requested_format;
|
||||||
|
PinosSourceOutputState state;
|
||||||
GBytes *format;
|
GBytes *format;
|
||||||
|
|
||||||
GSocket *socket;
|
GSocket *socket;
|
||||||
|
|
@ -63,6 +64,7 @@ enum
|
||||||
PROP_REQUESTED_FORMAT,
|
PROP_REQUESTED_FORMAT,
|
||||||
PROP_FORMAT,
|
PROP_FORMAT,
|
||||||
PROP_SOCKET,
|
PROP_SOCKET,
|
||||||
|
PROP_STATE,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
|
@ -119,6 +121,10 @@ pinos_source_output_get_property (GObject *_object,
|
||||||
g_value_set_object (value, priv->socket);
|
g_value_set_object (value, priv->socket);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PROP_STATE:
|
||||||
|
g_value_set_uint (value, priv->state);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (output, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (output, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
|
@ -192,6 +198,8 @@ handle_start (PinosSourceOutput1 *interface,
|
||||||
GUnixFDList *fdlist;
|
GUnixFDList *fdlist;
|
||||||
gint fd[2];
|
gint fd[2];
|
||||||
|
|
||||||
|
priv->state = PINOS_SOURCE_OUTPUT_STATE_STARTING;
|
||||||
|
|
||||||
priv->requested_format = g_bytes_new (arg_requested_format, strlen (arg_requested_format) + 1);
|
priv->requested_format = g_bytes_new (arg_requested_format, strlen (arg_requested_format) + 1);
|
||||||
|
|
||||||
socketpair (AF_UNIX, SOCK_STREAM, 0, fd);
|
socketpair (AF_UNIX, SOCK_STREAM, 0, fd);
|
||||||
|
|
@ -201,6 +209,8 @@ handle_start (PinosSourceOutput1 *interface,
|
||||||
if (priv->format == NULL)
|
if (priv->format == NULL)
|
||||||
goto no_format;
|
goto no_format;
|
||||||
|
|
||||||
|
priv->state = PINOS_SOURCE_OUTPUT_STATE_STREAMING;
|
||||||
|
|
||||||
fdlist = g_unix_fd_list_new ();
|
fdlist = g_unix_fd_list_new ();
|
||||||
g_unix_fd_list_append (fdlist, fd[1], NULL);
|
g_unix_fd_list_append (fdlist, fd[1], NULL);
|
||||||
|
|
||||||
|
|
@ -210,6 +220,11 @@ handle_start (PinosSourceOutput1 *interface,
|
||||||
g_bytes_get_data (priv->format, NULL)),
|
g_bytes_get_data (priv->format, NULL)),
|
||||||
fdlist);
|
fdlist);
|
||||||
|
|
||||||
|
g_object_set (priv->iface,
|
||||||
|
"format", g_bytes_get_data (priv->format, NULL),
|
||||||
|
"state", priv->state,
|
||||||
|
NULL);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* error */
|
/* error */
|
||||||
|
|
@ -245,6 +260,10 @@ stop_transfer (PinosSourceOutput *output)
|
||||||
clear_socket (output);
|
clear_socket (output);
|
||||||
g_object_notify (G_OBJECT (output), "socket");
|
g_object_notify (G_OBJECT (output), "socket");
|
||||||
}
|
}
|
||||||
|
priv->state = PINOS_SOURCE_OUTPUT_STATE_IDLE;
|
||||||
|
g_object_set (priv->iface,
|
||||||
|
"state", priv->state,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
@ -461,6 +480,9 @@ pinos_source_output_init (PinosSourceOutput * output)
|
||||||
g_signal_connect (priv->iface, "handle-start", (GCallback) handle_start, output);
|
g_signal_connect (priv->iface, "handle-start", (GCallback) handle_start, output);
|
||||||
g_signal_connect (priv->iface, "handle-stop", (GCallback) handle_stop, output);
|
g_signal_connect (priv->iface, "handle-stop", (GCallback) handle_stop, output);
|
||||||
g_signal_connect (priv->iface, "handle-remove", (GCallback) handle_remove, output);
|
g_signal_connect (priv->iface, "handle-remove", (GCallback) handle_remove, output);
|
||||||
|
|
||||||
|
priv->state = PINOS_SOURCE_OUTPUT_STATE_IDLE;
|
||||||
|
g_object_set (priv->iface, "state", priv->state, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -34,12 +34,12 @@ print_field (GQuark field, const GValue * value, gpointer user_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_formats (GBytes *formats)
|
print_formats (const gchar *name, GBytes *formats)
|
||||||
{
|
{
|
||||||
GstCaps *caps = gst_caps_from_string (g_bytes_get_data (formats, NULL));
|
GstCaps *caps = gst_caps_from_string (g_bytes_get_data (formats, NULL));
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
g_print ("\tformats:\n");
|
g_print ("\t%s:\n", name);
|
||||||
|
|
||||||
if (gst_caps_is_any (caps)) {
|
if (gst_caps_is_any (caps)) {
|
||||||
g_print ("\t\tANY\n");
|
g_print ("\t\tANY\n");
|
||||||
|
|
@ -120,7 +120,7 @@ dump_source_info (PinosContext *c, const PinosSourceInfo *info, gpointer userdat
|
||||||
g_print ("\tsource-path: \"%s\"\n", info->source_path);
|
g_print ("\tsource-path: \"%s\"\n", info->source_path);
|
||||||
g_print ("\tname: \"%s\"\n", info->name);
|
g_print ("\tname: \"%s\"\n", info->name);
|
||||||
g_print ("\tstate: %d\n", info->state);
|
g_print ("\tstate: %d\n", info->state);
|
||||||
print_formats (info->formats);
|
print_formats ("formats", info->formats);
|
||||||
print_properties (info->properties);
|
print_properties (info->properties);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
@ -135,7 +135,9 @@ dump_source_output_info (PinosContext *c, const PinosSourceOutputInfo *info, gpo
|
||||||
g_print ("\tid: %p\n", info->id);
|
g_print ("\tid: %p\n", info->id);
|
||||||
g_print ("\tclient-path: \"%s\"\n", info->client_path);
|
g_print ("\tclient-path: \"%s\"\n", info->client_path);
|
||||||
g_print ("\tsource-path: \"%s\"\n", info->source_path);
|
g_print ("\tsource-path: \"%s\"\n", info->source_path);
|
||||||
print_formats (info->possible_formats);
|
print_formats ("possible-formats", info->possible_formats);
|
||||||
|
g_print ("\tstate: \"%d\"\n", info->state);
|
||||||
|
print_formats ("format", info->format);
|
||||||
print_properties (info->properties);
|
print_properties (info->properties);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue