mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-12-20 08:56:47 -05:00
Merge branch 'master' of git://0pointer.de/pulseaudio
This commit is contained in:
commit
21ffcd55a5
13 changed files with 299 additions and 48 deletions
|
|
@ -141,8 +141,10 @@ EXTRA_DIST = \
|
|||
modules/alsa/mixer/paths/analog-input-tvtuner.conf \
|
||||
modules/alsa/mixer/paths/analog-input-video.conf \
|
||||
modules/alsa/mixer/paths/analog-output.conf \
|
||||
modules/alsa/mixer/paths/analog-output-speaker.conf \
|
||||
modules/alsa/mixer/paths/analog-output.conf.common \
|
||||
modules/alsa/mixer/paths/analog-output-headphones.conf \
|
||||
modules/alsa/mixer/paths/analog-output-headphones-2.conf \
|
||||
modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf \
|
||||
modules/alsa/mixer/paths/analog-output-mono.conf
|
||||
|
||||
|
|
|
|||
|
|
@ -657,7 +657,7 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
#ifdef HAVE_FORK
|
||||
if (pipe(daemon_pipe) < 0) {
|
||||
pa_log(_("pipe failed: %s"), pa_cstrerror(errno));
|
||||
pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
|
||||
goto finish;
|
||||
}
|
||||
|
||||
|
|
@ -708,22 +708,27 @@ int main(int argc, char *argv[]) {
|
|||
pa_log_set_target(PA_LOG_SYSLOG);
|
||||
|
||||
#ifdef HAVE_SETSID
|
||||
setsid();
|
||||
#endif
|
||||
#ifdef HAVE_SETPGID
|
||||
setpgid(0,0);
|
||||
if (setsid() < 0) {
|
||||
pa_log(_("setsid() failed: %s"), pa_cstrerror(errno));
|
||||
goto finish;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef OS_IS_WIN32
|
||||
pa_close(0);
|
||||
pa_close(1);
|
||||
pa_close(2);
|
||||
/* We now are a session and process group leader. Let's fork
|
||||
* again and let the father die, so that we'll become a
|
||||
* process that can never acquire a TTY again, in a session and
|
||||
* process group without leader */
|
||||
|
||||
pa_assert_se(open("/dev/null", O_RDONLY) == 0);
|
||||
pa_assert_se(open("/dev/null", O_WRONLY) == 1);
|
||||
pa_assert_se(open("/dev/null", O_WRONLY) == 2);
|
||||
#else
|
||||
FreeConsole();
|
||||
#ifdef HAVE_FORK
|
||||
if ((child = fork()) < 0) {
|
||||
pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (child != 0) {
|
||||
retval = 0;
|
||||
goto finish;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SIGTTOU
|
||||
|
|
@ -736,12 +741,7 @@ int main(int argc, char *argv[]) {
|
|||
signal(SIGTSTP, SIG_IGN);
|
||||
#endif
|
||||
|
||||
#ifdef TIOCNOTTY
|
||||
if ((tty_fd = open("/dev/tty", O_RDWR)) >= 0) {
|
||||
ioctl(tty_fd, TIOCNOTTY, (char*) 0);
|
||||
pa_assert_se(pa_close(tty_fd) == 0);
|
||||
}
|
||||
#endif
|
||||
pa_nullify_stdfds();
|
||||
}
|
||||
|
||||
pa_set_env_and_record("PULSE_INTERNAL", "1");
|
||||
|
|
|
|||
|
|
@ -98,6 +98,10 @@ priority = 18
|
|||
name = input-docking
|
||||
priority = 17
|
||||
|
||||
[Option Input Source:AUX IN]
|
||||
name = input
|
||||
priority = 10
|
||||
|
||||
;;; 'Capture Source'
|
||||
|
||||
[Element Capture Source]
|
||||
|
|
@ -244,6 +248,31 @@ name = input-docking
|
|||
[Option Capture Source:Dock Mic]
|
||||
name = input-docking-microphone
|
||||
|
||||
;;; 'Mic Jack Mode'
|
||||
|
||||
[Element Mic Jack Mode]
|
||||
enumeration = select
|
||||
|
||||
[Option Mic Jack Mode:Mic In]
|
||||
name = input-microphone
|
||||
|
||||
[Option Mic Jack Mode:Line In]
|
||||
name = input-linein
|
||||
|
||||
;;; 'Digital Input Source'
|
||||
|
||||
[Element Digital Input Source]
|
||||
enumeration = select
|
||||
|
||||
[Option Digital Input Source:Analog Inputs]
|
||||
name = input
|
||||
|
||||
[Option Digital Input Source:Digital Mic 1]
|
||||
name = input-microphone
|
||||
|
||||
[Option Digital Input Source:Digital Mic 2]
|
||||
name = input-microphone
|
||||
|
||||
;;; Various Boosts
|
||||
|
||||
[Element Capture Boost]
|
||||
|
|
|
|||
82
src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
Normal file
82
src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
# This file is part of PulseAudio.
|
||||
#
|
||||
# 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.1 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# PulseAudio is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with PulseAudio; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
|
||||
; Path for mixers that have a 'Headphone2' control
|
||||
;
|
||||
; See analog-output.conf.common for an explanation on the directives
|
||||
|
||||
[General]
|
||||
priority = 89
|
||||
|
||||
[Element Hardware Master]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all
|
||||
override-map.2 = all-left,all-right
|
||||
|
||||
[Element Master]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all
|
||||
override-map.2 = all-left,all-right
|
||||
|
||||
[Element Master Mono]
|
||||
switch = off
|
||||
volume = off
|
||||
|
||||
; This profile path is intended to control the second headphones, not
|
||||
; the first headphones. But it should not hurt if we leave the
|
||||
; headphone jack enabled nonetheless.
|
||||
[Element Headphone]
|
||||
switch = mute
|
||||
volume = zero
|
||||
|
||||
[Element Headphone2]
|
||||
required = any
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all
|
||||
override-map.2 = all-left,all-right
|
||||
|
||||
[Element Speaker]
|
||||
switch = off
|
||||
volume = off
|
||||
|
||||
[Element Front]
|
||||
switch = off
|
||||
volume = off
|
||||
|
||||
[Element Rear]
|
||||
switch = off
|
||||
volume = off
|
||||
|
||||
[Element Surround]
|
||||
switch = off
|
||||
volume = off
|
||||
|
||||
[Element Side]
|
||||
switch = off
|
||||
volume = off
|
||||
|
||||
[Element Center]
|
||||
switch = off
|
||||
volume = off
|
||||
|
||||
[Element LFE]
|
||||
switch = off
|
||||
volume = off
|
||||
|
||||
.include analog-output.conf.common
|
||||
|
|
@ -44,6 +44,13 @@ volume = merge
|
|||
override-map.1 = all
|
||||
override-map.2 = all-left,all-right
|
||||
|
||||
; This profile path is intended to control the first headphones, not
|
||||
; the second headphones. But it should not hurt if we leave the second
|
||||
; headphone jack enabled nonetheless.
|
||||
[Element Headphone2]
|
||||
switch = mute
|
||||
volume = zero
|
||||
|
||||
[Element Speaker]
|
||||
switch = off
|
||||
volume = off
|
||||
|
|
|
|||
|
|
@ -48,6 +48,10 @@ override-map.2 = lfe,lfe
|
|||
switch = mute
|
||||
volume = zero
|
||||
|
||||
[Element Headphone2]
|
||||
switch = mute
|
||||
volume = zero
|
||||
|
||||
[Element Speaker]
|
||||
switch = mute
|
||||
volume = merge
|
||||
|
|
|
|||
|
|
@ -45,6 +45,10 @@ override-map.2 = all-left,all-right
|
|||
switch = mute
|
||||
volume = zero
|
||||
|
||||
[Element Headphone2]
|
||||
switch = mute
|
||||
volume = zero
|
||||
|
||||
[Element Speaker]
|
||||
switch = mute
|
||||
volume = merge
|
||||
|
|
|
|||
94
src/modules/alsa/mixer/paths/analog-output-speaker.conf
Normal file
94
src/modules/alsa/mixer/paths/analog-output-speaker.conf
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
# This file is part of PulseAudio.
|
||||
#
|
||||
# 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.1 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# PulseAudio is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with PulseAudio; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
|
||||
; Path for mixers that have a 'Speaker' control
|
||||
;
|
||||
; See analog-output.conf.common for an explanation on the directives
|
||||
|
||||
[General]
|
||||
priority = 100
|
||||
|
||||
[Element Hardware Master]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all
|
||||
override-map.2 = all-left,all-right
|
||||
|
||||
[Element Master]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all
|
||||
override-map.2 = all-left,all-right
|
||||
|
||||
[Element Master Mono]
|
||||
switch = off
|
||||
volume = off
|
||||
|
||||
; This profile path is intended to control the speaker, not the
|
||||
; headphones. But it should not hurt if we leave the headphone jack
|
||||
; enabled nonetheless.
|
||||
[Element Headphone]
|
||||
switch = mute
|
||||
volume = zero
|
||||
|
||||
[Element Headphone2]
|
||||
switch = mute
|
||||
volume = zero
|
||||
|
||||
[Element Speaker]
|
||||
required = any
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all
|
||||
override-map.2 = all-left,all-right
|
||||
|
||||
[Element Front]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all-front
|
||||
override-map.2 = front-left,front-right
|
||||
|
||||
[Element Rear]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all-rear
|
||||
override-map.2 = rear-left,rear-right
|
||||
|
||||
[Element Surround]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all-rear
|
||||
override-map.2 = rear-left,rear-right
|
||||
|
||||
[Element Side]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all-side
|
||||
override-map.2 = side-left,side-right
|
||||
|
||||
[Element Center]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all-center
|
||||
override-map.2 = all-center,all-center
|
||||
|
||||
[Element LFE]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = lfe
|
||||
override-map.2 = lfe,lfe
|
||||
|
||||
.include analog-output.conf.common
|
||||
|
|
@ -14,12 +14,13 @@
|
|||
# along with PulseAudio; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
|
||||
; Intended for the 'default' output
|
||||
; Intended for the 'default' output. Note that a-o-speaker.conf has a
|
||||
; higher priority than this
|
||||
;
|
||||
; See analog-output.conf.common for an explanation on the directives
|
||||
|
||||
[General]
|
||||
priority = 100
|
||||
priority = 99
|
||||
|
||||
[Element Hardware Master]
|
||||
switch = mute
|
||||
|
|
@ -37,18 +38,20 @@ override-map.2 = all-left,all-right
|
|||
switch = off
|
||||
volume = off
|
||||
|
||||
; This profile path is intended to control the speaker, not the
|
||||
; This profile path is intended to control the default output, not the
|
||||
; headphones. But it should not hurt if we leave the headphone jack
|
||||
; enabled nonetheless.
|
||||
[Element Headphone]
|
||||
switch = mute
|
||||
volume = zero
|
||||
|
||||
[Element Headphone2]
|
||||
switch = mute
|
||||
volume = zero
|
||||
|
||||
[Element Speaker]
|
||||
switch = mute
|
||||
volume = merge
|
||||
override-map.1 = all
|
||||
override-map.2 = all-left,all-right
|
||||
volume = off
|
||||
|
||||
[Element Front]
|
||||
switch = mute
|
||||
|
|
|
|||
|
|
@ -62,42 +62,42 @@ auto-profiles = yes
|
|||
[Mapping analog-mono]
|
||||
device-strings = hw:%f
|
||||
channel-map = mono
|
||||
paths-output = analog-output analog-output-headphones analog-output-mono analog-output-lfe-on-mono
|
||||
paths-output = analog-output analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
|
||||
paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line
|
||||
priority = 1
|
||||
|
||||
[Mapping analog-stereo]
|
||||
device-strings = front:%f hw:%f
|
||||
channel-map = left,right
|
||||
paths-output = analog-output analog-output-headphones analog-output-mono analog-output-lfe-on-mono
|
||||
paths-output = analog-output analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
|
||||
paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line
|
||||
priority = 10
|
||||
|
||||
[Mapping analog-surround-40]
|
||||
device-strings = surround40:%f
|
||||
channel-map = front-left,front-right,rear-left,rear-right
|
||||
paths-output = analog-output analog-output-lfe-on-mono
|
||||
paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
|
||||
priority = 7
|
||||
direction = output
|
||||
|
||||
[Mapping analog-surround-41]
|
||||
device-strings = surround41:%f
|
||||
channel-map = front-left,front-right,rear-left,rear-right,lfe
|
||||
paths-output = analog-output analog-output-lfe-on-mono
|
||||
paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
|
||||
priority = 8
|
||||
direction = output
|
||||
|
||||
[Mapping analog-surround-50]
|
||||
device-strings = surround50:%f
|
||||
channel-map = front-left,front-right,rear-left,rear-right,front-center
|
||||
paths-output = analog-output analog-output-lfe-on-mono
|
||||
paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
|
||||
priority = 7
|
||||
direction = output
|
||||
|
||||
[Mapping analog-surround-51]
|
||||
device-strings = surround51:%f
|
||||
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
|
||||
paths-output = analog-output analog-output-lfe-on-mono
|
||||
paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
|
||||
priority = 8
|
||||
direction = output
|
||||
|
||||
|
|
@ -105,7 +105,7 @@ direction = output
|
|||
device-strings = surround71:%f
|
||||
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
|
||||
description = Analog Surround 7.1
|
||||
paths-output = analog-output analog-output-lfe-on-mono
|
||||
paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
|
||||
priority = 7
|
||||
direction = output
|
||||
|
||||
|
|
|
|||
|
|
@ -412,7 +412,8 @@ static void dsp_logic(
|
|||
fftwf_complex * restrict output_window,//The transformed window'd src
|
||||
struct userdata *u){//Collection of constants
|
||||
const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
|
||||
|
||||
float_vector_t x;
|
||||
x.f[0] = x.f[1] = x.f[2] = x.f[3] = X;
|
||||
|
||||
//assert(u->samples_gathered >= u->R);
|
||||
//use a linear-phase sliding STFT and overlap-add method
|
||||
|
|
@ -422,9 +423,8 @@ static void dsp_logic(
|
|||
float_vector_t *w = (float_vector_t*) (W + j);
|
||||
float_vector_t *s = (float_vector_t*) (src + j);
|
||||
//#if __SSE2__
|
||||
d->m = _mm_mul_ps(w->m, s->m);
|
||||
//#else
|
||||
// d->v = w->v * s->v;
|
||||
d->m = _mm_mul_ps(x.m, _mm_mul_ps(w->m, s->m));
|
||||
// d->v = x->v * w->v * s->v;
|
||||
//#endif
|
||||
}
|
||||
//zero padd the the remaining fft window
|
||||
|
|
@ -556,33 +556,41 @@ static void input_buffer(struct userdata *u, pa_memchunk *in){
|
|||
/* Called from I/O thread context */
|
||||
static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
|
||||
struct userdata *u;
|
||||
size_t fs, target_samples;
|
||||
struct timeval start, end;
|
||||
size_t fs, target_samples, mbs;
|
||||
//struct timeval start, end;
|
||||
pa_memchunk tchunk;
|
||||
pa_sink_input_assert_ref(i);
|
||||
pa_assert_se(u = i->userdata);
|
||||
pa_assert(chunk);
|
||||
pa_assert(u->sink);
|
||||
fs = pa_frame_size(&(u->sink->sample_spec));
|
||||
nbytes = PA_MIN(nbytes, pa_mempool_block_size_max(u->sink->core->mempool));
|
||||
target_samples = PA_ROUND_UP(nbytes / fs, u->R);
|
||||
mbs = pa_mempool_block_size_max(u->sink->core->mempool);
|
||||
//pa_log_debug("vanilla mbs = %ld",mbs);
|
||||
mbs = PA_ROUND_DOWN(mbs / fs, u->R);
|
||||
mbs = PA_MAX(mbs, u->R);
|
||||
target_samples = PA_MAX(target_samples, mbs);
|
||||
//pa_log_debug("target samples: %ld", target_samples);
|
||||
if(u->first_iteration){
|
||||
//allocate request_size
|
||||
target_samples = PA_MAX(target_samples, u->window_size);
|
||||
}else{
|
||||
//allocate request_size + overlap
|
||||
target_samples += u->overlap_size;
|
||||
alloc_input_buffers(u, target_samples);
|
||||
}
|
||||
alloc_input_buffers(u, target_samples);
|
||||
//pa_log_debug("post target samples: %ld", target_samples);
|
||||
chunk->memblock = NULL;
|
||||
|
||||
/* Hmm, process any rewind request that might be queued up */
|
||||
pa_sink_process_rewind(u->sink, 0);
|
||||
|
||||
//pa_log_debug("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
|
||||
pa_rtclock_get(&start);
|
||||
//pa_rtclock_get(&start);
|
||||
do{
|
||||
size_t input_remaining = target_samples - u->samples_gathered;
|
||||
// pa_log_debug("input remaining %ld samples", input_remaining);
|
||||
pa_assert(input_remaining > 0);
|
||||
while(pa_memblockq_peek(u->input_q, &tchunk) < 0){
|
||||
//pa_sink_render(u->sink, input_remaining * fs, &tchunk);
|
||||
|
|
@ -597,23 +605,23 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
|
|||
//pa_log_debug("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
|
||||
/* copy new input */
|
||||
//pa_rtclock_get(start);
|
||||
// pa_log_debug("buffering %ld bytes", tchunk.length);
|
||||
input_buffer(u, &tchunk);
|
||||
//pa_rtclock_get(&end);
|
||||
//pa_log_debug("Took %0.5f seconds to setup", pa_timeval_diff(end, start) / (double) PA_USEC_PER_SEC);
|
||||
pa_memblock_unref(tchunk.memblock);
|
||||
}while(u->samples_gathered < target_samples);
|
||||
|
||||
pa_rtclock_get(&end);
|
||||
pa_log_debug("Took %0.6f seconds to get data", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
|
||||
//pa_rtclock_get(&end);
|
||||
//pa_log_debug("Took %0.6f seconds to get data", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
|
||||
|
||||
pa_assert(u->fft_size >= u->window_size);
|
||||
pa_assert(u->R < u->window_size);
|
||||
/* set the H filter */
|
||||
pa_rtclock_get(&start);
|
||||
//pa_rtclock_get(&start);
|
||||
/* process a block */
|
||||
process_samples(u, chunk);
|
||||
pa_rtclock_get(&end);
|
||||
pa_log_debug("Took %0.6f seconds to process", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
|
||||
//pa_rtclock_get(&end);
|
||||
//pa_log_debug("Took %0.6f seconds to process", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
|
||||
|
||||
pa_assert(chunk->memblock);
|
||||
//pa_log_debug("gave %ld", chunk->length/fs);
|
||||
|
|
|
|||
|
|
@ -2999,3 +2999,19 @@ finish:
|
|||
pa_make_fd_cloexec(fileno(f));
|
||||
return f;
|
||||
}
|
||||
|
||||
void pa_nullify_stdfds(void) {
|
||||
|
||||
#ifndef OS_IS_WIN32
|
||||
pa_close(STDIN_FILENO);
|
||||
pa_close(STDOUT_FILENO);
|
||||
pa_close(STDERR_FILENO);
|
||||
|
||||
pa_assert_se(open("/dev/null", O_RDONLY) == STDIN_FILENO);
|
||||
pa_assert_se(open("/dev/null", O_WRONLY) == STDOUT_FILENO);
|
||||
pa_assert_se(open("/dev/null", O_WRONLY) == STDERR_FILENO);
|
||||
#else
|
||||
FreeConsole();
|
||||
#endif
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -265,4 +265,6 @@ int pa_pipe_cloexec(int pipefd[2]);
|
|||
int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
|
||||
FILE* pa_fopen_cloexec(const char *path, const char *mode);
|
||||
|
||||
void pa_nullify_stdfds(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue