diff options
| -rw-r--r-- | man/pulse-daemon.conf.5.xml.in | 8 | ||||
| -rw-r--r-- | src/daemon/daemon-conf.c | 19 | ||||
| -rw-r--r-- | src/daemon/daemon-conf.h | 3 | ||||
| -rw-r--r-- | src/daemon/daemon.conf.in | 4 | ||||
| -rw-r--r-- | src/daemon/main.c | 15 | 
5 files changed, 37 insertions, 12 deletions
diff --git a/man/pulse-daemon.conf.5.xml.in b/man/pulse-daemon.conf.5.xml.in index afa7ca00..b4a7fdb0 100644 --- a/man/pulse-daemon.conf.5.xml.in +++ b/man/pulse-daemon.conf.5.xml.in @@ -164,6 +164,14 @@ USA.      </option>      <option> +      <p><opt>lock-memory=</opt> Locks the entire PulseAudio process +      into memory. While this might increase drop-out safety when used +      in conjunction with real-time scheduling this takes away a lot +      of memory from other processes and might hence considerably slow +      down your system. Defaults to <opt>no</opt>.</p> +    </option> + +    <option>        <p><opt>flat-volumes=</opt> Enable 'flat' volumes, i.e. where        possible let the sink volume equal the maximum of the volumes of        the inputs connected to it. Takes a boolean argument, defaults diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c index ac6cc8aa..664e4fde 100644 --- a/src/daemon/daemon-conf.c +++ b/src/daemon/daemon-conf.c @@ -85,6 +85,7 @@ static const pa_daemon_conf default_conf = {      .system_instance = FALSE,      .no_cpu_limit = FALSE,      .disable_shm = FALSE, +    .lock_memory = FALSE,      .default_n_fragments = 4,      .default_fragment_size_msec = 25,      .default_sample_spec = { .format = PA_SAMPLE_S16NE, .rate = 44100, .channels = 2 }, @@ -446,6 +447,7 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {          { "no-cpu-limit",               pa_config_parse_bool,     &c->no_cpu_limit, NULL },          { "disable-shm",                pa_config_parse_bool,     &c->disable_shm, NULL },          { "flat-volumes",               pa_config_parse_bool,     &c->flat_volumes, NULL }, +        { "lock-memory",                pa_config_parse_bool,     &c->lock_memory, NULL },          { "exit-idle-time",             pa_config_parse_int,      &c->exit_idle_time, NULL },          { "scache-idle-time",           pa_config_parse_int,      &c->scache_idle_time, NULL },          { "realtime-priority",          parse_rtprio,             c, NULL }, @@ -595,16 +597,14 @@ FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf *c) {      return f;  } - -static const char* const log_level_to_string[] = { -    [PA_LOG_DEBUG] = "debug", -    [PA_LOG_INFO] = "info", -    [PA_LOG_NOTICE] = "notice", -    [PA_LOG_WARN] = "warning", -    [PA_LOG_ERROR] = "error" -}; -  char *pa_daemon_conf_dump(pa_daemon_conf *c) { +    static const char* const log_level_to_string[] = { +        [PA_LOG_DEBUG] = "debug", +        [PA_LOG_INFO] = "info", +        [PA_LOG_NOTICE] = "notice", +        [PA_LOG_WARN] = "warning", +        [PA_LOG_ERROR] = "error" +    };      pa_strbuf *s;      char cm[PA_CHANNEL_MAP_SNPRINT_MAX]; @@ -630,6 +630,7 @@ char *pa_daemon_conf_dump(pa_daemon_conf *c) {      pa_strbuf_printf(s, "no-cpu-limit = %s\n", pa_yes_no(c->no_cpu_limit));      pa_strbuf_printf(s, "disable-shm = %s\n", pa_yes_no(c->disable_shm));      pa_strbuf_printf(s, "flat-volumes = %s\n", pa_yes_no(c->flat_volumes)); +    pa_strbuf_printf(s, "lock-memory = %s\n", pa_yes_no(c->lock_memory));      pa_strbuf_printf(s, "exit-idle-time = %i\n", c->exit_idle_time);      pa_strbuf_printf(s, "scache-idle-time = %i\n", c->scache_idle_time);      pa_strbuf_printf(s, "dl-search-path = %s\n", pa_strempty(c->dl_search_path)); diff --git a/src/daemon/daemon-conf.h b/src/daemon/daemon-conf.h index 9cec189f..dd69e048 100644 --- a/src/daemon/daemon-conf.h +++ b/src/daemon/daemon-conf.h @@ -73,7 +73,8 @@ typedef struct pa_daemon_conf {          disallow_exit,          log_meta,          log_time, -        flat_volumes; +        flat_volumes, +        lock_memory;      int exit_idle_time,          scache_idle_time,          auto_log_target, diff --git a/src/daemon/daemon.conf.in b/src/daemon/daemon.conf.in index fcd2513a..746ea76c 100644 --- a/src/daemon/daemon.conf.in +++ b/src/daemon/daemon.conf.in @@ -27,6 +27,8 @@  ; system-instance = no  ; disable-shm = no  ; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB +; lock-memory = no +; no-cpu-limit = no  ; high-priority = yes  ; nice-level = -11 @@ -55,8 +57,6 @@  ; flat-volumes = yes -; no-cpu-limit = no -  ; rlimit-fsize = -1  ; rlimit-data = -1  ; rlimit-stack = -1 diff --git a/src/daemon/main.c b/src/daemon/main.c index 3e50baad..58f8d660 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -40,6 +40,10 @@  #include <liboil/liboil.h> +#ifdef HAVE_SYS_MMAN_H +#include <sys/mman.h> +#endif +  #ifdef HAVE_SYS_IOCTL_H  #include <sys/ioctl.h>  #endif @@ -960,6 +964,17 @@ int main(int argc, char *argv[]) {      pa_rtsig_configure(SIGRTMIN, SIGRTMAX-1);  #endif +    if (conf->lock_memory) { +#ifdef HAVE_SYS_MMAN_H +        if (mlockall(MCL_FUTURE) < 0) +            pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno)); +        else +            pa_log_info("Sucessfully locked process into memory."); +#else +        pa_log_warn("Memory locking requested but not supported on platform."); +#endif +    } +      pa_memtrap_install();      pa_assert_se(mainloop = pa_mainloop_new());  | 
