mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-01 22:58:47 -04:00
update latest upstream-2021-08-16
This commit is contained in:
parent
efb1080dd6
commit
bd71445296
36 changed files with 99 additions and 7357 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -26,6 +26,7 @@ cscope.in.out
|
|||
cscope.po.out
|
||||
pulse-daemon.log
|
||||
depcomp
|
||||
install/
|
||||
install-sh
|
||||
libltdl
|
||||
libtool
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@
|
|||
# infrastructure on fd.o GitLab.
|
||||
#
|
||||
# Once the container stage is done, we move on to the 'build' stage where we
|
||||
# run an autotools and meson build in parallel. Currently, tests are also run
|
||||
# as part of the build stage as there doesn't seem to be significant value to
|
||||
# splitting the stages at the moment.
|
||||
# run meson build. Currently, tests are also run as part of the build stage as
|
||||
# there doesn't seem to be significant value to splitting the stages at the
|
||||
# moment.
|
||||
|
||||
stages:
|
||||
- container
|
||||
|
|
@ -16,9 +16,10 @@ stages:
|
|||
|
||||
variables:
|
||||
# Update this tag when you want to trigger a rebuild the container in which
|
||||
# CI runs, for example when adding new packages to UBUNTU_DEBS. The tag is
|
||||
# an arbitrary string that identifies the exact container contents.
|
||||
FDO_DISTRIBUTION_TAG: '2020-03-07-01'
|
||||
# CI runs, for example when adding new packages to FDO_DISTRIBUTION_PACKAGES.
|
||||
# The tag is an arbitrary string that identifies the exact container
|
||||
# contents.
|
||||
FDO_DISTRIBUTION_TAG: '2021-03-01-02'
|
||||
FDO_DISTRIBUTION_VERSION: '18.04'
|
||||
FDO_UPSTREAM_REPO: 'pulseaudio/pulseaudio'
|
||||
UBUNTU_IMAGE: "$CI_REGISTRY_IMAGE/ubuntu/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
|
||||
|
|
@ -42,8 +43,6 @@ build-container:
|
|||
# Otherwise the changes won't have effect since an old container image will
|
||||
# be used.
|
||||
FDO_DISTRIBUTION_PACKAGES: >-
|
||||
autoconf
|
||||
automake
|
||||
autopoint
|
||||
bash-completion
|
||||
check
|
||||
|
|
@ -73,7 +72,6 @@ build-container:
|
|||
libssl-dev
|
||||
libsystemd-dev
|
||||
libtdb-dev
|
||||
libtool
|
||||
libudev-dev
|
||||
libwebrtc-audio-processing-dev
|
||||
libwrap0-dev
|
||||
|
|
@ -82,31 +80,13 @@ build-container:
|
|||
libxml-parser-perl
|
||||
libxml2-utils
|
||||
libxtst-dev
|
||||
make
|
||||
m4
|
||||
ninja-build
|
||||
pkg-config
|
||||
python3-setuptools
|
||||
systemd
|
||||
wget
|
||||
|
||||
build-autotools:
|
||||
stage: build
|
||||
image: $UBUNTU_IMAGE
|
||||
script:
|
||||
- export MAKEFLAGS="-j$(nproc)"
|
||||
- NOCONFIGURE=1 ./bootstrap.sh
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../configure --localstatedir=/var
|
||||
- make
|
||||
- make check
|
||||
- make check-daemon
|
||||
- ulimit -c 0 # don't dump core files on tests that are supposed to assert
|
||||
- make distcheck
|
||||
artifacts:
|
||||
paths:
|
||||
- build/
|
||||
|
||||
build-meson:
|
||||
stage: build
|
||||
image: $UBUNTU_IMAGE
|
||||
|
|
@ -121,8 +101,10 @@ build-meson:
|
|||
- meson build
|
||||
- cd build
|
||||
- ninja
|
||||
- ulimit -c 0 # don't dump core files on tests that are supposed to assert
|
||||
- ninja test
|
||||
- ninja test-daemon
|
||||
- ninja dist
|
||||
artifacts:
|
||||
paths:
|
||||
- build/
|
||||
|
|
|
|||
|
|
@ -1,22 +1,21 @@
|
|||
### Warning
|
||||
Missing data may cause bugs to languish.
|
||||
### Warning
|
||||
Missing data may cause bugs to languish.
|
||||
|
||||
### Summary
|
||||
(Summarize the bug encountered concisely)
|
||||
|
||||
### environment
|
||||
Check to see if you have pa-info installed by running `which pa-info`
|
||||
If yes please run it
|
||||
If no please download and run https://gitlab.freedesktop.org/pulseaudio/pulseaudio/blob/master/src/utils/pa-info
|
||||
Attach the output to this bug report as pa-info.txt
|
||||
### Summary
|
||||
(Summarize the bug encountered concisely)
|
||||
|
||||
### Steps to reproduce
|
||||
(How one can reproduce the issue - this is very important)
|
||||
|
||||
|
||||
### What is the current *bug* behavior?
|
||||
(What actually happens)
|
||||
|
||||
### What is the expected *correct* behavior?
|
||||
(What you should see instead)
|
||||
|
||||
### environment
|
||||
Check to see if you have pa-info installed by running `which pa-info`
|
||||
If yes please run it
|
||||
If no please download and run https://gitlab.freedesktop.org/pulseaudio/pulseaudio/blob/master/src/utils/pa-info
|
||||
Attach the output to this bug report as pa-info.txt
|
||||
|
||||
### Steps to reproduce
|
||||
(How one can reproduce the issue - this is very important)
|
||||
|
||||
|
||||
### What is the current *bug* behavior?
|
||||
(What actually happens)
|
||||
|
||||
### What is the expected *correct* behavior?
|
||||
(What you should see instead)
|
||||
|
|
|
|||
67
.gitlab/merge_request_templates/Guidelines.md
Normal file
67
.gitlab/merge_request_templates/Guidelines.md
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# Contribution Guidelines
|
||||
|
||||
## A note for contributors
|
||||
|
||||
Thank you for your contribution!
|
||||
|
||||
Please make sure you tick the box labelled `Allow commits from members who can
|
||||
merge to the target branch`. This allows us to make minor edits ourselves, and
|
||||
then automatically rebase and merge your changes.
|
||||
|
||||
PulseAudio is currently maintained by three volunteer developers in their free
|
||||
time (probably amounting to less than one full time developer), which is not
|
||||
really enough, given the project size and scope. For this reason bug reports
|
||||
and patch submissions are sometimes handled very slowly.
|
||||
|
||||
For non-trivial patches, we meet biweekly on IRC to discuss and prioritise
|
||||
outstanding MRs. If you haven't heard from us a few days after you create the
|
||||
MR, please take a look at [the patch status
|
||||
page](https://www.freedesktop.org/wiki/Software/PulseAudio/PatchStatus/).
|
||||
|
||||
If you don't see your MR in that list either, please don't hesitate to drop a
|
||||
comment pinging us, and we'll try to at least respond and make sure your
|
||||
request is tracked on that list.
|
||||
|
||||
## Coding Style
|
||||
|
||||
Please take a look at the [coding style
|
||||
documentation](https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/CodingStyle/)
|
||||
on our wiki.
|
||||
|
||||
## Commit messagse
|
||||
|
||||
We follow the standard git commit message format of a summary on the first line
|
||||
(<=50 characterss for preference, <=72 characters otherwise), followed by a new
|
||||
line, followed by a detailed commit message. An additional line at the end may
|
||||
link to an issue being fixed by this MR.
|
||||
|
||||
The first line is usually a short description of "what" your commit does, and
|
||||
the rest of the message describes the "why", along with any additional
|
||||
information that readers might need to understand the rationale for the change.
|
||||
If in doubt, more verbose is better than less.
|
||||
|
||||
If you need to describe the "how" of the commit, that is usually best
|
||||
documented along with the code itself.
|
||||
|
||||
Commit messages are prefixed with the subsystem being affected. Your best bet
|
||||
to figure out what is appropriate is to look at previous commit messages. An
|
||||
example:
|
||||
|
||||
```
|
||||
sink: Reduce chat sink priority
|
||||
|
||||
Some gaming sound cards have custom profiles with analog-game and
|
||||
analog-chat mappings that exist simultaneously. The game sink should
|
||||
have higher priority than the chat sink, but currently there's no way to
|
||||
affect the sink priorities from the profile-set configuration (the
|
||||
mapping priority is not propagated to the sink priority).
|
||||
|
||||
I first thought about adding the mapping priority to the sink priority,
|
||||
but that could mess up the prioritization system in
|
||||
pa_device_init_priority(). I ended up checking for the intended roles
|
||||
property to reduce the chat sink priority. I also reduced the iec958
|
||||
priority so that the chat and iec958 sinks don't end up with the same
|
||||
priority.
|
||||
|
||||
Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/818
|
||||
```
|
||||
148
Makefile.am
148
Makefile.am
|
|
@ -1,148 +0,0 @@
|
|||
# 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 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
EXTRA_DIST = \
|
||||
bootstrap.sh \
|
||||
coverity/model.c \
|
||||
.gitlab-ci.yml \
|
||||
.gitlab/issue_templates/Bug.md \
|
||||
git-version-gen \
|
||||
LICENSE \
|
||||
pulseaudio.supp \
|
||||
GPL \
|
||||
LGPL \
|
||||
doxygen/Makefile.am \
|
||||
doxygen/Makefile.in \
|
||||
doxygen/doxygen.conf.in \
|
||||
PROTOCOL \
|
||||
README \
|
||||
CODE_OF_CONDUCT.md \
|
||||
scripts/benchmark_memory_usage.sh \
|
||||
scripts/plot_memory_usage.gp \
|
||||
scripts/benchmarks/README \
|
||||
todo \
|
||||
.gitignore \
|
||||
doxygen/.gitignore \
|
||||
m4/.gitignore \
|
||||
man/.gitignore \
|
||||
po/.gitignore \
|
||||
scripts/benchmarks/.gitignore \
|
||||
src/.gitignore \
|
||||
src/daemon/.gitignore \
|
||||
src/pulse/.gitignore \
|
||||
meson.build \
|
||||
meson_options.txt \
|
||||
man/meson.build \
|
||||
po/meson.build \
|
||||
shell-completion/bash/meson.build \
|
||||
shell-completion/zsh/meson.build \
|
||||
src/daemon/meson.build \
|
||||
src/meson.build \
|
||||
src/modules/alsa/meson.build \
|
||||
src/modules/alsa/mixer/meson.build \
|
||||
src/modules/bluetooth/meson.build \
|
||||
src/modules/echo-cancel/meson.build \
|
||||
src/modules/gsettings/meson.build \
|
||||
src/modules/gsettings/meson_post_install.py \
|
||||
src/modules/meson.build \
|
||||
src/modules/oss/meson.build \
|
||||
src/modules/raop/meson.build \
|
||||
src/modules/rtp/meson.build \
|
||||
src/pulsecore/meson.build \
|
||||
src/pulse/meson.build \
|
||||
src/tests/meson.build \
|
||||
src/tests/test-daemon.meson.sh \
|
||||
src/utils/meson.build \
|
||||
vala/meson.build
|
||||
|
||||
SUBDIRS = src doxygen man po
|
||||
|
||||
MAINTAINERCLEANFILES =
|
||||
noinst_DATA =
|
||||
|
||||
vapidir = $(datadir)/vala/vapi
|
||||
dist_vapi_DATA = \
|
||||
vala/libpulse.deps vala/libpulse.vapi \
|
||||
vala/libpulse-mainloop-glib.deps vala/libpulse-mainloop-glib.vapi \
|
||||
vala/libpulse-simple.deps vala/libpulse-simple.vapi
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = libpulse.pc libpulse-simple.pc
|
||||
|
||||
if HAVE_GLIB20
|
||||
pkgconfig_DATA += \
|
||||
libpulse-mainloop-glib.pc
|
||||
endif
|
||||
|
||||
cmakedir = $(libdir)/cmake/PulseAudio
|
||||
cmake_DATA = PulseAudioConfig.cmake PulseAudioConfigVersion.cmake
|
||||
|
||||
bashcompletiondir=@bashcompletiondir@
|
||||
dist_bashcompletion_DATA = shell-completion/bash/pulseaudio
|
||||
|
||||
install-bashcompletion-aliases:
|
||||
cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio pactl
|
||||
cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio pacmd
|
||||
cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio pasuspender
|
||||
cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio padsp
|
||||
cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio pacat
|
||||
cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio paplay
|
||||
cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio parec
|
||||
cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio parecord
|
||||
|
||||
install-data-hook: install-bashcompletion-aliases
|
||||
|
||||
zshcompletiondir=@zshcompletiondir@
|
||||
dist_zshcompletion_DATA = shell-completion/zsh/_pulseaudio
|
||||
|
||||
homepage: all dist doxygen
|
||||
test -d $$HOME/homepage/private
|
||||
mkdir -p $$HOME/homepage/private/projects/pulseaudio $$HOME/homepage/private/projects/pulseaudio/doxygen
|
||||
cp pulseaudio-@PACKAGE_VERSION@.tar.gz $$HOME/homepage/private/projects/pulseaudio
|
||||
cp pulseaudio-@PACKAGE_VERSION@.tar.gz $$HOME/git.fedora/pulseaudio
|
||||
cp -a doxygen/html/* $$HOME/homepage/private/projects/pulseaudio/doxygen
|
||||
|
||||
doxygen:
|
||||
$(MAKE) -C doxygen doxygen
|
||||
|
||||
eolspace:
|
||||
find \( -name '*.c' -o -name '*.h' -o -name 'Makefile.am' \) -exec perl -i -pe 's/\s+\n$$/\1\n/;' \{\} \;
|
||||
|
||||
untabify:
|
||||
find \( -name '*.c' -o -name '*.h' \) -exec perl -i -pe 's/\t/ /g;' \{\} \;
|
||||
|
||||
fedora-snapshot: dist
|
||||
cp $(distdir).tar.gz $$HOME/git.fedora/pulseaudio/$(distdir).tar.gz
|
||||
|
||||
dist-hook:
|
||||
echo $(VERSION) > $(distdir)/.tarball-version
|
||||
echo $(VERSION) > $(distdir)/.version
|
||||
|
||||
check-daemon:
|
||||
$(MAKE) -C src check-daemon
|
||||
|
||||
check-daemon-long:
|
||||
$(MAKE) -C src check-daemon-long
|
||||
|
||||
.PHONY: homepage distcleancheck doxygen
|
||||
|
||||
# see git-version-gen
|
||||
BUILT_SOURCES = $(top_srcdir)/.version
|
||||
$(top_srcdir)/.version:
|
||||
echo $(VERSION) > $@-t && mv $@-t $@
|
||||
|
||||
DISTCHECK_CONFIGURE_FLAGS = --with-udev-rules-dir="$$dc_install_base/lib/udev/rules.d" --with-systemduserunitdir="$$dc_install_base/lib/systemd/user" --with-bash-completion-dir="$$dc_install_base/share/bash-completion/completions"
|
||||
22
autogen.sh
22
autogen.sh
|
|
@ -1,22 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# 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 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Only there to make jhbuild happy
|
||||
|
||||
NOCONFIGURE=1 ./bootstrap.sh
|
||||
|
||||
exec ./configure "$@"
|
||||
48
bootstrap.sh
48
bootstrap.sh
|
|
@ -1,48 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# 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 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
if [ -f .git/hooks/pre-commit.sample -a ! -f .git/hooks/pre-commit ] ; then
|
||||
cp -p .git/hooks/pre-commit.sample .git/hooks/pre-commit && \
|
||||
chmod +x .git/hooks/pre-commit && \
|
||||
echo "Activated pre-commit hook."
|
||||
fi
|
||||
|
||||
if [ -f .tarball-version ]; then
|
||||
echo "Marking tarball version as modified."
|
||||
echo -n `cat .tarball-version | sed 's/-rebootstrapped$//'`-rebootstrapped >.tarball-version
|
||||
fi
|
||||
|
||||
# We check for this here, because if pkg-config is not found in the
|
||||
# system, it's likely that the pkg.m4 macro file is also not present,
|
||||
# which will make PKG_PROG_PKG_CONFIG be undefined and the generated
|
||||
# configure file faulty.
|
||||
if ! pkg-config --version &>/dev/null; then
|
||||
echo "pkg-config is required to bootstrap this program"
|
||||
exit 1
|
||||
fi
|
||||
# Other necessary programs
|
||||
if ! autopoint --version &>/dev/null ; then
|
||||
echo "autopoint is required to bootstrap this program"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
autoreconf --force --install --verbose
|
||||
|
||||
if test "x$NOCONFIGURE" = "x"; then
|
||||
CFLAGS="$CFLAGS -g -O0" ./configure --enable-force-preopen "$@" && \
|
||||
make clean
|
||||
fi
|
||||
1761
configure.ac
1761
configure.ac
File diff suppressed because it is too large
Load diff
|
|
@ -1,22 +0,0 @@
|
|||
# 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 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
doxygen: doxygen.conf
|
||||
doxygen $<
|
||||
|
||||
clean-local:
|
||||
-rm -rf html
|
||||
|
||||
.PHONY: all doxygen
|
||||
37
m4/.gitignore
vendored
37
m4/.gitignore
vendored
|
|
@ -1,37 +0,0 @@
|
|||
codeset.m4
|
||||
extern-inline.m4
|
||||
fcntl-o.m4
|
||||
gettext.m4
|
||||
glibc2.m4
|
||||
glibc21.m4
|
||||
iconv.m4
|
||||
intdiv0.m4
|
||||
intl.m4
|
||||
intldir.m4
|
||||
intlmacosx.m4
|
||||
intmax.m4
|
||||
inttypes-pri.m4
|
||||
inttypes_h.m4
|
||||
lcmessage.m4
|
||||
lib-ld.m4
|
||||
lib-link.m4
|
||||
lib-prefix.m4
|
||||
libtool.m4
|
||||
lock.m4
|
||||
longlong.m4
|
||||
ltoptions.m4
|
||||
ltsugar.m4
|
||||
ltversion.m4
|
||||
lt~obsolete.m4
|
||||
nls.m4
|
||||
po.m4
|
||||
printf-posix.m4
|
||||
progtest.m4
|
||||
size_max.m4
|
||||
stdint_h.m4
|
||||
threadlib.m4
|
||||
uintmax_t.m4
|
||||
visibility.m4
|
||||
wchar_t.m4
|
||||
wint_t.m4
|
||||
xsize.m4
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
AC_DEFUN([ACX_LIBWRAP], [
|
||||
LIBWRAP_LIBS=
|
||||
saved_LIBS="$LIBS"
|
||||
LIBS="$LIBS -lwrap"
|
||||
AC_MSG_CHECKING([for tcpwrap library and headers])
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[#include <tcpd.h>
|
||||
#include <syslog.h>
|
||||
int allow_severity = LOG_INFO;
|
||||
int deny_severity = LOG_WARNING;],
|
||||
[struct request_info *req;
|
||||
return hosts_access (req);])],
|
||||
[AC_DEFINE(HAVE_LIBWRAP, [], [Have tcpwrap?])
|
||||
LIBWRAP_LIBS="-lwrap"
|
||||
AC_MSG_RESULT(yes)],
|
||||
[AC_MSG_RESULT(no)])
|
||||
LIBS="$saved_LIBS"
|
||||
])
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check whether the given FLAG works with the current language's compiler
|
||||
# or gives an error. (Warnings, however, are ignored)
|
||||
#
|
||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
|
||||
# success/failure.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the current language's default
|
||||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
|
||||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
|
||||
# force the compiler to issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
|
||||
#
|
||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
||||
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program 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 General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 4
|
||||
|
||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
|
||||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
|
||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
|
||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
|
||||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
|
||||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
|
||||
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
|
||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
||||
[AS_VAR_SET(CACHEVAR,[no])])
|
||||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
|
||||
AS_VAR_IF(CACHEVAR,yes,
|
||||
[m4_default([$2], :)],
|
||||
[m4_default([$3], :)])
|
||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||
])dnl AX_CHECK_COMPILE_FLAGS
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_check_define.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AC_CHECK_DEFINE([symbol], [ACTION-IF-FOUND], [ACTION-IF-NOT])
|
||||
# AX_CHECK_DEFINE([includes],[symbol], [ACTION-IF-FOUND], [ACTION-IF-NOT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Complements AC_CHECK_FUNC but it does not check for a function but for a
|
||||
# define to exist. Consider a usage like:
|
||||
#
|
||||
# AC_CHECK_DEFINE(__STRICT_ANSI__, CFLAGS="$CFLAGS -D_XOPEN_SOURCE=500")
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation; either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program 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 General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 8
|
||||
|
||||
AU_ALIAS([AC_CHECK_DEFINED], [AC_CHECK_DEFINE])
|
||||
AC_DEFUN([AC_CHECK_DEFINE],[
|
||||
AS_VAR_PUSHDEF([ac_var],[ac_cv_defined_$1])dnl
|
||||
AC_CACHE_CHECK([for $1 defined], ac_var,
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
|
||||
#ifdef $1
|
||||
int ok;
|
||||
#else
|
||||
choke me
|
||||
#endif
|
||||
]])],[AS_VAR_SET(ac_var, yes)],[AS_VAR_SET(ac_var, no)]))
|
||||
AS_IF([test AS_VAR_GET(ac_var) != "no"], [$2], [$3])dnl
|
||||
AS_VAR_POPDEF([ac_var])dnl
|
||||
])
|
||||
|
||||
AU_ALIAS([AX_CHECK_DEFINED], [AX_CHECK_DEFINE])
|
||||
AC_DEFUN([AX_CHECK_DEFINE],[
|
||||
AS_VAR_PUSHDEF([ac_var],[ac_cv_defined_$2_$1])dnl
|
||||
AC_CACHE_CHECK([for $2 defined in $1], ac_var,
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <$1>]], [[
|
||||
#ifdef $2
|
||||
int ok;
|
||||
#else
|
||||
choke me
|
||||
#endif
|
||||
]])],[AS_VAR_SET(ac_var, yes)],[AS_VAR_SET(ac_var, no)]))
|
||||
AS_IF([test AS_VAR_GET(ac_var) != "no"], [$3], [$4])dnl
|
||||
AS_VAR_POPDEF([ac_var])dnl
|
||||
])
|
||||
|
||||
AC_DEFUN([AX_CHECK_FUNC],
|
||||
[AS_VAR_PUSHDEF([ac_var], [ac_cv_func_$2])dnl
|
||||
AC_CACHE_CHECK([for $2], ac_var,
|
||||
dnl AC_LANG_FUNC_LINK_TRY
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([$1
|
||||
#undef $2
|
||||
char $2 ();],[
|
||||
char (*f) () = $2;
|
||||
return f != $2; ])],
|
||||
[AS_VAR_SET(ac_var, yes)],
|
||||
[AS_VAR_SET(ac_var, no)])])
|
||||
AS_IF([test AS_VAR_GET(ac_var) = yes], [$3], [$4])dnl
|
||||
AS_VAR_POPDEF([ac_var])dnl
|
||||
])# AC_CHECK_FUNC
|
||||
|
|
@ -1,147 +0,0 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_check_flag.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
|
||||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
|
||||
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
|
||||
# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
|
||||
# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS])
|
||||
# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check whether the given FLAG works with the current language's
|
||||
# preprocessor/compiler/linker, or whether they give an error. (Warnings,
|
||||
# however, are ignored.)
|
||||
#
|
||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
|
||||
# success/failure.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the current language's default
|
||||
# flags (e.g. CFLAGS) when the check is done. The check us thus made
|
||||
# with the following flags: "CFLAGS EXTRA-FLAGS FLAG". EXTRA-FLAGS can
|
||||
# for example be used to force the compiler to issue an error when a bad
|
||||
# flag is given.
|
||||
#
|
||||
# AX_APPEND_FLAG appends the FLAG to the FLAG-VARIABLE shell variable or
|
||||
# the current language's flags if not specified. FLAG is not added to
|
||||
# FLAG-VARIABLE if it is already in the shell variable.
|
||||
#
|
||||
# AX_APPEND_COMPILE_FLAGS checks for each FLAG1, FLAG2, etc. using
|
||||
# AX_CHECK_COMPILE_FLAG and if the check is successful the flag is added
|
||||
# to the appropriate FLAGS variable with AX_APPEND_FLAG. The
|
||||
# FLAGS-VARIABLE and EXTRA-FLAGS arguments are the same as in the other
|
||||
# macros. AX_APPEND_LINK_FLAGS does the same for linker flags.
|
||||
#
|
||||
# NOTE: Based on AX_CHECK_COMPILER_FLAGS and AX_CFLAGS_GCC_OPTION.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2009 Steven G. Johnson <stevenj@alum.mit.edu>
|
||||
# Copyright (c) 2009 Matteo Frigo
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program 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 General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 2
|
||||
|
||||
AC_DEFUN([AX_CHECK_PREPROC_FLAG],
|
||||
[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
|
||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]cppflags_$4_$1])dnl
|
||||
AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [
|
||||
ax_check_save_flags=$CPPFLAGS
|
||||
CPPFLAGS="$CPPFLAGS $4 $1"
|
||||
AC_PREPROC_IFELSE([AC_LANG_PROGRAM()],
|
||||
[AS_VAR_SET([CACHEVAR],[yes])],
|
||||
[AS_VAR_SET([CACHEVAR],[no])])
|
||||
CPPFLAGS=$ax_check_save_flags])
|
||||
AS_VAR_IF([CACHEVAR], "yes",
|
||||
[m4_default([$2], :)],
|
||||
[m4_default([$3], :)])
|
||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||
])dnl AX_CHECK_PREPROC_FLAGS
|
||||
|
||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
|
||||
[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
|
||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
|
||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
|
||||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
|
||||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
|
||||
[AS_VAR_SET([CACHEVAR],[yes])],
|
||||
[AS_VAR_SET([CACHEVAR],[no])])
|
||||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
|
||||
AS_VAR_IF([CACHEVAR], "yes",
|
||||
[m4_default([$2], :)],
|
||||
[m4_default([$3], :)])
|
||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||
])dnl AX_CHECK_COMPILE_FLAGS
|
||||
|
||||
AC_DEFUN([AX_CHECK_LINK_FLAG],
|
||||
[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
|
||||
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
|
||||
ax_check_save_flags=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS $4 $1"
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM()],
|
||||
[AS_VAR_SET([CACHEVAR],[yes])],
|
||||
[AS_VAR_SET([CACHEVAR],[no])])
|
||||
LDFLAGS=$ax_check_save_flags])
|
||||
AS_VAR_IF([CACHEVAR], "yes",
|
||||
[m4_default([$2], :)],
|
||||
[m4_default([$3], :)])
|
||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||
])dnl AX_CHECK_LINK_FLAGS
|
||||
|
||||
|
||||
AC_DEFUN([AX_APPEND_FLAG],
|
||||
[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
|
||||
AC_REQUIRE([AC_PROG_GREP])
|
||||
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[]FLAGS)])dnl
|
||||
AS_VAR_SET_IF([FLAGS],
|
||||
[AS_IF([AS_ECHO(" $[]FLAGS ") | $GREP " $1 " 2>&1 >/dev/null],
|
||||
[AC_RUN_LOG([: FLAGS already contains $1])],
|
||||
[AC_RUN_LOG([: FLAGS="$FLAGS $1"])
|
||||
AS_VAR_APPEND([FLAGS], [" $1"])])],
|
||||
[AS_VAR_SET([FLAGS],[$1])])
|
||||
AS_VAR_POPDEF([FLAGS])dnl
|
||||
])dnl AX_APPEND_FLAG
|
||||
|
||||
AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
|
||||
[for flag in $1; do
|
||||
AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3])
|
||||
done
|
||||
])dnl AX_APPEND_COMPILE_FLAGS
|
||||
|
||||
AC_DEFUN([AX_APPEND_LINK_FLAGS],
|
||||
[for flag in $1; do
|
||||
AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3])
|
||||
done
|
||||
])dnl AX_APPEND_LINK_FLAGS
|
||||
|
|
@ -1,558 +0,0 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check for baseline language coverage in the compiler for the specified
|
||||
# version of the C++ standard. If necessary, add switches to CXXFLAGS to
|
||||
# enable support. VERSION may be '11' (for the C++11 standard) or '14'
|
||||
# (for the C++14 standard).
|
||||
#
|
||||
# The second argument, if specified, indicates whether you insist on an
|
||||
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
|
||||
# -std=c++11). If neither is specified, you get whatever works, with
|
||||
# preference for an extended mode.
|
||||
#
|
||||
# The third argument, if specified 'mandatory' or if left unspecified,
|
||||
# indicates that baseline support for the specified C++ standard is
|
||||
# required and that the macro should error out if no mode with that
|
||||
# support is found. If specified 'optional', then configuration proceeds
|
||||
# regardless, after defining HAVE_CXX${VERSION} if and only if a
|
||||
# supporting mode is found.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
|
||||
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
|
||||
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
|
||||
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
|
||||
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
|
||||
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 1
|
||||
|
||||
dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
|
||||
dnl (serial version number 13).
|
||||
|
||||
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
|
||||
m4_if([$1], [11], [],
|
||||
[$1], [14], [],
|
||||
[$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])],
|
||||
[m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
|
||||
m4_if([$2], [], [],
|
||||
[$2], [ext], [],
|
||||
[$2], [noext], [],
|
||||
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
|
||||
m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
|
||||
[$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
|
||||
[$3], [optional], [ax_cxx_compile_cxx$1_required=false],
|
||||
[m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
|
||||
AC_LANG_PUSH([C++])dnl
|
||||
ac_success=no
|
||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
|
||||
ax_cv_cxx_compile_cxx$1,
|
||||
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
|
||||
[ax_cv_cxx_compile_cxx$1=yes],
|
||||
[ax_cv_cxx_compile_cxx$1=no])])
|
||||
if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
|
||||
ac_success=yes
|
||||
fi
|
||||
|
||||
m4_if([$2], [noext], [], [dnl
|
||||
if test x$ac_success = xno; then
|
||||
for switch in -std=gnu++$1 -std=gnu++0x; do
|
||||
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
|
||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
|
||||
$cachevar,
|
||||
[ac_save_CXXFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="$CXXFLAGS $switch"
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
|
||||
[eval $cachevar=yes],
|
||||
[eval $cachevar=no])
|
||||
CXXFLAGS="$ac_save_CXXFLAGS"])
|
||||
if eval test x\$$cachevar = xyes; then
|
||||
CXXFLAGS="$CXXFLAGS $switch"
|
||||
ac_success=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi])
|
||||
|
||||
m4_if([$2], [ext], [], [dnl
|
||||
if test x$ac_success = xno; then
|
||||
dnl HP's aCC needs +std=c++11 according to:
|
||||
dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
|
||||
dnl Cray's crayCC needs "-h std=c++11"
|
||||
for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do
|
||||
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
|
||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
|
||||
$cachevar,
|
||||
[ac_save_CXXFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="$CXXFLAGS $switch"
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
|
||||
[eval $cachevar=yes],
|
||||
[eval $cachevar=no])
|
||||
CXXFLAGS="$ac_save_CXXFLAGS"])
|
||||
if eval test x\$$cachevar = xyes; then
|
||||
CXXFLAGS="$CXXFLAGS $switch"
|
||||
ac_success=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi])
|
||||
AC_LANG_POP([C++])
|
||||
if test x$ax_cxx_compile_cxx$1_required = xtrue; then
|
||||
if test x$ac_success = xno; then
|
||||
AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
|
||||
fi
|
||||
else
|
||||
if test x$ac_success = xno; then
|
||||
HAVE_CXX$1=0
|
||||
AC_MSG_NOTICE([No compiler with C++$1 support was found])
|
||||
else
|
||||
HAVE_CXX$1=1
|
||||
AC_DEFINE(HAVE_CXX$1,1,
|
||||
[define if the compiler supports basic C++$1 syntax])
|
||||
fi
|
||||
|
||||
AC_SUBST(HAVE_CXX$1)
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl Test body for checking C++11 support
|
||||
|
||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
|
||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
|
||||
)
|
||||
|
||||
|
||||
dnl Test body for checking C++14 support
|
||||
|
||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
|
||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
|
||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
|
||||
)
|
||||
|
||||
|
||||
dnl Tests for new features in C++11
|
||||
|
||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
|
||||
|
||||
// If the compiler admits that it is not ready for C++11, why torture it?
|
||||
// Hopefully, this will speed up the test.
|
||||
|
||||
#ifndef __cplusplus
|
||||
|
||||
#error "This is not a C++ compiler"
|
||||
|
||||
#elif __cplusplus < 201103L
|
||||
|
||||
#error "This is not a C++11 compiler"
|
||||
|
||||
#else
|
||||
|
||||
namespace cxx11
|
||||
{
|
||||
|
||||
namespace test_static_assert
|
||||
{
|
||||
|
||||
template <typename T>
|
||||
struct check
|
||||
{
|
||||
static_assert(sizeof(int) <= sizeof(T), "not big enough");
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace test_final_override
|
||||
{
|
||||
|
||||
struct Base
|
||||
{
|
||||
virtual void f() {}
|
||||
};
|
||||
|
||||
struct Derived : public Base
|
||||
{
|
||||
virtual void f() override {}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace test_double_right_angle_brackets
|
||||
{
|
||||
|
||||
template < typename T >
|
||||
struct check {};
|
||||
|
||||
typedef check<void> single_type;
|
||||
typedef check<check<void>> double_type;
|
||||
typedef check<check<check<void>>> triple_type;
|
||||
typedef check<check<check<check<void>>>> quadruple_type;
|
||||
|
||||
}
|
||||
|
||||
namespace test_decltype
|
||||
{
|
||||
|
||||
int
|
||||
f()
|
||||
{
|
||||
int a = 1;
|
||||
decltype(a) b = 2;
|
||||
return a + b;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_type_deduction
|
||||
{
|
||||
|
||||
template < typename T1, typename T2 >
|
||||
struct is_same
|
||||
{
|
||||
static const bool value = false;
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
struct is_same<T, T>
|
||||
{
|
||||
static const bool value = true;
|
||||
};
|
||||
|
||||
template < typename T1, typename T2 >
|
||||
auto
|
||||
add(T1 a1, T2 a2) -> decltype(a1 + a2)
|
||||
{
|
||||
return a1 + a2;
|
||||
}
|
||||
|
||||
int
|
||||
test(const int c, volatile int v)
|
||||
{
|
||||
static_assert(is_same<int, decltype(0)>::value == true, "");
|
||||
static_assert(is_same<int, decltype(c)>::value == false, "");
|
||||
static_assert(is_same<int, decltype(v)>::value == false, "");
|
||||
auto ac = c;
|
||||
auto av = v;
|
||||
auto sumi = ac + av + 'x';
|
||||
auto sumf = ac + av + 1.0;
|
||||
static_assert(is_same<int, decltype(ac)>::value == true, "");
|
||||
static_assert(is_same<int, decltype(av)>::value == true, "");
|
||||
static_assert(is_same<int, decltype(sumi)>::value == true, "");
|
||||
static_assert(is_same<int, decltype(sumf)>::value == false, "");
|
||||
static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
|
||||
return (sumf > 0.0) ? sumi : add(c, v);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_noexcept
|
||||
{
|
||||
|
||||
int f() { return 0; }
|
||||
int g() noexcept { return 0; }
|
||||
|
||||
static_assert(noexcept(f()) == false, "");
|
||||
static_assert(noexcept(g()) == true, "");
|
||||
|
||||
}
|
||||
|
||||
namespace test_constexpr
|
||||
{
|
||||
|
||||
template < typename CharT >
|
||||
unsigned long constexpr
|
||||
strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
|
||||
{
|
||||
return *s ? strlen_c_r(s + 1, acc + 1) : acc;
|
||||
}
|
||||
|
||||
template < typename CharT >
|
||||
unsigned long constexpr
|
||||
strlen_c(const CharT *const s) noexcept
|
||||
{
|
||||
return strlen_c_r(s, 0UL);
|
||||
}
|
||||
|
||||
static_assert(strlen_c("") == 0UL, "");
|
||||
static_assert(strlen_c("1") == 1UL, "");
|
||||
static_assert(strlen_c("example") == 7UL, "");
|
||||
static_assert(strlen_c("another\0example") == 7UL, "");
|
||||
|
||||
}
|
||||
|
||||
namespace test_rvalue_references
|
||||
{
|
||||
|
||||
template < int N >
|
||||
struct answer
|
||||
{
|
||||
static constexpr int value = N;
|
||||
};
|
||||
|
||||
answer<1> f(int&) { return answer<1>(); }
|
||||
answer<2> f(const int&) { return answer<2>(); }
|
||||
answer<3> f(int&&) { return answer<3>(); }
|
||||
|
||||
void
|
||||
test()
|
||||
{
|
||||
int i = 0;
|
||||
const int c = 0;
|
||||
static_assert(decltype(f(i))::value == 1, "");
|
||||
static_assert(decltype(f(c))::value == 2, "");
|
||||
static_assert(decltype(f(0))::value == 3, "");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_uniform_initialization
|
||||
{
|
||||
|
||||
struct test
|
||||
{
|
||||
static const int zero {};
|
||||
static const int one {1};
|
||||
};
|
||||
|
||||
static_assert(test::zero == 0, "");
|
||||
static_assert(test::one == 1, "");
|
||||
|
||||
}
|
||||
|
||||
namespace test_lambdas
|
||||
{
|
||||
|
||||
void
|
||||
test1()
|
||||
{
|
||||
auto lambda1 = [](){};
|
||||
auto lambda2 = lambda1;
|
||||
lambda1();
|
||||
lambda2();
|
||||
}
|
||||
|
||||
int
|
||||
test2()
|
||||
{
|
||||
auto a = [](int i, int j){ return i + j; }(1, 2);
|
||||
auto b = []() -> int { return '0'; }();
|
||||
auto c = [=](){ return a + b; }();
|
||||
auto d = [&](){ return c; }();
|
||||
auto e = [a, &b](int x) mutable {
|
||||
const auto identity = [](int y){ return y; };
|
||||
for (auto i = 0; i < a; ++i)
|
||||
a += b--;
|
||||
return x + identity(a + b);
|
||||
}(0);
|
||||
return a + b + c + d + e;
|
||||
}
|
||||
|
||||
int
|
||||
test3()
|
||||
{
|
||||
const auto nullary = [](){ return 0; };
|
||||
const auto unary = [](int x){ return x; };
|
||||
using nullary_t = decltype(nullary);
|
||||
using unary_t = decltype(unary);
|
||||
const auto higher1st = [](nullary_t f){ return f(); };
|
||||
const auto higher2nd = [unary](nullary_t f1){
|
||||
return [unary, f1](unary_t f2){ return f2(unary(f1())); };
|
||||
};
|
||||
return higher1st(nullary) + higher2nd(nullary)(unary);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_variadic_templates
|
||||
{
|
||||
|
||||
template <int...>
|
||||
struct sum;
|
||||
|
||||
template <int N0, int... N1toN>
|
||||
struct sum<N0, N1toN...>
|
||||
{
|
||||
static constexpr auto value = N0 + sum<N1toN...>::value;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct sum<>
|
||||
{
|
||||
static constexpr auto value = 0;
|
||||
};
|
||||
|
||||
static_assert(sum<>::value == 0, "");
|
||||
static_assert(sum<1>::value == 1, "");
|
||||
static_assert(sum<23>::value == 23, "");
|
||||
static_assert(sum<1, 2>::value == 3, "");
|
||||
static_assert(sum<5, 5, 11>::value == 21, "");
|
||||
static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
|
||||
|
||||
}
|
||||
|
||||
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
|
||||
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
|
||||
// because of this.
|
||||
namespace test_template_alias_sfinae
|
||||
{
|
||||
|
||||
struct foo {};
|
||||
|
||||
template<typename T>
|
||||
using member = typename T::member_type;
|
||||
|
||||
template<typename T>
|
||||
void func(...) {}
|
||||
|
||||
template<typename T>
|
||||
void func(member<T>*) {}
|
||||
|
||||
void test();
|
||||
|
||||
void test() { func<foo>(0); }
|
||||
|
||||
}
|
||||
|
||||
} // namespace cxx11
|
||||
|
||||
#endif // __cplusplus >= 201103L
|
||||
|
||||
]])
|
||||
|
||||
|
||||
dnl Tests for new features in C++14
|
||||
|
||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
|
||||
|
||||
// If the compiler admits that it is not ready for C++14, why torture it?
|
||||
// Hopefully, this will speed up the test.
|
||||
|
||||
#ifndef __cplusplus
|
||||
|
||||
#error "This is not a C++ compiler"
|
||||
|
||||
#elif __cplusplus < 201402L
|
||||
|
||||
#error "This is not a C++14 compiler"
|
||||
|
||||
#else
|
||||
|
||||
namespace cxx14
|
||||
{
|
||||
|
||||
namespace test_polymorphic_lambdas
|
||||
{
|
||||
|
||||
int
|
||||
test()
|
||||
{
|
||||
const auto lambda = [](auto&&... args){
|
||||
const auto istiny = [](auto x){
|
||||
return (sizeof(x) == 1UL) ? 1 : 0;
|
||||
};
|
||||
const int aretiny[] = { istiny(args)... };
|
||||
return aretiny[0];
|
||||
};
|
||||
return lambda(1, 1L, 1.0f, '1');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_binary_literals
|
||||
{
|
||||
|
||||
constexpr auto ivii = 0b0000000000101010;
|
||||
static_assert(ivii == 42, "wrong value");
|
||||
|
||||
}
|
||||
|
||||
namespace test_generalized_constexpr
|
||||
{
|
||||
|
||||
template < typename CharT >
|
||||
constexpr unsigned long
|
||||
strlen_c(const CharT *const s) noexcept
|
||||
{
|
||||
auto length = 0UL;
|
||||
for (auto p = s; *p; ++p)
|
||||
++length;
|
||||
return length;
|
||||
}
|
||||
|
||||
static_assert(strlen_c("") == 0UL, "");
|
||||
static_assert(strlen_c("x") == 1UL, "");
|
||||
static_assert(strlen_c("test") == 4UL, "");
|
||||
static_assert(strlen_c("another\0test") == 7UL, "");
|
||||
|
||||
}
|
||||
|
||||
namespace test_lambda_init_capture
|
||||
{
|
||||
|
||||
int
|
||||
test()
|
||||
{
|
||||
auto x = 0;
|
||||
const auto lambda1 = [a = x](int b){ return a + b; };
|
||||
const auto lambda2 = [a = lambda1(x)](){ return a; };
|
||||
return lambda2();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace test_digit_seperators
|
||||
{
|
||||
|
||||
constexpr auto ten_million = 100'000'000;
|
||||
static_assert(ten_million == 100000000, "");
|
||||
|
||||
}
|
||||
|
||||
namespace test_return_type_deduction
|
||||
{
|
||||
|
||||
auto f(int& x) { return x; }
|
||||
decltype(auto) g(int& x) { return x; }
|
||||
|
||||
template < typename T1, typename T2 >
|
||||
struct is_same
|
||||
{
|
||||
static constexpr auto value = false;
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
struct is_same<T, T>
|
||||
{
|
||||
static constexpr auto value = true;
|
||||
};
|
||||
|
||||
int
|
||||
test()
|
||||
{
|
||||
auto x = 0;
|
||||
static_assert(is_same<int, decltype(f(x))>::value, "");
|
||||
static_assert(is_same<int&, decltype(g(x))>::value, "");
|
||||
return x;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace cxx14
|
||||
|
||||
#endif // __cplusplus >= 201402L
|
||||
|
||||
]])
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
# ============================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
|
||||
# ============================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CXX_COMPILE_STDCXX_11([ext|noext], [mandatory|optional])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check for baseline language coverage in the compiler for the C++11
|
||||
# standard; if necessary, add switches to CXXFLAGS to enable support.
|
||||
#
|
||||
# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX
|
||||
# macro with the version set to C++11. The two optional arguments are
|
||||
# forwarded literally as the second and third argument respectively.
|
||||
# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for
|
||||
# more information. If you want to use this macro, you also need to
|
||||
# download the ax_cxx_compile_stdcxx.m4 file.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
|
||||
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
|
||||
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
|
||||
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
|
||||
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
|
||||
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 14
|
||||
|
||||
include([ax_cxx_compile_stdcxx.m4])
|
||||
|
||||
AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [AX_CXX_COMPILE_STDCXX([11], [$1], [$2])])
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_define_dir.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_DEFINE_DIR(VARNAME, DIR [, DESCRIPTION])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro sets VARNAME to the expansion of the DIR variable, taking
|
||||
# care of fixing up ${prefix} and such.
|
||||
#
|
||||
# VARNAME is then offered as both an output variable and a C preprocessor
|
||||
# symbol.
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# AX_DEFINE_DIR([DATADIR], [datadir], [Where data are placed to.])
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Stepan Kasal <kasal@ucw.cz>
|
||||
# Copyright (c) 2008 Andreas Schwab <schwab@suse.de>
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2008 Alexandre Oliva
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 6
|
||||
|
||||
AU_ALIAS([AC_DEFINE_DIR], [AX_DEFINE_DIR])
|
||||
AC_DEFUN([AX_DEFINE_DIR], [
|
||||
prefix_NONE=
|
||||
exec_prefix_NONE=
|
||||
test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
|
||||
test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
|
||||
dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn
|
||||
dnl refers to ${prefix}. Thus we have to use `eval' twice.
|
||||
eval ax_define_dir="\"[$]$2\""
|
||||
eval ax_define_dir="\"$ax_define_dir\""
|
||||
AC_SUBST($1, "$ax_define_dir")
|
||||
AC_DEFINE_UNQUOTED($1, "$ax_define_dir", [$3])
|
||||
test "$prefix_NONE" && prefix=NONE
|
||||
test "$exec_prefix_NONE" && exec_prefix=NONE
|
||||
])
|
||||
317
m4/ax_pthread.m4
317
m4/ax_pthread.m4
|
|
@ -1,317 +0,0 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro figures out how to build C programs using POSIX threads. It
|
||||
# sets the PTHREAD_LIBS output variable to the threads library and linker
|
||||
# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
|
||||
# flags that are needed. (The user can also force certain compiler
|
||||
# flags/libs to be tested by setting these environment variables.)
|
||||
#
|
||||
# Also sets PTHREAD_CC to any special C compiler that is needed for
|
||||
# multi-threaded programs (defaults to the value of CC otherwise). (This
|
||||
# is necessary on AIX to use the special cc_r compiler alias.)
|
||||
#
|
||||
# NOTE: You are assumed to not only compile your program with these flags,
|
||||
# but also link it with them as well. e.g. you should link with
|
||||
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
|
||||
#
|
||||
# If you are only building threads programs, you may wish to use these
|
||||
# variables in your default LIBS, CFLAGS, and CC:
|
||||
#
|
||||
# LIBS="$PTHREAD_LIBS $LIBS"
|
||||
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
# CC="$PTHREAD_CC"
|
||||
#
|
||||
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
|
||||
# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
|
||||
# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
||||
#
|
||||
# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
|
||||
# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
|
||||
# PTHREAD_CFLAGS.
|
||||
#
|
||||
# ACTION-IF-FOUND is a list of shell commands to run if a threads library
|
||||
# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
|
||||
# is not found. If ACTION-IF-FOUND is not specified, the default action
|
||||
# will define HAVE_PTHREAD.
|
||||
#
|
||||
# Please let the authors know if this macro fails on any platform, or if
|
||||
# you have any other suggestions or comments. This macro was based on work
|
||||
# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
|
||||
# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
|
||||
# Alejandro Forero Cuervo to the autoconf macro repository. We are also
|
||||
# grateful for the helpful feedback of numerous users.
|
||||
#
|
||||
# Updated for Autoconf 2.68 by Daniel Richard G.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
|
||||
# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program 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 General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 20
|
||||
|
||||
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
|
||||
AC_DEFUN([AX_PTHREAD], [
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
AC_LANG_PUSH([C])
|
||||
ax_pthread_ok=no
|
||||
|
||||
# We used to check for pthread.h first, but this fails if pthread.h
|
||||
# requires special compiler flags (e.g. on True64 or Sequent).
|
||||
# It gets checked for in the link test anyway.
|
||||
|
||||
# First of all, check if the user has set any of the PTHREAD_LIBS,
|
||||
# etcetera environment variables, and if threads linking works using
|
||||
# them:
|
||||
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
|
||||
save_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
save_LIBS="$LIBS"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
|
||||
AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes)
|
||||
AC_MSG_RESULT($ax_pthread_ok)
|
||||
if test x"$ax_pthread_ok" = xno; then
|
||||
PTHREAD_LIBS=""
|
||||
PTHREAD_CFLAGS=""
|
||||
fi
|
||||
LIBS="$save_LIBS"
|
||||
CFLAGS="$save_CFLAGS"
|
||||
fi
|
||||
|
||||
# We must check for the threads library under a number of different
|
||||
# names; the ordering is very important because some systems
|
||||
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
|
||||
# libraries is broken (non-POSIX).
|
||||
|
||||
# Create a list of thread flags to try. Items starting with a "-" are
|
||||
# C compiler flags, and other items are library names, except for "none"
|
||||
# which indicates that we try without any flags at all, and "pthread-config"
|
||||
# which is a program returning the flags for the Pth emulation library.
|
||||
|
||||
ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
|
||||
|
||||
# The ordering *is* (sometimes) important. Some notes on the
|
||||
# individual items follow:
|
||||
|
||||
# pthreads: AIX (must check this before -lpthread)
|
||||
# none: in case threads are in libc; should be tried before -Kthread and
|
||||
# other compiler flags to prevent continual compiler warnings
|
||||
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
|
||||
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
|
||||
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
|
||||
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
|
||||
# -pthreads: Solaris/gcc
|
||||
# -mthreads: Mingw32/gcc, Lynx/gcc
|
||||
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
|
||||
# doesn't hurt to check since this sometimes defines pthreads too;
|
||||
# also defines -D_REENTRANT)
|
||||
# ... -mt is also the pthreads flag for HP/aCC
|
||||
# pthread: Linux, etcetera
|
||||
# --thread-safe: KAI C++
|
||||
# pthread-config: use pthread-config program (for GNU Pth library)
|
||||
|
||||
case ${host_os} in
|
||||
solaris*)
|
||||
|
||||
# On Solaris (at least, for some versions), libc contains stubbed
|
||||
# (non-functional) versions of the pthreads routines, so link-based
|
||||
# tests will erroneously succeed. (We need to link with -pthreads/-mt/
|
||||
# -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
|
||||
# a function called by this macro, so we could check for that, but
|
||||
# who knows whether they'll stub that too in a future libc.) So,
|
||||
# we'll just look for -pthreads and -lpthread first:
|
||||
|
||||
ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
|
||||
;;
|
||||
|
||||
darwin*)
|
||||
ax_pthread_flags="-pthread $ax_pthread_flags"
|
||||
;;
|
||||
esac
|
||||
|
||||
if test x"$ax_pthread_ok" = xno; then
|
||||
for flag in $ax_pthread_flags; do
|
||||
|
||||
case $flag in
|
||||
none)
|
||||
AC_MSG_CHECKING([whether pthreads work without any flags])
|
||||
;;
|
||||
|
||||
-*)
|
||||
AC_MSG_CHECKING([whether pthreads work with $flag])
|
||||
PTHREAD_CFLAGS="$flag"
|
||||
;;
|
||||
|
||||
pthread-config)
|
||||
AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no)
|
||||
if test x"$ax_pthread_config" = xno; then continue; fi
|
||||
PTHREAD_CFLAGS="`pthread-config --cflags`"
|
||||
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
|
||||
;;
|
||||
|
||||
*)
|
||||
AC_MSG_CHECKING([for the pthreads library -l$flag])
|
||||
PTHREAD_LIBS="-l$flag"
|
||||
;;
|
||||
esac
|
||||
|
||||
save_LIBS="$LIBS"
|
||||
save_CFLAGS="$CFLAGS"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
|
||||
# Check for various functions. We must include pthread.h,
|
||||
# since some functions may be macros. (On the Sequent, we
|
||||
# need a special flag -Kthread to make this header compile.)
|
||||
# We check for pthread_join because it is in -lpthread on IRIX
|
||||
# while pthread_create is in libc. We check for pthread_attr_init
|
||||
# due to DEC craziness with -lpthreads. We check for
|
||||
# pthread_cleanup_push because it is one of the few pthread
|
||||
# functions on Solaris that doesn't have a non-functional libc stub.
|
||||
# We try pthread_create on general principles.
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
|
||||
static void routine(void *a) { a = 0; }
|
||||
static void *start_routine(void *a) { return a; }],
|
||||
[pthread_t th; pthread_attr_t attr;
|
||||
pthread_create(&th, 0, start_routine, 0);
|
||||
pthread_join(th, 0);
|
||||
pthread_attr_init(&attr);
|
||||
pthread_cleanup_push(routine, 0);
|
||||
pthread_cleanup_pop(0) /* ; */])],
|
||||
[ax_pthread_ok=yes],
|
||||
[])
|
||||
|
||||
LIBS="$save_LIBS"
|
||||
CFLAGS="$save_CFLAGS"
|
||||
|
||||
AC_MSG_RESULT($ax_pthread_ok)
|
||||
if test "x$ax_pthread_ok" = xyes; then
|
||||
break;
|
||||
fi
|
||||
|
||||
PTHREAD_LIBS=""
|
||||
PTHREAD_CFLAGS=""
|
||||
done
|
||||
fi
|
||||
|
||||
# Various other checks:
|
||||
if test "x$ax_pthread_ok" = xyes; then
|
||||
save_LIBS="$LIBS"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
save_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
|
||||
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
|
||||
AC_MSG_CHECKING([for joinable pthread attribute])
|
||||
attr_name=unknown
|
||||
for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
|
||||
[int attr = $attr; return attr /* ; */])],
|
||||
[attr_name=$attr; break],
|
||||
[])
|
||||
done
|
||||
AC_MSG_RESULT($attr_name)
|
||||
if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
|
||||
AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
|
||||
[Define to necessary symbol if this constant
|
||||
uses a non-standard name on your system.])
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([if more special flags are required for pthreads])
|
||||
flag=no
|
||||
case ${host_os} in
|
||||
aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
|
||||
osf* | hpux*) flag="-D_REENTRANT";;
|
||||
solaris*)
|
||||
if test "$GCC" = "yes"; then
|
||||
flag="-D_REENTRANT"
|
||||
else
|
||||
flag="-mt -D_REENTRANT"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
AC_MSG_RESULT(${flag})
|
||||
if test "x$flag" != xno; then
|
||||
PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
|
||||
ax_cv_PTHREAD_PRIO_INHERIT, [
|
||||
AC_LINK_IFELSE([
|
||||
AC_LANG_PROGRAM([[#include <pthread.h>]], [[int i = PTHREAD_PRIO_INHERIT;]])],
|
||||
[ax_cv_PTHREAD_PRIO_INHERIT=yes],
|
||||
[ax_cv_PTHREAD_PRIO_INHERIT=no])
|
||||
])
|
||||
AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"],
|
||||
AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.]))
|
||||
|
||||
LIBS="$save_LIBS"
|
||||
CFLAGS="$save_CFLAGS"
|
||||
|
||||
# More AIX lossage: compile with *_r variant
|
||||
if test "x$GCC" != xyes; then
|
||||
case $host_os in
|
||||
aix*)
|
||||
AS_CASE(["x/$CC"],
|
||||
[x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
|
||||
[#handle absolute path differently from PATH based program lookup
|
||||
AS_CASE(["x$CC"],
|
||||
[x/*],
|
||||
[AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
|
||||
[AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
|
||||
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
|
||||
|
||||
AC_SUBST(PTHREAD_LIBS)
|
||||
AC_SUBST(PTHREAD_CFLAGS)
|
||||
AC_SUBST(PTHREAD_CC)
|
||||
|
||||
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
|
||||
if test x"$ax_pthread_ok" = xyes; then
|
||||
ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
|
||||
:
|
||||
else
|
||||
ax_pthread_ok=no
|
||||
$2
|
||||
fi
|
||||
AC_LANG_POP
|
||||
])dnl AX_PTHREAD
|
||||
76
m4/ax_tls.m4
76
m4/ax_tls.m4
|
|
@ -1,76 +0,0 @@
|
|||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_tls.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_TLS([action-if-found], [action-if-not-found])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Provides a test for the compiler support of thread local storage (TLS)
|
||||
# extensions. Defines TLS if it is found. Currently knows about GCC/ICC
|
||||
# and MSVC. I think SunPro uses the same as GCC, and Borland apparently
|
||||
# supports either.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Alan Woodland <ajw05@aber.ac.uk>
|
||||
# Copyright (c) 2010 Diego Elio Petteno` <flameeyes@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program 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 General Public License along
|
||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 10
|
||||
|
||||
AC_DEFUN([AX_TLS], [
|
||||
AC_MSG_CHECKING(for thread local storage (TLS) class)
|
||||
AC_CACHE_VAL(ac_cv_tls, [
|
||||
ax_tls_keywords="__thread __declspec(thread) none"
|
||||
for ax_tls_keyword in $ax_tls_keywords; do
|
||||
AS_CASE([$ax_tls_keyword],
|
||||
[none], [ac_cv_tls=none ; break],
|
||||
[AC_TRY_COMPILE(
|
||||
[#include <stdlib.h>
|
||||
static void
|
||||
foo(void) {
|
||||
static ] $ax_tls_keyword [ int bar;
|
||||
exit(1);
|
||||
}],
|
||||
[],
|
||||
[ac_cv_tls=$ax_tls_keyword ; break],
|
||||
ac_cv_tls=none
|
||||
)])
|
||||
done
|
||||
])
|
||||
AC_MSG_RESULT($ac_cv_tls)
|
||||
|
||||
AS_IF([test "$ac_cv_tls" != "none"],
|
||||
AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here])
|
||||
m4_ifnblank([$1], [$1]),
|
||||
m4_ifnblank([$2], [$2])
|
||||
)
|
||||
])
|
||||
69
m4/orc.m4
69
m4/orc.m4
|
|
@ -1,69 +0,0 @@
|
|||
dnl pkg-config-based checks for Orc
|
||||
|
||||
dnl specific:
|
||||
dnl ORC_CHECK([REQUIRED_VERSION])
|
||||
|
||||
AC_DEFUN([ORC_CHECK],
|
||||
[
|
||||
ORC_REQ=ifelse([$1], , "0.4.6", [$1])
|
||||
|
||||
AC_ARG_ENABLE(orc,
|
||||
AC_HELP_STRING([--enable-orc],[use Orc if installed]),
|
||||
[case "${enableval}" in
|
||||
auto) enable_orc=auto ;;
|
||||
yes) enable_orc=yes ;;
|
||||
no) enable_orc=no ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-orc) ;;
|
||||
esac
|
||||
],
|
||||
[enable_orc=auto]) dnl Default value
|
||||
|
||||
if test "x$enable_orc" != "xno" ; then
|
||||
PKG_CHECK_MODULES(ORC, orc-0.4 >= $ORC_REQ, [
|
||||
AC_DEFINE(HAVE_ORC, 1, [Use Orc])
|
||||
HAVE_ORC=yes
|
||||
if test "x$ORCC" = "x" ; then
|
||||
AC_MSG_CHECKING(for usable orcc)
|
||||
ORCC=`$PKG_CONFIG --variable=orcc orc-0.4`
|
||||
dnl check whether the orcc found by pkg-config can be run from the build environment
|
||||
dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH
|
||||
AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`])
|
||||
AC_MSG_RESULT($ORCC)
|
||||
fi
|
||||
AC_SUBST(ORCC)
|
||||
ORCC_FLAGS="--compat $ORC_REQ"
|
||||
AC_SUBST(ORCC_FLAGS)
|
||||
AS_IF([test "x$ORCC" = "x"], [HAVE_ORCC=no], [HAVE_ORCC=yes])
|
||||
], [
|
||||
if test "x$enable_orc" = "xyes" ; then
|
||||
AC_MSG_ERROR([--enable-orc specified, but Orc >= $ORC_REQ not found])
|
||||
fi
|
||||
AC_DEFINE(DISABLE_ORC, 1, [Disable Orc])
|
||||
HAVE_ORC=no
|
||||
HAVE_ORCC=no
|
||||
])
|
||||
else
|
||||
AC_DEFINE(DISABLE_ORC, 1, [Disable Orc])
|
||||
HAVE_ORC=no
|
||||
HAVE_ORCC=no
|
||||
fi
|
||||
AM_CONDITIONAL(HAVE_ORC, [test "x$HAVE_ORC" = "xyes"])
|
||||
AM_CONDITIONAL(HAVE_ORCC, [test "x$HAVE_ORCC" = "xyes"])
|
||||
|
||||
]))
|
||||
|
||||
AC_DEFUN([ORC_OUTPUT],
|
||||
[
|
||||
if test "$HAVE_ORC" = yes ; then
|
||||
printf "configure: *** Orc acceleration enabled.\n"
|
||||
else
|
||||
if test "x$enable_orc" = "xno" ; then
|
||||
printf "configure: *** Orc acceleration disabled by --disable-orc. Slower code paths\n"
|
||||
printf " will be used.\n"
|
||||
else
|
||||
printf "configure: *** Orc acceleration disabled. Requires Orc >= $ORC_REQ, which was\n"
|
||||
printf " not found. Slower code paths will be used.\n"
|
||||
fi
|
||||
fi
|
||||
printf "\n"
|
||||
])
|
||||
102
man/Makefile.am
102
man/Makefile.am
|
|
@ -1,102 +0,0 @@
|
|||
# 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 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
DISTCLEANFILES = \
|
||||
$(noinst_DATA)
|
||||
|
||||
noinst_DATA = \
|
||||
pulseaudio.1.xml \
|
||||
pax11publish.1.xml \
|
||||
pacat.1.xml \
|
||||
pacmd.1.xml \
|
||||
pactl.1.xml \
|
||||
pasuspender.1.xml \
|
||||
padsp.1.xml \
|
||||
pulse-daemon.conf.5.xml \
|
||||
pulse-client.conf.5.xml \
|
||||
default.pa.5.xml \
|
||||
pulse-cli-syntax.5.xml \
|
||||
start-pulseaudio-x11.1.xml
|
||||
|
||||
if HAVE_ESOUND
|
||||
noinst_DATA += esdcompat.1.xml
|
||||
endif
|
||||
|
||||
xmllint: $(noinst_DATA)
|
||||
for f in $(noinst_DATA) ; do \
|
||||
xmllint --noout --valid "$$f" || exit 1 ; \
|
||||
done
|
||||
|
||||
if BUILD_MANPAGES
|
||||
|
||||
dist_man_MANS = \
|
||||
pulseaudio.1 \
|
||||
pax11publish.1 \
|
||||
pacat.1 \
|
||||
pacmd.1 \
|
||||
pactl.1 \
|
||||
pasuspender.1 \
|
||||
padsp.1 \
|
||||
pulse-daemon.conf.5 \
|
||||
pulse-client.conf.5 \
|
||||
default.pa.5 \
|
||||
pulse-cli-syntax.5 \
|
||||
start-pulseaudio-x11.1
|
||||
|
||||
if HAVE_ESOUND
|
||||
dist_man_MANS += esdcompat.1
|
||||
endif
|
||||
CLEANFILES = \
|
||||
$(dist_man_MANS)
|
||||
|
||||
%: %.xml Makefile
|
||||
$(AM_V_GEN) perl $(srcdir)/xmltoman $< > $@ || rm -f $@
|
||||
|
||||
if OS_IS_WIN32
|
||||
SYMLINK_PROGRAM=cd $(DESTDIR)$(man1dir) && cp
|
||||
else
|
||||
SYMLINK_PROGRAM=ln -sf
|
||||
endif
|
||||
install-data-hook:
|
||||
$(SYMLINK_PROGRAM) pacat.1 $(DESTDIR)$(man1dir)/paplay.1
|
||||
$(SYMLINK_PROGRAM) pacat.1 $(DESTDIR)$(man1dir)/parec.1
|
||||
$(SYMLINK_PROGRAM) pacat.1 $(DESTDIR)$(man1dir)/parecord.1
|
||||
$(SYMLINK_PROGRAM) pacat.1 $(DESTDIR)$(man1dir)/pamon.1
|
||||
|
||||
uninstall-hook:
|
||||
rm -f $(DESTDIR)$(man1dir)/paplay.1
|
||||
rm -f $(DESTDIR)$(man1dir)/parec.1
|
||||
rm -f $(DESTDIR)$(man1dir)/parecord.1
|
||||
rm -f $(DESTDIR)$(man1dir)/pamon.1
|
||||
endif
|
||||
|
||||
EXTRA_DIST = \
|
||||
pulseaudio.1.xml.in \
|
||||
esdcompat.1.xml.in \
|
||||
pax11publish.1.xml.in \
|
||||
pacat.1.xml.in \
|
||||
pacmd.1.xml.in \
|
||||
pactl.1.xml.in \
|
||||
pasuspender.1.xml.in \
|
||||
padsp.1.xml.in \
|
||||
pulse-daemon.conf.5.xml.in \
|
||||
pulse-client.conf.5.xml.in \
|
||||
default.pa.5.xml.in \
|
||||
pulse-cli-syntax.5.xml.in \
|
||||
start-pulseaudio-x11.1.xml.in \
|
||||
xmltoman \
|
||||
xmltoman.css \
|
||||
xmltoman.xsl \
|
||||
xmltoman.dtd
|
||||
48
orc.mak
48
orc.mak
|
|
@ -1,48 +0,0 @@
|
|||
#
|
||||
# This is a Makefile.am fragment to build Orc code. It is based
|
||||
# on the orc.mak file distributed in the GStreamer common
|
||||
# repository.
|
||||
#
|
||||
# Include this file like this:
|
||||
#
|
||||
# include $(top_srcdir)/orc.mak
|
||||
#
|
||||
# For each Orc source file, append its name (without the extension)
|
||||
# to ORC_SOURCE:
|
||||
#
|
||||
# ORC_SOURCE += gstadderorc
|
||||
#
|
||||
# This will create gstadder-orc-gen.c and gstadder-orc-gen.h, which
|
||||
# you need to add to your nodist_module_SOURCES.
|
||||
#
|
||||
# Note that this file appends to BUILT_SOURCES and CLEANFILES, so
|
||||
# define them before including this file.
|
||||
#
|
||||
|
||||
|
||||
EXTRA_DIST += $(addsuffix .orc,$(ORC_SOURCE))
|
||||
|
||||
if HAVE_ORC
|
||||
ORC_BUILT_SOURCE = $(addsuffix -orc-gen.c,$(ORC_SOURCE))
|
||||
ORC_BUILT_HEADER = $(addsuffix -orc-gen.h,$(ORC_SOURCE))
|
||||
|
||||
BUILT_SOURCES += $(ORC_BUILT_SOURCE) $(ORC_BUILT_HEADER)
|
||||
CLEANFILES += $(BUILT_SOURCES)
|
||||
|
||||
|
||||
orcc_v_gen = $(orcc_v_gen_$(V))
|
||||
orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY))
|
||||
orcc_v_gen_0 = @echo " ORCC $@";
|
||||
|
||||
cp_v_gen = $(cp_v_gen_$(V))
|
||||
cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY))
|
||||
cp_v_gen_0 = @echo " CP $@";
|
||||
|
||||
%-orc-gen.c: %.orc
|
||||
@mkdir -p $(@D)
|
||||
$(orcc_v_gen)$(ORCC) --implementation -o $@ $<
|
||||
|
||||
%-orc-gen.h: %.orc
|
||||
@mkdir -p $(@D)
|
||||
$(orcc_v_gen)$(ORCC) --header -o $@ $<
|
||||
endif
|
||||
3
src/.gitignore
vendored
3
src/.gitignore
vendored
|
|
@ -14,7 +14,6 @@ daemon.conf
|
|||
default.pa
|
||||
echo-cancel-test
|
||||
esdcompat
|
||||
gconf-helper
|
||||
gsettings-helper
|
||||
org.freedesktop.pulseaudio.gschema.valid
|
||||
pacat
|
||||
|
|
@ -26,6 +25,7 @@ pasuspender
|
|||
pax11publish
|
||||
pulseaudio
|
||||
pulseaudio.service
|
||||
pulseaudio-x11.service
|
||||
start-pulseaudio-x11
|
||||
*-orc-gen.[ch]
|
||||
# tests
|
||||
|
|
@ -49,6 +49,7 @@ flist-test
|
|||
format-test
|
||||
get-binary-name-test
|
||||
gtk-test
|
||||
hashmap-test
|
||||
hook-list-test
|
||||
interpol-test
|
||||
ipacl-test
|
||||
|
|
|
|||
2309
src/Makefile.am
2309
src/Makefile.am
File diff suppressed because it is too large
Load diff
|
|
@ -1 +0,0 @@
|
|||
../modules/Makefile
|
||||
392
src/map-file
392
src/map-file
|
|
@ -1,392 +0,0 @@
|
|||
PULSE_0 {
|
||||
global:
|
||||
pa_ascii_filter;
|
||||
pa_ascii_valid;
|
||||
pa_bytes_per_second;
|
||||
pa_bytes_snprint;
|
||||
pa_bytes_to_usec;
|
||||
pa_channel_map_can_balance;
|
||||
pa_channel_map_can_fade;
|
||||
pa_channel_map_can_lfe_balance;
|
||||
pa_channel_map_compatible;
|
||||
pa_channel_map_equal;
|
||||
pa_channel_map_has_position;
|
||||
pa_channel_map_init;
|
||||
pa_channel_map_init_auto;
|
||||
pa_channel_map_init_extend;
|
||||
pa_channel_map_init_mono;
|
||||
pa_channel_map_init_stereo;
|
||||
pa_channel_map_mask;
|
||||
pa_channel_map_parse;
|
||||
pa_channel_map_snprint;
|
||||
pa_channel_map_superset;
|
||||
pa_channel_map_to_name;
|
||||
pa_channel_map_to_pretty_name;
|
||||
pa_channel_map_valid;
|
||||
pa_channel_position_from_string;
|
||||
pa_channel_position_to_pretty_string;
|
||||
pa_channel_position_to_string;
|
||||
pa_channels_valid;
|
||||
pa_context_add_autoload;
|
||||
pa_context_connect;
|
||||
pa_context_disconnect;
|
||||
pa_context_drain;
|
||||
pa_context_errno;
|
||||
pa_context_exit_daemon;
|
||||
pa_context_get_autoload_info_by_index;
|
||||
pa_context_get_autoload_info_by_name;
|
||||
pa_context_get_autoload_info_list;
|
||||
pa_context_get_card_info_by_index;
|
||||
pa_context_get_card_info_by_name;
|
||||
pa_context_get_card_info_list;
|
||||
pa_context_get_client_info;
|
||||
pa_context_get_client_info_list;
|
||||
pa_context_get_index;
|
||||
pa_context_get_module_info;
|
||||
pa_context_get_module_info_list;
|
||||
pa_context_get_protocol_version;
|
||||
pa_context_get_sample_info_by_index;
|
||||
pa_context_get_sample_info_by_name;
|
||||
pa_context_get_sample_info_list;
|
||||
pa_context_get_server;
|
||||
pa_context_get_server_info;
|
||||
pa_context_get_server_protocol_version;
|
||||
pa_context_get_sink_info_by_index;
|
||||
pa_context_get_sink_info_by_name;
|
||||
pa_context_get_sink_info_list;
|
||||
pa_context_get_sink_input_info;
|
||||
pa_context_get_sink_input_info_list;
|
||||
pa_context_get_source_info_by_index;
|
||||
pa_context_get_source_info_by_name;
|
||||
pa_context_get_source_info_list;
|
||||
pa_context_get_source_output_info;
|
||||
pa_context_get_source_output_info_list;
|
||||
pa_context_set_port_latency_offset;
|
||||
pa_context_get_state;
|
||||
pa_context_get_tile_size;
|
||||
pa_context_is_local;
|
||||
pa_context_is_pending;
|
||||
pa_context_kill_client;
|
||||
pa_context_kill_sink_input;
|
||||
pa_context_kill_source_output;
|
||||
pa_context_load_cookie_from_file;
|
||||
pa_context_load_module;
|
||||
pa_context_move_sink_input_by_index;
|
||||
pa_context_move_sink_input_by_name;
|
||||
pa_context_move_source_output_by_index;
|
||||
pa_context_move_source_output_by_name;
|
||||
pa_context_new;
|
||||
pa_context_new_with_proplist;
|
||||
pa_context_play_sample;
|
||||
pa_context_play_sample_with_proplist;
|
||||
pa_context_proplist_remove;
|
||||
pa_context_proplist_update;
|
||||
pa_context_ref;
|
||||
pa_context_remove_autoload_by_index;
|
||||
pa_context_remove_autoload_by_name;
|
||||
pa_context_remove_sample;
|
||||
pa_context_rttime_new;
|
||||
pa_context_rttime_restart;
|
||||
pa_context_set_card_profile_by_index;
|
||||
pa_context_set_card_profile_by_name;
|
||||
pa_context_set_default_sink;
|
||||
pa_context_set_default_source;
|
||||
pa_context_set_event_callback;
|
||||
pa_context_set_name;
|
||||
pa_context_set_sink_input_mute;
|
||||
pa_context_set_sink_input_volume;
|
||||
pa_context_set_sink_mute_by_index;
|
||||
pa_context_set_sink_mute_by_name;
|
||||
pa_context_set_sink_port_by_index;
|
||||
pa_context_set_sink_port_by_name;
|
||||
pa_context_set_sink_volume_by_index;
|
||||
pa_context_set_sink_volume_by_name;
|
||||
pa_context_set_source_output_mute;
|
||||
pa_context_set_source_output_volume;
|
||||
pa_context_set_source_mute_by_index;
|
||||
pa_context_set_source_mute_by_name;
|
||||
pa_context_set_source_port_by_index;
|
||||
pa_context_set_source_port_by_name;
|
||||
pa_context_set_source_volume_by_index;
|
||||
pa_context_set_source_volume_by_name;
|
||||
pa_context_set_state_callback;
|
||||
pa_context_set_subscribe_callback;
|
||||
pa_context_stat;
|
||||
pa_context_subscribe;
|
||||
pa_context_suspend_sink_by_index;
|
||||
pa_context_suspend_sink_by_name;
|
||||
pa_context_suspend_source_by_index;
|
||||
pa_context_suspend_source_by_name;
|
||||
pa_context_unload_module;
|
||||
pa_context_unref;
|
||||
pa_cvolume_avg;
|
||||
pa_cvolume_avg_mask;
|
||||
pa_cvolume_channels_equal_to;
|
||||
pa_cvolume_compatible;
|
||||
pa_cvolume_compatible_with_channel_map;
|
||||
pa_cvolume_dec;
|
||||
pa_cvolume_equal;
|
||||
pa_cvolume_get_balance;
|
||||
pa_cvolume_get_fade;
|
||||
pa_cvolume_get_lfe_balance;
|
||||
pa_cvolume_get_position;
|
||||
pa_cvolume_inc;
|
||||
pa_cvolume_inc_clamp;
|
||||
pa_cvolume_init;
|
||||
pa_cvolume_max;
|
||||
pa_cvolume_max_mask;
|
||||
pa_cvolume_merge;
|
||||
pa_cvolume_min;
|
||||
pa_cvolume_min_mask;
|
||||
pa_cvolume_remap;
|
||||
pa_cvolume_scale;
|
||||
pa_cvolume_scale_mask;
|
||||
pa_cvolume_set;
|
||||
pa_cvolume_set_balance;
|
||||
pa_cvolume_set_fade;
|
||||
pa_cvolume_set_lfe_balance;
|
||||
pa_cvolume_set_position;
|
||||
pa_cvolume_snprint;
|
||||
pa_cvolume_snprint_verbose;
|
||||
pa_cvolume_valid;
|
||||
pa_direction_to_string;
|
||||
pa_direction_valid;
|
||||
pa_encoding_from_string;
|
||||
pa_encoding_to_string;
|
||||
pa_ext_device_manager_delete;
|
||||
pa_ext_device_manager_enable_role_device_priority_routing;
|
||||
pa_ext_device_manager_read;
|
||||
pa_ext_device_manager_reorder_devices_for_role;
|
||||
pa_ext_device_manager_set_device_description;
|
||||
pa_ext_device_manager_set_subscribe_cb;
|
||||
pa_ext_device_manager_subscribe;
|
||||
pa_ext_device_manager_test;
|
||||
pa_ext_device_restore_read_formats;
|
||||
pa_ext_device_restore_read_formats_all;
|
||||
pa_ext_device_restore_save_formats;
|
||||
pa_ext_device_restore_set_subscribe_cb;
|
||||
pa_ext_device_restore_subscribe;
|
||||
pa_ext_device_restore_test;
|
||||
pa_ext_stream_restore_delete;
|
||||
pa_ext_stream_restore_read;
|
||||
pa_ext_stream_restore_set_subscribe_cb;
|
||||
pa_ext_stream_restore_subscribe;
|
||||
pa_ext_stream_restore_test;
|
||||
pa_ext_stream_restore_write;
|
||||
pa_format_info_copy;
|
||||
pa_format_info_free;
|
||||
pa_format_info_from_string;
|
||||
pa_format_info_from_sample_spec;
|
||||
pa_format_info_get_channel_map;
|
||||
pa_format_info_get_channels;
|
||||
pa_format_info_get_prop_type;
|
||||
pa_format_info_get_prop_int;
|
||||
pa_format_info_get_prop_int_range;
|
||||
pa_format_info_get_prop_int_array;
|
||||
pa_format_info_get_prop_string;
|
||||
pa_format_info_get_prop_string_array;
|
||||
pa_format_info_get_rate;
|
||||
pa_format_info_get_sample_format;
|
||||
pa_format_info_free_string_array;
|
||||
pa_format_info_is_compatible;
|
||||
pa_format_info_is_pcm;
|
||||
pa_format_info_new;
|
||||
pa_format_info_set_channel_map;
|
||||
pa_format_info_set_channels;
|
||||
pa_format_info_set_prop_int;
|
||||
pa_format_info_set_prop_int_array;
|
||||
pa_format_info_set_prop_int_range;
|
||||
pa_format_info_set_prop_string;
|
||||
pa_format_info_set_prop_string_array;
|
||||
pa_format_info_set_rate;
|
||||
pa_format_info_set_sample_format;
|
||||
pa_format_info_snprint;
|
||||
pa_format_info_to_sample_spec;
|
||||
pa_format_info_valid;
|
||||
pa_frame_size;
|
||||
pa_get_binary_name;
|
||||
pa_get_fqdn;
|
||||
pa_get_home_dir;
|
||||
pa_get_host_name;
|
||||
pa_get_library_version;
|
||||
pa_gettimeofday;
|
||||
pa_get_user_name;
|
||||
pa_glib_mainloop_free;
|
||||
pa_glib_mainloop_get_api;
|
||||
pa_glib_mainloop_new;
|
||||
pa_locale_to_utf8;
|
||||
pa_mainloop_api_once;
|
||||
pa_mainloop_dispatch;
|
||||
pa_mainloop_free;
|
||||
pa_mainloop_get_api;
|
||||
pa_mainloop_get_retval;
|
||||
pa_mainloop_iterate;
|
||||
pa_mainloop_new;
|
||||
pa_mainloop_poll;
|
||||
pa_mainloop_prepare;
|
||||
pa_mainloop_quit;
|
||||
pa_mainloop_run;
|
||||
pa_mainloop_set_poll_func;
|
||||
pa_mainloop_wakeup;
|
||||
pa_msleep;
|
||||
pa_thread_make_realtime;
|
||||
pa_operation_cancel;
|
||||
pa_operation_get_state;
|
||||
pa_operation_ref;
|
||||
pa_operation_set_state_callback;
|
||||
pa_operation_unref;
|
||||
pa_parse_sample_format;
|
||||
pa_path_get_filename;
|
||||
pa_proplist_clear;
|
||||
pa_proplist_contains;
|
||||
pa_proplist_copy;
|
||||
pa_proplist_equal;
|
||||
pa_proplist_free;
|
||||
pa_proplist_from_string;
|
||||
pa_proplist_get;
|
||||
pa_proplist_gets;
|
||||
pa_proplist_isempty;
|
||||
pa_proplist_iterate;
|
||||
pa_proplist_key_valid;
|
||||
pa_proplist_new;
|
||||
pa_proplist_set;
|
||||
pa_proplist_setf;
|
||||
pa_proplist_setp;
|
||||
pa_proplist_sets;
|
||||
pa_proplist_size;
|
||||
pa_proplist_to_string;
|
||||
pa_proplist_to_string_sep;
|
||||
pa_proplist_unset;
|
||||
pa_proplist_unset_many;
|
||||
pa_proplist_update;
|
||||
pa_rtclock_now;
|
||||
pa_sample_format_is_be;
|
||||
pa_sample_format_is_le;
|
||||
pa_sample_format_to_string;
|
||||
pa_sample_format_valid;
|
||||
pa_sample_rate_valid;
|
||||
pa_sample_size;
|
||||
pa_sample_size_of_format;
|
||||
pa_sample_spec_equal;
|
||||
pa_sample_spec_init;
|
||||
pa_sample_spec_snprint;
|
||||
pa_sample_spec_valid;
|
||||
pa_signal_done;
|
||||
pa_signal_free;
|
||||
pa_signal_init;
|
||||
pa_signal_new;
|
||||
pa_signal_set_destroy;
|
||||
pa_simple_drain;
|
||||
pa_simple_flush;
|
||||
pa_simple_free;
|
||||
pa_simple_get_latency;
|
||||
pa_simple_new;
|
||||
pa_simple_read;
|
||||
pa_simple_write;
|
||||
pa_stream_begin_write;
|
||||
pa_stream_cancel_write;
|
||||
pa_stream_connect_playback;
|
||||
pa_stream_connect_record;
|
||||
pa_stream_connect_upload;
|
||||
pa_stream_cork;
|
||||
pa_stream_disconnect;
|
||||
pa_stream_drain;
|
||||
pa_stream_drop;
|
||||
pa_stream_finish_upload;
|
||||
pa_stream_flush;
|
||||
pa_stream_get_buffer_attr;
|
||||
pa_stream_get_channel_map;
|
||||
pa_stream_get_context;
|
||||
pa_stream_get_device_index;
|
||||
pa_stream_get_device_name;
|
||||
pa_stream_get_format_info;
|
||||
pa_stream_get_index;
|
||||
pa_stream_get_latency;
|
||||
pa_stream_get_monitor_stream;
|
||||
pa_stream_get_sample_spec;
|
||||
pa_stream_get_state;
|
||||
pa_stream_get_time;
|
||||
pa_stream_get_timing_info;
|
||||
pa_stream_get_underflow_index;
|
||||
pa_stream_is_corked;
|
||||
pa_stream_is_suspended;
|
||||
pa_stream_new;
|
||||
pa_stream_new_extended;
|
||||
pa_stream_new_with_proplist;
|
||||
pa_stream_peek;
|
||||
pa_stream_prebuf;
|
||||
pa_stream_proplist_remove;
|
||||
pa_stream_proplist_update;
|
||||
pa_stream_readable_size;
|
||||
pa_stream_ref;
|
||||
pa_stream_set_buffer_attr;
|
||||
pa_stream_set_buffer_attr_callback;
|
||||
pa_stream_set_event_callback;
|
||||
pa_stream_set_latency_update_callback;
|
||||
pa_stream_set_monitor_stream;
|
||||
pa_stream_set_moved_callback;
|
||||
pa_stream_set_name;
|
||||
pa_stream_set_overflow_callback;
|
||||
pa_stream_set_read_callback;
|
||||
pa_stream_set_started_callback;
|
||||
pa_stream_set_state_callback;
|
||||
pa_stream_set_suspended_callback;
|
||||
pa_stream_set_underflow_callback;
|
||||
pa_stream_set_write_callback;
|
||||
pa_stream_trigger;
|
||||
pa_stream_unref;
|
||||
pa_stream_update_sample_rate;
|
||||
pa_stream_update_timing_info;
|
||||
pa_stream_writable_size;
|
||||
pa_stream_write;
|
||||
pa_stream_write_ext_free;
|
||||
pa_strerror;
|
||||
pa_sw_cvolume_divide;
|
||||
pa_sw_cvolume_divide_scalar;
|
||||
pa_sw_cvolume_multiply;
|
||||
pa_sw_cvolume_multiply_scalar;
|
||||
pa_sw_cvolume_snprint_dB;
|
||||
pa_sw_volume_divide;
|
||||
pa_sw_volume_from_dB;
|
||||
pa_sw_volume_from_linear;
|
||||
pa_sw_volume_multiply;
|
||||
pa_sw_volume_snprint_dB;
|
||||
pa_sw_volume_to_dB;
|
||||
pa_sw_volume_to_linear;
|
||||
pa_threaded_mainloop_accept;
|
||||
pa_threaded_mainloop_free;
|
||||
pa_threaded_mainloop_get_api;
|
||||
pa_threaded_mainloop_get_retval;
|
||||
pa_threaded_mainloop_in_thread;
|
||||
pa_threaded_mainloop_lock;
|
||||
pa_threaded_mainloop_new;
|
||||
pa_threaded_mainloop_once_unlocked;
|
||||
pa_threaded_mainloop_set_name;
|
||||
pa_threaded_mainloop_signal;
|
||||
pa_threaded_mainloop_start;
|
||||
pa_threaded_mainloop_stop;
|
||||
pa_threaded_mainloop_unlock;
|
||||
pa_threaded_mainloop_wait;
|
||||
pa_timeval_add;
|
||||
pa_timeval_age;
|
||||
pa_timeval_cmp;
|
||||
pa_timeval_diff;
|
||||
pa_timeval_load;
|
||||
pa_timeval_store;
|
||||
pa_timeval_sub;
|
||||
pa_usec_to_bytes;
|
||||
pa_utf8_filter;
|
||||
pa_utf8_to_locale;
|
||||
pa_utf8_valid;
|
||||
pa_volume_snprint;
|
||||
pa_volume_snprint_verbose;
|
||||
pa_xfree;
|
||||
pa_xmalloc;
|
||||
pa_xmalloc0;
|
||||
pa_xmemdup;
|
||||
pa_xrealloc;
|
||||
pa_xstrdup;
|
||||
pa_xstrndup;
|
||||
local:
|
||||
*;
|
||||
};
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
all:
|
||||
$(MAKE) -C ..
|
||||
|
||||
clean:
|
||||
$(MAKE) -C .. clean
|
||||
|
||||
.PHONY: all clean
|
||||
|
|
@ -1,133 +0,0 @@
|
|||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
Copyright 2006 Lennart Poettering
|
||||
|
||||
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, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <gconf/gconf-client.h>
|
||||
#include <glib.h>
|
||||
|
||||
#include <pulsecore/core-util.h>
|
||||
|
||||
#define PA_GCONF_ROOT "/system/pulseaudio"
|
||||
#define PA_GCONF_PATH_MODULES PA_GCONF_ROOT"/modules"
|
||||
|
||||
static void handle_module(GConfClient *client, const char *name) {
|
||||
gchar p[1024];
|
||||
gboolean enabled, locked;
|
||||
int i;
|
||||
|
||||
pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/locked", name);
|
||||
locked = gconf_client_get_bool(client, p, FALSE);
|
||||
|
||||
if (locked)
|
||||
return;
|
||||
|
||||
pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/enabled", name);
|
||||
enabled = gconf_client_get_bool(client, p, FALSE);
|
||||
|
||||
printf("%c%s%c", enabled ? '+' : '-', name, 0);
|
||||
|
||||
if (enabled) {
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
gchar *n, *a;
|
||||
|
||||
pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/name%i", name, i);
|
||||
if (!(n = gconf_client_get_string(client, p, NULL)) || !*n)
|
||||
break;
|
||||
|
||||
pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/args%i", name, i);
|
||||
a = gconf_client_get_string(client, p, NULL);
|
||||
|
||||
printf("%s%c%s%c", n, 0, a ? a : "", 0);
|
||||
|
||||
g_free(n);
|
||||
g_free(a);
|
||||
}
|
||||
|
||||
printf("%c", 0);
|
||||
}
|
||||
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
static void modules_callback(
|
||||
GConfClient* client,
|
||||
guint cnxn_id,
|
||||
GConfEntry *entry,
|
||||
gpointer user_data) {
|
||||
|
||||
const char *n;
|
||||
char buf[128];
|
||||
|
||||
g_assert(strncmp(entry->key, PA_GCONF_PATH_MODULES"/", sizeof(PA_GCONF_PATH_MODULES)) == 0);
|
||||
|
||||
n = entry->key + sizeof(PA_GCONF_PATH_MODULES);
|
||||
|
||||
g_strlcpy(buf, n, sizeof(buf));
|
||||
buf[strcspn(buf, "/")] = 0;
|
||||
|
||||
handle_module(client, buf);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
GMainLoop *g;
|
||||
GConfClient *client;
|
||||
GSList *modules, *m;
|
||||
|
||||
#if !GLIB_CHECK_VERSION(2,36,0)
|
||||
g_type_init();
|
||||
#endif
|
||||
|
||||
if (!(client = gconf_client_get_default()))
|
||||
goto fail;
|
||||
|
||||
gconf_client_add_dir(client, PA_GCONF_ROOT, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
|
||||
gconf_client_notify_add(client, PA_GCONF_PATH_MODULES, modules_callback, NULL, NULL, NULL);
|
||||
|
||||
modules = gconf_client_all_dirs(client, PA_GCONF_PATH_MODULES, NULL);
|
||||
|
||||
for (m = modules; m; m = m->next) {
|
||||
char *e = strrchr(m->data, '/');
|
||||
handle_module(client, e ? e+1 : m->data);
|
||||
}
|
||||
|
||||
g_slist_free(modules);
|
||||
|
||||
/* Signal the parent that we are now initialized */
|
||||
printf("!");
|
||||
fflush(stdout);
|
||||
|
||||
g = g_main_loop_new(NULL, FALSE);
|
||||
g_main_loop_run(g);
|
||||
g_main_loop_unref(g);
|
||||
|
||||
g_object_unref(G_OBJECT(client));
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -1,114 +0,0 @@
|
|||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
Copyright 2006 Lennart Poettering
|
||||
|
||||
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, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <pulsecore/core-error.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/start-child.h>
|
||||
|
||||
#include "../stdin-util.h"
|
||||
|
||||
PA_MODULE_AUTHOR("Lennart Poettering");
|
||||
PA_MODULE_DESCRIPTION("GConf Adapter");
|
||||
PA_MODULE_VERSION(PACKAGE_VERSION);
|
||||
PA_MODULE_LOAD_ONCE(true);
|
||||
|
||||
int pa__init(pa_module*m) {
|
||||
struct userdata *u;
|
||||
int r;
|
||||
|
||||
u = pa_xnew(struct userdata, 1);
|
||||
u->core = m->core;
|
||||
u->module = m;
|
||||
m->userdata = u;
|
||||
u->module_infos = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) module_info_free);
|
||||
u->pid = (pid_t) -1;
|
||||
u->fd = -1;
|
||||
u->fd_type = 0;
|
||||
u->io_event = NULL;
|
||||
u->buf_fill = 0;
|
||||
|
||||
if ((u->fd = pa_start_child_for_read(
|
||||
#if defined(__linux__) && defined(HAVE_RUNNING_FROM_BUILD_TREE)
|
||||
pa_run_from_build_tree() ? PA_BUILDDIR "/gconf-helper" :
|
||||
#endif
|
||||
PA_GCONF_HELPER, NULL, &u->pid)) < 0)
|
||||
goto fail;
|
||||
|
||||
u->io_event = m->core->mainloop->io_new(
|
||||
m->core->mainloop,
|
||||
u->fd,
|
||||
PA_IO_EVENT_INPUT,
|
||||
io_event_cb,
|
||||
u);
|
||||
|
||||
do {
|
||||
if ((r = handle_event(u)) < 0)
|
||||
goto fail;
|
||||
|
||||
/* Read until the client signalled us that it is ready with
|
||||
* initialization */
|
||||
} while (r != 1);
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
pa__done(m);
|
||||
return -1;
|
||||
}
|
||||
|
||||
void pa__done(pa_module*m) {
|
||||
struct userdata *u;
|
||||
|
||||
pa_assert(m);
|
||||
|
||||
if (!(u = m->userdata))
|
||||
return;
|
||||
|
||||
if (u->pid != (pid_t) -1) {
|
||||
kill(u->pid, SIGTERM);
|
||||
|
||||
for (;;) {
|
||||
if (waitpid(u->pid, NULL, 0) >= 0)
|
||||
break;
|
||||
|
||||
if (errno != EINTR) {
|
||||
pa_log("waitpid() failed: %s", pa_cstrerror(errno));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (u->io_event)
|
||||
m->core->mainloop->io_free(u->io_event);
|
||||
|
||||
if (u->fd >= 0)
|
||||
pa_close(u->fd);
|
||||
|
||||
if (u->module_infos)
|
||||
pa_hashmap_free(u->module_infos);
|
||||
|
||||
pa_xfree(u);
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
../modules/Makefile
|
||||
614
src/pulse/json.c
614
src/pulse/json.c
|
|
@ -1,614 +0,0 @@
|
|||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
Copyright 2016 Arun Raghavan <mail@arunraghavan.net>
|
||||
|
||||
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, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include <pulse/json.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/hashmap.h>
|
||||
#include <pulsecore/strbuf.h>
|
||||
|
||||
#define MAX_NESTING_DEPTH 20 /* Arbitrary number to make sure we don't have a stack overflow */
|
||||
|
||||
struct pa_json_object {
|
||||
pa_json_type type;
|
||||
|
||||
union {
|
||||
int int_value;
|
||||
double double_value;
|
||||
bool bool_value;
|
||||
char *string_value;
|
||||
pa_hashmap *object_values; /* name -> object */
|
||||
pa_idxset *array_values; /* objects */
|
||||
};
|
||||
};
|
||||
|
||||
static const char* parse_value(const char *str, const char *end, pa_json_object **obj, unsigned int depth);
|
||||
|
||||
static pa_json_object* json_object_new(void) {
|
||||
pa_json_object *obj;
|
||||
|
||||
obj = pa_xnew0(pa_json_object, 1);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
static bool is_whitespace(char c) {
|
||||
return c == '\t' || c == '\n' || c == '\r' || c == ' ';
|
||||
}
|
||||
|
||||
static bool is_digit(char c) {
|
||||
return c >= '0' && c <= '9';
|
||||
}
|
||||
|
||||
static bool is_end(const char c, const char *end) {
|
||||
if (!end)
|
||||
return c == '\0';
|
||||
else {
|
||||
while (*end) {
|
||||
if (c == *end)
|
||||
return true;
|
||||
end++;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static const char* consume_string(const char *str, const char *expect) {
|
||||
while (*expect) {
|
||||
if (*str != *expect)
|
||||
return NULL;
|
||||
|
||||
str++;
|
||||
expect++;
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
static const char* parse_null(const char *str, pa_json_object *obj) {
|
||||
str = consume_string(str, "null");
|
||||
|
||||
if (str)
|
||||
obj->type = PA_JSON_TYPE_NULL;
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
static const char* parse_boolean(const char *str, pa_json_object *obj) {
|
||||
const char *tmp;
|
||||
|
||||
tmp = consume_string(str, "true");
|
||||
|
||||
if (tmp) {
|
||||
obj->type = PA_JSON_TYPE_BOOL;
|
||||
obj->bool_value = true;
|
||||
} else {
|
||||
tmp = consume_string(str, "false");
|
||||
|
||||
if (str) {
|
||||
obj->type = PA_JSON_TYPE_BOOL;
|
||||
obj->bool_value = false;
|
||||
}
|
||||
}
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
static const char* parse_string(const char *str, pa_json_object *obj) {
|
||||
pa_strbuf *buf = pa_strbuf_new();
|
||||
|
||||
str++; /* Consume leading '"' */
|
||||
|
||||
while (*str && *str != '"') {
|
||||
if (*str != '\\') {
|
||||
/* We only accept ASCII printable characters. */
|
||||
if (*str < 0x20 || *str > 0x7E) {
|
||||
pa_log("Invalid non-ASCII character: 0x%x", (unsigned int) *str);
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Normal character, juts consume */
|
||||
pa_strbuf_putc(buf, *str);
|
||||
} else {
|
||||
/* Need to unescape */
|
||||
str++;
|
||||
|
||||
switch (*str) {
|
||||
case '"':
|
||||
case '\\':
|
||||
case '/':
|
||||
pa_strbuf_putc(buf, *str);
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
pa_strbuf_putc(buf, '\b' /* backspace */);
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
pa_strbuf_putc(buf, '\f' /* form feed */);
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
pa_strbuf_putc(buf, '\n' /* new line */);
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
pa_strbuf_putc(buf, '\r' /* carriage return */);
|
||||
break;
|
||||
|
||||
case 't':
|
||||
pa_strbuf_putc(buf, '\t' /* horizontal tab */);
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
pa_log("Unicode code points are currently unsupported");
|
||||
goto error;
|
||||
|
||||
default:
|
||||
pa_log("Unexepcted escape value: %c", *str);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
str++;
|
||||
}
|
||||
|
||||
if (*str != '"') {
|
||||
pa_log("Failed to parse remainder of string: %s", str);
|
||||
goto error;
|
||||
}
|
||||
|
||||
str++;
|
||||
|
||||
obj->type = PA_JSON_TYPE_STRING;
|
||||
obj->string_value = pa_strbuf_to_string_free(buf);
|
||||
|
||||
return str;
|
||||
|
||||
error:
|
||||
pa_strbuf_free(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char* parse_number(const char *str, pa_json_object *obj) {
|
||||
bool negative = false, has_fraction = false, has_exponent = false, valid = false;
|
||||
unsigned int integer = 0;
|
||||
unsigned int fraction = 0;
|
||||
unsigned int fraction_digits = 0;
|
||||
int exponent = 0;
|
||||
|
||||
if (*str == '-') {
|
||||
negative = true;
|
||||
str++;
|
||||
}
|
||||
|
||||
if (*str == '0') {
|
||||
valid = true;
|
||||
str++;
|
||||
goto fraction;
|
||||
}
|
||||
|
||||
while (is_digit(*str)) {
|
||||
valid = true;
|
||||
|
||||
if (integer > ((negative ? INT_MAX : UINT_MAX) / 10)) {
|
||||
pa_log("Integer overflow while parsing number");
|
||||
goto error;
|
||||
}
|
||||
|
||||
integer = (integer * 10) + (*str - '0');
|
||||
str++;
|
||||
}
|
||||
|
||||
fraction:
|
||||
|
||||
if (!valid) {
|
||||
pa_log("Missing digits while parsing number");
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (*str == '.') {
|
||||
has_fraction = true;
|
||||
str++;
|
||||
valid = false;
|
||||
|
||||
while (is_digit(*str)) {
|
||||
valid = true;
|
||||
|
||||
if (fraction > (UINT_MAX / 10)) {
|
||||
pa_log("Integer overflow while parsing fractional part of number");
|
||||
goto error;
|
||||
}
|
||||
|
||||
fraction = (fraction * 10) + (*str - '0');
|
||||
fraction_digits++;
|
||||
str++;
|
||||
}
|
||||
|
||||
if (!valid) {
|
||||
pa_log("No digit after '.' while parsing fraction");
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (*str == 'e' || *str == 'E') {
|
||||
bool exponent_negative = false;
|
||||
|
||||
has_exponent = true;
|
||||
str++;
|
||||
valid = false;
|
||||
|
||||
if (*str == '-') {
|
||||
exponent_negative = true;
|
||||
str++;
|
||||
} else if (*str == '+')
|
||||
str++;
|
||||
|
||||
while (is_digit(*str)) {
|
||||
valid = true;
|
||||
|
||||
if (exponent > (INT_MAX / 10)) {
|
||||
pa_log("Integer overflow while parsing exponent part of number");
|
||||
goto error;
|
||||
}
|
||||
|
||||
exponent = (exponent * 10) + (*str - '0');
|
||||
str++;
|
||||
}
|
||||
|
||||
if (!valid) {
|
||||
pa_log("No digit in exponent while parsing fraction");
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (exponent_negative)
|
||||
exponent *= -1;
|
||||
}
|
||||
|
||||
if (has_fraction || has_exponent) {
|
||||
obj->type = PA_JSON_TYPE_DOUBLE;
|
||||
obj->double_value =
|
||||
(negative ? -1.0 : 1.0) * (integer + (double) fraction / pow(10, fraction_digits)) * pow(10, exponent);
|
||||
} else {
|
||||
obj->type = PA_JSON_TYPE_INT;
|
||||
obj->int_value = (negative ? -1 : 1) * integer;
|
||||
}
|
||||
|
||||
return str;
|
||||
|
||||
error:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *parse_object(const char *str, pa_json_object *obj, unsigned int depth) {
|
||||
pa_json_object *name = NULL, *value = NULL;
|
||||
|
||||
obj->object_values = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func,
|
||||
pa_xfree, (pa_free_cb_t) pa_json_object_free);
|
||||
|
||||
while (*str != '}') {
|
||||
str++; /* Consume leading '{' or ',' */
|
||||
|
||||
str = parse_value(str, ":", &name, depth + 1);
|
||||
if (!str || pa_json_object_get_type(name) != PA_JSON_TYPE_STRING) {
|
||||
pa_log("Could not parse key for object");
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Consume the ':' */
|
||||
str++;
|
||||
|
||||
str = parse_value(str, ",}", &value, depth + 1);
|
||||
if (!str) {
|
||||
pa_log("Could not parse value for object");
|
||||
goto error;
|
||||
}
|
||||
|
||||
pa_hashmap_put(obj->object_values, pa_xstrdup(pa_json_object_get_string(name)), value);
|
||||
pa_json_object_free(name);
|
||||
|
||||
name = NULL;
|
||||
value = NULL;
|
||||
}
|
||||
|
||||
/* Drop trailing '}' */
|
||||
str++;
|
||||
|
||||
/* We now know the value was correctly parsed */
|
||||
obj->type = PA_JSON_TYPE_OBJECT;
|
||||
|
||||
return str;
|
||||
|
||||
error:
|
||||
pa_hashmap_free(obj->object_values);
|
||||
obj->object_values = NULL;
|
||||
|
||||
if (name)
|
||||
pa_json_object_free(name);
|
||||
if (value)
|
||||
pa_json_object_free(value);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *parse_array(const char *str, pa_json_object *obj, unsigned int depth) {
|
||||
pa_json_object *value;
|
||||
|
||||
obj->array_values = pa_idxset_new(NULL, NULL);
|
||||
|
||||
while (*str != ']') {
|
||||
str++; /* Consume leading '[' or ',' */
|
||||
|
||||
/* Need to chew up whitespaces as a special case to deal with the
|
||||
* possibility of an empty array */
|
||||
while (is_whitespace(*str))
|
||||
str++;
|
||||
|
||||
if (*str == ']')
|
||||
break;
|
||||
|
||||
str = parse_value(str, ",]", &value, depth + 1);
|
||||
if (!str) {
|
||||
pa_log("Could not parse value for array");
|
||||
goto error;
|
||||
}
|
||||
|
||||
pa_idxset_put(obj->array_values, value, NULL);
|
||||
}
|
||||
|
||||
/* Drop trailing ']' */
|
||||
str++;
|
||||
|
||||
/* We now know the value was correctly parsed */
|
||||
obj->type = PA_JSON_TYPE_ARRAY;
|
||||
|
||||
return str;
|
||||
|
||||
error:
|
||||
pa_idxset_free(obj->array_values, (pa_free_cb_t) pa_json_object_free);
|
||||
obj->array_values = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
JSON_PARSER_STATE_INIT,
|
||||
JSON_PARSER_STATE_FINISH,
|
||||
} json_parser_state;
|
||||
|
||||
static const char* parse_value(const char *str, const char *end, pa_json_object **obj, unsigned int depth) {
|
||||
json_parser_state state = JSON_PARSER_STATE_INIT;
|
||||
pa_json_object *o;
|
||||
|
||||
pa_assert(str != NULL);
|
||||
|
||||
o = json_object_new();
|
||||
|
||||
if (depth > MAX_NESTING_DEPTH) {
|
||||
pa_log("Exceeded maximum permitted nesting depth of objects (%u)", MAX_NESTING_DEPTH);
|
||||
goto error;
|
||||
}
|
||||
|
||||
while (!is_end(*str, end)) {
|
||||
switch (state) {
|
||||
case JSON_PARSER_STATE_INIT:
|
||||
if (is_whitespace(*str)) {
|
||||
str++;
|
||||
} else if (*str == 'n') {
|
||||
str = parse_null(str, o);
|
||||
state = JSON_PARSER_STATE_FINISH;
|
||||
} else if (*str == 't' || *str == 'f') {
|
||||
str = parse_boolean(str, o);
|
||||
state = JSON_PARSER_STATE_FINISH;
|
||||
} else if (*str == '"') {
|
||||
str = parse_string(str, o);
|
||||
state = JSON_PARSER_STATE_FINISH;
|
||||
} else if (is_digit(*str) || *str == '-') {
|
||||
str = parse_number(str, o);
|
||||
state = JSON_PARSER_STATE_FINISH;
|
||||
} else if (*str == '{') {
|
||||
str = parse_object(str, o, depth);
|
||||
state = JSON_PARSER_STATE_FINISH;
|
||||
} else if (*str == '[') {
|
||||
str = parse_array(str, o, depth);
|
||||
state = JSON_PARSER_STATE_FINISH;
|
||||
} else {
|
||||
pa_log("Invalid JSON string: %s", str);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!str)
|
||||
goto error;
|
||||
|
||||
break;
|
||||
|
||||
case JSON_PARSER_STATE_FINISH:
|
||||
/* Consume trailing whitespaces */
|
||||
if (is_whitespace(*str)) {
|
||||
str++;
|
||||
} else {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pa_json_object_get_type(o) == PA_JSON_TYPE_INIT) {
|
||||
/* We didn't actually get any data */
|
||||
pa_log("No data while parsing json string: '%s' till '%s'", str, pa_strnull(end));
|
||||
goto error;
|
||||
}
|
||||
|
||||
*obj = o;
|
||||
|
||||
return str;
|
||||
|
||||
error:
|
||||
pa_json_object_free(o);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
pa_json_object* pa_json_parse(const char *str) {
|
||||
pa_json_object *obj;
|
||||
|
||||
str = parse_value(str, NULL, &obj, 0);
|
||||
|
||||
if (!str) {
|
||||
pa_log("JSON parsing failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (*str != '\0') {
|
||||
pa_log("Unable to parse complete JSON string, remainder is: %s", str);
|
||||
pa_json_object_free(obj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
pa_json_type pa_json_object_get_type(const pa_json_object *obj) {
|
||||
return obj->type;
|
||||
}
|
||||
|
||||
void pa_json_object_free(pa_json_object *obj) {
|
||||
|
||||
switch (pa_json_object_get_type(obj)) {
|
||||
case PA_JSON_TYPE_INIT:
|
||||
case PA_JSON_TYPE_INT:
|
||||
case PA_JSON_TYPE_DOUBLE:
|
||||
case PA_JSON_TYPE_BOOL:
|
||||
case PA_JSON_TYPE_NULL:
|
||||
break;
|
||||
|
||||
case PA_JSON_TYPE_STRING:
|
||||
pa_xfree(obj->string_value);
|
||||
break;
|
||||
|
||||
case PA_JSON_TYPE_OBJECT:
|
||||
pa_hashmap_free(obj->object_values);
|
||||
break;
|
||||
|
||||
case PA_JSON_TYPE_ARRAY:
|
||||
pa_idxset_free(obj->array_values, (pa_free_cb_t) pa_json_object_free);
|
||||
break;
|
||||
|
||||
default:
|
||||
pa_assert_not_reached();
|
||||
}
|
||||
|
||||
pa_xfree(obj);
|
||||
}
|
||||
|
||||
int pa_json_object_get_int(const pa_json_object *o) {
|
||||
pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_INT);
|
||||
return o->int_value;
|
||||
}
|
||||
|
||||
double pa_json_object_get_double(const pa_json_object *o) {
|
||||
pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_DOUBLE);
|
||||
return o->double_value;
|
||||
}
|
||||
|
||||
bool pa_json_object_get_bool(const pa_json_object *o) {
|
||||
pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_BOOL);
|
||||
return o->bool_value;
|
||||
}
|
||||
|
||||
const char* pa_json_object_get_string(const pa_json_object *o) {
|
||||
pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_STRING);
|
||||
return o->string_value;
|
||||
}
|
||||
|
||||
const pa_json_object* pa_json_object_get_object_member(const pa_json_object *o, const char *name) {
|
||||
pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT);
|
||||
return pa_hashmap_get(o->object_values, name);
|
||||
}
|
||||
|
||||
int pa_json_object_get_array_length(const pa_json_object *o) {
|
||||
pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY);
|
||||
return pa_idxset_size(o->array_values);
|
||||
}
|
||||
|
||||
const pa_json_object* pa_json_object_get_array_member(const pa_json_object *o, int index) {
|
||||
pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY);
|
||||
return pa_idxset_get_by_index(o->array_values, index);
|
||||
}
|
||||
|
||||
bool pa_json_object_equal(const pa_json_object *o1, const pa_json_object *o2) {
|
||||
int i;
|
||||
|
||||
if (pa_json_object_get_type(o1) != pa_json_object_get_type(o2))
|
||||
return false;
|
||||
|
||||
switch (pa_json_object_get_type(o1)) {
|
||||
case PA_JSON_TYPE_NULL:
|
||||
return true;
|
||||
|
||||
case PA_JSON_TYPE_BOOL:
|
||||
return o1->bool_value == o2->bool_value;
|
||||
|
||||
case PA_JSON_TYPE_INT:
|
||||
return o1->int_value == o2->int_value;
|
||||
|
||||
case PA_JSON_TYPE_DOUBLE:
|
||||
return PA_DOUBLE_IS_EQUAL(o1->double_value, o2->double_value);
|
||||
|
||||
case PA_JSON_TYPE_STRING:
|
||||
return pa_streq(o1->string_value, o2->string_value);
|
||||
|
||||
case PA_JSON_TYPE_ARRAY:
|
||||
if (pa_json_object_get_array_length(o1) != pa_json_object_get_array_length(o2))
|
||||
return false;
|
||||
|
||||
for (i = 0; i < pa_json_object_get_array_length(o1); i++) {
|
||||
if (!pa_json_object_equal(pa_json_object_get_array_member(o1, i),
|
||||
pa_json_object_get_array_member(o2, i)))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
case PA_JSON_TYPE_OBJECT: {
|
||||
void *state;
|
||||
const char *key;
|
||||
const pa_json_object *v1, *v2;
|
||||
|
||||
if (pa_hashmap_size(o1->object_values) != pa_hashmap_size(o2->object_values))
|
||||
return false;
|
||||
|
||||
PA_HASHMAP_FOREACH_KV(key, v1, o1->object_values, state) {
|
||||
v2 = pa_json_object_get_object_member(o2, key);
|
||||
if (!v2 || !pa_json_object_equal(v1, v2))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
default:
|
||||
pa_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
Copyright 2016 Arun Raghavan <mail@arunraghavan.net>
|
||||
|
||||
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, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#define PA_DOUBLE_IS_EQUAL(x, y) (((x) - (y)) < 0.000001 && ((x) - (y)) > -0.000001)
|
||||
|
||||
typedef enum {
|
||||
PA_JSON_TYPE_INIT = 0,
|
||||
PA_JSON_TYPE_NULL,
|
||||
PA_JSON_TYPE_INT,
|
||||
PA_JSON_TYPE_DOUBLE,
|
||||
PA_JSON_TYPE_BOOL,
|
||||
PA_JSON_TYPE_STRING,
|
||||
PA_JSON_TYPE_ARRAY,
|
||||
PA_JSON_TYPE_OBJECT,
|
||||
} pa_json_type;
|
||||
|
||||
typedef struct pa_json_object pa_json_object;
|
||||
|
||||
pa_json_object* pa_json_parse(const char *str);
|
||||
pa_json_type pa_json_object_get_type(const pa_json_object *obj);
|
||||
void pa_json_object_free(pa_json_object *obj);
|
||||
|
||||
/* All pointer members that are returned are valid while the corresponding object is valid */
|
||||
|
||||
int pa_json_object_get_int(const pa_json_object *o);
|
||||
double pa_json_object_get_double(const pa_json_object *o);
|
||||
bool pa_json_object_get_bool(const pa_json_object *o);
|
||||
const char* pa_json_object_get_string(const pa_json_object *o);
|
||||
|
||||
const pa_json_object* pa_json_object_get_object_member(const pa_json_object *o, const char *name);
|
||||
|
||||
int pa_json_object_get_array_length(const pa_json_object *o);
|
||||
const pa_json_object* pa_json_object_get_array_member(const pa_json_object *o, int index);
|
||||
|
||||
bool pa_json_object_equal(const pa_json_object *o1, const pa_json_object *o2);
|
||||
|
|
@ -1 +0,0 @@
|
|||
../modules/Makefile
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
||||
|
||||
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, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef OS_IS_WIN32
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
|
||||
extern char *pa_win32_get_toplevel(HANDLE handle);
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
|
||||
WSADATA data;
|
||||
|
||||
switch (fdwReason) {
|
||||
|
||||
case DLL_PROCESS_ATTACH:
|
||||
if (!pa_win32_get_toplevel(hinstDLL))
|
||||
return FALSE;
|
||||
WSAStartup(MAKEWORD(2, 0), &data);
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH:
|
||||
WSACleanup();
|
||||
break;
|
||||
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* OS_IS_WIN32 */
|
||||
|
|
@ -1 +0,0 @@
|
|||
../modules/Makefile
|
||||
|
|
@ -1 +0,0 @@
|
|||
../modules/Makefile
|
||||
Loading…
Add table
Add a link
Reference in a new issue