mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-05 13:30:02 -05:00
default-routes: reconfigure the profile when routes change
When something changes to the route status, try to reconfigure the current profile.
This commit is contained in:
parent
9964741637
commit
0b6d3e4b71
1 changed files with 24 additions and 39 deletions
|
|
@ -74,7 +74,6 @@ struct device {
|
||||||
struct spa_hook listener;
|
struct spa_hook listener;
|
||||||
|
|
||||||
uint32_t active_profile;
|
uint32_t active_profile;
|
||||||
char profile_name[128];
|
|
||||||
|
|
||||||
uint32_t generation;
|
uint32_t generation;
|
||||||
struct pw_array route_info;
|
struct pw_array route_info;
|
||||||
|
|
@ -138,6 +137,7 @@ struct route_info {
|
||||||
uint32_t index;
|
uint32_t index;
|
||||||
uint32_t generation;
|
uint32_t generation;
|
||||||
uint32_t available;
|
uint32_t available;
|
||||||
|
uint32_t prev_available;
|
||||||
enum spa_direction direction;
|
enum spa_direction direction;
|
||||||
char name[64];
|
char name[64];
|
||||||
unsigned int save:1;
|
unsigned int save:1;
|
||||||
|
|
@ -181,6 +181,7 @@ static struct route_info *find_route_info(struct device *dev, struct route *r)
|
||||||
i->direction = r->direction;
|
i->direction = r->direction;
|
||||||
i->generation = dev->generation;
|
i->generation = dev->generation;
|
||||||
i->available = r->available;
|
i->available = r->available;
|
||||||
|
i->prev_available = r->available;
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
@ -480,7 +481,6 @@ static int restore_route(struct device *dev, struct route *r)
|
||||||
ri->prev_active = true;
|
ri->prev_active = true;
|
||||||
ri->active = true;
|
ri->active = true;
|
||||||
ri->generation = dev->generation;
|
ri->generation = dev->generation;
|
||||||
ri->available = r->available;
|
|
||||||
ri->save = r->save;
|
ri->save = r->save;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -527,7 +527,7 @@ static char *serialize_routes(struct device *dev)
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int save_profile(struct device *dev)
|
static int save_profile(struct device *dev, struct profile *pr)
|
||||||
{
|
{
|
||||||
struct impl *impl = dev->impl;
|
struct impl *impl = dev->impl;
|
||||||
char key[1024], *val;
|
char key[1024], *val;
|
||||||
|
|
@ -535,7 +535,7 @@ static int save_profile(struct device *dev)
|
||||||
if (pw_array_get_len(&dev->route_info, struct route_info) == 0)
|
if (pw_array_get_len(&dev->route_info, struct route_info) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
snprintf(key, sizeof(key), PREFIX"%s:profile:%s", dev->name, dev->profile_name);
|
snprintf(key, sizeof(key), PREFIX"%s:profile:%s", dev->name, pr->name);
|
||||||
|
|
||||||
val = serialize_routes(dev);
|
val = serialize_routes(dev);
|
||||||
if (pw_properties_set(impl->to_restore, key, val)) {
|
if (pw_properties_set(impl->to_restore, key, val)) {
|
||||||
|
|
@ -657,7 +657,11 @@ static int reconfigure_profile(struct device *dev, struct profile *pr)
|
||||||
char key[1024];
|
char key[1024];
|
||||||
const char *json;
|
const char *json;
|
||||||
|
|
||||||
snprintf(key, sizeof(key), PREFIX"%s:profile:%s", dev->name, dev->profile_name);
|
pw_log_info("device %s: restore routes for profile '%s'",
|
||||||
|
dev->name, pr->name);
|
||||||
|
dev->active_profile = pr->index;
|
||||||
|
|
||||||
|
snprintf(key, sizeof(key), PREFIX"%s:profile:%s", dev->name, pr->name);
|
||||||
json = pw_properties_get(impl->to_restore, key);
|
json = pw_properties_get(impl->to_restore, key);
|
||||||
|
|
||||||
if (pr->classes != NULL) {
|
if (pr->classes != NULL) {
|
||||||
|
|
@ -696,24 +700,6 @@ static int reconfigure_profile(struct device *dev, struct profile *pr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int handle_profile(struct device *dev)
|
|
||||||
{
|
|
||||||
struct profile pr;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
if ((res = find_current_profile(dev, &pr)) < 0)
|
|
||||||
return res;
|
|
||||||
if (dev->active_profile == pr.index)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
pw_log_info("device %s: restore routes for profile '%s'",
|
|
||||||
dev->name, pr.name);
|
|
||||||
dev->active_profile = pr.index;
|
|
||||||
snprintf(dev->profile_name, sizeof(dev->profile_name), "%s", pr.name);
|
|
||||||
|
|
||||||
return reconfigure_profile(dev, &pr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void prune_route_info(struct device *dev)
|
static void prune_route_info(struct device *dev)
|
||||||
{
|
{
|
||||||
struct route_info *i;
|
struct route_info *i;
|
||||||
|
|
@ -747,13 +733,17 @@ static int handle_route(struct device *dev, struct route *r)
|
||||||
/* just save port properties */
|
/* just save port properties */
|
||||||
save_route(dev, r);
|
save_route(dev, r);
|
||||||
}
|
}
|
||||||
ri->available = r->available;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int handle_routes(struct device *dev)
|
static int handle_device(struct device *dev)
|
||||||
{
|
{
|
||||||
|
struct profile pr;
|
||||||
struct sm_param *p;
|
struct sm_param *p;
|
||||||
|
int res;
|
||||||
|
bool route_changed = false;
|
||||||
|
|
||||||
|
dev->generation++;
|
||||||
|
|
||||||
/* first look at all routes */
|
/* first look at all routes */
|
||||||
spa_list_for_each(p, &dev->obj->param_list, link) {
|
spa_list_for_each(p, &dev->obj->param_list, link) {
|
||||||
|
|
@ -767,9 +757,12 @@ static int handle_routes(struct device *dev)
|
||||||
if ((ri = find_route_info(dev, &r)) == NULL)
|
if ((ri = find_route_info(dev, &r)) == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
ri->prev_available = ri->available;
|
||||||
if (ri->available != r.available) {
|
if (ri->available != r.available) {
|
||||||
pw_log_info("device %d: route %s available changed %d -> %d",
|
pw_log_info("device %d: route %s available changed %d -> %d",
|
||||||
dev->id, r.name, ri->available, r.available);
|
dev->id, r.name, ri->available, r.available);
|
||||||
|
ri->available = r.available;
|
||||||
|
route_changed = true;
|
||||||
}
|
}
|
||||||
ri->generation = dev->generation;
|
ri->generation = dev->generation;
|
||||||
ri->prev_active = ri->active;
|
ri->prev_active = ri->active;
|
||||||
|
|
@ -783,23 +776,15 @@ static int handle_routes(struct device *dev)
|
||||||
continue;
|
continue;
|
||||||
handle_route(dev, &r);
|
handle_route(dev, &r);
|
||||||
}
|
}
|
||||||
|
|
||||||
prune_route_info(dev);
|
prune_route_info(dev);
|
||||||
|
|
||||||
save_profile(dev);
|
if ((res = find_current_profile(dev, &pr)) >= 0) {
|
||||||
|
if (dev->active_profile != pr.index || route_changed)
|
||||||
|
reconfigure_profile(dev, &pr);
|
||||||
|
|
||||||
return 0;
|
save_profile(dev, &pr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int handle_device(struct device *dev)
|
|
||||||
{
|
|
||||||
int res;
|
|
||||||
|
|
||||||
dev->generation++;
|
|
||||||
|
|
||||||
if ((res = handle_profile(dev)) < 0)
|
|
||||||
return res;
|
|
||||||
if ((res = handle_routes(dev)) < 0)
|
|
||||||
return res;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue