mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -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;
|
||||
|
||||
uint32_t active_profile;
|
||||
char profile_name[128];
|
||||
|
||||
uint32_t generation;
|
||||
struct pw_array route_info;
|
||||
|
|
@ -138,6 +137,7 @@ struct route_info {
|
|||
uint32_t index;
|
||||
uint32_t generation;
|
||||
uint32_t available;
|
||||
uint32_t prev_available;
|
||||
enum spa_direction direction;
|
||||
char name[64];
|
||||
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->generation = dev->generation;
|
||||
i->available = r->available;
|
||||
i->prev_available = r->available;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
|
@ -480,7 +481,6 @@ static int restore_route(struct device *dev, struct route *r)
|
|||
ri->prev_active = true;
|
||||
ri->active = true;
|
||||
ri->generation = dev->generation;
|
||||
ri->available = r->available;
|
||||
ri->save = r->save;
|
||||
|
||||
return 0;
|
||||
|
|
@ -527,7 +527,7 @@ static char *serialize_routes(struct device *dev)
|
|||
return ptr;
|
||||
}
|
||||
|
||||
static int save_profile(struct device *dev)
|
||||
static int save_profile(struct device *dev, struct profile *pr)
|
||||
{
|
||||
struct impl *impl = dev->impl;
|
||||
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)
|
||||
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);
|
||||
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];
|
||||
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);
|
||||
|
||||
if (pr->classes != NULL) {
|
||||
|
|
@ -696,24 +700,6 @@ static int reconfigure_profile(struct device *dev, struct profile *pr)
|
|||
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)
|
||||
{
|
||||
struct route_info *i;
|
||||
|
|
@ -747,13 +733,17 @@ static int handle_route(struct device *dev, struct route *r)
|
|||
/* just save port properties */
|
||||
save_route(dev, r);
|
||||
}
|
||||
ri->available = r->available;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int handle_routes(struct device *dev)
|
||||
static int handle_device(struct device *dev)
|
||||
{
|
||||
struct profile pr;
|
||||
struct sm_param *p;
|
||||
int res;
|
||||
bool route_changed = false;
|
||||
|
||||
dev->generation++;
|
||||
|
||||
/* first look at all routes */
|
||||
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)
|
||||
continue;
|
||||
|
||||
ri->prev_available = ri->available;
|
||||
if (ri->available != r.available) {
|
||||
pw_log_info("device %d: route %s available changed %d -> %d",
|
||||
dev->id, r.name, ri->available, r.available);
|
||||
ri->available = r.available;
|
||||
route_changed = true;
|
||||
}
|
||||
ri->generation = dev->generation;
|
||||
ri->prev_active = ri->active;
|
||||
|
|
@ -783,23 +776,15 @@ static int handle_routes(struct device *dev)
|
|||
continue;
|
||||
handle_route(dev, &r);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
save_profile(dev, &pr);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue