X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/1562671b9b3048759b210a329764fac8880b62dd..f4f4c42fc611b0bca2293e9b517a88a525f2c1fb:/src/modules/module-default-device-restore.c diff --git a/src/modules/module-default-device-restore.c b/src/modules/module-default-device-restore.c index 2168ac71..fb18750f 100644 --- a/src/modules/module-default-device-restore.c +++ b/src/modules/module-default-device-restore.c @@ -5,7 +5,7 @@ PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2 of the License, + by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. PulseAudio is distributed in the hope that it will be useful, but @@ -26,7 +26,9 @@ #include #include +#include #include +#include #include #include @@ -39,18 +41,16 @@ PA_MODULE_AUTHOR("Lennart Poettering"); PA_MODULE_DESCRIPTION("Automatically restore the default sink and source"); PA_MODULE_VERSION(PACKAGE_VERSION); -PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_LOAD_ONCE(true); -#define DEFAULT_SINK_FILE "default-sink" -#define DEFAULT_SOURCE_FILE "default-source" -#define DEFAULT_SAVE_INTERVAL 5 +#define SAVE_INTERVAL (5 * PA_USEC_PER_SEC) struct userdata { pa_core *core; pa_subscription *subscription; pa_time_event *time_event; char *sink_filename, *source_filename; - pa_bool_t modified; + bool modified; }; static void load(struct userdata *u) { @@ -58,42 +58,44 @@ static void load(struct userdata *u) { /* We never overwrite manually configured settings */ - if (u->core->default_sink_name) + if (u->core->default_sink) pa_log_info("Manually configured default sink, not overwriting."); - else if ((f = fopen(u->sink_filename, "r"))) { + else if ((f = pa_fopen_cloexec(u->sink_filename, "r"))) { char ln[256] = ""; + pa_sink *s; - fgets(ln, sizeof(ln)-1, f); - pa_strip_nl(ln); + if (fgets(ln, sizeof(ln)-1, f)) + pa_strip_nl(ln); fclose(f); if (!ln[0]) pa_log_info("No previous default sink setting, ignoring."); - else if (pa_namereg_get(u->core, ln, PA_NAMEREG_SINK, TRUE)) { - pa_namereg_set_default(u->core, ln, PA_NAMEREG_SINK); + else if ((s = pa_namereg_get(u->core, ln, PA_NAMEREG_SINK))) { + pa_namereg_set_default_sink(u->core, s); pa_log_info("Restored default sink '%s'.", ln); } else - pa_log_info("Saved default sink '%s' not existant, not restoring default sink setting.", ln); + pa_log_info("Saved default sink '%s' not existent, not restoring default sink setting.", ln); } else if (errno != ENOENT) pa_log("Failed to load default sink: %s", pa_cstrerror(errno)); - if (u->core->default_source_name) + if (u->core->default_source) pa_log_info("Manually configured default source, not overwriting."); - else if ((f = fopen(u->source_filename, "r"))) { + else if ((f = pa_fopen_cloexec(u->source_filename, "r"))) { char ln[256] = ""; + pa_source *s; - fgets(ln, sizeof(ln)-1, f); - pa_strip_nl(ln); + if (fgets(ln, sizeof(ln)-1, f)) + pa_strip_nl(ln); fclose(f); if (!ln[0]) pa_log_info("No previous default source setting, ignoring."); - else if (pa_namereg_get(u->core, ln, PA_NAMEREG_SOURCE, TRUE)) { - pa_namereg_set_default(u->core, ln, PA_NAMEREG_SOURCE); + else if ((s = pa_namereg_get(u->core, ln, PA_NAMEREG_SOURCE))) { + pa_namereg_set_default_source(u->core, s); pa_log_info("Restored default source '%s'.", ln); } else - pa_log_info("Saved default source '%s' not existant, not restoring default source setting.", ln); + pa_log_info("Saved default source '%s' not existent, not restoring default source setting.", ln); } else if (errno != ENOENT) pa_log("Failed to load default sink: %s", pa_cstrerror(errno)); @@ -106,27 +108,27 @@ static void save(struct userdata *u) { return; if (u->sink_filename) { - if ((f = fopen(u->sink_filename, "w"))) { - const char *n = pa_namereg_get_default_sink_name(u->core); - fprintf(f, "%s\n", pa_strempty(n)); + if ((f = pa_fopen_cloexec(u->sink_filename, "w"))) { + pa_sink *s = pa_namereg_get_default_sink(u->core); + fprintf(f, "%s\n", s ? s->name : ""); fclose(f); } else pa_log("Failed to save default sink: %s", pa_cstrerror(errno)); } if (u->source_filename) { - if ((f = fopen(u->source_filename, "w"))) { - const char *n = pa_namereg_get_default_source_name(u->core); - fprintf(f, "%s\n", pa_strempty(n)); + if ((f = pa_fopen_cloexec(u->source_filename, "w"))) { + pa_source *s = pa_namereg_get_default_source(u->core); + fprintf(f, "%s\n", s ? s->name : ""); fclose(f); } else pa_log("Failed to save default source: %s", pa_cstrerror(errno)); } - u->modified = FALSE; + u->modified = false; } -static void time_cb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *tv, void *userdata) { +static void time_cb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *t, void *userdata) { struct userdata *u = userdata; pa_assert(u); @@ -143,14 +145,10 @@ static void subscribe_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t id pa_assert(u); - u->modified = TRUE; + u->modified = true; - if (!u->time_event) { - struct timeval tv; - pa_gettimeofday(&tv); - pa_timeval_add(&tv, DEFAULT_SAVE_INTERVAL*PA_USEC_PER_SEC); - u->time_event = u->core->mainloop->time_new(u->core->mainloop, &tv, time_cb, u); - } + if (!u->time_event) + u->time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + SAVE_INTERVAL, time_cb, u); } int pa__init(pa_module *m) { @@ -158,13 +156,13 @@ int pa__init(pa_module *m) { pa_assert(m); - u = pa_xnew0(struct userdata, 1); + m->userdata = u = pa_xnew0(struct userdata, 1); u->core = m->core; - if (!(u->sink_filename = pa_state_path(DEFAULT_SINK_FILE))) + if (!(u->sink_filename = pa_state_path("default-sink", true))) goto fail; - if (!(u->source_filename = pa_state_path(DEFAULT_SOURCE_FILE))) + if (!(u->source_filename = pa_state_path("default-source", true))) goto fail; load(u);