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
= FALSE
,
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
,
91 .default_n_fragments
= 4,
92 .default_fragment_size_msec
= 25,
93 .default_sample_spec
= { .format
= PA_SAMPLE_S16NE
, .rate
= 44100, .channels
= 2 },
94 .default_channel_map
= { .channels
= 2, .map
= { PA_CHANNEL_POSITION_LEFT
, PA_CHANNEL_POSITION_RIGHT
} },
96 #ifdef HAVE_SYS_RESOURCE_H
97 ,.rlimit_fsize
= { .value
= 0, .is_set
= FALSE
},
98 .rlimit_data
= { .value
= 0, .is_set
= FALSE
},
99 .rlimit_stack
= { .value
= 0, .is_set
= FALSE
},
100 .rlimit_core
= { .value
= 0, .is_set
= FALSE
}
102 ,.rlimit_rss
= { .value
= 0, .is_set
= FALSE
}
105 ,.rlimit_nproc
= { .value
= 0, .is_set
= FALSE
}
108 ,.rlimit_nofile
= { .value
= 256, .is_set
= TRUE
}
110 #ifdef RLIMIT_MEMLOCK
111 ,.rlimit_memlock
= { .value
= 0, .is_set
= FALSE
}
114 ,.rlimit_as
= { .value
= 0, .is_set
= FALSE
}
117 ,.rlimit_locks
= { .value
= 0, .is_set
= FALSE
}
119 #ifdef RLIMIT_SIGPENDING
120 ,.rlimit_sigpending
= { .value
= 0, .is_set
= FALSE
}
122 #ifdef RLIMIT_MSGQUEUE
123 ,.rlimit_msgqueue
= { .value
= 0, .is_set
= FALSE
}
126 ,.rlimit_nice
= { .value
= 31, .is_set
= TRUE
} /* nice level of -11 */
129 ,.rlimit_rtprio
= { .value
= 9, .is_set
= TRUE
} /* One below JACK's default for the server */
132 ,.rlimit_rttime
= { .value
= PA_USEC_PER_SEC
, .is_set
= TRUE
}
137 pa_daemon_conf
* pa_daemon_conf_new(void) {
138 pa_daemon_conf
*c
= pa_xnewdup(pa_daemon_conf
, &default_conf
, 1);
140 c
->dl_search_path
= pa_xstrdup(PA_DLSEARCHPATH
);
144 void pa_daemon_conf_free(pa_daemon_conf
*c
) {
146 pa_xfree(c
->script_commands
);
147 pa_xfree(c
->dl_search_path
);
148 pa_xfree(c
->default_script_file
);
149 pa_xfree(c
->config_file
);
153 int pa_daemon_conf_set_log_target(pa_daemon_conf
*c
, const char *string
) {
157 if (!strcmp(string
, "auto"))
158 c
->auto_log_target
= 1;
159 else if (!strcmp(string
, "syslog")) {
160 c
->auto_log_target
= 0;
161 c
->log_target
= PA_LOG_SYSLOG
;
162 } else if (!strcmp(string
, "stderr")) {
163 c
->auto_log_target
= 0;
164 c
->log_target
= PA_LOG_STDERR
;
171 int pa_daemon_conf_set_log_level(pa_daemon_conf
*c
, const char *string
) {
176 if (pa_atou(string
, &u
) >= 0) {
177 if (u
>= PA_LOG_LEVEL_MAX
)
180 c
->log_level
= (pa_log_level_t
) u
;
181 } else if (pa_startswith(string
, "debug"))
182 c
->log_level
= PA_LOG_DEBUG
;
183 else if (pa_startswith(string
, "info"))
184 c
->log_level
= PA_LOG_INFO
;
185 else if (pa_startswith(string
, "notice"))
186 c
->log_level
= PA_LOG_NOTICE
;
187 else if (pa_startswith(string
, "warn"))
188 c
->log_level
= PA_LOG_WARN
;
189 else if (pa_startswith(string
, "err"))
190 c
->log_level
= PA_LOG_ERROR
;
197 int pa_daemon_conf_set_resample_method(pa_daemon_conf
*c
, const char *string
) {
202 if ((m
= pa_parse_resample_method(string
)) < 0)
205 c
->resample_method
= m
;
209 int pa_daemon_conf_set_local_server_type(pa_daemon_conf
*c
, const char *string
) {
213 if (!strcmp(string
, "user"))
214 c
->local_server_type
= PA_SERVER_TYPE_USER
;
215 else if (!strcmp(string
, "system")) {
216 c
->local_server_type
= PA_SERVER_TYPE_SYSTEM
;
217 } else if (!strcmp(string
, "none")) {
218 c
->local_server_type
= PA_SERVER_TYPE_NONE
;
225 static int parse_log_target(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
226 pa_daemon_conf
*c
= data
;
233 if (pa_daemon_conf_set_log_target(c
, rvalue
) < 0) {
234 pa_log(_("[%s:%u] Invalid log target '%s'."), filename
, line
, rvalue
);
241 static int parse_log_level(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
242 pa_daemon_conf
*c
= data
;
249 if (pa_daemon_conf_set_log_level(c
, rvalue
) < 0) {
250 pa_log(_("[%s:%u] Invalid log level '%s'."), filename
, line
, rvalue
);
257 static int parse_resample_method(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
258 pa_daemon_conf
*c
= data
;
265 if (pa_daemon_conf_set_resample_method(c
, rvalue
) < 0) {
266 pa_log(_("[%s:%u] Invalid resample method '%s'."), filename
, line
, rvalue
);
273 static int parse_rlimit(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
274 #ifdef HAVE_SYS_RESOURCE_H
275 struct pa_rlimit
*r
= data
;
282 if (rvalue
[strspn(rvalue
, "\t ")] == 0) {
288 if (pa_atoi(rvalue
, &k
) < 0) {
289 pa_log(_("[%s:%u] Invalid rlimit '%s'."), filename
, line
, rvalue
);
293 r
->value
= k
>= 0 ? (rlim_t
) k
: 0;
296 pa_log_warn(_("[%s:%u] rlimit not supported on this platform."), filename
, line
);
302 static int parse_sample_format(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
303 pa_daemon_conf
*c
= data
;
304 pa_sample_format_t f
;
311 if ((f
= pa_parse_sample_format(rvalue
)) < 0) {
312 pa_log(_("[%s:%u] Invalid sample format '%s'."), filename
, line
, rvalue
);
316 c
->default_sample_spec
.format
= f
;
320 static int parse_sample_rate(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
321 pa_daemon_conf
*c
= data
;
329 if (pa_atou(rvalue
, &r
) < 0 || r
> (uint32_t) PA_RATE_MAX
|| r
<= 0) {
330 pa_log(_("[%s:%u] Invalid sample rate '%s'."), filename
, line
, rvalue
);
334 c
->default_sample_spec
.rate
= r
;
338 struct channel_conf_info
{
339 pa_daemon_conf
*conf
;
340 pa_bool_t default_sample_spec_set
;
341 pa_bool_t default_channel_map_set
;
344 static int parse_sample_channels(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
345 struct channel_conf_info
*i
= data
;
353 if (pa_atoi(rvalue
, &n
) < 0 || n
> (int32_t) PA_CHANNELS_MAX
|| n
<= 0) {
354 pa_log(_("[%s:%u] Invalid sample channels '%s'."), filename
, line
, rvalue
);
358 i
->conf
->default_sample_spec
.channels
= (uint8_t) n
;
359 i
->default_sample_spec_set
= TRUE
;
363 static int parse_channel_map(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
364 struct channel_conf_info
*i
= data
;
371 if (!pa_channel_map_parse(&i
->conf
->default_channel_map
, rvalue
)) {
372 pa_log(_("[%s:%u] Invalid channel map '%s'."), filename
, line
, rvalue
);
376 i
->default_channel_map_set
= TRUE
;
380 static int parse_fragments(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
381 pa_daemon_conf
*c
= data
;
389 if (pa_atoi(rvalue
, &n
) < 0 || n
< 2) {
390 pa_log(_("[%s:%u] Invalid number of fragments '%s'."), filename
, line
, rvalue
);
394 c
->default_n_fragments
= (unsigned) n
;
398 static int parse_fragment_size_msec(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
399 pa_daemon_conf
*c
= data
;
407 if (pa_atoi(rvalue
, &n
) < 0 || n
< 1) {
408 pa_log(_("[%s:%u] Invalid fragment size '%s'."), filename
, line
, rvalue
);
412 c
->default_fragment_size_msec
= (unsigned) n
;
416 static int parse_nice_level(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
417 pa_daemon_conf
*c
= data
;
425 if (pa_atoi(rvalue
, &level
) < 0 || level
< -20 || level
> 19) {
426 pa_log(_("[%s:%u] Invalid nice level '%s'."), filename
, line
, rvalue
);
430 c
->nice_level
= (int) level
;
434 static int parse_rtprio(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
435 pa_daemon_conf
*c
= data
;
443 if (pa_atoi(rvalue
, &rtprio
) < 0 || rtprio
< sched_get_priority_min(SCHED_FIFO
) || rtprio
> sched_get_priority_max(SCHED_FIFO
)) {
444 pa_log("[%s:%u] Invalid realtime priority '%s'.", filename
, line
, rvalue
);
448 c
->realtime_priority
= (int) rtprio
;
452 static int parse_server_type(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
453 pa_daemon_conf
*c
= data
;
460 if (pa_daemon_conf_set_local_server_type(c
, rvalue
) < 0) {
461 pa_log(_("[%s:%u] Invalid server type '%s'."), filename
, line
, rvalue
);
468 int pa_daemon_conf_load(pa_daemon_conf
*c
, const char *filename
) {
471 struct channel_conf_info ci
;
472 pa_config_item table
[] = {
473 { "daemonize", pa_config_parse_bool
, &c
->daemonize
, NULL
},
474 { "fail", pa_config_parse_bool
, &c
->fail
, NULL
},
475 { "high-priority", pa_config_parse_bool
, &c
->high_priority
, NULL
},
476 { "realtime-scheduling", pa_config_parse_bool
, &c
->realtime_scheduling
, NULL
},
477 { "disallow-module-loading", pa_config_parse_bool
, &c
->disallow_module_loading
, NULL
},
478 { "disallow-exit", pa_config_parse_bool
, &c
->disallow_exit
, NULL
},
479 { "use-pid-file", pa_config_parse_bool
, &c
->use_pid_file
, NULL
},
480 { "system-instance", pa_config_parse_bool
, &c
->system_instance
, NULL
},
482 { "local-server-type", parse_server_type
, c
, NULL
},
484 { "no-cpu-limit", pa_config_parse_bool
, &c
->no_cpu_limit
, NULL
},
485 { "disable-shm", pa_config_parse_bool
, &c
->disable_shm
, NULL
},
486 { "flat-volumes", pa_config_parse_bool
, &c
->flat_volumes
, NULL
},
487 { "exit-idle-time", pa_config_parse_int
, &c
->exit_idle_time
, NULL
},
488 { "scache-idle-time", pa_config_parse_int
, &c
->scache_idle_time
, NULL
},
489 { "realtime-priority", parse_rtprio
, c
, NULL
},
490 { "dl-search-path", pa_config_parse_string
, &c
->dl_search_path
, NULL
},
491 { "default-script-file", pa_config_parse_string
, &c
->default_script_file
, NULL
},
492 { "log-target", parse_log_target
, c
, NULL
},
493 { "log-level", parse_log_level
, c
, NULL
},
494 { "verbose", parse_log_level
, c
, NULL
},
495 { "resample-method", parse_resample_method
, c
, NULL
},
496 { "default-sample-format", parse_sample_format
, c
, NULL
},
497 { "default-sample-rate", parse_sample_rate
, c
, NULL
},
498 { "default-sample-channels", parse_sample_channels
, &ci
, NULL
},
499 { "default-channel-map", parse_channel_map
, &ci
, NULL
},
500 { "default-fragments", parse_fragments
, c
, NULL
},
501 { "default-fragment-size-msec", parse_fragment_size_msec
, c
, NULL
},
502 { "nice-level", parse_nice_level
, c
, NULL
},
503 { "disable-remixing", pa_config_parse_bool
, &c
->disable_remixing
, NULL
},
504 { "disable-lfe-remixing", pa_config_parse_bool
, &c
->disable_lfe_remixing
, NULL
},
505 { "load-default-script-file", pa_config_parse_bool
, &c
->load_default_script_file
, NULL
},
506 { "shm-size-bytes", pa_config_parse_size
, &c
->shm_size
, NULL
},
507 { "log-meta", pa_config_parse_bool
, &c
->log_meta
, NULL
},
508 { "log-time", pa_config_parse_bool
, &c
->log_time
, NULL
},
509 { "log-backtrace", pa_config_parse_unsigned
, &c
->log_backtrace
, NULL
},
510 #ifdef HAVE_SYS_RESOURCE_H
511 { "rlimit-fsize", parse_rlimit
, &c
->rlimit_fsize
, NULL
},
512 { "rlimit-data", parse_rlimit
, &c
->rlimit_data
, NULL
},
513 { "rlimit-stack", parse_rlimit
, &c
->rlimit_stack
, NULL
},
514 { "rlimit-core", parse_rlimit
, &c
->rlimit_core
, NULL
},
516 { "rlimit-rss", parse_rlimit
, &c
->rlimit_rss
, NULL
},
519 { "rlimit-nofile", parse_rlimit
, &c
->rlimit_nofile
, NULL
},
522 { "rlimit-as", parse_rlimit
, &c
->rlimit_as
, NULL
},
525 { "rlimit-nproc", parse_rlimit
, &c
->rlimit_nproc
, NULL
},
527 #ifdef RLIMIT_MEMLOCK
528 { "rlimit-memlock", parse_rlimit
, &c
->rlimit_memlock
, NULL
},
531 { "rlimit-locks", parse_rlimit
, &c
->rlimit_locks
, NULL
},
533 #ifdef RLIMIT_SIGPENDING
534 { "rlimit-sigpending", parse_rlimit
, &c
->rlimit_sigpending
, NULL
},
536 #ifdef RLIMIT_MSGQUEUE
537 { "rlimit-msgqueue", parse_rlimit
, &c
->rlimit_msgqueue
, NULL
},
540 { "rlimit-nice", parse_rlimit
, &c
->rlimit_nice
, NULL
},
543 { "rlimit-rtprio", parse_rlimit
, &c
->rlimit_rtprio
, NULL
},
546 { "rlimit-rttime", parse_rlimit
, &c
->rlimit_rttime
, NULL
},
549 { NULL
, NULL
, NULL
, NULL
},
552 pa_xfree(c
->config_file
);
553 c
->config_file
= NULL
;
556 fopen(c
->config_file
= pa_xstrdup(filename
), "r") :
557 pa_open_config_file(DEFAULT_CONFIG_FILE
, DEFAULT_CONFIG_FILE_USER
, ENV_CONFIG_FILE
, &c
->config_file
);
559 if (!f
&& errno
!= ENOENT
) {
560 pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno
));
564 ci
.default_channel_map_set
= ci
.default_sample_spec_set
= FALSE
;
567 r
= f
? pa_config_parse(c
->config_file
, f
, table
, NULL
) : 0;
571 /* Make sure that channel map and sample spec fit together */
573 if (ci
.default_sample_spec_set
&&
574 ci
.default_channel_map_set
&&
575 c
->default_channel_map
.channels
!= c
->default_sample_spec
.channels
) {
576 pa_log_error(_("The specified default channel map has a different number of channels than the specified default number of channels."));
579 } else if (ci
.default_sample_spec_set
)
580 pa_channel_map_init_extend(&c
->default_channel_map
, c
->default_sample_spec
.channels
, PA_CHANNEL_MAP_DEFAULT
);
581 else if (ci
.default_channel_map_set
)
582 c
->default_sample_spec
.channels
= c
->default_channel_map
.channels
;
592 int pa_daemon_conf_env(pa_daemon_conf
*c
) {
596 if ((e
= getenv(ENV_DL_SEARCH_PATH
))) {
597 pa_xfree(c
->dl_search_path
);
598 c
->dl_search_path
= pa_xstrdup(e
);
600 if ((e
= getenv(ENV_SCRIPT_FILE
))) {
601 pa_xfree(c
->default_script_file
);
602 c
->default_script_file
= pa_xstrdup(e
);
608 const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf
*c
) {
611 if (!c
->default_script_file
) {
612 if (c
->system_instance
)
613 c
->default_script_file
= pa_find_config_file(DEFAULT_SYSTEM_SCRIPT_FILE
, NULL
, ENV_SCRIPT_FILE
);
615 c
->default_script_file
= pa_find_config_file(DEFAULT_SCRIPT_FILE
, DEFAULT_SCRIPT_FILE_USER
, ENV_SCRIPT_FILE
);
618 return c
->default_script_file
;
621 FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf
*c
) {
625 if (!c
->default_script_file
) {
626 if (c
->system_instance
)
627 f
= pa_open_config_file(DEFAULT_SYSTEM_SCRIPT_FILE
, NULL
, ENV_SCRIPT_FILE
, &c
->default_script_file
);
629 f
= pa_open_config_file(DEFAULT_SCRIPT_FILE
, DEFAULT_SCRIPT_FILE_USER
, ENV_SCRIPT_FILE
, &c
->default_script_file
);
631 f
= fopen(c
->default_script_file
, "r");
637 static const char* const log_level_to_string
[] = {
638 [PA_LOG_DEBUG
] = "debug",
639 [PA_LOG_INFO
] = "info",
640 [PA_LOG_NOTICE
] = "notice",
641 [PA_LOG_WARN
] = "warning",
642 [PA_LOG_ERROR
] = "error"
645 static const char* const server_type_to_string
[] = {
646 [PA_SERVER_TYPE_UNSET
] = "!!UNSET!!",
647 [PA_SERVER_TYPE_USER
] = "user",
648 [PA_SERVER_TYPE_SYSTEM
] = "system",
649 [PA_SERVER_TYPE_NONE
] = "none"
652 char *pa_daemon_conf_dump(pa_daemon_conf
*c
) {
654 char cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
661 pa_strbuf_printf(s
, _("### Read from configuration file: %s ###\n"), c
->config_file
);
663 pa_assert(c
->log_level
< PA_LOG_LEVEL_MAX
);
665 pa_strbuf_printf(s
, "daemonize = %s\n", pa_yes_no(c
->daemonize
));
666 pa_strbuf_printf(s
, "fail = %s\n", pa_yes_no(c
->fail
));
667 pa_strbuf_printf(s
, "high-priority = %s\n", pa_yes_no(c
->high_priority
));
668 pa_strbuf_printf(s
, "nice-level = %i\n", c
->nice_level
);
669 pa_strbuf_printf(s
, "realtime-scheduling = %s\n", pa_yes_no(c
->realtime_scheduling
));
670 pa_strbuf_printf(s
, "realtime-priority = %i\n", c
->realtime_priority
);
671 pa_strbuf_printf(s
, "disallow-module-loading = %s\n", pa_yes_no(c
->disallow_module_loading
));
672 pa_strbuf_printf(s
, "disallow-exit = %s\n", pa_yes_no(c
->disallow_exit
));
673 pa_strbuf_printf(s
, "use-pid-file = %s\n", pa_yes_no(c
->use_pid_file
));
674 pa_strbuf_printf(s
, "system-instance = %s\n", pa_yes_no(c
->system_instance
));
676 pa_strbuf_printf(s
, "local-server-type = %s\n", server_type_to_string
[c
->local_server_type
]);
678 pa_strbuf_printf(s
, "no-cpu-limit = %s\n", pa_yes_no(c
->no_cpu_limit
));
679 pa_strbuf_printf(s
, "disable-shm = %s\n", pa_yes_no(c
->disable_shm
));
680 pa_strbuf_printf(s
, "flat-volumes = %s\n", pa_yes_no(c
->flat_volumes
));
681 pa_strbuf_printf(s
, "exit-idle-time = %i\n", c
->exit_idle_time
);
682 pa_strbuf_printf(s
, "scache-idle-time = %i\n", c
->scache_idle_time
);
683 pa_strbuf_printf(s
, "dl-search-path = %s\n", pa_strempty(c
->dl_search_path
));
684 pa_strbuf_printf(s
, "default-script-file = %s\n", pa_strempty(pa_daemon_conf_get_default_script_file(c
)));
685 pa_strbuf_printf(s
, "load-default-script-file = %s\n", pa_yes_no(c
->load_default_script_file
));
686 pa_strbuf_printf(s
, "log-target = %s\n", c
->auto_log_target
? "auto" : (c
->log_target
== PA_LOG_SYSLOG
? "syslog" : "stderr"));
687 pa_strbuf_printf(s
, "log-level = %s\n", log_level_to_string
[c
->log_level
]);
688 pa_strbuf_printf(s
, "resample-method = %s\n", pa_resample_method_to_string(c
->resample_method
));
689 pa_strbuf_printf(s
, "disable-remixing = %s\n", pa_yes_no(c
->disable_remixing
));
690 pa_strbuf_printf(s
, "disable-lfe-remixing = %s\n", pa_yes_no(c
->disable_lfe_remixing
));
691 pa_strbuf_printf(s
, "default-sample-format = %s\n", pa_sample_format_to_string(c
->default_sample_spec
.format
));
692 pa_strbuf_printf(s
, "default-sample-rate = %u\n", c
->default_sample_spec
.rate
);
693 pa_strbuf_printf(s
, "default-sample-channels = %u\n", c
->default_sample_spec
.channels
);
694 pa_strbuf_printf(s
, "default-channel-map = %s\n", pa_channel_map_snprint(cm
, sizeof(cm
), &c
->default_channel_map
));
695 pa_strbuf_printf(s
, "default-fragments = %u\n", c
->default_n_fragments
);
696 pa_strbuf_printf(s
, "default-fragment-size-msec = %u\n", c
->default_fragment_size_msec
);
697 pa_strbuf_printf(s
, "shm-size-bytes = %lu\n", (unsigned long) c
->shm_size
);
698 pa_strbuf_printf(s
, "log-meta = %s\n", pa_yes_no(c
->log_meta
));
699 pa_strbuf_printf(s
, "log-time = %s\n", pa_yes_no(c
->log_time
));
700 pa_strbuf_printf(s
, "log-backtrace = %u\n", c
->log_backtrace
);
701 #ifdef HAVE_SYS_RESOURCE_H
702 pa_strbuf_printf(s
, "rlimit-fsize = %li\n", c
->rlimit_fsize
.is_set
? (long int) c
->rlimit_fsize
.value
: -1);
703 pa_strbuf_printf(s
, "rlimit-data = %li\n", c
->rlimit_data
.is_set
? (long int) c
->rlimit_data
.value
: -1);
704 pa_strbuf_printf(s
, "rlimit-stack = %li\n", c
->rlimit_stack
.is_set
? (long int) c
->rlimit_stack
.value
: -1);
705 pa_strbuf_printf(s
, "rlimit-core = %li\n", c
->rlimit_core
.is_set
? (long int) c
->rlimit_core
.value
: -1);
707 pa_strbuf_printf(s
, "rlimit-rss = %li\n", c
->rlimit_rss
.is_set
? (long int) c
->rlimit_rss
.value
: -1);
710 pa_strbuf_printf(s
, "rlimit-as = %li\n", c
->rlimit_as
.is_set
? (long int) c
->rlimit_as
.value
: -1);
713 pa_strbuf_printf(s
, "rlimit-nproc = %li\n", c
->rlimit_nproc
.is_set
? (long int) c
->rlimit_nproc
.value
: -1);
716 pa_strbuf_printf(s
, "rlimit-nofile = %li\n", c
->rlimit_nofile
.is_set
? (long int) c
->rlimit_nofile
.value
: -1);
718 #ifdef RLIMIT_MEMLOCK
719 pa_strbuf_printf(s
, "rlimit-memlock = %li\n", c
->rlimit_memlock
.is_set
? (long int) c
->rlimit_memlock
.value
: -1);
722 pa_strbuf_printf(s
, "rlimit-locks = %li\n", c
->rlimit_locks
.is_set
? (long int) c
->rlimit_locks
.value
: -1);
724 #ifdef RLIMIT_SIGPENDING
725 pa_strbuf_printf(s
, "rlimit-sigpending = %li\n", c
->rlimit_sigpending
.is_set
? (long int) c
->rlimit_sigpending
.value
: -1);
727 #ifdef RLIMIT_MSGQUEUE
728 pa_strbuf_printf(s
, "rlimit-msgqueue = %li\n", c
->rlimit_msgqueue
.is_set
? (long int) c
->rlimit_msgqueue
.value
: -1);
731 pa_strbuf_printf(s
, "rlimit-nice = %li\n", c
->rlimit_nice
.is_set
? (long int) c
->rlimit_nice
.value
: -1);
734 pa_strbuf_printf(s
, "rlimit-rtprio = %li\n", c
->rlimit_rtprio
.is_set
? (long int) c
->rlimit_rtprio
.value
: -1);
737 pa_strbuf_printf(s
, "rlimit-rttime = %li\n", c
->rlimit_rttime
.is_set
? (long int) c
->rlimit_rttime
.value
: -1);
741 return pa_strbuf_tostring_free(s
);