mirror of
https://gitlab.freedesktop.org/pipewire/wireplumber.git
synced 2026-01-04 05:50:12 +01:00
- make it a GObject so that it can emit its own signals and so that it can be shared between multiple proxies - share the WpProps instance between endpoints, endpoint-streams and their underlying nodes - introduce the concept of the caching mode that redirects _set to _set_param of the proxy that actually has the props; this allows shared WpProps to actually set changes on the correct proxy in a transparent way - change methods to consume the ref of the pod and reflect that also on wp_proxy_set_prop() - refactor the export process on endpoints & endpoint-streams so that they always get all the required features (info, props, bound) and make it async so that we can take time to prepare the underlying node to have FEATURE_PROPS - update the props & endpoint unit tests, bringing back all the checks that the endpoint unit test used to have
269 lines
8.1 KiB
C
269 lines
8.1 KiB
C
/* WirePlumber
|
|
*
|
|
* Copyright © 2019 Collabora Ltd.
|
|
* @author George Kiagiadakis <george.kiagiadakis@collabora.com>
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#include <wp/wp.h>
|
|
|
|
#include <spa/param/props.h>
|
|
#include <spa/pod/vararg.h>
|
|
|
|
static void
|
|
test_props_set_get (void)
|
|
{
|
|
g_autoptr (WpProps) props = NULL;
|
|
float float_value = 0.0;
|
|
const gchar *string_value = NULL;
|
|
|
|
props = wp_props_new (WP_PROPS_MODE_STORE, NULL);
|
|
wp_props_register (props, "volume", "Volume",
|
|
wp_spa_pod_new_choice ("Range", "f", 1.0, "f", 0.0, "f", 10.0, NULL));
|
|
wp_props_register (props, "wp-test-property", "Test property",
|
|
wp_spa_pod_new_string ("default value"));
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = wp_props_get (props, "volume");
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_float (pod, &float_value));
|
|
g_assert_cmpfloat_with_epsilon (float_value, 1.0, 0.001);
|
|
}
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = wp_props_get (props, "wp-test-property");
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_string (pod, &string_value));
|
|
g_assert_cmpstr (string_value, ==, "default value");
|
|
}
|
|
|
|
wp_props_set (props, "volume", wp_spa_pod_new_float (0.8));
|
|
wp_props_set (props, "wp-test-property",
|
|
wp_spa_pod_new_string ("test value"));
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = wp_props_get (props, "volume");
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_float (pod, &float_value));
|
|
g_assert_cmpfloat_with_epsilon (float_value, 0.8, 0.001);
|
|
}
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = wp_props_get (props, "wp-test-property");
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_string (pod, &string_value));
|
|
g_assert_cmpstr (string_value, ==, "test value");
|
|
}
|
|
}
|
|
|
|
static void
|
|
test_props_get_all (void)
|
|
{
|
|
g_autoptr (WpProps) props = NULL;
|
|
g_autoptr (WpIterator) it = NULL;
|
|
g_auto (GValue) item = G_VALUE_INIT;
|
|
float float_value = 0.0;
|
|
const gchar *string_value = NULL;
|
|
const gchar *id_name;
|
|
guint32 id;
|
|
|
|
props = wp_props_new (WP_PROPS_MODE_STORE, NULL);
|
|
wp_props_register (props, "volume", "Volume",
|
|
wp_spa_pod_new_choice ("Range", "f", 1.0, "f", 0.0, "f", 10.0, NULL));
|
|
wp_props_register (props, "wp-test-property", "Test property",
|
|
wp_spa_pod_new_string ("default value"));
|
|
|
|
wp_props_set (props, "volume", wp_spa_pod_new_float (0.8));
|
|
wp_props_set (props, "wp-test-property",
|
|
wp_spa_pod_new_string ("test value"));
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = wp_props_get_all (props);
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_object (pod,
|
|
"Props", &id_name,
|
|
"volume", "f", &float_value,
|
|
"wp-test-property", "s", &string_value,
|
|
NULL));
|
|
g_assert_cmpfloat_with_epsilon (float_value, 0.8, 0.001);
|
|
g_assert_cmpstr (string_value, ==, "test value");
|
|
}
|
|
|
|
it = wp_props_iterate_prop_info (props);
|
|
g_assert_true (wp_iterator_next (it, &item));
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = g_value_dup_boxed (&item);
|
|
g_autoptr (WpSpaPod) pod_value = NULL;
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_object (pod,
|
|
"PropInfo", &id_name,
|
|
"id", "I", &id,
|
|
"name", "s", &string_value,
|
|
"type", "P", &pod_value,
|
|
NULL));
|
|
g_assert_cmpuint (id, ==, SPA_PROP_volume);
|
|
g_assert_cmpstr (string_value, ==, "Volume");
|
|
g_assert_nonnull (pod_value);
|
|
g_assert_true (wp_spa_pod_is_choice (pod_value));
|
|
}
|
|
|
|
g_value_unset (&item);
|
|
g_assert_true (wp_iterator_next (it, &item));
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = g_value_dup_boxed (&item);
|
|
g_autoptr (WpSpaPod) pod_value = NULL;
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_object (pod,
|
|
"PropInfo", &id_name,
|
|
"id", "I", &id,
|
|
"name", "s", &string_value,
|
|
"type", "P", &pod_value,
|
|
NULL));
|
|
g_assert_cmpuint (id, >, SPA_PROP_START_CUSTOM);
|
|
g_assert_cmpstr (string_value, ==, "Test property");
|
|
g_assert_nonnull (pod_value);
|
|
g_assert_true (wp_spa_pod_is_string (pod_value));
|
|
}
|
|
}
|
|
|
|
static void
|
|
test_props_store_from_props (void)
|
|
{
|
|
g_autoptr (WpProps) props = NULL;
|
|
float float_value = 0.0;
|
|
const gchar *string_value = NULL;
|
|
|
|
props = wp_props_new (WP_PROPS_MODE_STORE, NULL);
|
|
wp_props_register (props, "volume", "Volume",
|
|
wp_spa_pod_new_choice ("Range", "f", 1.0, "f", 0.0, "f", 10.0, NULL));
|
|
wp_props_register (props, "wp-test-property", "Test property",
|
|
wp_spa_pod_new_string ("default value"));
|
|
|
|
wp_props_set (props, NULL, wp_spa_pod_new_object (
|
|
"Props", "Props",
|
|
"volume", "f", 0.8,
|
|
"wp-test-property", "s", "test value",
|
|
NULL));
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = wp_props_get (props, "volume");
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_float (pod, &float_value));
|
|
g_assert_cmpfloat_with_epsilon (float_value, 0.8, 0.001);
|
|
}
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = wp_props_get (props, "wp-test-property");
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_string (pod, &string_value));
|
|
g_assert_cmpstr (string_value, ==, "test value");
|
|
}
|
|
}
|
|
|
|
static void
|
|
test_props_register_from_info (void)
|
|
{
|
|
g_autoptr (WpProps) props = NULL;
|
|
g_autoptr (WpIterator) it = NULL;
|
|
g_auto (GValue) item = G_VALUE_INIT;
|
|
float float_value = 0.0;
|
|
const gchar *string_value = NULL;
|
|
const gchar *id_name;
|
|
guint32 id;
|
|
guint test_property_id = 0;
|
|
|
|
wp_spa_type_get_by_nick (WP_SPA_TYPE_TABLE_PROPS, "wp-test-property",
|
|
&test_property_id, NULL, NULL);
|
|
|
|
props = wp_props_new (WP_PROPS_MODE_STORE, NULL);
|
|
|
|
wp_props_register_from_info (props, wp_spa_pod_new_object (
|
|
"PropInfo", "PropInfo",
|
|
"id", "I", SPA_PROP_volume,
|
|
"name", "s", "Volume",
|
|
"type", SPA_POD_CHOICE_RANGE_Float (1.0, 0.0, 10.0),
|
|
NULL));
|
|
|
|
wp_props_register_from_info (props, wp_spa_pod_new_object (
|
|
"PropInfo", "PropInfo",
|
|
"id", "I", test_property_id,
|
|
"name", "s", "Test property",
|
|
"type", "s", "default value",
|
|
NULL));
|
|
|
|
wp_props_set (props, "volume", wp_spa_pod_new_float (0.8));
|
|
wp_props_set (props, "wp-test-property",
|
|
wp_spa_pod_new_string ("test value"));
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = wp_props_get_all (props);
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_object (pod,
|
|
"Props", &id_name,
|
|
"volume", "f", &float_value,
|
|
"wp-test-property", "s", &string_value,
|
|
NULL));
|
|
g_assert_cmpfloat_with_epsilon (float_value, 0.8, 0.001);
|
|
g_assert_cmpstr (string_value, ==, "test value");
|
|
}
|
|
|
|
it = wp_props_iterate_prop_info (props);
|
|
g_assert_true (wp_iterator_next (it, &item));
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = g_value_dup_boxed (&item);
|
|
g_autoptr (WpSpaPod) pod_value = NULL;
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_object (pod,
|
|
"PropInfo", &id_name,
|
|
"id", "I", &id,
|
|
"name", "s", &string_value,
|
|
"type", "P", &pod_value,
|
|
NULL));
|
|
g_assert_cmpuint (id, ==, SPA_PROP_volume);
|
|
g_assert_cmpstr (string_value, ==, "Volume");
|
|
g_assert_nonnull (pod_value);
|
|
g_assert_true (wp_spa_pod_is_choice (pod_value));
|
|
}
|
|
|
|
g_value_unset (&item);
|
|
g_assert_true (wp_iterator_next (it, &item));
|
|
|
|
{
|
|
g_autoptr (WpSpaPod) pod = g_value_dup_boxed (&item);
|
|
g_autoptr (WpSpaPod) pod_value = NULL;
|
|
g_assert_nonnull (pod);
|
|
g_assert_true (wp_spa_pod_get_object (pod,
|
|
"PropInfo", &id_name,
|
|
"id", "I", &id,
|
|
"name", "s", &string_value,
|
|
"type", "P", &pod_value,
|
|
NULL));
|
|
g_assert_cmpuint (id, >, SPA_PROP_START_CUSTOM);
|
|
g_assert_cmpstr (string_value, ==, "Test property");
|
|
g_assert_nonnull (pod_value);
|
|
g_assert_true (wp_spa_pod_is_string (pod_value));
|
|
}
|
|
}
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
g_test_init (&argc, &argv, NULL);
|
|
wp_init (WP_INIT_ALL);
|
|
|
|
g_assert_true (wp_spa_type_register (WP_SPA_TYPE_TABLE_PROPS,
|
|
"Wp:Test:Property", "wp-test-property"));
|
|
|
|
g_test_add_func ("/wp/props/set_get", test_props_set_get);
|
|
g_test_add_func ("/wp/props/get_all", test_props_get_all);
|
|
g_test_add_func ("/wp/props/store_from_props",
|
|
test_props_store_from_props);
|
|
g_test_add_func ("/wp/props/register_from_info",
|
|
test_props_register_from_info);
|
|
|
|
return g_test_run ();
|
|
}
|