diff --git a/.ci/install-deps.sh b/.ci/install-deps.sh new file mode 100755 index 00000000..ddc25262 --- /dev/null +++ b/.ci/install-deps.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [ "$TRAVIS_OS_NAME" == "osx" ]; then + brew install --c++11 \ + pkg-config \ + aften \ + libsamplerate \ + libsndfile \ + opus \ + readline \ + doxygen + # force installation of gcc-6 if required + if [ "${CC}" == "gcc-6" ]; then + brew install gcc@6 + fi + # force installation of gcc-7 if required + if [ "${CC}" == "gcc-7" ]; then + brew install gcc@7 + fi + # force installation of gcc-8 if required + if [ "${CC}" == "gcc-8" ]; then + brew install gcc@8 + fi +fi + +if [ "$TRAVIS_OS_NAME" == "linux" ]; then + # autotools, automake, make are present in the trusty image + sudo apt-get install -y \ + doxygen \ + libffado-dev \ + libsamplerate-dev \ + libsndfile-dev \ + libasound2-dev \ + libdb-dev \ + systemd-services \ + systemd \ + libsystemd-journal-dev \ + libsystemd-login-dev \ + libsystemd-id128-dev \ + libsystemd-daemon-dev \ + libpam-systemd \ + libdbus-1-dev \ + libeigen3-dev \ + libopus-dev \ + portaudio19-dev + # force installation of gcc-6 if required + if [ "${CC}" == "gcc-6" ]; then + sudo apt-get install gcc-6 g++-6 + fi + # force installation of gcc-7 if required + if [ "${CC}" == "gcc-7" ]; then + sudo apt-get install gcc-7 g++-7 + fi + # force installation of gcc-8 if required + if [ "${CC}" == "gcc-8" ]; then + sudo apt-get install gcc-8 g++-8 + fi + # force installation of clang-3.8 if required + if [ "${CC}" == "clang-3.8" ]; then + sudo apt-get install clang-3.8 + fi +fi + +exit 0 diff --git a/.travis.yml b/.travis.yml index 103729fd..f9fb96f6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,34 +1,115 @@ -sudo: false -os: - - osx - - linux language: - cpp -compiler: - - gcc - - clang -addons: - apt: - packages: - - libsamplerate-dev - - libsndfile-dev - - libasound2-dev +sudo: required + +matrix: + include: + # linux with gcc 8 + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + install: + - gcc-8 + dist: trusty + env: + - MATRIX_EVAL="CC=gcc-8 CXX=g++-8" + compiler: gcc + # linux with gcc 7 + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + install: + - gcc-7 + dist: trusty + env: + - MATRIX_EVAL="CC=gcc-7 CXX=g++-7" + compiler: gcc + # linux with gcc 6 + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + install: + - gcc-6 + dist: trusty + env: + - MATRIX_EVAL="CC=gcc-6 CXX=g++-6" + compiler: gcc + # linux with gcc default (4.8) + - os: linux + dist: trusty + compiler: gcc + # linux with clang default (3.5) + - os: linux + dist: trusty + compiler: clang + # linux with clang 3.8 + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + install: + - clang-3.8 + dist: trusty + env: + - MATRIX_EVAL="CC=clang-3.8 CXX=clang++-3.8" + compiler: clang + # osx with xcode8.3/clang + - os: osx + osx_image: xcode8.3 + compiler: clang + # osx with xcode9.2/clang + - os: osx + osx_image: xcode9.2 + compiler: clang + # osx with xcode10.0/clang + - os: osx + osx_image: xcode10 + compiler: clang + # osx with xcode10.1/clang + - os: osx + osx_image: xcode10.1 + compiler: clang + # osx with xcode/clang (default) + - os: osx + compiler: clang before_install: - - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update; fi - - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew outdated pkg-config || brew upgrade pkg-config; fi - - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install aften; fi - - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install libsamplerate; fi - - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install libsndfile; fi - - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install opus; fi - - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install readline; fi + - eval "${MATRIX_EVAL}" + # uninstalling oclint, as it's preinstalled and conflicts with all versions of gcc + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + brew cask uninstall oclint || true + brew update; + fi + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq update; fi + +install: + - ./.ci/install-deps.sh + +before_script: + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig; fi script: - - if [ "$TRAVIS_OS_NAME" == "linux" ]; then ./waf configure --alsa; fi - - if [ "$TRAVIS_OS_NAME" == "osx" ]; then ./waf configure --opus=no --readline=no; fi - - ./waf build + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then + ./waf configure --prefix=/usr --alsa --classic --dbus; + ./waf -v build; + fi + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then + CXXFLAGS="${CXXFLAGS} -flax-vector-conversions" ./waf configure; + CXXFLAGS="${CXXFLAGS} -flax-vector-conversions" ./waf -v build; + fi + - sudo ./waf -v install -matrix: - exclude: - - os: osx - compiler: gcc +branches: + only: + - /.*/ + +notifications: + email: false +# vim:set ts=2 sw=2 et: diff --git a/README.rst b/README.rst new file mode 100644 index 00000000..ca3c4ecf --- /dev/null +++ b/README.rst @@ -0,0 +1,36 @@ +`JACK2 `_ +################################ + +.. image:: https://travis-ci.org/jackaudio/jack2.svg?branch=master + :target: https://travis-ci.org/jackaudio/jack2 + +JACK2 aka jackdmp is a C++ version of the JACK low-latency audio server for +multi-processor machines. It is a new implementation of the JACK server core +features that aims in removing some limitations of the JACK1 design. The +activation system has been changed for a data flow model and lock-free +programming techniques for graph access have been used to have a more dynamic +and robust system. + +- uses a new client activation model, that allows simultaneous client + execution (on a SMP machine) when parallel clients exist in the graph (client + that have the same inputs). This activation model allows to better use + available CPU on a smp machine, but also works on mono-processor machine. + +- uses a lock-free way to access (read/write) the client graph, thus + allowing connections/disconnection to be done without interrupting the audio + stream. The result is that connections/disconnections are glitch-free. + +- can work in two different modes at the server level: + + - *synchronous activation*: in a given cycle, the server waits for all + clients to be finished (similar to normal jackd) + + - *asynchronous activation*: in a given cycle, the server does not wait for + all clients to be finished and use output buffer computed the previous + cycle. + The audible result of this mode is that if a client is not activated + during one cycle, other clients may still run and the resulting audio + stream will still be produced (even if its partial in some way). This + mode usually result in fewer (less audible) audio glitches in a loaded + system. +