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
33 #include <pulse/xmalloc.h>
34 #include <pulse/timeval.h>
35 #include <pulse/i18n.h>
37 #include <pulsecore/core-error.h>
38 #include <pulsecore/core-util.h>
39 #include <pulsecore/strbuf.h>
40 #include <pulsecore/conf-parser.h>
41 #include <pulsecore/resampler.h>
42 #include <pulsecore/macro.h>
44 #include "daemon-conf.h"
46 #define DEFAULT_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "default.pa"
47 #define DEFAULT_SCRIPT_FILE_USER PA_PATH_SEP "default.pa"
48 #define DEFAULT_SYSTEM_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "system.pa"
50 #define DEFAULT_CONFIG_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "daemon.conf"
51 #define DEFAULT_CONFIG_FILE_USER PA_PATH_SEP "daemon.conf"
53 #define ENV_SCRIPT_FILE "PULSE_SCRIPT"
54 #define ENV_CONFIG_FILE "PULSE_CONFIG"
55 #define ENV_DL_SEARCH_PATH "PULSE_DLPATH"
57 static const pa_daemon_conf default_conf
= {
61 .high_priority
= TRUE
,
63 .realtime_scheduling
= TRUE
,
64 .realtime_priority
= 5, /* Half of JACK's default rtprio */
65 .disallow_module_loading
= FALSE
,
66 .disallow_exit
= FALSE
,
69 .scache_idle_time
= 20,
71 .script_commands
= NULL
,
72 .dl_search_path
= NULL
,
73 .load_default_script_file
= TRUE
,
74 .default_script_file
= NULL
,
75 .log_target
= PA_LOG_SYSLOG
,
76 .log_level
= PA_LOG_NOTICE
,
80 .resample_method
= PA_RESAMPLER_AUTO
,
81 .disable_remixing
= FALSE
,
82 .disable_lfe_remixing
= TRUE
,
85 .system_instance
= FALSE
,
87 .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. */
89 .no_cpu_limit
= FALSE
,
92 .default_n_fragments
= 4,
93 .default_fragment_size_msec
= 25,
94 .default_sample_spec
= { .format
= PA_SAMPLE_S16NE
, .rate
= 44100, .channels
= 2 },
95 .default_channel_map
= { .channels
= 2, .map
= { PA_CHANNEL_POSITION_LEFT
, PA_CHANNEL_POSITION_RIGHT
} },
97 #ifdef HAVE_SYS_RESOURCE_H
98 ,.rlimit_fsize
= { .value
= 0, .is_set
= FALSE
},
99 .rlimit_data
= { .value
= 0, .is_set
= FALSE
},
100 .rlimit_stack
= { .value
= 0, .is_set
= FALSE
},
101 .rlimit_core
= { .value
= 0, .is_set
= FALSE
}
103 ,.rlimit_rss
= { .value
= 0, .is_set
= FALSE
}
106 ,.rlimit_nproc
= { .value
= 0, .is_set
= FALSE
}
109 ,.rlimit_nofile
= { .value
= 256, .is_set
= TRUE
}
111 #ifdef RLIMIT_MEMLOCK
112 ,.rlimit_memlock
= { .value
= 0, .is_set
= FALSE
}
115 ,.rlimit_as
= { .value
= 0, .is_set
= FALSE
}
118 ,.rlimit_locks
= { .value
= 0, .is_set
= FALSE
}
120 #ifdef RLIMIT_SIGPENDING
121 ,.rlimit_sigpending
= { .value
= 0, .is_set
= FALSE
}
123 #ifdef RLIMIT_MSGQUEUE
124 ,.rlimit_msgqueue
= { .value
= 0, .is_set
= FALSE
}
127 ,.rlimit_nice
= { .value
= 31, .is_set
= TRUE
} /* nice level of -11 */
130 ,.rlimit_rtprio
= { .value
= 9, .is_set
= TRUE
} /* One below JACK's default for the server */
133 ,.rlimit_rttime
= { .value
= PA_USEC_PER_SEC
, .is_set
= TRUE
}
138 pa_daemon_conf
* pa_daemon_conf_new(void) {
139 pa_daemon_conf
*c
= pa_xnewdup(pa_daemon_conf
, &default_conf
, 1);
141 c
->dl_search_path
= pa_xstrdup(PA_DLSEARCHPATH
);
145 void pa_daemon_conf_free(pa_daemon_conf
*c
) {
147 pa_xfree(c
->script_commands
);
148 pa_xfree(c
->dl_search_path
);
149 pa_xfree(c
->default_script_file
);
150 pa_xfree(c
->config_file
);
154 int pa_daemon_conf_set_log_target(pa_daemon_conf
*c
, const char *string
) {
158 if (!strcmp(string
, "auto"))
159 c
->auto_log_target
= 1;
160 else if (!strcmp(string
, "syslog")) {
161 c
->auto_log_target
= 0;
162 c
->log_target
= PA_LOG_SYSLOG
;
163 } else if (!strcmp(string
, "stderr")) {
164 c
->auto_log_target
= 0;
165 c
->log_target
= PA_LOG_STDERR
;
172 int pa_daemon_conf_set_log_level(pa_daemon_conf
*c
, const char *string
) {
177 if (pa_atou(string
, &u
) >= 0) {
178 if (u
>= PA_LOG_LEVEL_MAX
)
181 c
->log_level
= (pa_log_level_t
) u
;
182 } else if (pa_startswith(string
, "debug"))
183 c
->log_level
= PA_LOG_DEBUG
;
184 else if (pa_startswith(string
, "info"))
185 c
->log_level
= PA_LOG_INFO
;
186 else if (pa_startswith(string
, "notice"))
187 c
->log_level
= PA_LOG_NOTICE
;
188 else if (pa_startswith(string
, "warn"))
189 c
->log_level
= PA_LOG_WARN
;
190 else if (pa_startswith(string
, "err"))
191 c
->log_level
= PA_LOG_ERROR
;
198 int pa_daemon_conf_set_resample_method(pa_daemon_conf
*c
, const char *string
) {
203 if ((m
= pa_parse_resample_method(string
)) < 0)
206 c
->resample_method
= m
;
210 int pa_daemon_conf_set_local_server_type(pa_daemon_conf
*c
, const char *string
) {
214 if (!strcmp(string
, "user"))
215 c
->local_server_type
= PA_SERVER_TYPE_USER
;
216 else if (!strcmp(string
, "system")) {
217 c
->local_server_type
= PA_SERVER_TYPE_SYSTEM
;
218 } else if (!strcmp(string
, "none")) {
219 c
->local_server_type
= PA_SERVER_TYPE_NONE
;
226 static int parse_log_target(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
227 pa_daemon_conf
*c
= data
;
234 if (pa_daemon_conf_set_log_target(c
, rvalue
) < 0) {
235 pa_log(_("[%s:%u] Invalid log target '%s'."), filename
, line
, rvalue
);
242 static int parse_log_level(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
243 pa_daemon_conf
*c
= data
;
250 if (pa_daemon_conf_set_log_level(c
, rvalue
) < 0) {
251 pa_log(_("[%s:%u] Invalid log level '%s'."), filename
, line
, rvalue
);
258 static int parse_resample_method(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
259 pa_daemon_conf
*c
= data
;
266 if (pa_daemon_conf_set_resample_method(c
, rvalue
) < 0) {
267 pa_log(_("[%s:%u] Invalid resample method '%s'."), filename
, line
, rvalue
);
274 static int parse_rlimit(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
275 #ifdef HAVE_SYS_RESOURCE_H
276 struct pa_rlimit
*r
= data
;
283 if (rvalue
[strspn(rvalue
, "\t ")] == 0) {
289 if (pa_atoi(rvalue
, &k
) < 0) {
290 pa_log(_("[%s:%u] Invalid rlimit '%s'."), filename
, line
, rvalue
);
294 r
->value
= k
>= 0 ? (rlim_t
) k
: 0;
297 pa_log_warn(_("[%s:%u] rlimit not supported on this platform."), filename
, line
);
303 static int parse_sample_format(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
304 pa_daemon_conf
*c
= data
;
305 pa_sample_format_t f
;
312 if ((f
= pa_parse_sample_format(rvalue
)) < 0) {
313 pa_log(_("[%s:%u] Invalid sample format '%s'."), filename
, line
, rvalue
);
317 c
->default_sample_spec
.format
= f
;
321 static int parse_sample_rate(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
322 pa_daemon_conf
*c
= data
;
330 if (pa_atou(rvalue
, &r
) < 0 || r
> (uint32_t) PA_RATE_MAX
|| r
<= 0) {
331 pa_log(_("[%s:%u] Invalid sample rate '%s'."), filename
, line
, rvalue
);
335 c
->default_sample_spec
.rate
= r
;
339 struct channel_conf_info
{
340 pa_daemon_conf
*conf
;
341 pa_bool_t default_sample_spec_set
;
342 pa_bool_t default_channel_map_set
;
345 static int parse_sample_channels(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
346 struct channel_conf_info
*i
= data
;
354 if (pa_atoi(rvalue
, &n
) < 0 || n
> (int32_t) PA_CHANNELS_MAX
|| n
<= 0) {
355 pa_log(_("[%s:%u] Invalid sample channels '%s'."), filename
, line
, rvalue
);
359 i
->conf
->default_sample_spec
.channels
= (uint8_t) n
;
360 i
->default_sample_spec_set
= TRUE
;
364 static int parse_channel_map(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
365 struct channel_conf_info
*i
= data
;
372 if (!pa_channel_map_parse(&i
->conf
->default_channel_map
, rvalue
)) {
373 pa_log(_("[%s:%u] Invalid channel map '%s'."), filename
, line
, rvalue
);
377 i
->default_channel_map_set
= TRUE
;
381 static int parse_fragments(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
382 pa_daemon_conf
*c
= data
;
390 if (pa_atoi(rvalue
, &n
) < 0 || n
< 2) {
391 pa_log(_("[%s:%u] Invalid number of fragments '%s'."), filename
, line
, rvalue
);
395 c
->default_n_fragments
= (unsigned) n
;
399 static int parse_fragment_size_msec(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
400 pa_daemon_conf
*c
= data
;
408 if (pa_atoi(rvalue
, &n
) < 0 || n
< 1) {
409 pa_log(_("[%s:%u] Invalid fragment size '%s'."), filename
, line
, rvalue
);
413 c
->default_fragment_size_msec
= (unsigned) n
;
417 static int parse_nice_level(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
418 pa_daemon_conf
*c
= data
;
426 if (pa_atoi(rvalue
, &level
) < 0 || level
< -20 || level
> 19) {
427 pa_log(_("[%s:%u] Invalid nice level '%s'."), filename
, line
, rvalue
);
431 c
->nice_level
= (int) level
;
435 static int parse_rtprio(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
436 pa_daemon_conf
*c
= data
;
444 if (pa_atoi(rvalue
, &rtprio
) < 0 || rtprio
< sched_get_priority_min(SCHED_FIFO
) || rtprio
> sched_get_priority_max(SCHED_FIFO
)) {
445 pa_log("[%s:%u] Invalid realtime priority '%s'.", filename
, line
, rvalue
);
449 c
->realtime_priority
= (int) rtprio
;
453 static int parse_server_type(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
454 pa_daemon_conf
*c
= data
;
461 if (pa_daemon_conf_set_local_server_type(c
, rvalue
) < 0) {
462 pa_log(_("[%s:%u] Invalid server type '%s'."), filename
, line
, rvalue
);
469 int pa_daemon_conf_load(pa_daemon_conf
*c
, const char *filename
) {
472 struct channel_conf_info ci
;
473 pa_config_item table
[] = {
474 { "daemonize", pa_config_parse_bool
, &c
->daemonize
, NULL
},
475 { "fail", pa_config_parse_bool
, &c
->fail
, NULL
},
476 { "high-priority", pa_config_parse_bool
, &c
->high_priority
, NULL
},
477 { "realtime-scheduling", pa_config_parse_bool
, &c
->realtime_scheduling
, NULL
},
478 { "disallow-module-loading", pa_config_parse_bool
, &c
->disallow_module_loading
, NULL
},
479 { "allow-module-loading", pa_config_parse_not_bool
, &c
->disallow_module_loading
, NULL
},
480 { "disallow-exit", pa_config_parse_bool
, &c
->disallow_exit
, NULL
},
481 { "allow-exit", pa_config_parse_not_bool
, &c
->disallow_exit
, NULL
},
482 { "use-pid-file", pa_config_parse_bool
, &c
->use_pid_file
, NULL
},
483 { "system-instance", pa_config_parse_bool
, &c
->system_instance
, NULL
},
485 { "local-server-type", parse_server_type
, c
, NULL
},
487 { "no-cpu-limit", pa_config_parse_bool
, &c
->no_cpu_limit
, NULL
},
488 { "cpu-limit", pa_config_parse_not_bool
, &c
->no_cpu_limit
, NULL
},
489 { "disable-shm", pa_config_parse_bool
, &c
->disable_shm
, NULL
},
490 { "enable-shm", pa_config_parse_not_bool
, &c
->disable_shm
, NULL
},
491 { "flat-volumes", pa_config_parse_bool
, &c
->flat_volumes
, NULL
},
492 { "lock-memory", pa_config_parse_bool
, &c
->lock_memory
, NULL
},
493 { "exit-idle-time", pa_config_parse_int
, &c
->exit_idle_time
, NULL
},
494 { "scache-idle-time", pa_config_parse_int
, &c
->scache_idle_time
, NULL
},
495 { "realtime-priority", parse_rtprio
, c
, NULL
},
496 { "dl-search-path", pa_config_parse_string
, &c
->dl_search_path
, NULL
},
497 { "default-script-file", pa_config_parse_string
, &c
->default_script_file
, NULL
},
498 { "log-target", parse_log_target
, c
, NULL
},
499 { "log-level", parse_log_level
, c
, NULL
},
500 { "verbose", parse_log_level
, c
, NULL
},
501 { "resample-method", parse_resample_method
, c
, NULL
},
502 { "default-sample-format", parse_sample_format
, c
, NULL
},
503 { "default-sample-rate", parse_sample_rate
, c
, NULL
},
504 { "default-sample-channels", parse_sample_channels
, &ci
, NULL
},
505 { "default-channel-map", parse_channel_map
, &ci
, NULL
},
506 { "default-fragments", parse_fragments
, c
, NULL
},
507 { "default-fragment-size-msec", parse_fragment_size_msec
, c
, NULL
},
508 { "nice-level", parse_nice_level
, c
, NULL
},
509 { "disable-remixing", pa_config_parse_bool
, &c
->disable_remixing
, NULL
},
510 { "enable-remixing", pa_config_parse_not_bool
, &c
->disable_remixing
, NULL
},
511 { "disable-lfe-remixing", pa_config_parse_bool
, &c
->disable_lfe_remixing
, NULL
},
512 { "enable-lfe-remixing", pa_config_parse_not_bool
, &c
->disable_lfe_remixing
, NULL
},
513 { "load-default-script-file", pa_config_parse_bool
, &c
->load_default_script_file
, NULL
},
514 { "shm-size-bytes", pa_config_parse_size
, &c
->shm_size
, NULL
},
515 { "log-meta", pa_config_parse_bool
, &c
->log_meta
, NULL
},
516 { "log-time", pa_config_parse_bool
, &c
->log_time
, NULL
},
517 { "log-backtrace", pa_config_parse_unsigned
, &c
->log_backtrace
, NULL
},
518 #ifdef HAVE_SYS_RESOURCE_H
519 { "rlimit-fsize", parse_rlimit
, &c
->rlimit_fsize
, NULL
},
520 { "rlimit-data", parse_rlimit
, &c
->rlimit_data
, NULL
},
521 { "rlimit-stack", parse_rlimit
, &c
->rlimit_stack
, NULL
},
522 { "rlimit-core", parse_rlimit
, &c
->rlimit_core
, NULL
},
524 { "rlimit-rss", parse_rlimit
, &c
->rlimit_rss
, NULL
},
527 { "rlimit-nofile", parse_rlimit
, &c
->rlimit_nofile
, NULL
},
530 { "rlimit-as", parse_rlimit
, &c
->rlimit_as
, NULL
},
533 { "rlimit-nproc", parse_rlimit
, &c
->rlimit_nproc
, NULL
},
535 #ifdef RLIMIT_MEMLOCK
536 { "rlimit-memlock", parse_rlimit
, &c
->rlimit_memlock
, NULL
},
539 { "rlimit-locks", parse_rlimit
, &c
->rlimit_locks
, NULL
},
541 #ifdef RLIMIT_SIGPENDING
542 { "rlimit-sigpending", parse_rlimit
, &c
->rlimit_sigpending
, NULL
},
544 #ifdef RLIMIT_MSGQUEUE
545 { "rlimit-msgqueue", parse_rlimit
, &c
->rlimit_msgqueue
, NULL
},
548 { "rlimit-nice", parse_rlimit
, &c
->rlimit_nice
, NULL
},
551 { "rlimit-rtprio", parse_rlimit
, &c
->rlimit_rtprio
, NULL
},
554 { "rlimit-rttime", parse_rlimit
, &c
->rlimit_rttime
, NULL
},
557 { NULL
, NULL
, NULL
, NULL
},
560 pa_xfree(c
->config_file
);
561 c
->config_file
= NULL
;
564 fopen(c
->config_file
= pa_xstrdup(filename
), "r") :
565 pa_open_config_file(DEFAULT_CONFIG_FILE
, DEFAULT_CONFIG_FILE_USER
, ENV_CONFIG_FILE
, &c
->config_file
);
567 if (!f
&& errno
!= ENOENT
) {
568 pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno
));
572 ci
.default_channel_map_set
= ci
.default_sample_spec_set
= FALSE
;
575 r
= f
? pa_config_parse(c
->config_file
, f
, table
, NULL
) : 0;
579 /* Make sure that channel map and sample spec fit together */
581 if (ci
.default_sample_spec_set
&&
582 ci
.default_channel_map_set
&&
583 c
->default_channel_map
.channels
!= c
->default_sample_spec
.channels
) {
584 pa_log_error(_("The specified default channel map has a different number of channels than the specified default number of channels."));
587 } else if (ci
.default_sample_spec_set
)
588 pa_channel_map_init_extend(&c
->default_channel_map
, c
->default_sample_spec
.channels
, PA_CHANNEL_MAP_DEFAULT
);
589 else if (ci
.default_channel_map_set
)
590 c
->default_sample_spec
.channels
= c
->default_channel_map
.channels
;
600 int pa_daemon_conf_env(pa_daemon_conf
*c
) {
604 if ((e
= getenv(ENV_DL_SEARCH_PATH
))) {
605 pa_xfree(c
->dl_search_path
);
606 c
->dl_search_path
= pa_xstrdup(e
);
608 if ((e
= getenv(ENV_SCRIPT_FILE
))) {
609 pa_xfree(c
->default_script_file
);
610 c
->default_script_file
= pa_xstrdup(e
);
616 const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf
*c
) {
619 if (!c
->default_script_file
) {
620 if (c
->system_instance
)
621 c
->default_script_file
= pa_find_config_file(DEFAULT_SYSTEM_SCRIPT_FILE
, NULL
, ENV_SCRIPT_FILE
);
623 c
->default_script_file
= pa_find_config_file(DEFAULT_SCRIPT_FILE
, DEFAULT_SCRIPT_FILE_USER
, ENV_SCRIPT_FILE
);
626 return c
->default_script_file
;
629 FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf
*c
) {
633 if (!c
->default_script_file
) {
634 if (c
->system_instance
)
635 f
= pa_open_config_file(DEFAULT_SYSTEM_SCRIPT_FILE
, NULL
, ENV_SCRIPT_FILE
, &c
->default_script_file
);
637 f
= pa_open_config_file(DEFAULT_SCRIPT_FILE
, DEFAULT_SCRIPT_FILE_USER
, ENV_SCRIPT_FILE
, &c
->default_script_file
);
639 f
= fopen(c
->default_script_file
, "r");
644 char *pa_daemon_conf_dump(pa_daemon_conf
*c
) {
645 static const char* const log_level_to_string
[] = {
646 [PA_LOG_DEBUG
] = "debug",
647 [PA_LOG_INFO
] = "info",
648 [PA_LOG_NOTICE
] = "notice",
649 [PA_LOG_WARN
] = "warning",
650 [PA_LOG_ERROR
] = "error"
653 static const char* const server_type_to_string
[] = {
654 [PA_SERVER_TYPE_UNSET
] = "!!UNSET!!",
655 [PA_SERVER_TYPE_USER
] = "user",
656 [PA_SERVER_TYPE_SYSTEM
] = "system",
657 [PA_SERVER_TYPE_NONE
] = "none"
661 char cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
668 pa_strbuf_printf(s
, _("### Read from configuration file: %s ###\n"), c
->config_file
);
670 pa_assert(c
->log_level
< PA_LOG_LEVEL_MAX
);
672 pa_strbuf_printf(s
, "daemonize = %s\n", pa_yes_no(c
->daemonize
));
673 pa_strbuf_printf(s
, "fail = %s\n", pa_yes_no(c
->fail
));
674 pa_strbuf_printf(s
, "high-priority = %s\n", pa_yes_no(c
->high_priority
));
675 pa_strbuf_printf(s
, "nice-level = %i\n", c
->nice_level
);
676 pa_strbuf_printf(s
, "realtime-scheduling = %s\n", pa_yes_no(c
->realtime_scheduling
));
677 pa_strbuf_printf(s
, "realtime-priority = %i\n", c
->realtime_priority
);
678 pa_strbuf_printf(s
, "allow-module-loading = %s\n", pa_yes_no(!c
->disallow_module_loading
));
679 pa_strbuf_printf(s
, "allow-exit = %s\n", pa_yes_no(!c
->disallow_exit
));
680 pa_strbuf_printf(s
, "use-pid-file = %s\n", pa_yes_no(c
->use_pid_file
));
681 pa_strbuf_printf(s
, "system-instance = %s\n", pa_yes_no(c
->system_instance
));
683 pa_strbuf_printf(s
, "local-server-type = %s\n", server_type_to_string
[c
->local_server_type
]);
685 pa_strbuf_printf(s
, "cpu-limit = %s\n", pa_yes_no(!c
->no_cpu_limit
));
686 pa_strbuf_printf(s
, "enable-shm = %s\n", pa_yes_no(!c
->disable_shm
));
687 pa_strbuf_printf(s
, "flat-volumes = %s\n", pa_yes_no(c
->flat_volumes
));
688 pa_strbuf_printf(s
, "lock-memory = %s\n", pa_yes_no(c
->lock_memory
));
689 pa_strbuf_printf(s
, "exit-idle-time = %i\n", c
->exit_idle_time
);
690 pa_strbuf_printf(s
, "scache-idle-time = %i\n", c
->scache_idle_time
);
691 pa_strbuf_printf(s
, "dl-search-path = %s\n", pa_strempty(c
->dl_search_path
));
692 pa_strbuf_printf(s
, "default-script-file = %s\n", pa_strempty(pa_daemon_conf_get_default_script_file(c
)));
693 pa_strbuf_printf(s
, "load-default-script-file = %s\n", pa_yes_no(c
->load_default_script_file
));
694 pa_strbuf_printf(s
, "log-target = %s\n", c
->auto_log_target
? "auto" : (c
->log_target
== PA_LOG_SYSLOG
? "syslog" : "stderr"));
695 pa_strbuf_printf(s
, "log-level = %s\n", log_level_to_string
[c
->log_level
]);
696 pa_strbuf_printf(s
, "resample-method = %s\n", pa_resample_method_to_string(c
->resample_method
));
697 pa_strbuf_printf(s
, "enable-remixing = %s\n", pa_yes_no(!c
->disable_remixing
));
698 pa_strbuf_printf(s
, "enable-lfe-remixing = %s\n", pa_yes_no(!c
->disable_lfe_remixing
));
699 pa_strbuf_printf(s
, "default-sample-format = %s\n", pa_sample_format_to_string(c
->default_sample_spec
.format
));
700 pa_strbuf_printf(s
, "default-sample-rate = %u\n", c
->default_sample_spec
.rate
);
701 pa_strbuf_printf(s
, "default-sample-channels = %u\n", c
->default_sample_spec
.channels
);
702 pa_strbuf_printf(s
, "default-channel-map = %s\n", pa_channel_map_snprint(cm
, sizeof(cm
), &c
->default_channel_map
));
703 pa_strbuf_printf(s
, "default-fragments = %u\n", c
->default_n_fragments
);
704 pa_strbuf_printf(s
, "default-fragment-size-msec = %u\n", c
->default_fragment_size_msec
);
705 pa_strbuf_printf(s
, "shm-size-bytes = %lu\n", (unsigned long) c
->shm_size
);
706 pa_strbuf_printf(s
, "log-meta = %s\n", pa_yes_no(c
->log_meta
));
707 pa_strbuf_printf(s
, "log-time = %s\n", pa_yes_no(c
->log_time
));
708 pa_strbuf_printf(s
, "log-backtrace = %u\n", c
->log_backtrace
);
709 #ifdef HAVE_SYS_RESOURCE_H
710 pa_strbuf_printf(s
, "rlimit-fsize = %li\n", c
->rlimit_fsize
.is_set
? (long int) c
->rlimit_fsize
.value
: -1);
711 pa_strbuf_printf(s
, "rlimit-data = %li\n", c
->rlimit_data
.is_set
? (long int) c
->rlimit_data
.value
: -1);
712 pa_strbuf_printf(s
, "rlimit-stack = %li\n", c
->rlimit_stack
.is_set
? (long int) c
->rlimit_stack
.value
: -1);
713 pa_strbuf_printf(s
, "rlimit-core = %li\n", c
->rlimit_core
.is_set
? (long int) c
->rlimit_core
.value
: -1);
715 pa_strbuf_printf(s
, "rlimit-rss = %li\n", c
->rlimit_rss
.is_set
? (long int) c
->rlimit_rss
.value
: -1);
718 pa_strbuf_printf(s
, "rlimit-as = %li\n", c
->rlimit_as
.is_set
? (long int) c
->rlimit_as
.value
: -1);
721 pa_strbuf_printf(s
, "rlimit-nproc = %li\n", c
->rlimit_nproc
.is_set
? (long int) c
->rlimit_nproc
.value
: -1);
724 pa_strbuf_printf(s
, "rlimit-nofile = %li\n", c
->rlimit_nofile
.is_set
? (long int) c
->rlimit_nofile
.value
: -1);
726 #ifdef RLIMIT_MEMLOCK
727 pa_strbuf_printf(s
, "rlimit-memlock = %li\n", c
->rlimit_memlock
.is_set
? (long int) c
->rlimit_memlock
.value
: -1);
730 pa_strbuf_printf(s
, "rlimit-locks = %li\n", c
->rlimit_locks
.is_set
? (long int) c
->rlimit_locks
.value
: -1);
732 #ifdef RLIMIT_SIGPENDING
733 pa_strbuf_printf(s
, "rlimit-sigpending = %li\n", c
->rlimit_sigpending
.is_set
? (long int) c
->rlimit_sigpending
.value
: -1);
735 #ifdef RLIMIT_MSGQUEUE
736 pa_strbuf_printf(s
, "rlimit-msgqueue = %li\n", c
->rlimit_msgqueue
.is_set
? (long int) c
->rlimit_msgqueue
.value
: -1);
739 pa_strbuf_printf(s
, "rlimit-nice = %li\n", c
->rlimit_nice
.is_set
? (long int) c
->rlimit_nice
.value
: -1);
742 pa_strbuf_printf(s
, "rlimit-rtprio = %li\n", c
->rlimit_rtprio
.is_set
? (long int) c
->rlimit_rtprio
.value
: -1);
745 pa_strbuf_printf(s
, "rlimit-rttime = %li\n", c
->rlimit_rttime
.is_set
? (long int) c
->rlimit_rttime
.value
: -1);
749 return pa_strbuf_tostring_free(s
);