mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-04 13:29:59 -05:00
device-manager: Add a function to dump the database which we do whenever we save it (and on startup)
This commit is contained in:
parent
1d43230006
commit
4dedba73a6
1 changed files with 107 additions and 15 deletions
|
|
@ -55,7 +55,7 @@
|
||||||
#include "module-device-manager-symdef.h"
|
#include "module-device-manager-symdef.h"
|
||||||
|
|
||||||
PA_MODULE_AUTHOR("Colin Guthrie");
|
PA_MODULE_AUTHOR("Colin Guthrie");
|
||||||
PA_MODULE_DESCRIPTION("Keep track of devices (and their descriptions) both past and present");
|
PA_MODULE_DESCRIPTION("Keep track of devices (and their descriptions) both past and present and prioritise by role");
|
||||||
PA_MODULE_VERSION(PACKAGE_VERSION);
|
PA_MODULE_VERSION(PACKAGE_VERSION);
|
||||||
PA_MODULE_LOAD_ONCE(TRUE);
|
PA_MODULE_LOAD_ONCE(TRUE);
|
||||||
PA_MODULE_USAGE(
|
PA_MODULE_USAGE(
|
||||||
|
|
@ -64,6 +64,7 @@ PA_MODULE_USAGE(
|
||||||
"on_rescue=<When device becomes unavailable, recheck streams?>");
|
"on_rescue=<When device becomes unavailable, recheck streams?>");
|
||||||
|
|
||||||
#define SAVE_INTERVAL (10 * PA_USEC_PER_SEC)
|
#define SAVE_INTERVAL (10 * PA_USEC_PER_SEC)
|
||||||
|
#define DUMP_DATABASE
|
||||||
|
|
||||||
static const char* const valid_modargs[] = {
|
static const char* const valid_modargs[] = {
|
||||||
"do_routing",
|
"do_routing",
|
||||||
|
|
@ -135,20 +136,6 @@ enum {
|
||||||
SUBCOMMAND_EVENT
|
SUBCOMMAND_EVENT
|
||||||
};
|
};
|
||||||
|
|
||||||
static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
|
|
||||||
struct userdata *u = userdata;
|
|
||||||
|
|
||||||
pa_assert(a);
|
|
||||||
pa_assert(e);
|
|
||||||
pa_assert(u);
|
|
||||||
|
|
||||||
pa_assert(e == u->save_time_event);
|
|
||||||
u->core->mainloop->time_free(u->save_time_event);
|
|
||||||
u->save_time_event = NULL;
|
|
||||||
|
|
||||||
pa_database_sync(u->database);
|
|
||||||
pa_log_info("Synced.");
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct entry* read_entry(struct userdata *u, const char *name) {
|
static struct entry* read_entry(struct userdata *u, const char *name) {
|
||||||
pa_datum key, data;
|
pa_datum key, data;
|
||||||
|
|
@ -190,6 +177,107 @@ fail:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DUMP_DATABASE
|
||||||
|
static void dump_database_helper(struct userdata *u, uint32_t role_index, const char* human, pa_bool_t sink_mode) {
|
||||||
|
pa_assert(u);
|
||||||
|
pa_assert(human);
|
||||||
|
|
||||||
|
if (sink_mode) {
|
||||||
|
pa_sink *s;
|
||||||
|
if (PA_INVALID_INDEX != u->preferred_sinks[role_index] && (s = pa_idxset_get_by_index(u->core->sinks, u->preferred_sinks[role_index])))
|
||||||
|
pa_log_debug(" %s %s (%s)", human, pa_strnull(pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION)), s->name);
|
||||||
|
else
|
||||||
|
pa_log_debug(" %s No sink specified", human);
|
||||||
|
} else {
|
||||||
|
pa_source *s;
|
||||||
|
if (PA_INVALID_INDEX != u->preferred_sinks[role_index] && (s = pa_idxset_get_by_index(u->core->sinks, u->preferred_sinks[role_index])))
|
||||||
|
pa_log_debug(" %s %s (%s)", human, pa_strnull(pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION)), s->name);
|
||||||
|
else
|
||||||
|
pa_log_debug(" %s No source specified", human);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dump_database(struct userdata *u) {
|
||||||
|
pa_datum key;
|
||||||
|
pa_bool_t done;
|
||||||
|
|
||||||
|
pa_assert(u);
|
||||||
|
|
||||||
|
done = !pa_database_first(u->database, &key, NULL);
|
||||||
|
|
||||||
|
pa_log_debug("Dumping database");
|
||||||
|
while (!done) {
|
||||||
|
char *name;
|
||||||
|
struct entry *e;
|
||||||
|
pa_datum next_key;
|
||||||
|
|
||||||
|
done = !pa_database_next(u->database, &key, &next_key, NULL);
|
||||||
|
|
||||||
|
name = pa_xstrndup(key.data, key.size);
|
||||||
|
|
||||||
|
if ((e = read_entry(u, name))) {
|
||||||
|
pa_log_debug(" Got entry: %s", name);
|
||||||
|
pa_log_debug(" Description: %s", e->description);
|
||||||
|
pa_log_debug(" Priorities: None: %3u, Video: %3u, Music: %3u, Game: %3u, Event: %3u",
|
||||||
|
e->priority[ROLE_NONE], e->priority[ROLE_VIDEO], e->priority[ROLE_MUSIC], e->priority[ROLE_GAME], e->priority[ROLE_EVENT]);
|
||||||
|
pa_log_debug(" Phone: %3u, Anim: %3u, Prodtn: %3u, A11y: %3u",
|
||||||
|
e->priority[ROLE_PHONE], e->priority[ROLE_ANIMATION], e->priority[ROLE_PRODUCTION], e->priority[ROLE_A11Y]);
|
||||||
|
pa_xfree(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_xfree(name);
|
||||||
|
|
||||||
|
pa_datum_free(&key);
|
||||||
|
key = next_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_log_debug(" Highest priority devices per-role:");
|
||||||
|
|
||||||
|
pa_log_debug(" Sinks:");
|
||||||
|
dump_database_helper(u, ROLE_NONE, "None: ", TRUE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Video: ", TRUE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Music: ", TRUE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Game: ", TRUE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Event: ", TRUE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Phone: ", TRUE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Anim: ", TRUE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Prodtn:", TRUE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Ally: ", TRUE);
|
||||||
|
|
||||||
|
pa_log_debug(" Sources:");
|
||||||
|
dump_database_helper(u, ROLE_NONE, "None: ", FALSE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Video: ", FALSE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Music: ", FALSE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Game: ", FALSE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Event: ", FALSE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Phone: ", FALSE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Anim: ", FALSE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Prodtn:", FALSE);
|
||||||
|
dump_database_helper(u, ROLE_NONE, "Ally: ", FALSE);
|
||||||
|
|
||||||
|
pa_log_debug("Completed database dump");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
|
||||||
|
struct userdata *u = userdata;
|
||||||
|
|
||||||
|
pa_assert(a);
|
||||||
|
pa_assert(e);
|
||||||
|
pa_assert(u);
|
||||||
|
|
||||||
|
pa_assert(e == u->save_time_event);
|
||||||
|
u->core->mainloop->time_free(u->save_time_event);
|
||||||
|
u->save_time_event = NULL;
|
||||||
|
|
||||||
|
pa_database_sync(u->database);
|
||||||
|
pa_log_info("Synced.");
|
||||||
|
|
||||||
|
#ifdef DUMP_DATABASE
|
||||||
|
dump_database(u);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static void trigger_save(struct userdata *u) {
|
static void trigger_save(struct userdata *u) {
|
||||||
pa_native_connection *c;
|
pa_native_connection *c;
|
||||||
uint32_t idx;
|
uint32_t idx;
|
||||||
|
|
@ -1210,6 +1298,10 @@ int pa__init(pa_module*m) {
|
||||||
route_sink_inputs(u, NULL);
|
route_sink_inputs(u, NULL);
|
||||||
route_source_outputs(u, NULL);
|
route_source_outputs(u, NULL);
|
||||||
|
|
||||||
|
#ifdef DUMP_DATABASE
|
||||||
|
dump_database(u);
|
||||||
|
#endif
|
||||||
|
|
||||||
pa_modargs_free(ma);
|
pa_modargs_free(ma);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue