2 This file is part of PulseAudio.
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation; either version 2.1 of the License,
10 or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
37 #include <pulse/xmalloc.h>
38 #include <pulse/timeval.h>
39 #include <pulse/i18n.h>
41 #include <pulsecore/core-error.h>
42 #include <pulsecore/core-util.h>
43 #include <pulsecore/strbuf.h>
44 #include <pulsecore/conf-parser.h>
45 #include <pulsecore/resampler.h>
46 #include <pulsecore/macro.h>
48 #include "daemon-conf.h"
50 #define DEFAULT_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "default.pa"
51 #define DEFAULT_SCRIPT_FILE_USER PA_PATH_SEP "default.pa"
52 #define DEFAULT_SYSTEM_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "system.pa"
54 #define DEFAULT_CONFIG_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "daemon.conf"
55 #define DEFAULT_CONFIG_FILE_USER PA_PATH_SEP "daemon.conf"
57 #define ENV_SCRIPT_FILE "PULSE_SCRIPT"
58 #define ENV_CONFIG_FILE "PULSE_CONFIG"
59 #define ENV_DL_SEARCH_PATH "PULSE_DLPATH"
61 static const pa_daemon_conf default_conf
= {
65 .high_priority
= TRUE
,
67 .realtime_scheduling
= TRUE
,
68 .realtime_priority
= 5, /* Half of JACK's default rtprio */
69 .disallow_module_loading
= FALSE
,
70 .disallow_exit
= FALSE
,
73 .scache_idle_time
= 20,
75 .script_commands
= NULL
,
76 .dl_search_path
= NULL
,
77 .load_default_script_file
= TRUE
,
78 .default_script_file
= NULL
,
79 .log_target
= PA_LOG_SYSLOG
,
80 .log_level
= PA_LOG_NOTICE
,
84 .resample_method
= PA_RESAMPLER_AUTO
,
85 .disable_remixing
= FALSE
,
86 .disable_lfe_remixing
= TRUE
,
89 .system_instance
= FALSE
,
91 .local_server_type
= PA_SERVER_TYPE_UNSET
, /* The actual default is _USER, but we have to detect when the user doesn't specify this option. */
97 .default_n_fragments
= 4,
98 .default_fragment_size_msec
= 25,
99 .sync_volume_safety_margin_usec
= 8000,
100 .sync_volume_extra_delay_usec
= 0,
101 .default_sample_spec
= { .format
= PA_SAMPLE_S16NE
, .rate
= 44100, .channels
= 2 },
102 .default_channel_map
= { .channels
= 2, .map
= { PA_CHANNEL_POSITION_LEFT
, PA_CHANNEL_POSITION_RIGHT
} },
104 #ifdef HAVE_SYS_RESOURCE_H
105 ,.rlimit_fsize
= { .value
= 0, .is_set
= FALSE
},
106 .rlimit_data
= { .value
= 0, .is_set
= FALSE
},
107 .rlimit_stack
= { .value
= 0, .is_set
= FALSE
},
108 .rlimit_core
= { .value
= 0, .is_set
= FALSE
}
110 ,.rlimit_rss
= { .value
= 0, .is_set
= FALSE
}
113 ,.rlimit_nproc
= { .value
= 0, .is_set
= FALSE
}
116 ,.rlimit_nofile
= { .value
= 256, .is_set
= TRUE
}
118 #ifdef RLIMIT_MEMLOCK
119 ,.rlimit_memlock
= { .value
= 0, .is_set
= FALSE
}
122 ,.rlimit_as
= { .value
= 0, .is_set
= FALSE
}
125 ,.rlimit_locks
= { .value
= 0, .is_set
= FALSE
}
127 #ifdef RLIMIT_SIGPENDING
128 ,.rlimit_sigpending
= { .value
= 0, .is_set
= FALSE
}
130 #ifdef RLIMIT_MSGQUEUE
131 ,.rlimit_msgqueue
= { .value
= 0, .is_set
= FALSE
}
134 ,.rlimit_nice
= { .value
= 31, .is_set
= TRUE
} /* nice level of -11 */
137 ,.rlimit_rtprio
= { .value
= 9, .is_set
= TRUE
} /* One below JACK's default for the server */
140 ,.rlimit_rttime
= { .value
= PA_USEC_PER_SEC
, .is_set
= TRUE
}
145 pa_daemon_conf
* pa_daemon_conf_new(void) {
148 c
= pa_xnewdup(pa_daemon_conf
, &default_conf
, 1);
150 #if defined(__linux__) && !defined(__OPTIMIZE__)
152 /* We abuse __OPTIMIZE__ as a check whether we are a debug build
153 * or not. If we are and are run from the build tree then we
154 * override the search path to point to our build tree */
156 if (pa_run_from_build_tree()) {
157 pa_log_notice("Detected that we are run from the build tree, fixing search path.");
158 c
->dl_search_path
= pa_xstrdup(PA_BUILDDIR
"/.libs/");
163 c
->dl_search_path
= pa_xstrdup(PA_DLSEARCHPATH
);
168 void pa_daemon_conf_free(pa_daemon_conf
*c
) {
173 pa_xfree(c
->script_commands
);
174 pa_xfree(c
->dl_search_path
);
175 pa_xfree(c
->default_script_file
);
176 pa_xfree(c
->config_file
);
180 int pa_daemon_conf_set_log_target(pa_daemon_conf
*c
, const char *string
) {
184 if (!strcmp(string
, "auto"))
185 c
->auto_log_target
= 1;
186 else if (!strcmp(string
, "syslog")) {
187 c
->auto_log_target
= 0;
188 c
->log_target
= PA_LOG_SYSLOG
;
189 } else if (!strcmp(string
, "stderr")) {
190 c
->auto_log_target
= 0;
191 c
->log_target
= PA_LOG_STDERR
;
198 int pa_daemon_conf_set_log_level(pa_daemon_conf
*c
, const char *string
) {
203 if (pa_atou(string
, &u
) >= 0) {
204 if (u
>= PA_LOG_LEVEL_MAX
)
207 c
->log_level
= (pa_log_level_t
) u
;
208 } else if (pa_startswith(string
, "debug"))
209 c
->log_level
= PA_LOG_DEBUG
;
210 else if (pa_startswith(string
, "info"))
211 c
->log_level
= PA_LOG_INFO
;
212 else if (pa_startswith(string
, "notice"))
213 c
->log_level
= PA_LOG_NOTICE
;
214 else if (pa_startswith(string
, "warn"))
215 c
->log_level
= PA_LOG_WARN
;
216 else if (pa_startswith(string
, "err"))
217 c
->log_level
= PA_LOG_ERROR
;
218 else if (pa_startswith(string
, "file:")) {
222 pa_strlcpy(file_path
, string
+ 5, sizeof(file_path
));
224 /* Open target file with user rights */
225 if ((log_fd
= open(file_path
, O_RDWR
|O_TRUNC
|O_CREAT
, S_IRWXU
)) >= 0) {
226 c
->auto_log_target
= 0;
227 c
->log_target
= PA_LOG_FD
;
228 pa_log_set_fd(log_fd
);
231 printf("Failed to open target file %s, error : %s\n", file_path
, pa_cstrerror(errno
));
241 int pa_daemon_conf_set_resample_method(pa_daemon_conf
*c
, const char *string
) {
246 if ((m
= pa_parse_resample_method(string
)) < 0)
249 c
->resample_method
= m
;
253 int pa_daemon_conf_set_local_server_type(pa_daemon_conf
*c
, const char *string
) {
257 if (!strcmp(string
, "user"))
258 c
->local_server_type
= PA_SERVER_TYPE_USER
;
259 else if (!strcmp(string
, "system")) {
260 c
->local_server_type
= PA_SERVER_TYPE_SYSTEM
;
261 } else if (!strcmp(string
, "none")) {
262 c
->local_server_type
= PA_SERVER_TYPE_NONE
;
269 static int parse_log_target(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
270 pa_daemon_conf
*c
= data
;
277 if (pa_daemon_conf_set_log_target(c
, rvalue
) < 0) {
278 pa_log(_("[%s:%u] Invalid log target '%s'."), filename
, line
, rvalue
);
285 static int parse_log_level(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
286 pa_daemon_conf
*c
= data
;
293 if (pa_daemon_conf_set_log_level(c
, rvalue
) < 0) {
294 pa_log(_("[%s:%u] Invalid log level '%s'."), filename
, line
, rvalue
);
301 static int parse_resample_method(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
302 pa_daemon_conf
*c
= data
;
309 if (pa_daemon_conf_set_resample_method(c
, rvalue
) < 0) {
310 pa_log(_("[%s:%u] Invalid resample method '%s'."), filename
, line
, rvalue
);
317 #ifdef HAVE_SYS_RESOURCE_H
318 static int parse_rlimit(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
319 struct pa_rlimit
*r
= data
;
326 if (rvalue
[strspn(rvalue
, "\t ")] == 0) {
332 if (pa_atoi(rvalue
, &k
) < 0) {
333 pa_log(_("[%s:%u] Invalid rlimit '%s'."), filename
, line
, rvalue
);
337 r
->value
= k
>= 0 ? (rlim_t
) k
: 0;
344 static int parse_sample_format(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
345 pa_daemon_conf
*c
= data
;
346 pa_sample_format_t f
;
353 if ((f
= pa_parse_sample_format(rvalue
)) < 0) {
354 pa_log(_("[%s:%u] Invalid sample format '%s'."), filename
, line
, rvalue
);
358 c
->default_sample_spec
.format
= f
;
362 static int parse_sample_rate(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
363 pa_daemon_conf
*c
= data
;
371 if (pa_atou(rvalue
, &r
) < 0 || r
> (uint32_t) PA_RATE_MAX
|| r
<= 0) {
372 pa_log(_("[%s:%u] Invalid sample rate '%s'."), filename
, line
, rvalue
);
376 c
->default_sample_spec
.rate
= r
;
380 struct channel_conf_info
{
381 pa_daemon_conf
*conf
;
382 pa_bool_t default_sample_spec_set
;
383 pa_bool_t default_channel_map_set
;
386 static int parse_sample_channels(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
387 struct channel_conf_info
*i
= data
;
395 if (pa_atoi(rvalue
, &n
) < 0 || n
> (int32_t) PA_CHANNELS_MAX
|| n
<= 0) {
396 pa_log(_("[%s:%u] Invalid sample channels '%s'."), filename
, line
, rvalue
);
400 i
->conf
->default_sample_spec
.channels
= (uint8_t) n
;
401 i
->default_sample_spec_set
= TRUE
;
405 static int parse_channel_map(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
406 struct channel_conf_info
*i
= data
;
413 if (!pa_channel_map_parse(&i
->conf
->default_channel_map
, rvalue
)) {
414 pa_log(_("[%s:%u] Invalid channel map '%s'."), filename
, line
, rvalue
);
418 i
->default_channel_map_set
= TRUE
;
422 static int parse_fragments(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
423 pa_daemon_conf
*c
= data
;
431 if (pa_atoi(rvalue
, &n
) < 0 || n
< 2) {
432 pa_log(_("[%s:%u] Invalid number of fragments '%s'."), filename
, line
, rvalue
);
436 c
->default_n_fragments
= (unsigned) n
;
440 static int parse_fragment_size_msec(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
441 pa_daemon_conf
*c
= data
;
449 if (pa_atoi(rvalue
, &n
) < 0 || n
< 1) {
450 pa_log(_("[%s:%u] Invalid fragment size '%s'."), filename
, line
, rvalue
);
454 c
->default_fragment_size_msec
= (unsigned) n
;
458 static int parse_nice_level(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
459 pa_daemon_conf
*c
= data
;
467 if (pa_atoi(rvalue
, &level
) < 0 || level
< -20 || level
> 19) {
468 pa_log(_("[%s:%u] Invalid nice level '%s'."), filename
, line
, rvalue
);
472 c
->nice_level
= (int) level
;
476 static int parse_rtprio(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
477 pa_daemon_conf
*c
= data
;
486 if (pa_atoi(rvalue
, &rtprio
) < 0 || rtprio
< sched_get_priority_min(SCHED_FIFO
) || rtprio
> sched_get_priority_max(SCHED_FIFO
)) {
487 pa_log("[%s:%u] Invalid realtime priority '%s'.", filename
, line
, rvalue
);
492 c
->realtime_priority
= (int) rtprio
;
497 static int parse_server_type(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
498 pa_daemon_conf
*c
= data
;
505 if (pa_daemon_conf_set_local_server_type(c
, rvalue
) < 0) {
506 pa_log(_("[%s:%u] Invalid server type '%s'."), filename
, line
, rvalue
);
514 int pa_daemon_conf_load(pa_daemon_conf
*c
, const char *filename
) {
517 struct channel_conf_info ci
;
518 pa_config_item table
[] = {
519 { "daemonize", pa_config_parse_bool
, &c
->daemonize
, NULL
},
520 { "fail", pa_config_parse_bool
, &c
->fail
, NULL
},
521 { "high-priority", pa_config_parse_bool
, &c
->high_priority
, NULL
},
522 { "realtime-scheduling", pa_config_parse_bool
, &c
->realtime_scheduling
, NULL
},
523 { "disallow-module-loading", pa_config_parse_bool
, &c
->disallow_module_loading
, NULL
},
524 { "allow-module-loading", pa_config_parse_not_bool
, &c
->disallow_module_loading
, NULL
},
525 { "disallow-exit", pa_config_parse_bool
, &c
->disallow_exit
, NULL
},
526 { "allow-exit", pa_config_parse_not_bool
, &c
->disallow_exit
, NULL
},
527 { "use-pid-file", pa_config_parse_bool
, &c
->use_pid_file
, NULL
},
528 { "system-instance", pa_config_parse_bool
, &c
->system_instance
, NULL
},
530 { "local-server-type", parse_server_type
, c
, NULL
},
532 { "no-cpu-limit", pa_config_parse_bool
, &c
->no_cpu_limit
, NULL
},
533 { "cpu-limit", pa_config_parse_not_bool
, &c
->no_cpu_limit
, NULL
},
534 { "disable-shm", pa_config_parse_bool
, &c
->disable_shm
, NULL
},
535 { "enable-shm", pa_config_parse_not_bool
, &c
->disable_shm
, NULL
},
536 { "flat-volumes", pa_config_parse_bool
, &c
->flat_volumes
, NULL
},
537 { "lock-memory", pa_config_parse_bool
, &c
->lock_memory
, NULL
},
538 { "enable-sync-volume", pa_config_parse_bool
, &c
->sync_volume
, NULL
},
539 { "exit-idle-time", pa_config_parse_int
, &c
->exit_idle_time
, NULL
},
540 { "scache-idle-time", pa_config_parse_int
, &c
->scache_idle_time
, NULL
},
541 { "realtime-priority", parse_rtprio
, c
, NULL
},
542 { "dl-search-path", pa_config_parse_string
, &c
->dl_search_path
, NULL
},
543 { "default-script-file", pa_config_parse_string
, &c
->default_script_file
, NULL
},
544 { "log-target", parse_log_target
, c
, NULL
},
545 { "log-level", parse_log_level
, c
, NULL
},
546 { "verbose", parse_log_level
, c
, NULL
},
547 { "resample-method", parse_resample_method
, c
, NULL
},
548 { "default-sample-format", parse_sample_format
, c
, NULL
},
549 { "default-sample-rate", parse_sample_rate
, c
, NULL
},
550 { "default-sample-channels", parse_sample_channels
, &ci
, NULL
},
551 { "default-channel-map", parse_channel_map
, &ci
, NULL
},
552 { "default-fragments", parse_fragments
, c
, NULL
},
553 { "default-fragment-size-msec", parse_fragment_size_msec
, c
, NULL
},
554 { "sync-volume-safety-margin-usec", pa_config_parse_unsigned
, &c
->sync_volume_safety_margin_usec
, NULL
},
555 { "sync-volume-extra-delay-usec", pa_config_parse_int
, &c
->sync_volume_extra_delay_usec
, NULL
},
556 { "nice-level", parse_nice_level
, c
, NULL
},
557 { "disable-remixing", pa_config_parse_bool
, &c
->disable_remixing
, NULL
},
558 { "enable-remixing", pa_config_parse_not_bool
, &c
->disable_remixing
, NULL
},
559 { "disable-lfe-remixing", pa_config_parse_bool
, &c
->disable_lfe_remixing
, NULL
},
560 { "enable-lfe-remixing", pa_config_parse_not_bool
, &c
->disable_lfe_remixing
, NULL
},
561 { "load-default-script-file", pa_config_parse_bool
, &c
->load_default_script_file
, NULL
},
562 { "shm-size-bytes", pa_config_parse_size
, &c
->shm_size
, NULL
},
563 { "log-meta", pa_config_parse_bool
, &c
->log_meta
, NULL
},
564 { "log-time", pa_config_parse_bool
, &c
->log_time
, NULL
},
565 { "log-backtrace", pa_config_parse_unsigned
, &c
->log_backtrace
, NULL
},
566 #ifdef HAVE_SYS_RESOURCE_H
567 { "rlimit-fsize", parse_rlimit
, &c
->rlimit_fsize
, NULL
},
568 { "rlimit-data", parse_rlimit
, &c
->rlimit_data
, NULL
},
569 { "rlimit-stack", parse_rlimit
, &c
->rlimit_stack
, NULL
},
570 { "rlimit-core", parse_rlimit
, &c
->rlimit_core
, NULL
},
572 { "rlimit-rss", parse_rlimit
, &c
->rlimit_rss
, NULL
},
575 { "rlimit-nofile", parse_rlimit
, &c
->rlimit_nofile
, NULL
},
578 { "rlimit-as", parse_rlimit
, &c
->rlimit_as
, NULL
},
581 { "rlimit-nproc", parse_rlimit
, &c
->rlimit_nproc
, NULL
},
583 #ifdef RLIMIT_MEMLOCK
584 { "rlimit-memlock", parse_rlimit
, &c
->rlimit_memlock
, NULL
},
587 { "rlimit-locks", parse_rlimit
, &c
->rlimit_locks
, NULL
},
589 #ifdef RLIMIT_SIGPENDING
590 { "rlimit-sigpending", parse_rlimit
, &c
->rlimit_sigpending
, NULL
},
592 #ifdef RLIMIT_MSGQUEUE
593 { "rlimit-msgqueue", parse_rlimit
, &c
->rlimit_msgqueue
, NULL
},
596 { "rlimit-nice", parse_rlimit
, &c
->rlimit_nice
, NULL
},
599 { "rlimit-rtprio", parse_rlimit
, &c
->rlimit_rtprio
, NULL
},
602 { "rlimit-rttime", parse_rlimit
, &c
->rlimit_rttime
, NULL
},
605 { NULL
, NULL
, NULL
, NULL
},
608 pa_xfree(c
->config_file
);
609 c
->config_file
= NULL
;
612 pa_fopen_cloexec(c
->config_file
= pa_xstrdup(filename
), "r") :
613 pa_open_config_file(DEFAULT_CONFIG_FILE
, DEFAULT_CONFIG_FILE_USER
, ENV_CONFIG_FILE
, &c
->config_file
);
615 if (!f
&& errno
!= ENOENT
) {
616 pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno
));
620 ci
.default_channel_map_set
= ci
.default_sample_spec_set
= FALSE
;
623 r
= f
? pa_config_parse(c
->config_file
, f
, table
, NULL
) : 0;
627 /* Make sure that channel map and sample spec fit together */
629 if (ci
.default_sample_spec_set
&&
630 ci
.default_channel_map_set
&&
631 c
->default_channel_map
.channels
!= c
->default_sample_spec
.channels
) {
632 pa_log_error(_("The specified default channel map has a different number of channels than the specified default number of channels."));
635 } else if (ci
.default_sample_spec_set
)
636 pa_channel_map_init_extend(&c
->default_channel_map
, c
->default_sample_spec
.channels
, PA_CHANNEL_MAP_DEFAULT
);
637 else if (ci
.default_channel_map_set
)
638 c
->default_sample_spec
.channels
= c
->default_channel_map
.channels
;
648 int pa_daemon_conf_env(pa_daemon_conf
*c
) {
652 if ((e
= getenv(ENV_DL_SEARCH_PATH
))) {
653 pa_xfree(c
->dl_search_path
);
654 c
->dl_search_path
= pa_xstrdup(e
);
656 if ((e
= getenv(ENV_SCRIPT_FILE
))) {
657 pa_xfree(c
->default_script_file
);
658 c
->default_script_file
= pa_xstrdup(e
);
664 const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf
*c
) {
667 if (!c
->default_script_file
) {
668 if (c
->system_instance
)
669 c
->default_script_file
= pa_find_config_file(DEFAULT_SYSTEM_SCRIPT_FILE
, NULL
, ENV_SCRIPT_FILE
);
671 c
->default_script_file
= pa_find_config_file(DEFAULT_SCRIPT_FILE
, DEFAULT_SCRIPT_FILE_USER
, ENV_SCRIPT_FILE
);
674 return c
->default_script_file
;
677 FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf
*c
) {
681 if (!c
->default_script_file
) {
682 if (c
->system_instance
)
683 f
= pa_open_config_file(DEFAULT_SYSTEM_SCRIPT_FILE
, NULL
, ENV_SCRIPT_FILE
, &c
->default_script_file
);
685 f
= pa_open_config_file(DEFAULT_SCRIPT_FILE
, DEFAULT_SCRIPT_FILE_USER
, ENV_SCRIPT_FILE
, &c
->default_script_file
);
687 f
= pa_fopen_cloexec(c
->default_script_file
, "r");
692 char *pa_daemon_conf_dump(pa_daemon_conf
*c
) {
693 static const char* const log_level_to_string
[] = {
694 [PA_LOG_DEBUG
] = "debug",
695 [PA_LOG_INFO
] = "info",
696 [PA_LOG_NOTICE
] = "notice",
697 [PA_LOG_WARN
] = "warning",
698 [PA_LOG_ERROR
] = "error"
702 static const char* const server_type_to_string
[] = {
703 [PA_SERVER_TYPE_UNSET
] = "!!UNSET!!",
704 [PA_SERVER_TYPE_USER
] = "user",
705 [PA_SERVER_TYPE_SYSTEM
] = "system",
706 [PA_SERVER_TYPE_NONE
] = "none"
711 char cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
718 pa_strbuf_printf(s
, _("### Read from configuration file: %s ###\n"), c
->config_file
);
720 pa_assert(c
->log_level
< PA_LOG_LEVEL_MAX
);
722 pa_strbuf_printf(s
, "daemonize = %s\n", pa_yes_no(c
->daemonize
));
723 pa_strbuf_printf(s
, "fail = %s\n", pa_yes_no(c
->fail
));
724 pa_strbuf_printf(s
, "high-priority = %s\n", pa_yes_no(c
->high_priority
));
725 pa_strbuf_printf(s
, "nice-level = %i\n", c
->nice_level
);
726 pa_strbuf_printf(s
, "realtime-scheduling = %s\n", pa_yes_no(c
->realtime_scheduling
));
727 pa_strbuf_printf(s
, "realtime-priority = %i\n", c
->realtime_priority
);
728 pa_strbuf_printf(s
, "allow-module-loading = %s\n", pa_yes_no(!c
->disallow_module_loading
));
729 pa_strbuf_printf(s
, "allow-exit = %s\n", pa_yes_no(!c
->disallow_exit
));
730 pa_strbuf_printf(s
, "use-pid-file = %s\n", pa_yes_no(c
->use_pid_file
));
731 pa_strbuf_printf(s
, "system-instance = %s\n", pa_yes_no(c
->system_instance
));
733 pa_strbuf_printf(s
, "local-server-type = %s\n", server_type_to_string
[c
->local_server_type
]);
735 pa_strbuf_printf(s
, "cpu-limit = %s\n", pa_yes_no(!c
->no_cpu_limit
));
736 pa_strbuf_printf(s
, "enable-shm = %s\n", pa_yes_no(!c
->disable_shm
));
737 pa_strbuf_printf(s
, "flat-volumes = %s\n", pa_yes_no(c
->flat_volumes
));
738 pa_strbuf_printf(s
, "lock-memory = %s\n", pa_yes_no(c
->lock_memory
));
739 pa_strbuf_printf(s
, "enable-sync-volume = %s\n", pa_yes_no(c
->sync_volume
));
740 pa_strbuf_printf(s
, "exit-idle-time = %i\n", c
->exit_idle_time
);
741 pa_strbuf_printf(s
, "scache-idle-time = %i\n", c
->scache_idle_time
);
742 pa_strbuf_printf(s
, "dl-search-path = %s\n", pa_strempty(c
->dl_search_path
));
743 pa_strbuf_printf(s
, "default-script-file = %s\n", pa_strempty(pa_daemon_conf_get_default_script_file(c
)));
744 pa_strbuf_printf(s
, "load-default-script-file = %s\n", pa_yes_no(c
->load_default_script_file
));
745 pa_strbuf_printf(s
, "log-target = %s\n", c
->auto_log_target
? "auto" : (c
->log_target
== PA_LOG_SYSLOG
? "syslog" : "stderr"));
746 pa_strbuf_printf(s
, "log-level = %s\n", log_level_to_string
[c
->log_level
]);
747 pa_strbuf_printf(s
, "resample-method = %s\n", pa_resample_method_to_string(c
->resample_method
));
748 pa_strbuf_printf(s
, "enable-remixing = %s\n", pa_yes_no(!c
->disable_remixing
));
749 pa_strbuf_printf(s
, "enable-lfe-remixing = %s\n", pa_yes_no(!c
->disable_lfe_remixing
));
750 pa_strbuf_printf(s
, "default-sample-format = %s\n", pa_sample_format_to_string(c
->default_sample_spec
.format
));
751 pa_strbuf_printf(s
, "default-sample-rate = %u\n", c
->default_sample_spec
.rate
);
752 pa_strbuf_printf(s
, "default-sample-channels = %u\n", c
->default_sample_spec
.channels
);
753 pa_strbuf_printf(s
, "default-channel-map = %s\n", pa_channel_map_snprint(cm
, sizeof(cm
), &c
->default_channel_map
));
754 pa_strbuf_printf(s
, "default-fragments = %u\n", c
->default_n_fragments
);
755 pa_strbuf_printf(s
, "default-fragment-size-msec = %u\n", c
->default_fragment_size_msec
);
756 pa_strbuf_printf(s
, "sync-volume-safety-margin-usec = %u\n", c
->sync_volume_safety_margin_usec
);
757 pa_strbuf_printf(s
, "sync-volume-extra-delay-usec = %d\n", c
->sync_volume_extra_delay_usec
);
758 pa_strbuf_printf(s
, "shm-size-bytes = %lu\n", (unsigned long) c
->shm_size
);
759 pa_strbuf_printf(s
, "log-meta = %s\n", pa_yes_no(c
->log_meta
));
760 pa_strbuf_printf(s
, "log-time = %s\n", pa_yes_no(c
->log_time
));
761 pa_strbuf_printf(s
, "log-backtrace = %u\n", c
->log_backtrace
);
762 #ifdef HAVE_SYS_RESOURCE_H
763 pa_strbuf_printf(s
, "rlimit-fsize = %li\n", c
->rlimit_fsize
.is_set
? (long int) c
->rlimit_fsize
.value
: -1);
764 pa_strbuf_printf(s
, "rlimit-data = %li\n", c
->rlimit_data
.is_set
? (long int) c
->rlimit_data
.value
: -1);
765 pa_strbuf_printf(s
, "rlimit-stack = %li\n", c
->rlimit_stack
.is_set
? (long int) c
->rlimit_stack
.value
: -1);
766 pa_strbuf_printf(s
, "rlimit-core = %li\n", c
->rlimit_core
.is_set
? (long int) c
->rlimit_core
.value
: -1);
768 pa_strbuf_printf(s
, "rlimit-rss = %li\n", c
->rlimit_rss
.is_set
? (long int) c
->rlimit_rss
.value
: -1);
771 pa_strbuf_printf(s
, "rlimit-as = %li\n", c
->rlimit_as
.is_set
? (long int) c
->rlimit_as
.value
: -1);
774 pa_strbuf_printf(s
, "rlimit-nproc = %li\n", c
->rlimit_nproc
.is_set
? (long int) c
->rlimit_nproc
.value
: -1);
777 pa_strbuf_printf(s
, "rlimit-nofile = %li\n", c
->rlimit_nofile
.is_set
? (long int) c
->rlimit_nofile
.value
: -1);
779 #ifdef RLIMIT_MEMLOCK
780 pa_strbuf_printf(s
, "rlimit-memlock = %li\n", c
->rlimit_memlock
.is_set
? (long int) c
->rlimit_memlock
.value
: -1);
783 pa_strbuf_printf(s
, "rlimit-locks = %li\n", c
->rlimit_locks
.is_set
? (long int) c
->rlimit_locks
.value
: -1);
785 #ifdef RLIMIT_SIGPENDING
786 pa_strbuf_printf(s
, "rlimit-sigpending = %li\n", c
->rlimit_sigpending
.is_set
? (long int) c
->rlimit_sigpending
.value
: -1);
788 #ifdef RLIMIT_MSGQUEUE
789 pa_strbuf_printf(s
, "rlimit-msgqueue = %li\n", c
->rlimit_msgqueue
.is_set
? (long int) c
->rlimit_msgqueue
.value
: -1);
792 pa_strbuf_printf(s
, "rlimit-nice = %li\n", c
->rlimit_nice
.is_set
? (long int) c
->rlimit_nice
.value
: -1);
795 pa_strbuf_printf(s
, "rlimit-rtprio = %li\n", c
->rlimit_rtprio
.is_set
? (long int) c
->rlimit_rtprio
.value
: -1);
798 pa_strbuf_printf(s
, "rlimit-rttime = %li\n", c
->rlimit_rttime
.is_set
? (long int) c
->rlimit_rttime
.value
: -1);
802 return pa_strbuf_tostring_free(s
);