mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
update DBus object with current format
Detect a format change in the payloader and post an element message. Catch the format change element message in the client-source and use it to update the format and possible formats in the source and source-outputs.
This commit is contained in:
parent
44f2c3602d
commit
45976ffeda
5 changed files with 57 additions and 0 deletions
|
|
@ -368,6 +368,23 @@ gst_pinos_pay_chain_pinos (GstPinosPay *pay, GstBuffer * buffer)
|
||||||
g_array_append_val (fdids, p.id);
|
g_array_append_val (fdids, p.id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PINOS_PACKET_TYPE_FORMAT_CHANGE:
|
||||||
|
{
|
||||||
|
PinosPacketFormatChange p;
|
||||||
|
GstCaps * caps;
|
||||||
|
|
||||||
|
if (!pinos_buffer_iter_parse_format_change (&it, &p))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
caps = gst_caps_from_string (p.format);
|
||||||
|
|
||||||
|
gst_element_post_message (GST_ELEMENT (pay),
|
||||||
|
gst_message_new_element (GST_OBJECT (pay),
|
||||||
|
gst_structure_new ("PinosPayloaderFormatChange",
|
||||||
|
"format", GST_TYPE_CAPS, caps, NULL)));
|
||||||
|
gst_caps_unref (caps);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,26 @@ bus_handler (GstBus *bus,
|
||||||
gst_element_set_state (priv->pipeline, GST_STATE_NULL);
|
gst_element_set_state (priv->pipeline, GST_STATE_NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case GST_MESSAGE_ELEMENT:
|
||||||
|
{
|
||||||
|
if (gst_message_has_name (message, "PinosPayloaderFormatChange")) {
|
||||||
|
const GstStructure *str = gst_message_get_structure (message);
|
||||||
|
GstCaps *caps;
|
||||||
|
GBytes *format;
|
||||||
|
gchar *caps_str;
|
||||||
|
|
||||||
|
gst_structure_get (str, "format", GST_TYPE_CAPS, &caps, NULL);
|
||||||
|
gst_caps_replace (&priv->format, caps);
|
||||||
|
caps_str = gst_caps_to_string (caps);
|
||||||
|
|
||||||
|
format = g_bytes_new_take (caps_str, strlen (caps_str) + 1);
|
||||||
|
g_object_set (priv->input, "possible-formats", format, "format", format, NULL);
|
||||||
|
pinos_source_update_possible_formats (source, format);
|
||||||
|
pinos_source_update_format (source, format);
|
||||||
|
g_bytes_unref (format);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -179,6 +179,8 @@ pinos_source_output_set_property (GObject *_object,
|
||||||
if (priv->format)
|
if (priv->format)
|
||||||
g_bytes_unref (priv->format);
|
g_bytes_unref (priv->format);
|
||||||
priv->format = g_value_dup_boxed (value);
|
priv->format = g_value_dup_boxed (value);
|
||||||
|
g_object_set (priv->iface, "format",
|
||||||
|
g_bytes_get_data (priv->format, NULL), NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -510,6 +510,7 @@ void
|
||||||
pinos_source_update_possible_formats (PinosSource *source, GBytes *formats)
|
pinos_source_update_possible_formats (PinosSource *source, GBytes *formats)
|
||||||
{
|
{
|
||||||
PinosSourcePrivate *priv;
|
PinosSourcePrivate *priv;
|
||||||
|
GList *walk;
|
||||||
|
|
||||||
g_return_if_fail (PINOS_IS_SOURCE (source));
|
g_return_if_fail (PINOS_IS_SOURCE (source));
|
||||||
priv = source->priv;
|
priv = source->priv;
|
||||||
|
|
@ -518,6 +519,22 @@ pinos_source_update_possible_formats (PinosSource *source, GBytes *formats)
|
||||||
g_object_set (priv->iface, "possible-formats",
|
g_object_set (priv->iface, "possible-formats",
|
||||||
g_bytes_get_data (formats, NULL),
|
g_bytes_get_data (formats, NULL),
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
for (walk = priv->outputs; walk; walk = g_list_next (walk))
|
||||||
|
g_object_set (walk->data, "possible-formats", formats, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pinos_source_update_format (PinosSource *source, GBytes *format)
|
||||||
|
{
|
||||||
|
PinosSourcePrivate *priv;
|
||||||
|
GList *walk;
|
||||||
|
|
||||||
|
g_return_if_fail (PINOS_IS_SOURCE (source));
|
||||||
|
priv = source->priv;
|
||||||
|
|
||||||
|
for (walk = priv->outputs; walk; walk = g_list_next (walk))
|
||||||
|
g_object_set (walk->data, "format", format, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
PinosSourceOutput *
|
PinosSourceOutput *
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,7 @@ void pinos_source_report_idle (PinosSource *source);
|
||||||
void pinos_source_report_busy (PinosSource *source);
|
void pinos_source_report_busy (PinosSource *source);
|
||||||
|
|
||||||
void pinos_source_update_possible_formats (PinosSource *source, GBytes *formats);
|
void pinos_source_update_possible_formats (PinosSource *source, GBytes *formats);
|
||||||
|
void pinos_source_update_format (PinosSource *source, GBytes *format);
|
||||||
|
|
||||||
PinosSourceOutput * pinos_source_create_source_output (PinosSource *source,
|
PinosSourceOutput * pinos_source_create_source_output (PinosSource *source,
|
||||||
const gchar *client_path,
|
const gchar *client_path,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue