diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index 65785ebdc6..0000000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-name: Bug report
-about: Create a report to help us improve
-title: ''
-labels: bug
-assignees: ''
----
-
-**Describe the bug**
-
-
-
-**To Reproduce**
-
-
-
-**Expected behavior**
-
-
-
-**Screenshots**
-
-
-
-**Operating system**
-
-
-
-**Version of Jamulus**
-
-
-
-**Additional context**
-
-
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
deleted file mode 100644
index 1969de8e5a..0000000000
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-contact_links:
- - name: Support Request or Question
- url: https://github.com/jamulussoftware/jamulus/discussions/new
- about: Please ask questions by opening a new Discussion.
-
- - name: Idea/Feature Request
- url: https://github.com/jamulussoftware/jamulus/discussions/new
- about: Please open a Discussion if you have ideas for new features or functions.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index b6c2099375..0000000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-name: Specified Feature
-about: Agreed specification for a feature or enhancement
-title: ''
-labels: 'feature request'
-assignees: ''
----
-
-**What is the current behaviour and why should it be changed?**
-
-
-
-**Describe possible approaches**
-
-
-
-
-
-**Has this feature been discussed and generally agreed?**
-
-
diff --git a/.github/autobuild/README.md b/.github/autobuild/README.md
deleted file mode 100644
index 94070bf8aa..0000000000
--- a/.github/autobuild/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Scripts for building Jamulus via GitHub Actions
-
-The scripts in this folder are used by the Github autobuild actions in .github/workflows/autobuild.yml.
-They are responsible for setting up the Github environment, building the binaries and passing the resulting artifacts back to the workflow.
-
-The scripts may work outside of Github, but haven't been designed or tested for that use case.
-Some of the scripts modify global system settings, install software or create files in directories which are usually managed by package managers.
-In short: They should probably only used in throw-away environments.
-
-See the various platform-specific build scripts in their own folders for standalone builds (e.g. windows/deploy_windows.ps1).
diff --git a/.github/autobuild/android.sh b/.github/autobuild/android.sh
deleted file mode 100755
index 69ae1d7f55..0000000000
--- a/.github/autobuild/android.sh
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/bin/bash
-##############################################################################
-# Copyright (c) 2022-2025
-#
-# Author(s):
-# Christian Hoffmann
-# The Jamulus Development Team
-#
-##############################################################################
-#
-# 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 2 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-#
-##############################################################################
-
-set -eu
-
-# Some of the following version pinnings are semi-automatically checked for
-# updates. Update .github/workflows/bump-dependencies.yaml when renaming those:
-COMMANDLINETOOLS_VERSION=6858069
-ANDROID_NDK_VERSION=r21d
-ANDROID_PLATFORM=android-30
-ANDROID_BUILD_TOOLS=30.0.2
-AQTINSTALL_VERSION=3.1.21
-QT_VERSION=5.15.2
-
-# Only variables which are really needed by sub-commands are exported.
-# Definitions have to stay in a specific order due to dependencies.
-QT_BASEDIR="/opt/Qt"
-ANDROID_BASEDIR="/opt/android"
-BUILD_DIR=build
-export ANDROID_SDK_ROOT="${ANDROID_BASEDIR}/android-sdk"
-COMMANDLINETOOLS_DIR="${ANDROID_SDK_ROOT}"/cmdline-tools/latest/
-export ANDROID_NDK_ROOT="${ANDROID_BASEDIR}/android-ndk"
-ANDROID_NDK_HOST="linux-x86_64"
-ANDROID_SDKMANAGER="${COMMANDLINETOOLS_DIR}/bin/sdkmanager"
-export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/"
-export PATH="${PATH}:${ANDROID_SDK_ROOT}/tools"
-export PATH="${PATH}:${ANDROID_SDK_ROOT}/platform-tools"
-
-if [[ ! ${JAMULUS_BUILD_VERSION:-} =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
- echo "Environment variable JAMULUS_BUILD_VERSION has to be set to a valid version string"
- exit 1
-fi
-
-setup_ubuntu_dependencies() {
- export DEBIAN_FRONTEND="noninteractive"
-
- sudo apt-get -qq update
- sudo apt-get -qq --no-install-recommends -y install build-essential zip unzip bzip2 p7zip-full curl chrpath openjdk-8-jdk-headless
-}
-
-setup_android_sdk() {
- mkdir -p "${ANDROID_BASEDIR}"
-
- if [[ -d "${COMMANDLINETOOLS_DIR}" ]]; then
- echo "Using commandlinetools installation from previous run (actions/cache)"
- else
- mkdir -p "${COMMANDLINETOOLS_DIR}"
- curl -s -o downloadfile "https://dl.google.com/android/repository/commandlinetools-linux-${COMMANDLINETOOLS_VERSION}_latest.zip"
- unzip -q downloadfile
- mv cmdline-tools/* "${COMMANDLINETOOLS_DIR}"
- fi
-
- yes | "${ANDROID_SDKMANAGER}" --licenses
- "${ANDROID_SDKMANAGER}" --update
- "${ANDROID_SDKMANAGER}" "platforms;${ANDROID_PLATFORM}"
- "${ANDROID_SDKMANAGER}" "build-tools;${ANDROID_BUILD_TOOLS}"
-}
-
-setup_android_ndk() {
- mkdir -p "${ANDROID_BASEDIR}"
- if [[ -d "${ANDROID_NDK_ROOT}" ]]; then
- echo "Using NDK installation from previous run (actions/cache)"
- else
- curl -s -o downloadfile "https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux-x86_64.zip"
- unzip -q downloadfile
- mv "android-ndk-${ANDROID_NDK_VERSION}" "${ANDROID_NDK_ROOT}"
- fi
-}
-
-setup_qt() {
- if [[ -d "${QT_BASEDIR}" ]]; then
- echo "Using Qt installation from previous run (actions/cache)"
- else
- echo "Installing Qt..."
- python3 -m pip install "aqtinstall==${AQTINSTALL_VERSION}"
- local qtmultimedia=()
- if [[ ! "${QT_VERSION}" =~ 5\..* ]]; then
- # From Qt6 onwards, qtmultimedia is a module and cannot be installed
- # as an archive anymore.
- qtmultimedia=("--modules")
- fi
- qtmultimedia+=("qtmultimedia")
-
- python3 -m aqt install-qt --outputdir "${QT_BASEDIR}" linux android "${QT_VERSION}" \
- --archives qtbase qttools qttranslations qtandroidextras \
- "${qtmultimedia[@]}"
- # Delete libraries, which we don't use, but which bloat the resulting package and might introduce unwanted dependencies.
- find "${QT_BASEDIR}" -name 'libQt5*Quick*.so' -delete
- rm -r "${QT_BASEDIR}/${QT_VERSION}/android/qml/"
- fi
-}
-
-build_app_as_apk() {
- local QT_DIR="${QT_BASEDIR}/${QT_VERSION}/android"
- local MAKE="${ANDROID_NDK_ROOT}/prebuilt/${ANDROID_NDK_HOST}/bin/make"
-
- "${QT_DIR}/bin/qmake" -spec android-clang
- "${MAKE}" -j "$(nproc)"
- "${MAKE}" INSTALL_ROOT="${BUILD_DIR}" -f Makefile install
- "${QT_DIR}"/bin/androiddeployqt --input android-Jamulus-deployment-settings.json --output "${BUILD_DIR}" \
- --android-platform "${ANDROID_PLATFORM}" --jdk "${JAVA_HOME}" --gradle
-}
-
-pass_artifact_to_job() {
- mkdir deploy
- local artifact="jamulus_${JAMULUS_BUILD_VERSION}_android.apk"
- echo "Moving ${BUILD_DIR}/build/outputs/apk/debug/build-debug.apk to deploy/${artifact}"
- mv "./${BUILD_DIR}/build/outputs/apk/debug/build-debug.apk" "./deploy/${artifact}"
- echo "artifact_1=${artifact}" >> "$GITHUB_OUTPUT"
-}
-
-case "${1:-}" in
- setup)
- setup_ubuntu_dependencies
- setup_android_ndk
- setup_android_sdk
- setup_qt
- ;;
- build)
- build_app_as_apk
- ;;
- get-artifacts)
- pass_artifact_to_job
- ;;
- *)
- echo "Unknown stage '${1:-}'"
- exit 1
- ;;
-esac
diff --git a/.github/autobuild/extractVersionChangelog.pl b/.github/autobuild/extractVersionChangelog.pl
deleted file mode 100755
index 7bef861087..0000000000
--- a/.github/autobuild/extractVersionChangelog.pl
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/env perl
-##############################################################################
-# Copyright (c) 2021-2025
-#
-# Author(s):
-# ann0see
-# Christian Hoffmann
-# The Jamulus Development Team
-#
-##############################################################################
-#
-# 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 2 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-#
-##############################################################################
-
-use strict;
-use warnings;
-# get arguments
-my ($ChangeLogFile, $Version, $FormatOption) = @ARGV;
-# open the file
-open my $fh, '<', $ChangeLogFile or die;
-
-my $SingleLineEntries = ($FormatOption or '') eq '--line-per-entry';
-
-my $logversion = "";
-my $entry;
-my $matchedLogversion = 0;
-while (my $line = <$fh>) {
- if ($line =~ /^### (\S+)[^#]*###$/m) {
- # The version for this section of the ChangeLog
- if ($matchedLogversion) {
- # We've processed the lines corresponding to $Version, and
- # we're now on the next section. There's no more to do.
- last;
- }
- $logversion = $1;
- next;
- }
- if ($logversion eq $Version) {
- $matchedLogversion = 1;
- if ($SingleLineEntries) {
- if ($line =~ /^- (.*)$/) { # beginning of entry
- $entry = $1;
- } elsif ($line =~ /^ ( \S.*)$/) { # continuation of entry
- $entry .= $1;
- } else { # otherwise, separator between entries
- print "${entry}\n" if $entry;
- $entry = undef;
- }
- } else {
- print $line;
- }
- }
-}
-
-close $fh;
-
-if (!$matchedLogversion) {
- die "Failed to find entry for version '${Version}'";
-}
diff --git a/.github/autobuild/get_build_vars.py b/.github/autobuild/get_build_vars.py
deleted file mode 100755
index 891db8980e..0000000000
--- a/.github/autobuild/get_build_vars.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env python3
-##############################################################################
-# Copyright (c) 2022-2025
-#
-# Author(s):
-# Christian Hoffmann
-# The Jamulus Development Team
-#
-##############################################################################
-#
-# 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 2 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-#
-##############################################################################
-
-"""
-This script is triggered from the GitHub Autobuild workflow.
-It analyzes Jamulus.pro and git push details (tag vs. branch, etc.) to decide
- - whether a release should be created,
- - whether it is a pre-release, and
- - what its title should be.
-"""
-
-import os
-import re
-import subprocess
-
-REPO_PATH = os.path.join(os.path.dirname(__file__), '..', '..')
-
-
-def get_version_from_jamulus_pro():
- with open(REPO_PATH + '/Jamulus.pro', 'r') as f:
- pro_content = f.read()
- matches = re.search(r'^VERSION\s*=\s*(\S+)$', pro_content, re.MULTILINE)
- if not matches:
- raise ValueError("Unable to determine Jamulus.pro VERSION")
- return matches.group(1)
-
-
-def get_git_hash():
- return subprocess.check_output([
- 'git',
- 'describe',
- '--match=xxxxxxxxxxxxxxxxxxxx',
- '--always',
- '--abbrev',
- '--dirty'
- ]).decode('ascii').strip()
-
-
-def get_build_version(jamulus_pro_version):
- if "dev" in jamulus_pro_version:
- version = f"{jamulus_pro_version}-{get_git_hash()}"
- return 'intermediate', version
-
- version = jamulus_pro_version
- return 'release', version
-
-
-def set_github_variable(varname, varval):
- print(f"{varname}='{varval}'") # console output
- output_file = os.getenv('GITHUB_OUTPUT')
- with open(output_file, "a") as ghout:
- ghout.write(f"{varname}={varval}\n")
-
-jamulus_pro_version = get_version_from_jamulus_pro()
-set_github_variable("JAMULUS_PRO_VERSION", jamulus_pro_version)
-build_type, build_version = get_build_version(jamulus_pro_version)
-print(f'building a version of type "{build_type}": {build_version}')
-
-full_ref = os.environ['GITHUB_REF']
-publish_to_release = bool(re.match(r'^refs/tags/r\d+_\d+_\d+\S*$', full_ref))
-
-# BUILD_VERSION is required for all builds including branch pushes
-# and PRs:
-set_github_variable("BUILD_VERSION", build_version)
-
-# PUBLISH_TO_RELEASE is always required as the workflow decides about further
-# steps based on this. It will only be true for tag pushes with a tag
-# starting with "r".
-set_github_variable("PUBLISH_TO_RELEASE", str(publish_to_release).lower())
-
-if publish_to_release:
- ref_list = full_ref.split("/", 2)
- release_tag = ref_list[2]
- release_title = f"Release {build_version} ({release_tag})"
- is_prerelease = not re.match(r'^r\d+_\d+_\d+$', release_tag)
- if not is_prerelease and build_version != release_tag[1:].replace('_', '.'):
- raise ValueError(f"non-pre-release tag {release_tag} doesn't match Jamulus.pro VERSION = {build_version}")
-
- # Those variables are only used when a release is created at all:
- set_github_variable("IS_PRERELEASE", str(is_prerelease).lower())
- set_github_variable("RELEASE_TITLE", release_title)
- set_github_variable("RELEASE_TAG", release_tag)
diff --git a/.github/autobuild/ios.sh b/.github/autobuild/ios.sh
deleted file mode 100755
index 9cf6a61891..0000000000
--- a/.github/autobuild/ios.sh
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/bin/bash
-##############################################################################
-# Copyright (c) 2022-2025
-#
-# Author(s):
-# Christian Hoffmann
-# The Jamulus Development Team
-#
-##############################################################################
-#
-# 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 2 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-#
-##############################################################################
-
-set -eu
-
-QT_DIR=/opt/qt
-# The following version pinnings are semi-automatically checked for
-# updates. Verify .github/workflows/bump-dependencies.yaml when changing those manually:
-AQTINSTALL_VERSION=3.1.21
-
-if [[ ! ${QT_VERSION:-} =~ [0-9]+\.[0-9]+\..* ]]; then
- echo "Environment variable QT_VERSION must be set to a valid Qt version"
- exit 1
-fi
-if [[ ! ${JAMULUS_BUILD_VERSION:-} =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
- echo "Environment variable JAMULUS_BUILD_VERSION has to be set to a valid version string"
- exit 1
-fi
-
-setup() {
- if [[ -d "${QT_DIR}" ]]; then
- echo "Using Qt installation from previous run (actions/cache)"
- else
- echo "Installing Qt"
- # We may need to create the Qt installation directory and chown it to the runner user to fix permissions
- sudo mkdir -p "${QT_DIR}"
- sudo chown "$(whoami)" "${QT_DIR}"
- # Create and enter virtual environment
- python3 -m venv venv
- # Must hide directory as it just gets created during execution of the previous command and cannot be found by shellcheck
- # shellcheck source=/dev/null
- source venv/bin/activate
- pip install "aqtinstall==${AQTINSTALL_VERSION}"
- # Install actual ios Qt:
- local qtmultimedia=()
- if [[ ! "${QT_VERSION}" =~ 5\.[0-9]+\.[0-9]+ ]]; then
- # From Qt6 onwards, qtmultimedia is a module and cannot be installed
- # as an archive anymore.
- qtmultimedia=("--modules")
- fi
- qtmultimedia+=("qtmultimedia")
- python3 -m aqt install-qt --outputdir "${QT_DIR}" mac ios "${QT_VERSION}" --archives qtbase qttools qttranslations "${qtmultimedia[@]}"
- if [[ ! "${QT_VERSION}" =~ 5\.[0-9]+\.[0-9]+ ]]; then
- # Starting with Qt6, ios' qtbase install does no longer include a real qmake binary.
- # Instead, it is a script which invokes the mac desktop qmake.
- # As of aqtinstall 2.1.0 / 04/2022, desktop qtbase and qttools including lrelease have to be installed manually:
- python3 -m aqt install-qt --outputdir "${QT_DIR}" mac desktop "${QT_VERSION}" --archives qtbase qttools
- fi
-
- # deactivate and remove venv as aqt is no longer needed from here on
- deactivate
- rm -rf venv
- fi
-}
-
-build_app_as_ipa() {
- # Add the Qt binaries to the PATH:
- export PATH="${QT_DIR}/${QT_VERSION}/ios/bin:${PATH}"
- ./ios/deploy_ios.sh
-}
-
-pass_artifact_to_job() {
- local artifact="jamulus_${JAMULUS_BUILD_VERSION}_iOSUnsigned${ARTIFACT_SUFFIX:-}.ipa"
- echo "Moving build artifact to deploy/${artifact}"
- mv ./deploy/Jamulus.ipa "./deploy/${artifact}"
- echo "artifact_1=${artifact}" >> "$GITHUB_OUTPUT"
-}
-
-case "${1:-}" in
- setup)
- setup
- ;;
- build)
- build_app_as_ipa
- ;;
- get-artifacts)
- pass_artifact_to_job
- ;;
- *)
- echo "Unknown stage '${1:-}'"
- exit 1
- ;;
-esac
diff --git a/.github/autobuild/linux_deb.sh b/.github/autobuild/linux_deb.sh
deleted file mode 100755
index dbf0f77a47..0000000000
--- a/.github/autobuild/linux_deb.sh
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/bin/bash
-##############################################################################
-# Copyright (c) 2022-2025
-#
-# Author(s):
-# Christian Hoffmann
-# The Jamulus Development Team
-#
-##############################################################################
-#
-# 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 2 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-#
-##############################################################################
-
-set -eu
-
-if [[ ! ${JAMULUS_BUILD_VERSION:-} =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
- echo "Environment variable JAMULUS_BUILD_VERSION has to be set to a valid version string"
- exit 1
-fi
-
-TARGET_ARCH="${TARGET_ARCH:-amd64}"
-case "${TARGET_ARCH}" in
- amd64)
- ABI_NAME=""
- ;;
- armhf)
- ABI_NAME="arm-linux-gnueabihf"
- ;;
- arm64)
- ABI_NAME="aarch64-linux-gnu"
- ;;
- *)
- echo "Unsupported TARGET_ARCH ${TARGET_ARCH}"
- exit 1
- ;;
-esac
-
-setup() {
- export DEBIAN_FRONTEND="noninteractive"
-
- APT_ARCH="$(dpkg --print-architecture)"
- export APT_ARCH
-
- setup_cross_compilation_apt_sources
-
- echo "Installing dependencies..."
- sudo apt-get -qq update
- sudo apt-get -qq --no-install-recommends -y install devscripts build-essential debhelper fakeroot libjack-jackd2-dev qtbase5-dev qttools5-dev-tools qtmultimedia5-dev
-
- setup_cross_compiler
-}
-
-setup_cross_compilation_apt_sources() {
- if [[ "${TARGET_ARCH}" == "${APT_ARCH}" ]]; then
- return
- fi
- echo "Building on ${APT_ARCH} for ${TARGET_ARCH}. Thus modifying apt..."
- sudo dpkg --add-architecture "${TARGET_ARCH}"
-
- if [[ "${APT_ARCH}" == "amd64" ]]; then
- # Duplicate the original Ubuntu sources and modify them to refer to the TARGET_ARCH:
- sed -rne "s|^deb.*/ ([^ -]+(-updates)?) main.*|deb [arch=${TARGET_ARCH}] http://ports.ubuntu.com/ubuntu-ports \1 main universe multiverse restricted|p" /etc/apt/sources.list | sudo dd of=/etc/apt/sources.list.d/"${TARGET_ARCH}".list
- # Now take the original Ubuntu sources and limit those to the build host (i.e. non-TARGET_ARCH) architectures:
- sudo sed -re 's/^deb /deb [arch=amd64,i386] /' -i /etc/apt/sources.list
- fi
-}
-
-setup_cross_compiler() {
- if [[ "${TARGET_ARCH}" == "${APT_ARCH}" ]]; then
- return
- fi
- local GCC_VERSION=9 # 9 is the default on 20.04, there is no reason not to update once 20.04 is out of support
- sudo apt install -qq -y --no-install-recommends "g++-${GCC_VERSION}-${ABI_NAME}" "qt5-qmake:${TARGET_ARCH}" "qtbase5-dev:${TARGET_ARCH}" "libjack-jackd2-dev:${TARGET_ARCH}" "qtmultimedia5-dev:${TARGET_ARCH}"
- sudo update-alternatives --install "/usr/bin/${ABI_NAME}-g++" g++ "/usr/bin/${ABI_NAME}-g++-${GCC_VERSION}" 10
- sudo update-alternatives --install "/usr/bin/${ABI_NAME}-gcc" gcc "/usr/bin/${ABI_NAME}-gcc-${GCC_VERSION}" 10
-
- # Ubuntu's Qt version only ships a profile for gnueabi, but not for gnueabihf or aarch64. Therefore, build a custom one:
- if [[ $ABI_NAME ]]; then
- sudo cp -R "/usr/lib/${ABI_NAME}/qt5/mkspecs/linux-arm-gnueabi-g++/" "/usr/lib/${ABI_NAME}/qt5/mkspecs/${ABI_NAME}-g++/"
- sudo sed -re "s/arm-linux-gnueabi/${ABI_NAME}/" -i "/usr/lib/${ABI_NAME}/qt5/mkspecs/${ABI_NAME}-g++/qmake.conf"
- fi
-}
-
-build_app_as_deb() {
- TARGET_ARCH="${TARGET_ARCH}" ./linux/deploy_deb.sh
-}
-
-pass_artifacts_to_job() {
- mkdir deploy
-
- # rename headless first, so wildcard pattern matches only one file each
- local artifact_1="jamulus-headless_${JAMULUS_BUILD_VERSION}_ubuntu_${TARGET_ARCH}.deb"
- echo "Moving headless build artifact to deploy/${artifact_1}"
- mv ../jamulus-headless*"_${TARGET_ARCH}.deb" "./deploy/${artifact_1}"
- echo "artifact_1=${artifact_1}" >> "$GITHUB_OUTPUT"
-
- local artifact_2="jamulus_${JAMULUS_BUILD_VERSION}_ubuntu_${TARGET_ARCH}.deb"
- echo "Moving regular build artifact to deploy/${artifact_2}"
- mv ../jamulus*_"${TARGET_ARCH}.deb" "./deploy/${artifact_2}"
- echo "artifact_2=${artifact_2}" >> "$GITHUB_OUTPUT"
-}
-
-case "${1:-}" in
- setup)
- setup
- ;;
- build)
- build_app_as_deb
- ;;
- get-artifacts)
- pass_artifacts_to_job
- ;;
- *)
- echo "Unknown stage '${1:-}'"
- exit 1
- ;;
-esac
diff --git a/.github/autobuild/mac.sh b/.github/autobuild/mac.sh
deleted file mode 100755
index ba420c9d52..0000000000
--- a/.github/autobuild/mac.sh
+++ /dev/null
@@ -1,234 +0,0 @@
-#!/bin/bash
-##############################################################################
-# Copyright (c) 2022-2025
-#
-# Author(s):
-# Christian Hoffmann
-# The Jamulus Development Team
-#
-##############################################################################
-#
-# 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 2 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-#
-##############################################################################
-
-set -eu
-
-QT_DIR=~/qt
-# The following version pinnings are semi-automatically checked for
-# updates. Verify .github/workflows/bump-dependencies.yaml when changing those manually:
-AQTINSTALL_VERSION=3.1.21
-
-TARGET_ARCHS="${TARGET_ARCHS:-}"
-
-if [[ ! ${QT_VERSION:-} =~ [0-9]+\.[0-9]+\..* ]]; then
- echo "Environment variable QT_VERSION must be set to a valid Qt version"
- exit 1
-fi
-if [[ ! ${JAMULUS_BUILD_VERSION:-} =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
- echo "Environment variable JAMULUS_BUILD_VERSION has to be set to a valid version string"
- exit 1
-fi
-
-setup() {
- if [[ -d "${QT_DIR}" ]]; then
- echo "Using Qt installation from previous run (actions/cache)"
- else
- echo "Installing Qt..."
- # We may need to create the Qt installation directory and chown it to the runner user to fix permissions
- sudo mkdir -p "${QT_DIR}"
- sudo chown "$(whoami)" "${QT_DIR}"
- # Create and enter virtual environment
- python3 -m venv venv
- # Must hide directory as it just gets created during execution of the previous command and cannot be found by shellcheck
- # shellcheck source=/dev/null
- source venv/bin/activate
- pip install "aqtinstall==${AQTINSTALL_VERSION}"
- local qtmultimedia=()
- if [[ ! "${QT_VERSION}" =~ 5\.[0-9]+\.[0-9]+ ]]; then
- # From Qt6 onwards, qtmultimedia is a module and cannot be installed
- # as an archive anymore.
- qtmultimedia=("--modules")
- fi
- qtmultimedia+=("qtmultimedia")
- python3 -m aqt install-qt --outputdir "${QT_DIR}" mac desktop "${QT_VERSION}" --archives qtbase qttools qttranslations "${qtmultimedia[@]}"
- # deactivate and remove venv as aqt is no longer needed from here on
- deactivate
- rm -rf venv
- fi
-}
-
-prepare_signing() {
- ## Certificate types in use:
- # - MACOS_CERTIFICATE - Developer ID Application - for codesigning for adhoc release
- # - MAC_STORE_APP_CERT - Mac App Distribution - codesigning for App Store submission
- # - MAC_STORE_INST_CERT - Mac Installer Distribution - for signing installer pkg file for App Store submission
-
- [[ "${SIGN_IF_POSSIBLE:-0}" == "1" ]] || return 1
-
- # Signing was requested, now check all prerequisites:
- [[ -n "${MACOS_CERTIFICATE:-}" ]] || return 1
- [[ -n "${MACOS_CERTIFICATE_ID:-}" ]] || return 1
- [[ -n "${MACOS_CERTIFICATE_PWD:-}" ]] || return 1
- [[ -n "${NOTARIZATION_PASSWORD:-}" ]] || return 1
- [[ -n "${KEYCHAIN_PASSWORD:-}" ]] || return 1
-
- # Check for notarization (not wanted on self signed build)
- if [[ -z "${NOTARIZATION_PASSWORD}" ]]; then
- echo "Notarization password not found or empty. This suggests we might run a self signed build."
- if [[ -z "${MACOS_CA_PUBLICKEY}" ]]; then
- echo "Warning: The CA public key wasn't set or is empty. Skipping signing."
- return 1
- fi
- fi
-
- echo "Signing was requested and all dependencies are satisfied"
-
- ## Put the certs to files
- echo "${MACOS_CERTIFICATE}" | base64 --decode > macos_certificate.p12
-
- # If set, put the CA public key into a file
- if [[ -n "${MACOS_CA_PUBLICKEY}" ]]; then
- echo "${MACOS_CA_PUBLICKEY}" | base64 --decode > CA.cer
- fi
-
- # Set up a keychain for the build:
- security create-keychain -p "${KEYCHAIN_PASSWORD}" build.keychain
- security default-keychain -s build.keychain
- # Remove default re-lock timeout to avoid codesign hangs:
- security set-keychain-settings build.keychain
- security unlock-keychain -p "${KEYCHAIN_PASSWORD}" build.keychain
- security import macos_certificate.p12 -k build.keychain -P "${MACOS_CERTIFICATE_PWD}" -A -T /usr/bin/codesign
- security set-key-partition-list -S apple-tool:,apple: -s -k "${KEYCHAIN_PASSWORD}" build.keychain
-
- # Tell Github Workflow that we want signing
- echo "macos_signed=true" >> "$GITHUB_OUTPUT"
-
- # If set, import CA key to allow self signed key
- if [[ -n "${MACOS_CA_PUBLICKEY}" ]]; then
- # bypass any GUI related trusting prompt (https://developer.apple.com/forums/thread/671582)
- echo "Importing development only CA"
- # shellcheck disable=SC2024
- sudo security authorizationdb read com.apple.trust-settings.admin > rights
- sudo security authorizationdb write com.apple.trust-settings.admin allow
- sudo security add-trusted-cert -d -r trustRoot -k "build.keychain" CA.cer
- # shellcheck disable=SC2024
- sudo security authorizationdb write com.apple.trust-settings.admin < rights
- else
- # Tell Github Workflow that we need notarization & stapling (non self signed build)
- echo "macos_notarize=true" >> "$GITHUB_OUTPUT"
- fi
-
- # If distribution cert is present, set for store signing + submission
- if [[ -n "${MAC_STORE_APP_CERT}" ]]; then
-
- # Check all Github secrets are in place
- # MAC_STORE_APP_CERT already checked
- [[ -n "${MAC_STORE_APP_CERT_ID:-}" ]] || return 1
- [[ -n "${MAC_STORE_APP_CERT_PWD:-}" ]] || return 1
- [[ -n "${MAC_STORE_INST_CERT:-}" ]] || return 1
- [[ -n "${MAC_STORE_INST_CERT_ID:-}" ]] || return 1
- [[ -n "${MAC_STORE_INST_CERT_PWD:-}" ]] || return 1
-
- # Put the certs to files
- echo "${MAC_STORE_APP_CERT}" | base64 --decode > macapp_certificate.p12
- echo "${MAC_STORE_INST_CERT}" | base64 --decode > macinst_certificate.p12
-
- echo "App Store distribution dependencies are satisfied, proceeding..."
-
- # Add additional certs to the keychain
- security set-keychain-settings build.keychain
- security unlock-keychain -p "${KEYCHAIN_PASSWORD}" build.keychain
- security import macapp_certificate.p12 -k build.keychain -P "${MAC_STORE_APP_CERT_PWD}" -A -T /usr/bin/codesign
- security import macinst_certificate.p12 -k build.keychain -P "${MAC_STORE_INST_CERT_PWD}" -A -T /usr/bin/productbuild
- security set-key-partition-list -S apple-tool:,apple: -s -k "${KEYCHAIN_PASSWORD}" build.keychain
-
- # Tell Github Workflow that we are building for store submission
- echo "macos_store=true" >> "$GITHUB_OUTPUT"
- fi
-
- return 0
-}
-
-build_app_as_dmg_installer() {
- # Add the qt binaries to the PATH.
- # The clang_64 entry can be dropped when Qt <6.2 compatibility is no longer needed.
- export PATH="${QT_DIR}/${QT_VERSION}/macos/bin:${QT_DIR}/${QT_VERSION}/clang_64/bin:${PATH}"
-
- # Mac's bash version considers BUILD_ARGS unset without at least one entry:
- BUILD_ARGS=("")
- if prepare_signing; then
- BUILD_ARGS=("-s" "${MACOS_CERTIFICATE_ID}" "-a" "${MAC_STORE_APP_CERT_ID}" "-i" "${MAC_STORE_INST_CERT_ID}" "-k" "${KEYCHAIN_PASSWORD}")
- fi
- TARGET_ARCHS="${TARGET_ARCHS}" ./mac/deploy_mac.sh "${BUILD_ARGS[@]}"
-}
-
-pass_artifact_to_job() {
- artifact="jamulus_${JAMULUS_BUILD_VERSION}_mac${ARTIFACT_SUFFIX:-}.dmg"
- echo "Moving build artifact to deploy/${artifact}"
- mv ./deploy/Jamulus-*installer-mac.dmg "./deploy/${artifact}"
- echo "artifact_1=${artifact}" >> "$GITHUB_OUTPUT"
-
- artifact2="jamulus_${JAMULUS_BUILD_VERSION}_mac${ARTIFACT_SUFFIX:-}.pkg"
- file=(./deploy/Jamulus_*.pkg)
- if [ -f "${file[0]}" ]; then
- echo "Moving build artifact2 to deploy/${artifact2}"
- mv "${file[0]}" "./deploy/${artifact2}"
- echo "artifact_2=${artifact2}" >> "$GITHUB_OUTPUT"
- fi
-}
-
-notarize() {
- echo "Submitting artifact to AppStore Connect..."
-
- if [[ ${ARTIFACT_PATH} == *.pkg ]]; then
- # Check if .pkg file is signed. (https://apple.stackexchange.com/a/212336)
- pkgutil --check-signature "${ARTIFACT_PATH}"
- fi
-
- echo "Requesting notarization..."
- xcrun notarytool submit "${ARTIFACT_PATH}" \
- --apple-id "${NOTARIZATION_USERNAME}" \
- --team-id "${APPLE_TEAM_ID}" \
- --password "${NOTARIZATION_PASSWORD}" \
- --wait
-}
-
-staple() {
- echo "Stapling package..."
- xcrun stapler staple "${ARTIFACT_PATH}"
-}
-
-case "${1:-}" in
- setup)
- setup
- ;;
- build)
- build_app_as_dmg_installer
- ;;
- get-artifacts)
- pass_artifact_to_job
- ;;
- notarize)
- notarize
- ;;
- staple)
- staple
- ;;
- *)
- echo "Unknown stage '${1:-}'"
- exit 1
- ;;
-esac
diff --git a/.github/autobuild/windows.ps1 b/.github/autobuild/windows.ps1
deleted file mode 100644
index 9a0157d796..0000000000
--- a/.github/autobuild/windows.ps1
+++ /dev/null
@@ -1,268 +0,0 @@
-##############################################################################
-# Copyright (c) 2022-2023
-#
-# Author(s):
-# Christian Hoffmann
-# The Jamulus Development Team
-#
-##############################################################################
-#
-# 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 2 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-#
-##############################################################################
-
-# Steps for generating Windows artifacts via Github Actions
-# See README.md in this folder for details.
-# See windows/deploy_windows.ps1 for standalone builds.
-
-param(
- [Parameter(Mandatory=$true)]
- [string] $Stage = "",
- # Allow buildoption to be passed for jackonwindows build, leave empty for standard (ASIO) build:
- [string] $BuildOption = "",
- # unused, only required during refactoring as long as not all platforms have been updated:
- [string] $GithubWorkspace =""
-)
-
-# Fail early on all errors
-$ErrorActionPreference = "Stop"
-
-# Invoke-WebRequest is really slow by default because it renders a progress bar.
-# Disabling this, improves vastly performance:
-$ProgressPreference = 'SilentlyContinue'
-
-$QtDir = 'C:\Qt'
-$ChocoCacheDir = 'C:\ChocoCache'
-$DownloadCacheDir = 'C:\AutobuildCache'
-# The following version pinnings are semi-automatically checked for
-# updates. Verify .github/workflows/bump-dependencies.yaml when changing those manually:
-$Qt32Version = "5.15.2"
-$Qt64Version = "6.9.1"
-$AqtinstallVersion = "3.1.21"
-$JackVersion = "1.9.22"
-$Msvc32Version = "win32_msvc2019"
-$Msvc64Version = "win64_msvc2022_64"
-$JomVersion = "1.1.2"
-
-# Compose JACK download urls
-$JackBaseUrl = "https://github.com/jackaudio/jack2-releases/releases/download/v${JackVersion}/jack2-win"
-$Jack64Url = $JackBaseUrl + "64-v${JackVersion}.exe"
-$Jack32Url = $JackBaseUrl + "32-v${JackVersion}.exe"
-
-$JamulusVersion = $Env:JAMULUS_BUILD_VERSION
-if ( $JamulusVersion -notmatch '^\d+\.\d+\.\d+.*' )
-{
- throw "Environment variable JAMULUS_BUILD_VERSION has to be set to a valid version string"
-}
-
-# Download dependency to cache directory
-Function Download-Dependency
-{
- param(
- [Parameter(Mandatory=$true)]
- [string] $Uri,
- [Parameter(Mandatory=$true)]
- [string] $Name
- )
-
-
- # Restore dependency if cached copy already exists
- if (Test-Path -Path "$DownloadCacheDir\$Name" -PathType Leaf)
- {
- echo "Using ${DownloadCacheDir}\${Name} from previous run (actions/cache)"
- return
- }
-
- Invoke-WebRequest -Uri $Uri -OutFile "${DownloadCacheDir}\${Name}"
-
- if ( !$? )
- {
- throw "Download of $Name ($Uri) failed with exit code $LastExitCode"
- }
-}
-
-Function Install-Qt
-{
- param(
- [string] $QtVersion,
- [string] $QtArch
- )
- $Args = (
- "--outputdir", "$QtDir",
- "windows",
- "desktop",
- "$QtVersion",
- "$QtArch",
- "--archives", "qtbase", "qttools", "qttranslations"
- )
- if ( $QtVersion -notmatch '5\.[0-9]+\.[0-9]+' )
- {
- # From Qt6 onwards, qtmultimedia is a module and cannot be installed
- # as an archive anymore.
- $Args += ("--modules")
- }
- $Args += ("qtmultimedia")
- aqt install-qt @Args
- if ( !$? )
- {
- echo "WARNING: Qt installation via first aqt run failed, re-starting with different base URL."
- aqt install-qt -b https://mirrors.ocf.berkeley.edu/qt/ @Args
- if ( !$? )
- {
- throw "Qt installation with args @Args failed with exit code $LastExitCode"
- }
- }
-}
-
-Function Ensure-Qt
-{
- if ( Test-Path -Path $QtDir )
- {
- echo "Using Qt installation from previous run (actions/cache)"
- return
- }
-
- echo "Install Qt..."
- # Install Qt
- pip install "aqtinstall==$AqtinstallVersion"
- if ( !$? )
- {
- throw "pip install aqtinstall failed with exit code $LastExitCode"
- }
-
- echo "Get Qt 64 bit..."
- Install-Qt "${Qt64Version}" "${Msvc64Version}"
-
- echo "Get Qt 32 bit..."
- Install-Qt "${Qt32Version}" "${Msvc32Version}"
-}
-
-Function Ensure-jom
-{
- choco install --no-progress -y jom --version "${JomVersion}"
-}
-
-Function Ensure-JACK
-{
- if ( $BuildOption -ne "jackonwindows" )
- {
- return
- }
-
- # Set installer parameters for silent install
-
- $JACKInstallParms = "/SILENT", "/SUPPRESSMSGBOXES", "/NORESTART"
-
- # Create cache directory if it doesn't exist yet
-
- if (-not(Test-Path -Path "$DownloadCacheDir"))
- {
- New-Item -Path $DownloadCacheDir -ItemType "directory"
- }
-
- echo "Downloading 64 Bit and 32 Bit JACK installer (if needed)..."
-
- Download-Dependency -Uri $Jack64Url -Name "JACK64.exe"
- Download-Dependency -Uri $Jack32Url -Name "JACK32.exe"
-
- # Install JACK 64 Bit silently via installer
-
- echo "Installing JACK2 64-bit..."
-
- $JACKInstallPath = "${DownloadCacheDir}\JACK64.exe"
-
- Start-Process -Wait $JACKInstallPath -ArgumentList "$JACKInstallParms"
-
- if ( !$? )
- {
- throw "64bit JACK installer failed with exit code $LastExitCode"
- }
-
- echo "64bit JACK installation completed successfully"
-
- echo "Installing JACK2 32-bit..."
-
- # Install JACK 32 Bit silently via installer
-
- $JACKInstallPath = "${DownloadCacheDir}\JACK32.exe"
-
- Start-Process -Wait $JACKInstallPath -ArgumentList "$JACKInstallParms"
-
- if ( !$? )
- {
- throw "32bit JACK installer failed with exit code $LastExitCode"
- }
-
- echo "32bit JACK installation completed successfully"
-}
-
-Function Build-App-With-Installer
-{
- echo "Build app and create installer..."
- $ExtraArgs = @()
- if ( $BuildOption -ne "" )
- {
- $ExtraArgs += ("-BuildOption", $BuildOption)
- }
- powershell ".\windows\deploy_windows.ps1" "C:\Qt\${Qt32Version}" "C:\Qt\${Qt64Version}" @ExtraArgs
- if ( !$? )
- {
- throw "deploy_windows.ps1 failed with exit code $LastExitCode"
- }
-}
-
-Function Pass-Artifact-to-Job
-{
- # Add $BuildOption as artifact file name suffix. Shorten "jackonwindows" to just "jack":
- $ArtifactSuffix = switch -Regex ( $BuildOption )
- {
- "jackonwindows" { "_jack"; break }
- "^\S+$" { "_${BuildOption}"; break }
- default { "" }
- }
-
- $artifact = "jamulus_${JamulusVersion}_win${ArtifactSuffix}.exe"
- echo "Copying artifact to .\deploy\${artifact}"
- move ".\deploy\Jamulus*installer-win.exe" ".\deploy\${artifact}"
- if ( !$? )
- {
- throw "move failed with exit code $LastExitCode"
- }
- echo "Setting Github step output name=artifact_1 to ${artifact}"
- echo "artifact_1=${artifact}" >> "$Env:GITHUB_OUTPUT"
-}
-
-switch ( $Stage )
-{
- "setup"
- {
- choco config set cacheLocation $ChocoCacheDir
- Ensure-Qt
- Ensure-jom
- Ensure-JACK
- }
- "build"
- {
- Build-App-With-Installer
- }
- "get-artifacts"
- {
- Pass-Artifact-to-Job
- }
- default
- {
- throw "Unknown stage ${Stage}"
- }
-}
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 70d0f59469..0000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-version: 2
-updates:
- - package-ecosystem: github-actions
- directory: /
- schedule:
- interval: weekly
- commit-message:
- prefix: "Build"
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
deleted file mode 100644
index d267c12c91..0000000000
--- a/.github/pull_request_template.md
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-**Short description of changes**
-
-
-
-CHANGELOG:
-
-**Context: Fixes an issue?**
-
-
-
-**Does this change need documentation? What needs to be documented and how?**
-
-
-
-**Status of this Pull Request**
-
-
-
-
-**What is missing until this pull request can be merged?**
-
-
-
-## Checklist
-
-
-
-- [ ] I've verified that this Pull Request follows the [general code principles](https://github.com/jamulussoftware/jamulus/blob/main/CONTRIBUTING.md#jamulus-projectsource-code-general-principles)
-- [ ] I tested my code and it does what I want
-- [ ] My code follows the [style guide](https://github.com/jamulussoftware/jamulus/blob/main/CONTRIBUTING.md#source-code-consistency)
-- [ ] I waited some time after this Pull Request was opened and all GitHub checks completed without errors.
-- [ ] I've filled all the content above
-
-
-
diff --git a/.github/workflows/autobuild.yml b/.github/workflows/autobuild.yml
deleted file mode 100644
index 82d9786a5e..0000000000
--- a/.github/workflows/autobuild.yml
+++ /dev/null
@@ -1,505 +0,0 @@
-# This file builds the source and produces artifacts for every supported platform.
-# For release tags it creates a Github release and uploads the binaries to that releases.
-# The builds are instrumented with CodeQL.
-
-# see analyse_git_reference.py for implementation of the logic:
-# for every push to a branch starting with "autobuild": (can be used during development for tighter supervision of builds)
-# - do CodeQl while building for every platform
-# - publish the created binaries/packs only as artifacts/appendix of the github-action-run (not as release), and only retain those files for limited period
-# for every pull-request to main:
-# - do CodeQl while building for every platform
-# - publish the created binaries/packs only as artifacts/appendix of the github-action-run (not as release), and only retain those files for limited period
-# for every tag that starts with 'r' and has an arbitrary suffix (e.g. beta1, rc1, etc.)
-# - do CodeQl while building for every platform
-# - publish the created binaries/packs only as artifacts/appendix as a prerelease
-# for every tag that starts with 'r' and does not have any suffix:
-# - do CodeQl while building for every platform
-# - publish the created binaries/packs only as artifacts/appendix as a release
-
-on:
- workflow_dispatch:
- inputs:
- build_all_targets:
- type: boolean
- description: 'Build all targets (instead of just the main platforms)'
- push:
- tags:
- - "r*"
- branches:
- # For developers: Branches starting with autobuild will be built and evaluated on each push.
- - "autobuild**"
- # CodeQL requires every branch from on.pull_request to be part of on.push as well in order to run comparisons.
- # We also need main here to trigger builds on PR merge to main and manual pushes (e.g. as part of the release process):
- - "main"
- paths-ignore:
- - '**README.md'
- - 'docs/**'
- - 'SECURITY.md'
- - 'CONTRIBUTING.md'
- - 'COMPILING.md'
- - 'COPYING'
- - 'APPLEAPPSTORE.LICENCE.WAIVER'
- - '.github/ISSUE_TEMPLATE/*'
- - '.github/pull_request_template.md'
- pull_request:
- branches:
- - main
- paths-ignore:
- - '**README.md'
- - 'docs/**'
- - 'SECURITY.md'
- - 'CONTRIBUTING.md'
- - 'COMPILING.md'
- - 'COPYING'
- - 'APPLEAPPSTORE.LICENCE.WAIVER'
- - '.github/ISSUE_TEMPLATE/*'
- - '.github/pull_request_template.md'
-
-name: Auto-Build
-permissions: {}
-jobs:
- create_release:
- # Check if we are doing a release or just a normal build.
- # This must be done before actually building the app to find out where to upload the binaries and if we need to create a Github release.
- name: Build vars & Github release (if required)
- runs-on: ubuntu-24.04-arm
- outputs:
- publish_to_release: ${{ steps.get-build-vars.outputs.PUBLISH_TO_RELEASE }}
- tag_name: ${{ steps.get-build-vars.outputs.RELEASE_TAG }}
- build_version: ${{ steps.get-build-vars.outputs.BUILD_VERSION }}
- build_all_targets: ${{ steps.decide-build-targets.outputs.build_all_targets }}
- env:
- release_changelog_path: ./.github_release_changelog.md
- # Set permissions. We need write permissions to content for creating/removing the release
- permissions:
- contents: write
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Determine release version, type and prerelease variables
- run: ./.github/autobuild/get_build_vars.py
- id: get-build-vars
-
- - name: Extract Changelog for the Github release body
- if: steps.get-build-vars.outputs.PUBLISH_TO_RELEASE == 'true'
- run: ./.github/autobuild/extractVersionChangelog.pl ChangeLog ${{ steps.get-build-vars.outputs.JAMULUS_PRO_VERSION }} > ${{ env.release_changelog_path }}
-
- - name: Create/Recreate Release ${{steps.get-build-vars.outputs.RELEASE_TAG}} ${{steps.get-build-vars.outputs.RELEASE_TITLE}}
- if: steps.get-build-vars.outputs.PUBLISH_TO_RELEASE == 'true'
- id: create-release
- run: |
- set -eu
-
- # delete release if existing
- gh release delete "${tag_name}" || true
-
- RELEASE_PRERELEASE_ARG=""
- if [[ "${prerelease}" == 'true' ]]; then
- RELEASE_PRERELEASE_ARG="--prerelease"
- fi
- # Actually create the release. This will print the release url if successful
- gh release create "${tag_name}" --title "${release_name}" --notes-file "${body_path}" ${RELEASE_PRERELEASE_ARG}
-
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- tag_name: ${{ steps.get-build-vars.outputs.RELEASE_TAG }}
- release_name: ${{ steps.get-build-vars.outputs.RELEASE_TITLE }}
- body_path: ${{ env.release_changelog_path }}
- prerelease: ${{ steps.get-build-vars.outputs.IS_PRERELEASE }}
-
- - name: Decide which targets to build for
- id: decide-build-targets
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- INPUT_BUILD_ALL_TARGETS: ${{ github.event.inputs.build_all_targets }}
- PR_NUMBER: ${{ github.event.number }}
- PR_BASE: ${{ github.event.pull_request.base.sha }}
- PR_HEAD: ${{ github.event.pull_request.head.sha }}
- run: |
- set -eu
- build_all_targets() {
- echo "build_all_targets=${1}" >> $GITHUB_OUTPUT
- echo "Building for all targets? Result: ${1}"
- exit 0
- }
-
- handle_push() {
- if [[ "${GITHUB_REF}" == "refs/tags/"* ]]; then
- echo 'Triggered by a tag push, building all targets'
- build_all_targets 'true'
- fi
- if [[ "${GITHUB_REF}" == "refs/heads/autobuild"* ]]; then
- echo 'Triggered by a push to an autobuild* branch, building all targets'
- build_all_targets 'true'
- fi
- }
-
- handle_workflow_dispatch() {
- if [[ "${INPUT_BUILD_ALL_TARGETS}" == 'true' ]]; then
- echo 'Triggered by manual run with "Build all targets" checkbox set'
- build_all_targets 'true'
- fi
- }
-
- handle_pull_request() {
- pr_body_contains_magic_string() {
- pr_body=$(gh pr view "${PR_NUMBER}" --json body --jq .body)
- grep -vP ' (#2448).
- (contributed by @gilgongo)
-
-- Documentation: Rewrite some parts of COMPILING.md and CONTRIBUTING.md to stay up to date and enable clearer contribution guidelines (#2561).
- (contributed by @ann0see)
-
-- Build: Added nojsonrpc qmake CONFIG option to remove JSON-RPC support (#2660).
- (contributed by @pljones)
-
-- Build: Make serveronly more comprehensive (#2551).
- (contributed by @pljones)
-
-- Build: Rename existing define to JACK_ON_WINDOWS (#2525).
- (contributed by @pljones)
-
-- Build: Moved CodeQL from Mac to Mac Legacy to work around signing incompatibility (#2564).
- (contributed by @softins)
-
-- Build: Provide unsigned iOS builds for easy install on iOS devices (#2355).
- (contributed by @ann0see)
-
-- Build: Added macOS M1 (arm64) support (#2682).
- (contributed by @hoffie)
-
-- Build: macOS will now be built with Qt 6.3.1 for better support of modern versions of macOS. Users of macOS 10.14 or earlier must from now use the legacy build or compile from source (#2672).
- (contributed by @ann0see)
-
-- Build: Improved grep usage in scripts #2421 (#2397).
- (contributed by @ann0see)
-
-- Build: Removed broken QMAKE_APPLICATION_BUNDLE_NAME. logic (#2477).
- (contributed by @hoffie)
-
-- Build: Initial support for building with Qt6 has been implemented (@dcorson-ticino-com, @softins) (#2299).
- (contributed by @hoffie)
-
-- Build: Updated aqt to v2.1.0 due to reliability reasons (#2597).
- (contributed by @ann0see)
-
-- Autobuild: Major overhaul, incorporating improvements in performance
- * Coding style and static checks for shell scripts are now enforced (#2635).
- * Build workflow download and cache optimisations (#2284, #2498, #2499, #2642).
- * Parallelisation of build processes (#2444, #2445)
- * Build script refactoring (#2284, #2451, #2470, #2473, #2476, #2489, #2501, #2502, #2509, #2514, #2527, #2540, #2584, #2642).
- (contributed by @hoffie)
-
-- Autobuild: Added experimental support for armhf (Raspberry-compatible) Linux .deb packages (#2526).
- (contributed by @hoffie)
-
-- Autobuild: Fix iOS artifact name (#2619).
- (contributed by @hoffie)
-
-- Autobuild: Build macOS .dmg files by create-dmg for building compatibility with further versions of macOS #2420 (#2207).
- (contributed by @ann0see)
-
-- Autobuild: Stop the build if the audio SDK is missing (#2536).
- (contributed by @pljones)
-
-- Autobuild: Stop running Autobuild if only documentation is updated to avoid wasting computation time (#2532).
- (contributed by @ann0see)
-
-- Autobuild: Build Windows version on latest build environment. This upgrades the Windows build process (#2649).
- (contributed by @ann0see)
-
-- Autobuild: Make Qt downloads on Windows more reliable by re-trying downloads (#2333).
- (contributed by @ann0see)
-
-- Autobuild: Backport Oboe's fixes CodeQl overflow warnings (#2548).
- (contributed by @ann0see)
-
-- Code: code restructuring to reduce cross-dependencies (CHighPrecisionTimer) (#2637).
- (contributed by @pljones)
-
-- Internal: Improved analyze_git_references.py script (#2471).
- (contributed by @hoffie)
-
-- Internal: Improved and reorganized git/Changelog scripts (#2656).
- (contributed by @hoffie)
-
-- Internal: Added .editorconfig for cross-language standardized indentation and line endings (#2585).
- (contributed by @hoffie)
-
-- Internal: Applied a consistent coding style to scripts (#2547, #2582).
- (contributed by @hoffie)
-
-- Internal: Added `make clang_format` helper command to simplify code formatting for contributors (#2258).
- (contributed by @hoffie)
-
-- Internal: Added debian/ folder to .gitignore file to ensure build files are not added to git (#2464).
- (contributed by @ann0see)
-
-- Internal: Check coding style on macOS/iOS code files (.mm extension) (#1871).
- (contributed by @ngocdh)
-
-- Internal: Use TODO and TEST comments instead of un-indenting with clang-format off/on (#2600).
- (contributed by @pgScorpio)
-
-- Internal: Removed unneeded white-space in all files and streamline line endings (#2402).
- (contributed by @ann0see)
-
-- Internal: Applied standard style to .md files (#2549).
- (contributed by @ann0see)
-
-- Internal: Move sound API files into src/sound folder. Contributors will now find the sound.cpp/sound.h/sound.mm in the src/sound folder for consistency (#2575).
- (contributed by @ann0see)
-
-- Internal: Move translation files one level up to make finding them easier for translators (#2576).
- (contributed by @ann0see)
-
-- Internal: Moved entitlements file to mac/ folder to clean up the repo root (#2529).
- (contributed by @ann0see)
-
-- Internal: Rename LED resources (#2621).
- (contributed by @henkdegroot)
-
-- Internal: Improved release contributor tooling (#2411).
- (contributed by @hoffie)
-
-- Internal: Improved Changelog release tooling (#2485, #2661).
- (contributed by @hoffie)
-
-- Internal: Moved outdated VST code on feature branch since there hasn't been any active development for a long time (#2461).
- (contributed by @ann0see)
-
-- Internal: Removed outdated qt-installer-windows.qs since we no longer use Travis CI (#2516).
- (contributed by @ann0see)
-
-
-### 3.8.2 (2022-02-20) ###
-
-- Client: Added selection option for level meter style (#1688, #2352, #2356).
- (contributed by @henkdegroot, @hoffie, @pgScorpio, @pljones)
-
-- Client: On Windows, if no driver found while installing, the "Run Jamulus"
- option will not be checked (#2103).
- (contributed by @henkdegroot)
-
-- Client: on macOS, corrected minimum OS version number for Legacy installer from 10.13 to 10.10.
- Legacy installer will now install correctly on macOS Yosemite or newer (#2223).
- (contributed by @softins)
-
-- Client: Added Vibraphone to list of instruments (#2043, #2080, #2158).
- (contributed by @DavidSavinkoff, @softins, photo by @vibraphon)
-
-- Client: Added Conductor to list of instruments (#2140).
- (contributed by @henkdegroot)
-
-- Client: Fix wrong display of Unicode characters at line wrap and settings screen (#1994, #2274).
- (contributed by @djfun, @pljones, @hoffie)
-
-- Client: Fixed incorrect operation of feedback detection on first connect in run (#2120).
- (contributed by @softins)
-
-- Client: Added option always to show one's own fader first (#1809).
- (contributed by @ngocdh)
-
-- Client: Improved regex to highlight URLs in the chat window, avoiding terminating punctuation.
- Also migrated from deprecated QRegExp to QRegularExpression, for future compatibility with
- Qt6 (#2124, #2272, #2273).
- (contributed by @softins, @corrados, @hoffie)
-
-- Client: Improved keyboard control of the list of Custom Directories (#2129).
- (contributed by @pljones)
-
-- Client: Added the connected server name to the heading in the mixer panel (#2173).
- (contributed by @pljones)
-
-- Client: Enhanced the ASIO driver detection during installation on Windows (#2149).
- (contributed by @henkdegroot)
-
-- Client: On Windows, hide the ASIO button in the version that uses JACK instead (#2215).
- (contributed by @henkdegroot)
-
-- Client: Improved the "What's this?" text displayed for Buffer Delay (#2232).
- (contributed by @henkdegroot)
-
-- Client: Accelerator key clash between Settings button and Settings menu corrected (#2248).
- (contributed by @henkdegroot)
-
-- Client: Added option code 'o' in --ctrlmidich for "Mute Myself" (#2334).
- (contributed by @henkdegroot)
-
-- Client/Server: Output from --help and --version is now sent to StdOut instead of StdErr (#2244).
- (contributed by @henkdegroot)
-
-- Client/Server: Improved the version output on the command line to give more detail and Qt version (#2187).
- (contributed by @henkdegroot)
-
-- Client/Server: Added version and Jamulus URL to the Windows uninstall information registered when installing (#2201).
- (contributed by @henkdegroot)
-
-- Client/Server: Some improvements to text related to localisation (#2085).
- (Contributed by @BLumia)
-
-- GUI: Improved Connect Dialog help texts (#2121).
- (contributed by @pljones)
-
-- GUI: Translations have been updated:
- * Dutch, by @henkdegroot and @jerogee (#2371, #2314)
- * French, by @jujudusud (#2329, #2320, #2381)
- * German, by @ann0see, @rolamos and @hoffie (#2349, #2387)
- * Italian, by @dzpex (#2327)
- * Polish, by @SeeLook (#2375, #2331)
- * Portuguese Brazilian, by @melcon (#2369, #2358)
- * Portuguese European, by @melcon (#2368)
- * Simplified Chinese, by @BLumia (#2313, #2391)
- * Slovak, by @jose1711 (#2348)
- * Spanish, by @ignotus666 (#2378, #2326)
- * Swedish, by @softins (#2364)
-
-- Server: Fixed incorrect German translation (#2137).
- (contributed by @rolamos)
-
-- Server: Improved management and allocation of free channels, so that a new client always gets the
- lowest available channel number. Improves operation of clients with MIDI faders (#2151).
- (contributed by @softins)
-
-- Server: Improved the icon that is displayed in the Windows system tray for a server (#2231).
- (contributed by @henkdegroot)
-
-- Bugfix: IPv6 address formatting and obfuscation has been improved (#2343).
- (contributed by @rdica, @hoffie, @softins)
-
-- Windows Installer: Updated NSIS to v3.08 (#2208).
- (contributed by @ann0see)
-
-- Android: Some internal improvements to the experimental Android port buffer handling (#1528, #2237).
- (contributed by @j-santander, @softins)
-
-- Documentation: Enhanced the iOS compilation guide and signing instructions (#2139, #2315).
- (contributed by @ann0see, @RobyDati)
-
-- Documentation: Added a man page for Jamulus, from the Debian project (#2180).
- (contributed by @mirabilos)
-
-- Build: Raspijamulus build script has been improved to work with the latest Raspberry Pi OS releases and to include a newer JACK version (#2267).
- (contributed by @corrados, @softins)
-
-- Internal: Improved accelerator key detection (#2061).
- (contributed by @softins)
-
-- Internal: A hypothetical CodeQL-detected multiplication overflow in sound buffer handling has been fixed (#2292, #2297).
- (contributed by @softins)
-
-- Internal: Changed "Central" to "Directory" in names of variables and functions (#2079).
- (contributed by @pljones)
-
-- Internal: Corrected "Protcol" to "Protocol" in names of variables and functions (#2146).
- (contributed by @atsampson)
-
-- Internal: Some code reordering, particularly of the settings initialisation (#2174, #2177).
- (contributed by @pljones)
-
-- Internal: Removed unneeded submodules from tools directory, and replaced with a RELATED-PROJECTS document (#2196).
- (contributed by @softins)
-
-- Internal: Improved generation of the changelog for the Debian package, using dch (#2138).
- (contributed by @npostavs)
-
-- Internal: Improved powershell redirect handling when building for Windows in Github (#2225).
- (contributed by @henkdegroot)
-
-- Internal: Prepared autobuild logic for upcoming Qt6 compatibility (#2328).
- (contributed by @hoffie, @softins)
-
-- Internal: Release build process has been refactored and uses pinned dependencies for better reproducibility now (#2345, #2336).
- (contributed by @hoffie, @softins)
-
-- Internal: Moved documentation files into docs/ folder to clean up root folder (#2283).
- (contributed by @ann0see)
-
-
-### 3.8.1 (2021-10-23) ###
-
-- Client: JACK support on Windows has been improved (#1718).
- (contributed by @jujudusud, @henkdegroot)
-
-- Client: Rewrote multiple error messages to improve UX (#1568, #1732).
- (contributed by @ann0see)
-
-- Client: Add custom directory servers to Connect Dialog (#1869, #1894).
- (contributed by @jp8)
-
-- Client: Rearrange existing UI menu bar items (#1915, #1926).
- (contributed by @jp8)
-
-- Bug Fix: Mute myself has been made more consistent (#1838).
- (contributed by @ngocdh)
-
-- Bug Fix: Fix ampersand not being shown correctly on mixer (#1886, #1893).
- (contributed by @HughePaul, @ann0see)
-
-- Bug Fix: A crash fix related to the way iOS handles sockets in idle mode (#1875).
- (contributed by @ngocdh)
-
-- Server: A single click on the server application in the systemtray now opens the Jamulus Server main window (#1722, #1731).
- (contributed by @henkdegroot)
-
-- Server: Jam Recorder's internal locking and initialization code has been made more robust (#1826).
- (contributed by @cdmahoney)
-
-- Server: The list of servers registered on a directory can now be saved during directory restart. Use the new
- --directoryfile CLI option to use this feature (#1867).
- (contributed by @pljones)
-
-- Server: Add link to website if a new version is available (#1980).
- (contributed by: @ann0see)
-
-- Bug Fix: Remove incorrect version of headless .service file (#2009).
- (contributed by @ann0see)
-
-- Client/Server: Add IPv6 support for direct connections (#1017, #1938).
- (contributed by @jardous, @softins)
-
-- CLI: Re-order and refactor help for client/server validation (#1896).
- (contributed by @pljones)
-
-- CLI: Jamulus now shows a link to the Website for translated content (#1759).
- (contributed by @henkdegroot)
-
-- Android: Add close button on Android to enhance UX (#1763, #1876).
- (contributed by @ngocdh)
-
-- iOS: Sound support, feature to allow switch between external device and the internal mic (#1875).
- (contributed by @ngocdh)
-
-- MacOS: Keyboard shortcuts now also work on macOS (#1726, #1873).
- (contributed by @henkdegroot)
-
-- Installer: Add zh_CN translation + for nsis win installer (#1922, #1954).
- (contributed by @BLumia)
-
-- Documentation: Move Demos, description of inputs options to Knowledge Base (#603, #551).
- (contributed by: @pcar75, @gilgongo)
-
-- Documentation: Add user experience section to CONTRIBUTING.md (#1885).
- (contributed by: @ann0see)
-
-- Documentation: Create Server Admin Manual (#527).
- (contributed by: @gilgongo)
-
-- Documentation: Update typo on links in compiling.md file (#1824).
- (contributed by @jujudusud)
-
-- Documentation: Number range command line error messages reworded accurately (#1978).
- (contributed by @DavidSavinkoff)
-
-- Website: switch to .po file format to make updating translations easier (various PRs)
- (contributed by: @ignotus666)
-
-- Website: Removed edit button from wiki layout file (#576).
- (contributed by: @DevRish)
-
-- Internal: Enable signing of macOS binaries (via build script and automatically via CI) (#1856, #1937).
- (contributed by @emlynmac)
-
-- Internal: Added Apple Appstore licence waiver (#1874)
- (contributed by @ann0see, @pljones, @gilgongo)
-
-- Internal: Add autobuild for Windows with JACK (#1829).
- (contributed by @henkdegroot)
-
-- Internal: Document release process on contribute page (#1594, #592).
- (contributed by: @hoffie, @ann0see)
-
-### 3.8.0 (2021-06-02) ###
-
-- The term "Central server" has been replaced with "Directory server" (#1407, #1715, #1629).
- Note that the program will still accept the --centralserver option for backward
- compatibility with existing system startup scripts, but its usage is deprecated.
- (contributed by @pljones, @softins)
-
-- Mac: Generate build with Qt 5.15.2 for better compatibility with Big Sur (#1687, #1768).
- We still build a legacy version with Qt 5.9.9 to support older versions of macOS:
- * Users of 10.13 (High sierra) or newer should use the standard build with Qt 5.15.2
- * Users of Yosemite, El Capitan or Sierra should use the legacy build with Qt 5.9.9
- (contributed by @softins)
-
-- GUI: Settings window has been reorganized into tabs (#1415, #1554, #1542, #1588):
- * User Profile window has been integrated into the settings window.
- * Input Pan has been moved to the newly created Advanced tab and removed from main window.
- (contributed by @dcorson-ticino-com, @pljones)
-
-- GUI: Moved the Ping and Delay stats from the Settings window to the main window (#1762):
- This was partly to work around a Mac issue with updates to the settings window (#1643)
- and is actually an improvement anyway, as the settings window does not need to remain open.
- (contributed by @dcorson-ticino-com and @softins)
-
-- GUI: Added "About Qt" to the help menu to display version of Qt (#1685, #1692).
- (contributed by @softins)
-
-- GUI: Corrected the operation of What's This in the settings dialog (#1622, #1635).
- (contributed by @dcorson-ticino-com)
-
-- GUI: Improved the muted speaker icon display (#1691).
- (contributed by @henkdegroot)
-
-- Added new icons for Linux desktop use (#1672).
- (contributed by @jujudusud)
-
-- GUI: Corrected handling of custom directory server in the server, to prevent
- unintended registration with a directory server (#1624, #1627).
- (contributed by @softins)
-
-- GUI: Corrected alignment of Mute icon above fader (#811, #1312, #1640).
- (contributed by @vimpostor)
-
-- GUI: Support for more than two mixer rows has been added (#1549, #1560).
- (contributed by @pljones)
-
-- GUI: --clientname also works in dialog titles now (#1352, 1370).
- (contributed by @dcorson-ticino-com)
-
-- GUI: Translations have been updated
- * Dutch, by @henkdegroot (#1562, #1623, #1714, #1557)
- * French, by @jujudusud (#1648, #1708)
- * German, by @rolamos (#1677, #1810)
- * Italian, by @dzpex (#1620)
- * Polish, by @SeeLook (#1619)
- * Portuguese Brazilian, by @melcon (#1671, #1807)
- * Portuguese European, by @Snayler (#1689)
- * Slovak, by @jose1711 (#1647)
- * Spanish, by @ignotus666 (#1621, #1730, #1808)
- * Swedish, by @genesisproject2020 (#1664, #1696)
-
-- Network: Support for DSCP Quality of Service flags has been added (#1310).
- This is supposed to lead to improved network performance.
- It is enabled by default.
- On Windows, this requires additional configuration in order to work.
- Please see the Tips & Tricks page on the website for a setup guide for Windows.
- (contributed by @DavidSavinkoff)
-
-- Client: Automatic channel fader adjustment simplifies mixer setup by using the channel level meters (#1071).
- (contributed by @JohannesBrx)
-
-- Client: Basic audio feedback detection has been added (#1179).
- (contributed by @JohannesBrx)
-
-- Client: Support for input gain boost has been added (#1222, #1030)
- (contributed by @hoffie)
-
-- Client: Grouping support has been extended to allow for up to eight groups (#1551).
- (contributed by @pljones)
-
-- Client: A hint regarding non-default Jack support has been added (#1397, #1438).
- (contributed by @djfun)
-
-- Server: Support for Delay Panning has been added (#332, #567, #1151, #1417, #1744):
- This feature can be enabled on servers using the new --delaypan option.
- Enabling this feature will slightly increase server CPU usage.
- It can create a much more realistic spatial sound impression for clients
- that are set to Stereo or Mono-in/Stereo-out mode.
- (contributed by @DetlefHennings, @Hk1020, @softins, @henkdegroot)
-
-- Server: Multi-threading performance has been improved (#960).
- (contributed by @menzels, @softins)
-
-- Server: Half-connected clients will no longer receive audio (#1243, #1589):
- Note: This breaks compatibility with client versions before 3.3.0 (Feb 2013).
- If you update your server, ensure that all clients use 3.3.0 or later as well.
- (contributed by @softins)
-
-- Server: HTML status file is now emptied on exit (#1423, #1427).
- (contributed by @hoffie, @drummer1154)
-
-- Server: An explicit bind address can now be specified (#141, #1561).
- This can be done by the new --serverbindip option.
- (contributed by @buv)
-
-- Recorder: Compatibility with third-party tools such as Audacity has been improved (#1384, #1424, #1437).
- Non-ASCII characters are now stripped out when creating filenames.
- (contributed by @softins, @gilgongo, @reinhardwh)
-
-- Recorder: Failures to start recording no longer result in crashes (#1163, #1289, #1463).
- (contributed by @hoffie, @softins, @pljones)
-
-- Recorder: Logging has been improved (#1284, #1463).
- (contributed by @hoffie, @drummer1154)
-
-- Bug fix: The mute indicator is now also shown in mono mode (#1074).
- (contributed by @npostavs)
-
-- Bug fix: Channel mapping on Windows now only resets if the sound card or the numbers of channels changed (#1347).
- (contributed by @ann0see)
-
-- Bug fix: Jamulus client should now close itself correctly if a non-working device was selected (#872).
- (contributed by @npostavs)
-
-- Bug fix: Server no longer crashes while changing the recording directory (#1501, #1573).
- (contributed by @henkdegroot, @hoffie, @softins)
-
-- Bug fix: Example systemd unit has been fixed to avoid crashing when sending signals (#1515, #1518).
- (contributed by @softins, @helgeerbe, @gilgongo)
-
-- Bug fix: The Windows installer now correctly compiles in a path with spaces (#864, #1319).
- (contributed by @henkdegroot)
-
-- Performance: Opus encoding/decoding now uses machine-specific optimizations (#1105).
- (contributed by @npostavs)
-
-- Performance: Timer configuration for Windows servers has been improved (#1536).
- (contributed by @npostavs)
-
-- iOS support is being worked on (#1450).
- (contributed by @jeroenvv)
-
-- Github autobuild for Mac now uses Xcode 11.7 and SDK 10.15 for compatibility with Qt5 (#1655).
- (contributed by @softins)
-
-- Build: Creation of debug builds has been simplified (#1516).
- (contributed by @hoffie)
-
-- Internal: Constants for JACK usage have been renamed (#1429).
- (contributed by @djfun)
-
-- Internal: Legacy IP address variables have been cleaned up (#1400).
- (contributed by @wferi)
-
-- Internal: Added automatic code formatting with clang-format (#901, #1127, #1751).
- (contributed by @passing)
-
-- Internal: New pull requests will now be checked for coding style automatically (#1735).
- (contributed by @passing)
-
-- Internal: Windows deploy script has been aligned to autobuilds (#1720).
- (contributed by @henkdegroot)
-
-### 3.7.0 (2021-03-17) ###
-
-- Server lists have been reorganized to make room for more servers (#875):
- * Default has been renamed to Any Genre 1.
- * Any Genre has been renamed to Any Genre 2.
- * Any Genre 3 has been added.
- * Choral/Barbershop has been added.
- * Classical/Folk/Choral has been renamed to Classical/Folk.
-
-- Central server addresses have been moved to the jamulus.io domain (#919).
- The fischvolk.de addresses are deprecated.
-
-- GUI: If a name is provided using --clientname, that name is shown first in the window title, to avoid clipping in the Windows task bar (#789).
-
-- GUI: Translations have been updated:
- * Dutch, by @jerogee (#1110)
- * French, by @trebmuh & @jujudusud (#1199 & #1113)
- * German, by @rolamos (#1097)
- * Italian, by @dzpex (#1112)
- * Polish, by @SeeLook (#1099)
- * Portugese, by @melcon & @Snayler (#1141 & #1168)
- * Slovak, by @jose1711 (#1104)
- * Spanish, by @ignotus666 (#1152)
- * Swedish, by @genesisproject2020 (#1182 & #1106)
-
-- Active recording state is now highlighted in the mixerboard title (#968).
- (contributed by @dcorson-ticino-com)
-
-- Client window makes it more obvious when not connected to a server by graying out input levels and showing a message (#847, #983).
- (contributed by @ann0see)
-
-- Screensaver and screen blanking are now prevented on Macs (#834).
- (contributed by @jerogee)
-
-- Windows installer has been improved (#792, #841).
- Note: If you are using ASIO4ALL, we strongly suggest that you take a screenshot
- of your ASIO4ALL settings before upgrading. The installer will try its best to
- migrate your settings, but it may fail to do so when using custom
- installation paths.
- (contributed by @ann0see and @doloopuntil)
-
-- Windows installer interface now supports English, Dutch, French, German, Italian, Polish, Portuguese, Spanish and Swedish.
- (contributed by @jerogee, @jujudusud, @ann0see, @dzpex, @SeeLook, @Snayler,
- @melcon, @ignotus666 and @genesisproject2020)
-
-- Windows ASIO Setup button placement has been improved to be below the driver selection (#977).
- (contributed by @mulyaj and @ann0see)
-
-- Chat dialog has gained support for auto-linking http addresses (#879).
- (contributed by @hoffie)
-
-- Chat messages no longer allow HTML-formatted chat messages due to security reasons (#939).
- HTML formatting in Welcome messages will continue to work.
- (contributed by @atsampson)
-
-- Mixerboard background image quality in the Fancy skin has been improved (#970).
- (contributed by @passing)
-
-- MIDI controller logic has been improved to support fader, pan, mute and solo buttons in --ctrlmidich syntax (#945).
- Mute & solo buttons are only for toggle-type controllers and do not support
- headless operation yet.
- (contributed by @dakhubgit)
-
-- Servers connected to central servers behind the same NAT can now be made accessible to public clients via the newly added --serverpublicip option (#954).
- (contributed by @hoffie)
-
-- External IP detection no longer generates traffic to Cloudflare (#633, #1092).
- (contributed by @atsampson and @hoffie)
-
-- Version update detection has been improved (#1155):
- * The check now uses two servers instead of one (updatecheck1.jamulus.io and updatecheck2.jamulus.io).
- * The server version is now ignored if it is not a release, due to a
- suffix such as dev, beta or rc.
- (contributed by @softins)
-
-- Official Ubuntu/Debian packages are now built and published as part of the release (#1100).
- The packages are compatible with Ubuntu 18.04 or later.
- (contributed by @ann0see)
-
-- Experimental .apk installation packages for Android are now provided (#880).
- (contributed by @nefarius2001)
-
-- Bug fix: A suspected memory leak has been solved by removing usage of ConsoleWriterFactory (#926).
- (contributed by @pljones)
-
-- Bug fix: Changing ASIO driver properties like switching input/outputs in ASIO4ALL now resets input/output channel mapping in Jamulus again (#796).
- This was done to solve a bug with ASIO4ALL introduced in the last version.
-
-- Bug fix: Fader levels, mute and solo state are now restored properly when reconnecting to a restarted server (#955, #1010).
- This is a server-side fix.
- (contributed by @hoffie)
-
-- Bug fix: Multiple memory leaks in the server's recording feature have been fixed (#1073).
- (contributed by @softins)
-
-- Bug fix: Menu accelerator keys have been fixed in multiple translations (#1165).
- (contributed by @softins)
-
-- Bug fix: Windows sound driver lacked driverInfo initialisation (#1194).
- (coded by @npostavs)
-
-- Internal build and release process have been re-designed, automated and moved to Github.
- (contributed by @pljones, @nefarius2001, @ann0see, @ranfdev)
-
-- Internal development builds now contain a detailed version number (#475).
- (contributed by @nefarius2001)
-
-
-### 3.6.2 (2020-12-12) ###
-
-- change Clear All Stored Solo Settings to clear Mute as well (#731)
-
-- avoid selecting IPv6 results from hostname lookup, coded by jarmar (#722)
-
-- added possibility to set MIDI offset for fader control to --ctrlmidich (#95)
-
-- detect if no audio Device is selected before trying to connect a server (#129)
-
-- on MacOS if an audio device is no longer available, show a warning
- rather than switching to default automatically (#727)
-
-- bug fix: sliders move by themselves if fader groups are used on reconnect (#611)
-
-- bug fix: do not reset sound card channel selection on a device property change (#727)
-
-- bug fix: compiling Jamulus 3.6.1 is failing on Debian 9 Linode (#736)
-
-- bug fix: on MacOS Jamulus does not always select the previous sound card (#680)
-
-- bug fix: use new server icon on Mac server bundle and Windows installer (#737)
-
-- bug fix: ping times of servers which are further down the server list are too high (#49)
-
-
-### 3.6.1 (2020-11-21) ###
-
-- added menu entry "Set All Faders to New Client Level" (#622)
-
-- isolate a channel from the group temporarily with shift-click-drag (#695)
-
-- on shift-click the pan reset to 0 L/R (#707)
-
-- support multiple custom central server addresses (#698)
-
-- the Jamulus server now has a different icon, created by geheimerEichkater (#700)
-
-- support two rows for the mixer panel (#720)
-
-- changed RYG indicator lights with colour-blind compensation, created by geheimerEichkater (#57)
-
-- saving and loading mixer settings is now possible during an active connection and a
- mixer settings file can be loaded with drag'n'drop (#706)
-
-- menu entry Clear All Stored Solo Settings is now enabled during an active connection
-
-- bug fix: the fader group property was not correctly loaded from the ini file
-
-
-### 3.6.0 (2020-10-25) ###
-
-- handle audio packets received out of order, coded by softins (#619)
-
-- most recently connected users appear on the RH side on the fader panel (#673)
-
-- improvements for the server multithreading, coded by kraney (#653)
-
-- removed Display Channel Levels setting and --servername (#638)
-
-- removed support for further server infos in --serverinfo since the preferred
- way of registering a server is to do it using the protocol messages (#638)
-
-- removed -g, --pingservers since all Central servers must activate this function,
- now it is activated by default and no command line argument is needed (#638)
-
-- added --mutemyown command line argument to mute my own signal in my personal mix,
- only supported in headless client mode (#340)
-
-- added "Mountain Dulcimer" instrument icon, created by dora71 (#649)
-
-- added new instrument icons for "Scratching" and "Rapping"
-
-- replaced double types by floats for some of the signal processing, coded by hselasky (#544)
-
-- support permanent channel fader sorting (i.e., not only on request but always) (#666)
-
-- support sorting faders by channel city
-
-- if sorting the faders by instrument, we now sort by the name for the same instruments
-
-- improvements to the Android audio interface, coded by j-santander (#83)
-
-- bug fix: reduced server list is displayed instead of the normal list (#657)
-
-
-### 3.5.12 (2020-10-03) ###
-
-- added hyperlink support for the chat window, coded by jc-Rosichini (#591)
-
-- added new menu entry "Clear All Stored Solo Settings" (#616)
-
-- fade in all clients at the server when entering a server to avoid the volume
- is at 100% when joining a server (#628)
-
-- added a qmake CONFIG flag for disabling the automatic version check (#370)
-
-- avoid confusion with the Server Address field on the connection setup window by
- no longer showing the server name in that field since it is only intended for
- entering IP addresses or valid server URLs (#365)
-
-- removed the "Show Creative Commons BY-NC-SA 4.0 Licence Dialog" setting from the
- server GUI and changed the -L/--licence text in the licence dialog to "Do you agree
- to the text in the chat window?" so that a licence text must now be given in the
- server welcome message (#587, #367, #81)
-
-- added a protocol message for a reduced server list to improve the situation caused
- by UDP packet fragmentation (#631, #255)
-
-- added translation: Slovak by jose1711 (#635)
-
-- bug fix: crash when using the jam recorder in the server, coded by pljones (#618)
-
-
-### 3.5.11 (2020-09-19) ###
-
-- support a check for updates (#370)
-
-- added an optional server list whitelist filter (#413)
-
-- added a command line argument to enable multithreading in the server (#339)
-
-- added support for split protocol messages (fixes bug with large number of clients
- connected to a server, #547)
-
-- store recorder settings, coded by pljones (#313)
-
-- added a command line argument to disable recording on start up, coded by pljones (#574)
-
-- accessibility improvements, coded by chigkim (#498, #512)
-
-- added Jack audio latency calculation, coded by bflamig (#437)
-
-- show the server name in the title bar (#559)
-
-- bug fix: crash when using the Jack backend and quickly reconfiguring, coded by hselasky (#543)
-
-- bug fix: Alt+h shortcut to open the Chat dialog did not work, use Alt+c instead
-
-- bug fix: pan is not correctly initialized in the server on a new connection (#537)
-
-
-### 3.5.10 (2020-08-16) ###
-
-- do not change the server list order if the mouse is over the table to
- avoid selecting an incorrect server on a mouse double click (#293)
-
-- if network name/address contains spaces, they are removed now,
- coded by dingodoppelt (#462)
-
-- improve Compact skin by using smaller font size
-
-- improve server audio mix processing for better clipping behavior
-
-- support MIDI control faders in headless build (#483)
-
-- option to set Mute Myself on with a command line argument (#495)
-
-- added a red message to indicate that Mute Myself is activated (#476)
-
-- manual clip LED reset by mouse click on the level meter (#421)
-
-- replacing internal history graph functionality by external scripts/tools (#501)
-
-- accessibility improvements, coded by chigkim (#499, #510, #514)
-
-- bug fix: fixed a stability issue in the server
-
-- bug fix: --showallservers ping column sort is alphabetic (#201)
-
-
-### 3.5.9 (2020-07-19) ###
-
-- new app icon for Jamulus, created by geheimerEichkater (#410)
-
-- support up to four different groups for the channels (#202)
-
-- support sorting faders by channel group
-
-- add support to change the GUI language (#297)
-
-- add special server list filter for filtering occupied servers by using "#" (#397)
-
-- update server UI to allow setting the jam recorder directory (like -R) (#228, #405)
-
-- redesign of the server dialog (e.g. added welcome message setting)
-
-- save and restore mixer state (like fader, mute, etc.) (#377),
- note that saving/loading of settings only works if not connected
-
-- scale channel instrument picture in Compact skin mode
-
-- show maximum number of clients for servers in the serverlist, coded by dingodoppelt (#451)
-
-- log the number of connected clients on each new connection (#277)
-
-- move the Mute Myself button up to prevent accidentally disconnecting
-
-- bug fix: grouping faders in the client should be proportional (see discussion in #202, #419)
-
-
-### 3.5.8 (2020-06-30) ###
-
-- bug fix: incorrect selection of UI language (#408)
-
-
-### 3.5.7 (2020-06-28) ###
-
-- add new "compact" skin, intended for large ensembles (#339)
-
-- support sorting faders by channel instrument, coded by Alberstein8 (#356)
-
-- new group switch to change several faders in sync, coded by Alberstein8 (#202, #379)
-
-- support a clip LED, coded by fleutot (#220)
-
-- add server recording indicator, coded by pljones (#295)
-
-- support for storing/recovering the server window positions (#357)
-
-- add a headless build type which does not depend on QtGui/QtWidgets, coded by marcan (#322)
-
-- the local pan middle position is no longer attenuated in Mono-in/Stereo-out mode (#353)
-
-- added translation: Brazilian Portuguese by melcon (#372)
-
-- add send button to chat window (#384)
-
-- add some protections to the code, coded by atsampson (#380, #381, #382)
-
-- bug fix: server window stop updating after minimized, coded by AronVietti (#355, #383)
-
-
-### 3.5.6 (2020-06-09) ###
-
-- support sorting faders by channel name (#178)
-
-- enable/disable recording from command line, coded by pljones (#228)
-
-- add Audacity "list of files" writer to jam recorder, by pljones (#315)
-
-- make level meter LED black when off, by fleutot (#318)
-
-- added ukulele/bass ukulele instrument icons created by dos1 (#319)
-
-- avoid showing IP address if no name in the musician profile is given (#316)
-
-- show channel numbers if --ctrlmidich is used (#241, #95)
-
-- added check in acknowledge message, coded by atsampson (#302)
-
-- bug fix: on MacOS declare an activity to ensure the process doesn't get throttled
- by OS level Nap, Sleep, and Thread Priority systems, coded by AronVietti (#23)
-
-
-### 3.5.5 (2020-05-26) ###
-
-- added banjo/mandolin instrument icons created by atsampson (#283)
-
-- faster update of musicians list in the server list table
-
-- display recorder state and latest recording directory in the server GUI,
- allow a new recording to be requested, by pljones (#228)
-
-- New Client Level now also applies if you enter a server
-
-- bug fix: honour own fader and Mute button in Mute Myself (#148)
-
-- bug fix: audio fader sliders cannot be moved if the main windows is too small (#292)
-
-- bug fix: server gain calculations were incorrect (introduced in version 3.5.4)
-
-
-### 3.5.4 (2020-05-24) ###
-
-- introduce genre-based server lists (#139)
-
-- implement panning for channels, coded by tarmoj (#52, #145)
-
-- added an indicator that another client has muted me (#257)
-
-- move central server type dropdown to connection setup (#157)
-
-- added vocal bass/tenor/alto/soprano instrument icons created by Alberstein8 (#131)
-
-- support intermediate Reaper RPP file while recording, coded by pljones (#170)
-
-- save client settings on Linux cmdline termination signal, coded by pljones (#70)
-
-- added translation: Italian by dzpex (#249)
-
-- bug fix: fixed misaligned tracks in recordings, coded by snayler, improved by pljones (#234)
-
-
-### 3.5.3 (2020-05-15) ###
-
-- correct unregister of headless server and RPP file creation on
- SIGINT/SIGTERM, coded by pljones (Tickets #130, #168)
-
-- for CoreAudio and 4 channel input, support mixing channels 1&2 with 3&4
-
-- added bassoon/oboe/harp instrument icons created by dszgit,
- congas/bongo created by bspeer (#131)
-
-- link to docs from application Help menu (#90)
-
-- support Mac CoreAudio aggregated devices (#138)
-
-- added translations: French by trebmuh, Portuguese by Snayler,
- Spanish by ignotus666, Dutch by jerogee, German by corrados (#77)
-
-- new design for the About dialog (#189)
-
-- new command line option -d to disconnect all clients on shutdown of the server (#161)
-
-- bug fix: for mono capture Jack audio interface Jamulus complains it
- cannot make connections (#137)
-
-- bug fix: fixed that Jamulus segfaults when jackd is restarted (#122, #127)
-
-- bug fix: better handling of disconnect message in the client
-
-- note: Jamulus is no longer compatible to Qt4
-
-
-### 3.5.2 (2020-04-24) ###
-
-- use audio level meter bars for normal skin
-
-- store Show All Musicians setting in the ini-file
-
-- improved Mac installer, coded by doloopuntil
-
-- support to open ASIO driver setup(s) if startup failed due to incorrect driver settings (#117)
-
-- added -v/--version command line argument to output version information (#121)
-
-- added bodhran and other instrument icons, bodhran created by bomm (#131)
-
-- bug fix: if small network buffers are used we get much better audio quality when drop outs occur
-
-- bug fix: if names given with the -o option were too long, the server registration failed (#91)
-
-- bug fix: audio level changes if Buffer Delay is changed (#106)
-
-- bug fix: do not reset fader level meters if number of clients change
-
-- bug fix: fixed a crash with JackRouter 64 bit ASIO driver (#93, thanks to elliotclee)
-
-
-### 3.5.1 (2020-04-18) ###
-
-- added a Mute Stream button to hear your signal and the signal of the other clients but
- do not transmit your signal to the server so that the other clients cannot hear you
-
-- added Enable Small Network Buffers switch to enable small sound card buffers in
- combination with legacy OPUS packets since OPUS packets with 64 samples enable low
- latency but can increase audio drop outs
-
-- upgrade OPUS codec library to v1.3.1 by doloopuntil
-
-- server list registration status indicator added to the server GUI, coded by pljones
-
-- improved auto jitter buffer for 64 samples frame size
-
-- the ping times in the server list are now more stable
-
-
-### 3.5.0 (2020-04-15) ###
-
-- added support for 64 samples OPUS packets in the client (if a sound card buffer size
- larger or equal than 128 samples is chosen, the legacy 128 samples OPUS packets are used)
-
-- added a filter for the server list to, e.g., filter a specific country or search for a musician
-
-- refresh server list if the Central Server address type is changed
-
-- the unit of the mixer faders is now dB using the range -50 dB to 0 dB
-
-- increased LED luminance (#71)
-
-- bug fix: the server welcome message may appear twice if the server list was double clicked
-
-
-### 3.4.7 (2020-04-11) ###
-
-- added support for alternative Central Servers to solve the 200 server registration limit (#50)
-
-- added support for 64 samples frame size in the server (if server runs in 64 or 128 samples
- mode it is still compatible to both, 64 and 128 samples frame size clients)
-
-- added multichannel CoreAudio support, coded by emlynmac (#44)
-
-- fixed server not visible if in same local network, coded by pljones (#27)
-
-
-### 3.4.6 (2020-04-09) ###
-
-- added support for channel meters, coded by pljones
-
-- added show licence switch in the server GUI
-
-- store fader mute state in the ini file, coded by doloopuntil
-
-- fixed low-res icon issue (#28)
-
-
-### 3.4.5 (2020-04-04) ###
-
-- audio fade-in at the server if a new client connects
-
-- added a scroll bar to the mixer board to support large numbers of
- mixer faders (a thank you to doloopuntil for his help)
-
-- changed the maximum number of clients supported by the server from 20 to 50
-
-- Windows installer now contains a 32 and 64 bit version of Jamulus (the version to
- be installed is selected automatically according to the detected operating system)
-
-- bug fix: server list ping times may not be accurate and client list may not be retrieved
-
-
-### 3.4.4 (2020-03-25) ###
-
-- added support for controlling the audio mixer faders with a MIDI controller (MacOS and Linux)
-
-- added command line argument for disabling auto jack connection (#49)
-
-- audio recording for the server, coded by pljones
-
-- SVG server history graph, coded by pljones
-
-
-### 3.4.3 (2018-05-17) ###
-
-- for ASIO and 4 channel input, support mixing channels 1&2 with 3&4
-
-- bug fix: fixed a crash, running Jamulus on MacOS version "High Sierra"
-
-
-### 3.4.2 (2017-08-11) ###
-
-- removed old CELT library (minimum compatible version is now 3.3.1)
-
-- show server name in the server list in bold font if it is a permanent server
-
-- Jack can be used instead of CoreAudio on MacOS (using qmake "CONFIG+=jackonmac")
-
-
-### 3.4.1 (2016-02-10) ###
-
-- show the number of connected clients in the MacOS task bar if more
- than one client is connected
-
-- avoid a single jitter buffer for the auto detection
-
-- the Musicians value in the server list shows a warning if the server is full
-
-- automatic server setting for permanent server flag in the protocol
-
-- bug fix: ping time measurement may be invalid for the Linux OS
-
-
-### 3.4.0 (2015-12-10) ###
-
-- show the names of the connected clients in the server list
-
-
-### 3.3.11 (2015-11-26) ###
-
-- added a new client fader level setting
-
-- changed the MacOS audio interface to be future proof (do not use
- the Carbon Component Manager anymore)
-
-- added support for audio channel selection for MacOS
-
-
-### 3.3.10 (2015-10-20) ###
-
-- changed the default central server URL
-
-- added support for server disconnection
-
-
-### 3.3.9 (2015-07-12) ###
-
-- another improvement of auto jitter buffer detection in very bad
- network conditions
-
-- support client operation without using a GUI front end
-
-- bug fix: fixed a crash in the MacOS audio interface
-
-
-### 3.3.8 (2015-03-15) ###
-
-- improved audio quality in bad network conditions
-
-- more realistic overall delay estimation
-
-- improvement of auto jitter buffer detection in bad network conditions
-
-- show info about sound card buffer size if not one of the standard sizes
-
-
-### 3.3.7 (2015-02-05) ###
-
-- added a musician profile dialog (some settings in the main window
- were removed)
-
-- a tool tip for the fader tag shows the complete musician profile
-
-- the city and skill level can be set in the musician profile
-
-- added new instrument picture for "Guitar+Vocal"
-
-
-### 3.3.6 (2015-01-25) ###
-
-- support for a country flag icon on the fader tag
-
-- a licence agreement dialog can be requested by the server
-
-
-### 3.3.5 (2014-07-30) ###
-
-- new compile config options for disabling old CELT, use OPUS in a shared
- library and change the executable name
-
-- added a Linux jamulus.desktop file
-
-
-### 3.3.4 (2014-02-25) ###
-
-- true stereo reverberation effect (previously it was a mono reverberation
- effect on both stereo channels)
-
-- added a mono-in/stereo-out mode to support special sound cards which have
- mono inputs for the instrument and a microphone but have stereo outputs
-
-- store fader solo state in the ini file
-
-- improved stability of the audio stream by reducing audio drop outs (by
- using a separate socket thread)
-
-- removed unnecessary settings and LED indicators
-
-- bug fix: the fader level could not be changed if the fader was on solo
-
-
-### 3.3.3 (2013-12-30) ###
-
-- support for storing/recovering the window positions
-
-- added new instrument pictures for "Recorder", "Streamer" and "Listener"
-
-- the solo state of a mixer fader is not exclusive any more and the solo
- state is preserved if the number of mixer faders changes
-
-- more precise sound card latency estimation under Windows
-
-- integrated a new OPUS version: v1.1
-
-- bug fix: support for correct utf-8 storage of names in the ini-file
-
-
-### 3.3.2 (2013-08-24) ###
-
-- the connection setup dialog can now be opened during a connection
-
-- support for three audio quality settings: low, normal and high
-
-
-### 3.3.1 (2013-03-24) ###
-
-- enabled the OPUS codec
-
-- store fader level settings
-
-- improved server performance under Linux
-
-- changed the network buffer for improved OPUS PLC performance
-
-- added protocol overhead for DSL line for upload rate calculation
-
-- fixed outstanding renaming from llcon to Jamulus
-
-- bug fix: the overall delay was not correctly calculated
-
-
-### 3.3.0 (2013-02-24) ###
-
-- renamed the software from llcon to Jamulus
-
-- support for an instrument picture on the fader tag
-
-- a server welcome message can be shown on a connect to the
- server (the message is shown in the chat dialog of the client)
-
-- the source code is now compatible to Qt5
-
-- bug fix: strings in the protocol are now utf-8 coded
-
-
-### 3.2.2 (2012-07-15) ###
-
-- changed auto jitter buffer property to reduce audio drop outs
-
-- bug fix: mechanism to keep port in NAT of slave server open works now correctly
-
-- bug fix: slave server unregistering may not be successful
-
-
-### 3.2.1 (2012-02-02) ###
-
-- support for audio device selection under Mac OS
-
-- connect dialog list is sorted by the ping time
-
-- software icon changed
-
-- bug fix: fixed distorted audio with USB sound cards on Mac OS
-
-- bug fix: fixed crash on slave server unregistering
-
-
-### 3.2.0 (2011-07-23) ###
-
-- new GUI style of the main window, added switch for selecting the GUI style
- in the settings window
-
-- a list of available servers is shown on pressing the connect button, the list
- is managed by a central server, any private server is added automatically if
- the registering setting is enabled
-
-- the jitter buffer size can be independently set for client and server
-
-- improved auto jitter buffer algorithm
-
-- the Qt project file is now used for Linux, too
-
-- ini-file is stored in the home directory instead of the application directory
-
-- added server settings in the GUI for the server list and added ini file
- support to store the settings
-
-- bug fix: fixed Jack audio interface instability
-
-
-### 3.1.2 (2011-03-02) ###
-
-- show warning in main window if audio delay is too long
-
-- added download link in help menu
-
-- bug fix: solo switch did not work correctly
-
-
-### 3.1.1 (2010-07-01) ###
-
-- added stereo audio channel support
-
-- added input/output audio channel mapping for ASIO audio interface
-
-
-### 3.1.0 (2010-03-16) ###
-
-- support for MacOS (using CoreAudio audio interface)
-
-- sound card frame size support for frame sizes other than 128, 256 and 512
- samples
-
-- improvement of network buffer (jitter buffer) in case of small buffer sizes
-
-- all available ASIO sample formats supported
-
-- bug fix for M-Audio Delta ASIO driver
-
-
-### 3.0.3 (2009-12-05) ###
-
-- accessibility improvements
-
-- show number of connected clients in window title (and therefore in OS task
- bar)
-
-- added "What's this" help text to the GUI controls in the general settings
- dialog, added Tool Tips to some GUI controls
-
-- server logging history grid lines of weekend days are now plotted with
- different line width
-
-- removed ALSA support since the ALSA interface implementation in llcon was
- buggy and will not be maintained in the future
-
-- bug fix: fix for server logging history graph x-axis
-
-- bug fix: fix for disconnect issue at the server
-
-
-### 3.0.2 (2009-09-21) ###
-
-- new server features: for chat messages the time stamp is also shown, parsing
- of existing log file supported
-
-- updates for help texts
-
-- new design for fader tag
-
-- change for Jack Linux audio interface: ports are only registered and
- connected once when the software is started up
-
-- bug fix: under bad network conditions chat messages were randomly repeated
-
-- bug fix: in case the server was shutdown and restarted during a connection,
- the channel name was not updated correctly at the server
-
-
-### 3.0.1 (2009-08-23) ###
-
-- use low complexity CELT encoder profile, this lowers audio dropout
- probability on slow computers
-
-- in case "Open Chat on New Message" is not enabled, a hint in the status bar
- is shown when a message is received
-
-- bug fix: buzzing occurred when audio stream was interrupted (e.g. in case
- of network trouble)
-
-
-### 3.0.0 (2009-08-19) ###
-
-- introduced new audio codec "CELT", not compatible to old versions
-
-- only the sound card frame sizes 128, 256 and 512 are allowed (since other
- frame sizes require additional conversion buffers which introduce delay)
-
-- IMA-ADPCM, MS-ADPCM removed
-
-- since CELT works on 48 kHz sample rate, resampling was removed
-
-- various bug fixes (e.g. disconnecting did not work reliably)
-
-
-### 2.3.0 (2009-07-09) ###
-
-- new system sample rate of 33 kHz to improve audio quality, not compatible
- to old versions
-
-- added history graph for server logging
-
-- added command line argument for connecting a server at software start-up
-
-
-### 2.2.2 (2009-05-14) ###
-
-- "Mute" and "Solo" check boxes for each connected client fader
-
-- store previous server URLs
-
-- changes to the main GUI (grouped "local" and "server" settings)
-
-- LED status lights and LED input level meter
-
-- better behaviour on disconnection (introduced disconnection protocol message)
-
-
-### 2.2.1 (2009-03-29) ###
-
-- bug fix and improvements for automatic jitter buffer size setting
-
-
-### 2.2.0 (2009-03-13) ###
-
-- added Jack audio interface (Linux)
-
-- simplified settings dialog, complete redesign (removed sound card
- buffer settings, network block sizes settings, added upload rate display)
-
-- improved audio stability (audio interface is not callback based, removed
- intermediate audio buffers, client audio buffer size equals network
- buffer size now)
-
-- added upload rate limitation for server (server decides which network
- parameters to use depending on the upload limit and the number of connected
- clients)
-
-
-### 2.1.4 (2009-02-15) ###
-
-- added automatic jitter buffer size setting
-
-- speed optimizations to improve audio interface stability
-
-- new default settings (e.g. turn off Reverb by default since it requires
- significant CPU)
-
-
-### 2.1.3 (2008-11-02) ###
-
-- added sound card selection
-
-- improved ASIO configuration
-
-- added total delay display
-
-
-### 2.1.2 (2008-08-15) ###
-
-- audio compression type can be selected (IMA ADPCM, MS ADPCM, None)
-
-- security checks for protocol messages (wrong messages could crash the
- software)
-
-- bug fix: ping time measurement problems on Windows OS fixed
-
-
-### 2.1.1 (2008-08-03) ###
-
-- added a chat window
-
-- the client can select a port number of server additional to the URL
-
-- the server can be operated on an arbitrary port number
-
-- ping time information in general settings dialog added
-
-
-### 2.1.0 (2008-07-17) ###
-
-- ASIO support
-
-
-### 2.0.0 (2008-03-29) ###
-
-- first QT4 compatible release
-
-
-### 0.9.9 (2007-09-10) ###
-
-- new client settings dialog
-
-- at each client a separate audio mix can be generated for all connected clients
- at the server
-
-
-### 0.9.4 (2006-03-10) ###
-
-- added a protocol mechanism, now it is possible to set the jitter buffer in the
- server according to the setting in the client (they are coupled now)
-
-- removed sample rate offset estimation since it was not used anyway
-
-- internal audio processing in the server is now based on the minimum block
- size (improves latency)
-
-
-### 0.9.1 (2006-01-28) ###
-
-- initial version
-
-
diff --git a/Jamulus.pro b/Jamulus.pro
deleted file mode 100644
index 3d1d5acd45..0000000000
--- a/Jamulus.pro
+++ /dev/null
@@ -1,1189 +0,0 @@
-VERSION = 3.11.0dev
-
-# Using lrelease and embed_translations only works for Qt 5.12 or later.
-# See https://github.com/jamulussoftware/jamulus/pull/3288 for these changes.
-lessThan(QT_MAJOR_VERSION, 5) | equals(QT_MAJOR_VERSION, 5) : lessThan(QT_MINOR_VERSION, 12) {
- error(Jamulus requires at least Qt5.12. See https://github.com/jamulussoftware/jamulus/pull/3288)
-}
-
-# use target name which does not use a capital letter at the beginning
-contains(CONFIG, "noupcasename") {
- message(The target name is jamulus instead of Jamulus.)
- TARGET = jamulus
-}
-
-# allow detailed version info for intermediate builds (#475)
-contains(VERSION, .*dev.*) {
- exists(".git/config") {
- GIT_DESCRIPTION=$$system(git describe --match=xxxxxxxxxxxxxxxxxxxx --always --abbrev --dirty) # the match should never match
- VERSION = "$$VERSION"-$$GIT_DESCRIPTION
- message("building version \"$$VERSION\" (intermediate in git repository)")
- } else {
- VERSION = "$$VERSION"-nogit
- message("building version \"$$VERSION\" (intermediate without git repository)")
- }
-} else {
- message("building version \"$$VERSION\" (release)")
-}
-
-CONFIG += qt \
- thread \
- lrelease \
- embed_translations \
- debug_and_release
-
-QT += network \
- xml \
- concurrent
-
-contains(CONFIG, "nosound") {
- CONFIG -= "nosound"
- CONFIG += "serveronly"
- warning("\"nosound\" is deprecated: please use \"serveronly\" for a server-only build.")
-}
-
-contains(CONFIG, "headless") {
- message(Headless mode activated.)
- QT -= gui
-} else {
- QT += widgets
- QT += multimedia
-}
-
-# Do not set LRELEASE_DIR explicitly when using embed_translations.
-# It doesn't work with multiple targets or architectures.
-TRANSLATIONS = src/translation/translation_de_DE.ts \
- src/translation/translation_fr_FR.ts \
- src/translation/translation_ko_KR.ts \
- src/translation/translation_pt_PT.ts \
- src/translation/translation_pt_BR.ts \
- src/translation/translation_es_ES.ts \
- src/translation/translation_nb_NO.ts \
- src/translation/translation_nl_NL.ts \
- src/translation/translation_pl_PL.ts \
- src/translation/translation_sk_SK.ts \
- src/translation/translation_it_IT.ts \
- src/translation/translation_sv_SE.ts \
- src/translation/translation_zh_CN.ts
-
-INCLUDEPATH += src
-
-INCLUDEPATH_OPUS = libs/opus/include \
- libs/opus/celt \
- libs/opus/silk \
- libs/opus/silk/float \
- libs/opus/silk/fixed \
- libs/opus
-
-# As JACK is used in multiple OS, we declare it globally
-HEADERS_JACK = src/sound/jack/sound.h
-SOURCES_JACK = src/sound/jack/sound.cpp
-
-DEFINES += APP_VERSION=\\\"$$VERSION\\\" \
- CUSTOM_MODES \
- _REENTRANT
-
-# some depreciated functions need to be kept for older versions to build
-# TODO as soon as we drop support for the old Qt version, remove the following line
-DEFINES += QT_NO_DEPRECATED_WARNINGS
-
-win32 {
- DEFINES -= UNICODE # fixes issue with ASIO SDK (asiolist.cpp is not unicode compatible)
- DEFINES += NOMINMAX # solves a compiler error in qdatetime.h (Qt5)
- RC_FILE = src/res/win-mainicon.rc
- mingw* {
- DEFINES += _WIN32_WINNT=0x0600 # solves missing inet_pton in CSocket::SendPacket
- LIBS += -lole32 \
- -luser32 \
- -ladvapi32 \
- -lwinmm \
- -lws2_32
- } else {
- QMAKE_LFLAGS += /DYNAMICBASE:NO # fixes crash with libjack64.dll, see https://github.com/jamulussoftware/jamulus/issues/93
- LIBS += ole32.lib \
- user32.lib \
- advapi32.lib \
- winmm.lib \
- ws2_32.lib
- greaterThan(QT_MAJOR_VERSION, 5) {
- # Qt5 had a special qtmain library which took care of forwarding the MSVC default WinMain() entrypoint to
- # the platform-agnostic main().
- # Qt6 is still supposed to have that lib under the new name QtEntryPoint. As it does not seem
- # to be effective when building with qmake, we are rather instructing MSVC to use the platform-agnostic
- # main() entrypoint directly:
- QMAKE_LFLAGS += /subsystem:windows /ENTRY:mainCRTStartup
- }
- }
-
- contains(CONFIG, "serveronly") {
- message(Restricting build to server-only due to CONFIG+=serveronly.)
- DEFINES += SERVER_ONLY
- } else {
- contains(CONFIG, "jackonwindows") {
- message(Using JACK.)
- contains(QT_ARCH, "i386") {
- exists("C:/Program Files (x86)") {
- message("Cross compilation build")
- programfilesdir = "C:/Program Files (x86)"
- } else {
- message("Native i386 build")
- programfilesdir = "C:/Program Files"
- }
- libjackname = "libjack.lib"
- } else {
- message("Native x86_64 build")
- programfilesdir = "C:/Program Files"
- libjackname = "libjack64.lib"
- }
- !exists("$${programfilesdir}/JACK2/include/jack/jack.h") {
- error("Error: jack.h was not found in the expected location ($${programfilesdir}). Ensure that the right JACK2 variant is installed (32 Bit vs. 64 Bit).")
- }
-
- HEADERS += $$HEADERS_JACK
- SOURCES += $$SOURCES_JACK
- DEFINES += WITH_JACK
- DEFINES += JACK_ON_WINDOWS
- DEFINES += _STDINT_H # supposed to solve compilation error in systemdeps.h
- INCLUDEPATH += "$${programfilesdir}/JACK2/include"
- LIBS += "$${programfilesdir}/JACK2/lib/$${libjackname}"
- } else {
- message(Using native Windows MIDI.)
-
- HEADERS += src/sound/midi-win/midi.h
- SOURCES += src/sound/midi-win/midi.cpp
-
- message(Using ASIO.)
- message(Please review the ASIO SDK licence.)
-
- !exists(libs/ASIOSDK2/common) {
- error("Error: ASIOSDK2 must be placed in Jamulus \\libs folder such that e.g. \\libs\ASIOSDK2\common exists.")
- }
- # Important: Keep those ASIO includes local to this build target in
- # order to avoid poisoning other builds license-wise.
- HEADERS += src/sound/asio/sound.h
- SOURCES += src/sound/asio/sound.cpp \
- libs/ASIOSDK2/common/asio.cpp \
- libs/ASIOSDK2/host/asiodrivers.cpp \
- libs/ASIOSDK2/host/pc/asiolist.cpp
- INCLUDEPATH += libs/ASIOSDK2/common \
- libs/ASIOSDK2/host \
- libs/ASIOSDK2/host/pc
- }
- }
-
-} else:macx {
- contains(CONFIG, "server_bundle") {
- message(The generated application bundle will run a server instance.)
-
- DEFINES += SERVER_BUNDLE
- TARGET = $${TARGET}Server
- MACOSX_BUNDLE_ICON.files = src/res/mac-jamulus-server.icns
- RC_FILE = src/res/mac-jamulus-server.icns
- } else {
- MACOSX_BUNDLE_ICON.files = src/res/mac-mainicon.icns
- RC_FILE = src/res/mac-mainicon.icns
- }
-
- HEADERS += src/mac/activity.h src/mac/badgelabel.h
- OBJECTIVE_SOURCES += src/mac/activity.mm src/mac/badgelabel.mm
- CONFIG += x86
- QMAKE_TARGET_BUNDLE_PREFIX = app.jamulussoftware
-
- OSX_ENTITLEMENTS.files = mac/Jamulus.entitlements
- OSX_ENTITLEMENTS.path = Contents/Resources
- QMAKE_BUNDLE_DATA += OSX_ENTITLEMENTS
-
- macx-xcode {
- # As of 2023-04-15 the macOS build with Xcode only fails. This is tracked in #1841
- QMAKE_INFO_PLIST = mac/Info-xcode.plist
- XCODE_ENTITLEMENTS.name = CODE_SIGN_ENTITLEMENTS
- XCODE_ENTITLEMENTS.value = mac/Jamulus.entitlements
- QMAKE_MAC_XCODE_SETTINGS += XCODE_ENTITLEMENTS
- MACOSX_BUNDLE_ICON.path = Contents/Resources
- QMAKE_BUNDLE_DATA += MACOSX_BUNDLE_ICON
- } else {
- QMAKE_INFO_PLIST = mac/Info-make.plist
- }
-
- LIBS += -framework CoreFoundation \
- -framework CoreServices \
- -framework CoreAudio \
- -framework CoreMIDI \
- -framework AudioToolbox \
- -framework AudioUnit \
- -framework Foundation \
- -framework AppKit
-
- contains(CONFIG, "jackonmac") {
- message(Using JACK.)
- !exists(/usr/include/jack/jack.h) {
- !exists(/usr/local/include/jack/jack.h) {
- error("Error: jack.h was not found at the usual place, maybe JACK is not installed")
- }
- }
- HEADERS += $$HEADERS_JACK
- SOURCES += $$SOURCES_JACK
- DEFINES += WITH_JACK
- DEFINES += JACK_REPLACES_COREAUDIO
- INCLUDEPATH += /usr/local/include
- LIBS += /usr/local/lib/libjack.dylib
- } else {
- message(Using CoreAudio.)
- HEADERS += src/sound/coreaudio-mac/sound.h
- SOURCES += src/sound/coreaudio-mac/sound.cpp
- }
-
-} else:ios {
- QMAKE_ASSET_CATALOGS += src/res/iOSIcons.xcassets
- QMAKE_INFO_PLIST = ios/Info.plist
- OBJECTIVE_SOURCES += src/ios/ios_app_delegate.mm
- HEADERS += src/ios/ios_app_delegate.h
- HEADERS += src/sound/coreaudio-ios/sound.h
- OBJECTIVE_SOURCES += src/sound/coreaudio-ios/sound.mm
- QMAKE_TARGET_BUNDLE_PREFIX = app.jamulussoftware
- LIBS += -framework AVFoundation \
- -framework AudioToolbox
-} else:android {
- ANDROID_ABIS = armeabi-v7a arm64-v8a x86 x86_64
- ANDROID_VERSION_NAME = $$VERSION
- ANDROID_VERSION_CODE = $$system(git log --oneline | wc -l)
- message("Setting ANDROID_VERSION_NAME=$${ANDROID_VERSION_NAME} ANDROID_VERSION_CODE=$${ANDROID_VERSION_CODE}")
-
- # liboboe requires C++17 for std::timed_mutex
- CONFIG += c++17
-
- QT += androidextras
-
- # enabled only for debugging on android devices
- DEFINES += ANDROIDDEBUG
-
- target.path = /tmp/your_executable # path on device
- INSTALLS += target
-
- HEADERS += src/sound/oboe/sound.h
-
- SOURCES += src/sound/oboe/sound.cpp \
- src/android/androiddebug.cpp
-
- LIBS += -lOpenSLES
- ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
- DISTFILES += android/AndroidManifest.xml
-
- # if compiling for android you need to use Oboe library which is included as a git submodule
- # make sure you git pull with submodules to pull the latest Oboe library
- OBOE_SOURCES = $$files(libs/oboe/src/*.cpp, true)
- OBOE_HEADERS = $$files(libs/oboe/src/*.h, true)
-
- INCLUDEPATH_OBOE = libs/oboe/include/ \
- libs/oboe/src/
-
- DISTFILES_OBOE += libs/oboe/AUTHORS \
- libs/oboe/CONTRIBUTING \
- libs/oboe/LICENSE \
- libs/oboe/README
-
- INCLUDEPATH += $$INCLUDEPATH_OBOE
- HEADERS += $$OBOE_HEADERS
- SOURCES += $$OBOE_SOURCES
- DISTFILES += $$DISTFILES_OBOE
-} else:unix {
- # we want to compile with C++11
- CONFIG += c++11
-
- # --as-needed avoids linking the final binary against unnecessary runtime
- # libs. Most g++ versions already do that by default.
- # However, Debian buster does not and would link against libQt5Concurrent
- # unnecessarily without this workaround (#741):
- QMAKE_LFLAGS += -Wl,--as-needed
-
- # we assume to have lrintf() one moderately modern linux distributions
- # would be better to have that tested, though
- DEFINES += HAVE_LRINTF
-
- # we assume that stdint.h is always present in a Linux system
- DEFINES += HAVE_STDINT_H
-
- # only include JACK support if CONFIG serveronly is not set
- contains(CONFIG, "serveronly") {
- message(Restricting build to server-only due to CONFIG+=serveronly.)
- DEFINES += SERVER_ONLY
- } else {
- message(JACK Audio Interface Enabled.)
-
- HEADERS += $$HEADERS_JACK
- SOURCES += $$SOURCES_JACK
-
- contains(CONFIG, "raspijamulus") {
- message(Using JACK Audio in raspijamulus.sh mode.)
- LIBS += -ljack
- } else {
- CONFIG += link_pkgconfig
- PKGCONFIG += jack
- }
-
- DEFINES += WITH_JACK
- }
-
- isEmpty(PREFIX) {
- PREFIX = /usr/local
- }
-
- isEmpty(BINDIR) {
- BINDIR = bin
- }
- BINDIR = $$absolute_path($$BINDIR, $$PREFIX)
- target.path = $$BINDIR
-
- contains(CONFIG, "headless") {
- INSTALLS += target
- } else {
- isEmpty(APPSDIR) {
- APPSDIR = share/applications
- }
- APPSDIR = $$absolute_path($$APPSDIR, $$PREFIX)
- desktop.path = $$APPSDIR
- QMAKE_SUBSTITUTES += linux/jamulus.desktop.in linux/jamulus-server.desktop.in
- desktop.files = linux/jamulus.desktop linux/jamulus-server.desktop
-
- isEmpty(ICONSDIR) {
- ICONSDIR = share/icons/hicolor/512x512/apps
- }
- ICONSDIR = $$absolute_path($$ICONSDIR, $$PREFIX)
- icons.path = $$ICONSDIR
- icons.files = src/res/io.jamulus.jamulus.png
-
- isEmpty(ICONSDIR_SVG) {
- ICONSDIR_SVG = share/icons/hicolor/scalable/apps/
- }
- ICONSDIR_SVG = $$absolute_path($$ICONSDIR_SVG, $$PREFIX)
- icons_svg.path = $$ICONSDIR_SVG
- icons_svg.files = src/res/io.jamulus.jamulus.svg src/res/io.jamulus.jamulusserver.svg
-
- isEmpty(MANDIR) {
- MANDIR = share/man/man1
- }
- MANDIR = $$absolute_path($$MANDIR, $$PREFIX)
- man.path = $$MANDIR
- man.files = linux/Jamulus.1
-
- INSTALLS += target desktop icons icons_svg man
- }
-}
-
-# Do not set RCC_DIR explicitly when using embed_translations.
-# It doesn't work with multiple targets or architectures.
-RESOURCES += src/resources.qrc
-
-FORMS_GUI = src/aboutdlgbase.ui \
- src/serverdlgbase.ui
-
-!contains(CONFIG, "serveronly") {
- FORMS_GUI += src/clientdlgbase.ui \
- src/clientsettingsdlgbase.ui \
- src/chatdlgbase.ui \
- src/connectdlgbase.ui
-}
-
-HEADERS += src/plugins/audioreverb.h \
- src/buffer.h \
- src/channel.h \
- src/global.h \
- src/protocol.h \
- src/recorder/jamcontroller.h \
- src/threadpool.h \
- src/server.h \
- src/serverlist.h \
- src/serverlogging.h \
- src/settings.h \
- src/socket.h \
- src/util.h \
- src/recorder/jamrecorder.h \
- src/recorder/creaperproject.h \
- src/recorder/cwavestream.h \
- src/signalhandler.h
-
-!contains(CONFIG, "serveronly") {
- HEADERS += src/client.h \
- src/sound/soundbase.h \
- src/testbench.h
-}
-
-HEADERS_GUI = src/serverdlg.h
-
-!contains(CONFIG, "serveronly") {
- HEADERS_GUI += src/audiomixerboard.h \
- src/chatdlg.h \
- src/clientsettingsdlg.h \
- src/connectdlg.h \
- src/clientdlg.h \
- src/levelmeter.h \
- src/analyzerconsole.h \
- src/multicolorled.h
-}
-
-HEADERS_OPUS = libs/opus/celt/arch.h \
- libs/opus/celt/bands.h \
- libs/opus/celt/celt.h \
- libs/opus/celt/celt_lpc.h \
- libs/opus/celt/cpu_support.h \
- libs/opus/celt/cwrs.h \
- libs/opus/celt/ecintrin.h \
- libs/opus/celt/entcode.h \
- libs/opus/celt/entdec.h \
- libs/opus/celt/entenc.h \
- libs/opus/celt/float_cast.h \
- libs/opus/celt/kiss_fft.h \
- libs/opus/celt/laplace.h \
- libs/opus/celt/mathops.h \
- libs/opus/celt/mdct.h \
- libs/opus/celt/mfrngcod.h \
- libs/opus/celt/modes.h \
- libs/opus/celt/os_support.h \
- libs/opus/celt/pitch.h \
- libs/opus/celt/quant_bands.h \
- libs/opus/celt/rate.h \
- libs/opus/celt/stack_alloc.h \
- libs/opus/celt/static_modes_float.h \
- libs/opus/celt/vq.h \
- libs/opus/celt/_kiss_fft_guts.h \
- libs/opus/include/opus.h \
- libs/opus/include/opus_custom.h \
- libs/opus/include/opus_defines.h \
- libs/opus/include/opus_types.h \
- libs/opus/silk/API.h \
- libs/opus/silk/control.h \
- libs/opus/silk/debug.h \
- libs/opus/silk/define.h \
- libs/opus/silk/errors.h \
- libs/opus/silk/float/main_FLP.h \
- libs/opus/silk/float/SigProc_FLP.h \
- libs/opus/silk/float/structs_FLP.h \
- libs/opus/silk/Inlines.h \
- libs/opus/silk/MacroCount.h \
- libs/opus/silk/MacroDebug.h \
- libs/opus/silk/macros.h \
- libs/opus/silk/main.h \
- libs/opus/silk/NSQ.h \
- libs/opus/silk/pitch_est_defines.h \
- libs/opus/silk/PLC.h \
- libs/opus/silk/resampler_private.h \
- libs/opus/silk/resampler_rom.h \
- libs/opus/silk/resampler_structs.h \
- libs/opus/silk/SigProc_FIX.h \
- libs/opus/silk/structs.h \
- libs/opus/silk/tables.h \
- libs/opus/silk/tuning_parameters.h \
- libs/opus/silk/typedef.h \
- libs/opus/src/analysis.h \
- libs/opus/src/mlp.h \
- libs/opus/src/opus_private.h
-
-HEADERS_OPUS_ARM = libs/opus/celt/arm/armcpu.h \
- libs/opus/silk/arm/biquad_alt_arm.h \
- libs/opus/celt/arm/fft_arm.h \
- libs/opus/silk/arm/LPC_inv_pred_gain_arm.h \
- libs/opus/celt/arm/mdct_arm.h \
- libs/opus/silk/arm/NSQ_del_dec_arm.h \
- libs/opus/celt/arm/pitch_arm.h
-
-HEADERS_OPUS_X86 = libs/opus/celt/x86/celt_lpc_sse.h \
- libs/opus/celt/x86/pitch_sse.h \
- libs/opus/celt/x86/vq_sse.h \
- libs/opus/celt/x86/x86cpu.h \
- $$files(libs/opus/silk/x86/*.h)
-
-SOURCES += src/plugins/audioreverb.cpp \
- src/buffer.cpp \
- src/channel.cpp \
- src/main.cpp \
- src/protocol.cpp \
- src/recorder/jamcontroller.cpp \
- src/server.cpp \
- src/serverlist.cpp \
- src/serverlogging.cpp \
- src/settings.cpp \
- src/signalhandler.cpp \
- src/socket.cpp \
- src/util.cpp \
- src/recorder/jamrecorder.cpp \
- src/recorder/creaperproject.cpp \
- src/recorder/cwavestream.cpp
-
-!contains(CONFIG, "serveronly") {
- SOURCES += src/client.cpp \
- src/sound/soundbase.cpp \
-}
-
-SOURCES_GUI = src/serverdlg.cpp
-
-!contains(CONFIG, "serveronly") {
- SOURCES_GUI += src/audiomixerboard.cpp \
- src/chatdlg.cpp \
- src/clientsettingsdlg.cpp \
- src/connectdlg.cpp \
- src/clientdlg.cpp \
- src/multicolorled.cpp \
- src/levelmeter.cpp \
- src/analyzerconsole.cpp
-}
-
-SOURCES_OPUS = libs/opus/celt/bands.c \
- libs/opus/celt/celt.c \
- libs/opus/celt/celt_decoder.c \
- libs/opus/celt/celt_encoder.c \
- libs/opus/celt/celt_lpc.c \
- libs/opus/celt/cwrs.c \
- libs/opus/celt/entcode.c \
- libs/opus/celt/entdec.c \
- libs/opus/celt/entenc.c \
- libs/opus/celt/kiss_fft.c \
- libs/opus/celt/laplace.c \
- libs/opus/celt/mathops.c \
- libs/opus/celt/mdct.c \
- libs/opus/celt/modes.c \
- libs/opus/celt/pitch.c \
- libs/opus/celt/quant_bands.c \
- libs/opus/celt/rate.c \
- libs/opus/celt/vq.c \
- libs/opus/silk/A2NLSF.c \
- libs/opus/silk/ana_filt_bank_1.c \
- libs/opus/silk/biquad_alt.c \
- libs/opus/silk/bwexpander.c \
- libs/opus/silk/bwexpander_32.c \
- libs/opus/silk/check_control_input.c \
- libs/opus/silk/CNG.c \
- libs/opus/silk/code_signs.c \
- libs/opus/silk/control_audio_bandwidth.c \
- libs/opus/silk/control_codec.c \
- libs/opus/silk/control_SNR.c \
- libs/opus/silk/debug.c \
- libs/opus/silk/decoder_set_fs.c \
- libs/opus/silk/decode_core.c \
- libs/opus/silk/decode_frame.c \
- libs/opus/silk/decode_indices.c \
- libs/opus/silk/decode_parameters.c \
- libs/opus/silk/decode_pitch.c \
- libs/opus/silk/decode_pulses.c \
- libs/opus/silk/dec_API.c \
- libs/opus/silk/encode_indices.c \
- libs/opus/silk/encode_pulses.c \
- libs/opus/silk/enc_API.c \
- libs/opus/silk/float/apply_sine_window_FLP.c \
- libs/opus/silk/float/autocorrelation_FLP.c \
- libs/opus/silk/float/burg_modified_FLP.c \
- libs/opus/silk/float/bwexpander_FLP.c \
- libs/opus/silk/float/corrMatrix_FLP.c \
- libs/opus/silk/float/encode_frame_FLP.c \
- libs/opus/silk/float/energy_FLP.c \
- libs/opus/silk/float/find_LPC_FLP.c \
- libs/opus/silk/float/find_LTP_FLP.c \
- libs/opus/silk/float/find_pitch_lags_FLP.c \
- libs/opus/silk/float/find_pred_coefs_FLP.c \
- libs/opus/silk/float/inner_product_FLP.c \
- libs/opus/silk/float/k2a_FLP.c \
- libs/opus/silk/float/LPC_analysis_filter_FLP.c \
- libs/opus/silk/float/LTP_analysis_filter_FLP.c \
- libs/opus/silk/float/LTP_scale_ctrl_FLP.c \
- libs/opus/silk/float/noise_shape_analysis_FLP.c \
- libs/opus/silk/float/pitch_analysis_core_FLP.c \
- libs/opus/silk/float/process_gains_FLP.c \
- libs/opus/silk/float/residual_energy_FLP.c \
- libs/opus/silk/float/scale_copy_vector_FLP.c \
- libs/opus/silk/float/scale_vector_FLP.c \
- libs/opus/silk/float/schur_FLP.c \
- libs/opus/silk/float/sort_FLP.c \
- libs/opus/silk/float/warped_autocorrelation_FLP.c \
- libs/opus/silk/float/wrappers_FLP.c \
- libs/opus/silk/gain_quant.c \
- libs/opus/silk/HP_variable_cutoff.c \
- libs/opus/silk/init_decoder.c \
- libs/opus/silk/init_encoder.c \
- libs/opus/silk/inner_prod_aligned.c \
- libs/opus/silk/interpolate.c \
- libs/opus/silk/lin2log.c \
- libs/opus/silk/log2lin.c \
- libs/opus/silk/LPC_analysis_filter.c \
- libs/opus/silk/LPC_fit.c \
- libs/opus/silk/LPC_inv_pred_gain.c \
- libs/opus/silk/LP_variable_cutoff.c \
- libs/opus/silk/NLSF2A.c \
- libs/opus/silk/NLSF_decode.c \
- libs/opus/silk/NLSF_del_dec_quant.c \
- libs/opus/silk/NLSF_encode.c \
- libs/opus/silk/NLSF_stabilize.c \
- libs/opus/silk/NLSF_unpack.c \
- libs/opus/silk/NLSF_VQ.c \
- libs/opus/silk/NLSF_VQ_weights_laroia.c \
- libs/opus/silk/NSQ.c \
- libs/opus/silk/NSQ_del_dec.c \
- libs/opus/silk/pitch_est_tables.c \
- libs/opus/silk/PLC.c \
- libs/opus/silk/process_NLSFs.c \
- libs/opus/silk/quant_LTP_gains.c \
- libs/opus/silk/resampler.c \
- libs/opus/silk/resampler_down2.c \
- libs/opus/silk/resampler_down2_3.c \
- libs/opus/silk/resampler_private_AR2.c \
- libs/opus/silk/resampler_private_down_FIR.c \
- libs/opus/silk/resampler_private_IIR_FIR.c \
- libs/opus/silk/resampler_private_up2_HQ.c \
- libs/opus/silk/resampler_rom.c \
- libs/opus/silk/shell_coder.c \
- libs/opus/silk/sigm_Q15.c \
- libs/opus/silk/sort.c \
- libs/opus/silk/stereo_decode_pred.c \
- libs/opus/silk/stereo_encode_pred.c \
- libs/opus/silk/stereo_find_predictor.c \
- libs/opus/silk/stereo_LR_to_MS.c \
- libs/opus/silk/stereo_MS_to_LR.c \
- libs/opus/silk/stereo_quant_pred.c \
- libs/opus/silk/sum_sqr_shift.c \
- libs/opus/silk/tables_gain.c \
- libs/opus/silk/tables_LTP.c \
- libs/opus/silk/tables_NLSF_CB_NB_MB.c \
- libs/opus/silk/tables_NLSF_CB_WB.c \
- libs/opus/silk/tables_other.c \
- libs/opus/silk/tables_pitch_lag.c \
- libs/opus/silk/tables_pulses_per_block.c \
- libs/opus/silk/table_LSF_cos.c \
- libs/opus/silk/VAD.c \
- libs/opus/silk/VQ_WMat_EC.c \
- libs/opus/src/analysis.c \
- libs/opus/src/extensions.c \
- libs/opus/src/mlp.c \
- libs/opus/src/mlp_data.c \
- libs/opus/src/opus.c \
- libs/opus/src/opus_decoder.c \
- libs/opus/src/opus_encoder.c \
- libs/opus/src/repacketizer.c
-
-SOURCES_OPUS_ARM = libs/opus/celt/arm/armcpu.c \
- libs/opus/celt/arm/arm_celt_map.c \
- libs/opus/silk/arm/arm_silk_map.c \
- libs/opus/silk/arm/arm_silk_map.c \
- libs/opus/silk/arm/biquad_alt_neon_intr.c \
- libs/opus/silk/arm/LPC_inv_pred_gain_neon_intr.c \
- libs/opus/silk/arm/NSQ_del_dec_neon_intr.c \
- libs/opus/silk/arm/NSQ_neon.c \
- libs/opus/celt/arm/celt_neon_intr.c \
- libs/opus/celt/arm/pitch_neon_intr.c \
- libs/opus/celt/arm/celt_fft_ne10.c \
- libs/opus/celt/arm/celt_mdct_ne10.c
-
-SOURCES_OPUS_X86_SSE = libs/opus/celt/x86/x86cpu.c \
- libs/opus/celt/x86/x86_celt_map.c \
- libs/opus/celt/x86/pitch_sse.c
-SOURCES_OPUS_X86_SSE2 = libs/opus/celt/x86/pitch_sse2.c \
- libs/opus/celt/x86/vq_sse2.c
-SOURCES_OPUS_X86_SSE4 = libs/opus/celt/x86/celt_lpc_sse4_1.c \
- libs/opus/celt/x86/pitch_sse4_1.c \
- libs/opus/silk/x86/NSQ_sse4_1.c \
- libs/opus/silk/x86/NSQ_del_dec_sse4_1.c \
- libs/opus/silk/x86/x86_silk_map.c \
- libs/opus/silk/x86/VAD_sse4_1.c \
- libs/opus/silk/x86/VQ_WMat_EC_sse4_1.c
-
-contains(QT_ARCH, armeabi-v7a) | contains(QT_ARCH, arm64-v8a) {
- HEADERS_OPUS += $$HEADERS_OPUS_ARM
- SOURCES_OPUS_ARCH += $$SOURCES_OPUS_ARM
- DEFINES_OPUS += OPUS_ARM_PRESUME_NEON=1 OPUS_ARM_PRESUME_NEON_INTR=1
- contains(QT_ARCH, arm64-v8a):DEFINES_OPUS += OPUS_ARM_PRESUME_AARCH64_NEON_INTR
-} else:contains(QT_ARCH, x86) | contains(QT_ARCH, x86_64) {
- HEADERS_OPUS += $$HEADERS_OPUS_X86
- SOURCES_OPUS_ARCH += $$SOURCES_OPUS_X86_SSE $$SOURCES_OPUS_X86_SSE2 $$SOURCES_OPUS_X86_SSE4
- DEFINES_OPUS += OPUS_X86_MAY_HAVE_SSE OPUS_X86_MAY_HAVE_SSE2 OPUS_X86_MAY_HAVE_SSE4_1
- # x86_64 implies SSE2
- contains(QT_ARCH, x86_64):DEFINES_OPUS += OPUS_X86_PRESUME_SSE=1 OPUS_X86_PRESUME_SSE2=1
- DEFINES_OPUS += CPU_INFO_BY_C
-}
-DEFINES_OPUS += OPUS_BUILD=1 USE_ALLOCA=1 OPUS_HAVE_RTCD=1 HAVE_LRINTF=1 HAVE_LRINT=1
-
-DISTFILES += ChangeLog \
- COMPILING.md \
- COPYING \
- CONTRIBUTING.md \
- README.md \
- SECURITY.md \
- docs/JAMULUS_PROTOCOL.md \
- docs/JSON-RPC.md \
- docs/README.md \
- docs/TRANSLATING.md \
- linux/jamulus.desktop.in \
- linux/jamulus-server.desktop.in \
- mac/Info-make.plist \
- mac/Info-xcode.plist \
- mac/Jamulus.entitlements \
- mac/deploy_mac.sh \
- src/res/io.jamulus.jamulus.png \
- src/res/io.jamulus.jamulus.svg \
- src/res/io.jamulus.jamulusserver.svg \
- src/res/CLEDBlackSmall.png \
- src/res/CLEDGreenSmall.png \
- src/res/CLEDGrey.png \
- src/res/CLEDRedSmall.png \
- src/res/CLEDYellowSmall.png \
- src/res/CLEDBlackBig.png \
- src/res/CLEDBlackSrc.png \
- src/res/CLEDDisabled.png \
- src/res/CLEDGreenBig.png \
- src/res/CLEDGreenSrc.png \
- src/res/CLEDGreySrc.png \
- src/res/CLEDRedBig.png \
- src/res/CLEDRedSrc.png \
- src/res/CLEDYellowBig.png \
- src/res/CLEDYellowSrc.png \
- src/res/IndicatorGreen.png \
- src/res/IndicatorYellow.png \
- src/res/IndicatorRed.png \
- src/res/IndicatorYellowFancy.png \
- src/res/IndicatorRedFancy.png \
- src/res/faderbackground.png \
- src/res/faderhandle.png \
- src/res/faderhandlesmall.png \
- src/res/HLEDGreen.png \
- src/res/HLEDBlack.png \
- src/res/HLEDRed.png \
- src/res/HLEDYellow.png \
- src/res/HLEDBlackSrc.png \
- src/res/HLEDGreenSrc.png \
- src/res/HLEDGrey.png \
- src/res/HLEDGreySrc.png \
- src/res/HLEDRedSrc.png \
- src/res/HLEDYellowSrc.png \
- src/res/ledbuttonnotpressed.png \
- src/res/ledbuttonpressed.png \
- src/res/fronticon.png \
- src/res/fronticonserver.png \
- src/res/mixerboardbackground.png \
- src/res/transparent1x1.png \
- src/res/mutediconorange.png \
- src/res/servertrayiconactive.png \
- src/res/servertrayiconinactive.png \
- src/res/installerbackground.png \
- src/res/instruments/accordeon.png \
- src/res/instruments/aguitar.png \
- src/res/instruments/bassguitar.png \
- src/res/instruments/cello.png \
- src/res/instruments/clarinet.png \
- src/res/instruments/conductor.png \
- src/res/instruments/djembe.png \
- src/res/instruments/doublebass.png \
- src/res/instruments/drumset.png \
- src/res/instruments/eguitar.png \
- src/res/instruments/flute.png \
- src/res/instruments/frenchhorn.png \
- src/res/instruments/grandpiano.png \
- src/res/instruments/harmonica.png \
- src/res/instruments/keyboard.png \
- src/res/instruments/listener.png \
- src/res/instruments/microphone.png \
- src/res/instruments/mountaindulcimer.png \
- src/res/instruments/none.png \
- src/res/instruments/rapping.png \
- src/res/instruments/recorder.png \
- src/res/instruments/saxophone.png \
- src/res/instruments/scratching.png \
- src/res/instruments/streamer.png \
- src/res/instruments/synthesizer.png \
- src/res/instruments/trombone.png \
- src/res/instruments/trumpet.png \
- src/res/instruments/tuba.png \
- src/res/instruments/vibraphone.png \
- src/res/instruments/violin.png \
- src/res/instruments/vocal.png \
- src/res/instruments/guitarvocal.png \
- src/res/instruments/keyboardvocal.png \
- src/res/instruments/bodhran.svg \
- src/res/instruments/bodhran.png \
- src/res/instruments/bassoon.svg \
- src/res/instruments/bassoon.png \
- src/res/instruments/oboe.svg \
- src/res/instruments/oboe.png \
- src/res/instruments/harp.svg \
- src/res/instruments/harp.png \
- src/res/instruments/viola.png \
- src/res/instruments/congas.svg \
- src/res/instruments/congas.png \
- src/res/instruments/bongo.svg \
- src/res/instruments/bongo.png \
- src/res/instruments/ukulele.svg \
- src/res/instruments/ukulele.png \
- src/res/instruments/bassukulele.svg \
- src/res/instruments/bassukulele.png \
- src/res/instruments/vocalbass.png \
- src/res/instruments/vocaltenor.png \
- src/res/instruments/vocalalto.png \
- src/res/instruments/vocalsoprano.png \
- src/res/instruments/vocalbaritone.png \
- src/res/instruments/vocallead.png \
- src/res/instruments/banjo.png \
- src/res/instruments/mandolin.png \
- src/res/flags/flagnone.png \
- src/res/flags/ad.png \
- src/res/flags/ae.png \
- src/res/flags/af.png \
- src/res/flags/ag.png \
- src/res/flags/ai.png \
- src/res/flags/al.png \
- src/res/flags/am.png \
- src/res/flags/an.png \
- src/res/flags/ao.png \
- src/res/flags/ar.png \
- src/res/flags/as.png \
- src/res/flags/at.png \
- src/res/flags/au.png \
- src/res/flags/aw.png \
- src/res/flags/ax.png \
- src/res/flags/az.png \
- src/res/flags/ba.png \
- src/res/flags/bb.png \
- src/res/flags/bd.png \
- src/res/flags/be.png \
- src/res/flags/bf.png \
- src/res/flags/bg.png \
- src/res/flags/bh.png \
- src/res/flags/bi.png \
- src/res/flags/bj.png \
- src/res/flags/bm.png \
- src/res/flags/bn.png \
- src/res/flags/bo.png \
- src/res/flags/br.png \
- src/res/flags/bs.png \
- src/res/flags/bt.png \
- src/res/flags/bv.png \
- src/res/flags/bw.png \
- src/res/flags/by.png \
- src/res/flags/bz.png \
- src/res/flags/ca.png \
- src/res/flags/cc.png \
- src/res/flags/cd.png \
- src/res/flags/cf.png \
- src/res/flags/cg.png \
- src/res/flags/ch.png \
- src/res/flags/ci.png \
- src/res/flags/ck.png \
- src/res/flags/cl.png \
- src/res/flags/cm.png \
- src/res/flags/cn.png \
- src/res/flags/co.png \
- src/res/flags/cr.png \
- src/res/flags/cs.png \
- src/res/flags/cu.png \
- src/res/flags/cv.png \
- src/res/flags/cx.png \
- src/res/flags/cy.png \
- src/res/flags/cz.png \
- src/res/flags/de.png \
- src/res/flags/dj.png \
- src/res/flags/dk.png \
- src/res/flags/dm.png \
- src/res/flags/do.png \
- src/res/flags/dz.png \
- src/res/flags/ec.png \
- src/res/flags/ee.png \
- src/res/flags/eg.png \
- src/res/flags/eh.png \
- src/res/flags/er.png \
- src/res/flags/es.png \
- src/res/flags/et.png \
- src/res/flags/fam.png \
- src/res/flags/fi.png \
- src/res/flags/fj.png \
- src/res/flags/fk.png \
- src/res/flags/fm.png \
- src/res/flags/fo.png \
- src/res/flags/fr.png \
- src/res/flags/ga.png \
- src/res/flags/gb.png \
- src/res/flags/gd.png \
- src/res/flags/ge.png \
- src/res/flags/gf.png \
- src/res/flags/gh.png \
- src/res/flags/gi.png \
- src/res/flags/gl.png \
- src/res/flags/gm.png \
- src/res/flags/gn.png \
- src/res/flags/gp.png \
- src/res/flags/gq.png \
- src/res/flags/gr.png \
- src/res/flags/gs.png \
- src/res/flags/gt.png \
- src/res/flags/gu.png \
- src/res/flags/gw.png \
- src/res/flags/gy.png \
- src/res/flags/hk.png \
- src/res/flags/hm.png \
- src/res/flags/hn.png \
- src/res/flags/hr.png \
- src/res/flags/ht.png \
- src/res/flags/hu.png \
- src/res/flags/id.png \
- src/res/flags/ie.png \
- src/res/flags/il.png \
- src/res/flags/in.png \
- src/res/flags/io.png \
- src/res/flags/iq.png \
- src/res/flags/ir.png \
- src/res/flags/is.png \
- src/res/flags/it.png \
- src/res/flags/jm.png \
- src/res/flags/jo.png \
- src/res/flags/jp.png \
- src/res/flags/ke.png \
- src/res/flags/kg.png \
- src/res/flags/kh.png \
- src/res/flags/ki.png \
- src/res/flags/km.png \
- src/res/flags/kn.png \
- src/res/flags/kp.png \
- src/res/flags/kr.png \
- src/res/flags/kw.png \
- src/res/flags/ky.png \
- src/res/flags/kz.png \
- src/res/flags/la.png \
- src/res/flags/lb.png \
- src/res/flags/lc.png \
- src/res/flags/li.png \
- src/res/flags/lk.png \
- src/res/flags/lr.png \
- src/res/flags/ls.png \
- src/res/flags/lt.png \
- src/res/flags/lu.png \
- src/res/flags/lv.png \
- src/res/flags/ly.png \
- src/res/flags/ma.png \
- src/res/flags/mc.png \
- src/res/flags/md.png \
- src/res/flags/me.png \
- src/res/flags/mg.png \
- src/res/flags/mh.png \
- src/res/flags/mk.png \
- src/res/flags/ml.png \
- src/res/flags/mm.png \
- src/res/flags/mn.png \
- src/res/flags/mo.png \
- src/res/flags/mp.png \
- src/res/flags/mq.png \
- src/res/flags/mr.png \
- src/res/flags/ms.png \
- src/res/flags/mt.png \
- src/res/flags/mu.png \
- src/res/flags/mv.png \
- src/res/flags/mw.png \
- src/res/flags/mx.png \
- src/res/flags/my.png \
- src/res/flags/mz.png \
- src/res/flags/na.png \
- src/res/flags/nc.png \
- src/res/flags/ne.png \
- src/res/flags/nf.png \
- src/res/flags/ng.png \
- src/res/flags/ni.png \
- src/res/flags/nl.png \
- src/res/flags/no.png \
- src/res/flags/np.png \
- src/res/flags/nr.png \
- src/res/flags/nu.png \
- src/res/flags/nz.png \
- src/res/flags/om.png \
- src/res/flags/pa.png \
- src/res/flags/pe.png \
- src/res/flags/pf.png \
- src/res/flags/pg.png \
- src/res/flags/ph.png \
- src/res/flags/pk.png \
- src/res/flags/pl.png \
- src/res/flags/pm.png \
- src/res/flags/pn.png \
- src/res/flags/pr.png \
- src/res/flags/ps.png \
- src/res/flags/pt.png \
- src/res/flags/pw.png \
- src/res/flags/py.png \
- src/res/flags/qa.png \
- src/res/flags/re.png \
- src/res/flags/ro.png \
- src/res/flags/rs.png \
- src/res/flags/ru.png \
- src/res/flags/rw.png \
- src/res/flags/sa.png \
- src/res/flags/sb.png \
- src/res/flags/sc.png \
- src/res/flags/sd.png \
- src/res/flags/se.png \
- src/res/flags/sg.png \
- src/res/flags/sh.png \
- src/res/flags/si.png \
- src/res/flags/sj.png \
- src/res/flags/sk.png \
- src/res/flags/sl.png \
- src/res/flags/sm.png \
- src/res/flags/sn.png \
- src/res/flags/so.png \
- src/res/flags/sr.png \
- src/res/flags/st.png \
- src/res/flags/sv.png \
- src/res/flags/sy.png \
- src/res/flags/sz.png \
- src/res/flags/tc.png \
- src/res/flags/td.png \
- src/res/flags/tf.png \
- src/res/flags/tg.png \
- src/res/flags/th.png \
- src/res/flags/tj.png \
- src/res/flags/tk.png \
- src/res/flags/tl.png \
- src/res/flags/tm.png \
- src/res/flags/tn.png \
- src/res/flags/to.png \
- src/res/flags/tr.png \
- src/res/flags/tt.png \
- src/res/flags/tv.png \
- src/res/flags/tw.png \
- src/res/flags/tz.png \
- src/res/flags/ua.png \
- src/res/flags/ug.png \
- src/res/flags/um.png \
- src/res/flags/us.png \
- src/res/flags/uy.png \
- src/res/flags/uz.png \
- src/res/flags/va.png \
- src/res/flags/vc.png \
- src/res/flags/ve.png \
- src/res/flags/vg.png \
- src/res/flags/vi.png \
- src/res/flags/vn.png \
- src/res/flags/vu.png \
- src/res/flags/wf.png \
- src/res/flags/ws.png \
- src/res/flags/ye.png \
- src/res/flags/yt.png \
- src/res/flags/za.png \
- src/res/flags/zm.png \
- src/res/flags/zw.png \
- src/res/flags/catalonia.png \
- src/res/flags/england.png \
- src/res/flags/europeanunion.png \
- src/res/flags/scotland.png \
- src/res/flags/wales.png \
- src/res/flags/readme.txt \
- tools/changelog-helper.sh \
- tools/check-wininstaller-translations.sh \
- tools/checkkeys.pl \
- tools/create-translation-issues.sh \
- tools/generate_json_rpc_docs.py \
- tools/get_release_contributors.py \
- tools/qt5_to_qt6_country_code_table.py \
- tools/update-copyright-notices.sh \
- windows/deploy_windows.ps1 \
- windows/installer.nsi
-
-DISTFILES_OPUS += libs/opus/AUTHORS \
- libs/opus/ChangeLog \
- libs/opus/COPYING \
- libs/opus/NEWS \
- libs/opus/README \
- libs/opus/celt/arm/armopts.s.in \
- libs/opus/celt/arm/celt_pitch_xcorr_arm.s \
-
-contains(CONFIG, "headless") {
- DEFINES += HEADLESS
-} else {
- HEADERS += $$HEADERS_GUI
- SOURCES += $$SOURCES_GUI
- FORMS += $$FORMS_GUI
-}
-
-contains(CONFIG, "nojsonrpc") {
- message(JSON-RPC support excluded from build.)
- DEFINES += NO_JSON_RPC
-} else {
- HEADERS += \
- src/rpcserver.h \
- src/serverrpc.h
- SOURCES += \
- src/rpcserver.cpp \
- src/serverrpc.cpp
- contains(CONFIG, "serveronly") {
- message("server only, skipping client rpc")
- } else {
- HEADERS += src/clientrpc.h
- SOURCES += src/clientrpc.cpp
- }
-}
-
-# use external OPUS library if requested
-contains(CONFIG, "opus_shared_lib") {
- message(OPUS codec is used from a shared library.)
-
- unix {
- !exists(/usr/include/opus/opus_custom.h) {
- !exists(/usr/local/include/opus/opus_custom.h) {
- message(Header opus_custom.h was not found at the usual place. Maybe the opus dev packet is missing.)
- }
- }
-
- LIBS += -lopus
- DEFINES += USE_OPUS_SHARED_LIB
- }
-} else {
- DEFINES += $$DEFINES_OPUS
- INCLUDEPATH += $$INCLUDEPATH_OPUS
- HEADERS += $$HEADERS_OPUS
- SOURCES += $$SOURCES_OPUS
- DISTFILES += $$DISTFILES_OPUS
-
- contains(QT_ARCH, x86) | contains(QT_ARCH, x86_64) {
- msvc | macx-xcode {
- # According to opus/win32/config.h, "no special compiler
- # flags necessary" when using msvc. It always supports
- # SSE intrinsics, but does not auto-vectorize.
- # The macOS Xcode build would fail with these specific compiler flags.
- # Thus, we omit them for macx-xcode too. This was discovered by
- # plain testing by the Jamulus team and might mean that the
- # optimizations are not used on macx-xcode. (See #1841, #3076)
-
- SOURCES += $$SOURCES_OPUS_ARCH
- } else {
- # Arch-specific files need special compiler flags, but we
- # can't use those flags for other files because otherwise we
- # might end up with vectorized code that the CPU doesn't
- # support. For windows, libs/opus/win32/config.h says no
- # compiler flags are needed.
- sse_cc.name = sse_cc
- sse_cc.input = SOURCES_OPUS_X86_SSE
- sse_cc.dependency_type = TYPE_C
- sse_cc.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${first(QMAKE_EXT_OBJ)}
- sse_cc.commands = ${CC} -msse $(CFLAGS) $(INCPATH) -c ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
- sse_cc.variable_out = OBJECTS
- sse2_cc.name = sse2_cc
- sse2_cc.input = SOURCES_OPUS_X86_SSE2
- sse2_cc.dependency_type = TYPE_C
- sse2_cc.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${first(QMAKE_EXT_OBJ)}
- sse2_cc.commands = ${CC} -msse2 $(CFLAGS) $(INCPATH) -c ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
- sse2_cc.variable_out = OBJECTS
- sse4_cc.name = sse4_cc
- sse4_cc.input = SOURCES_OPUS_X86_SSE4
- sse4_cc.dependency_type = TYPE_C
- sse4_cc.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${first(QMAKE_EXT_OBJ)}
- sse4_cc.commands = ${CC} -msse4 $(CFLAGS) $(INCPATH) -c ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
- sse4_cc.variable_out = OBJECTS
- QMAKE_EXTRA_COMPILERS += sse_cc sse2_cc sse4_cc
- }
- }
-}
-
-# disable version check if requested (#370)
-contains(CONFIG, "disable_version_check") {
- message(The version check is disabled.)
- DEFINES += DISABLE_VERSION_CHECK
-}
-
-# Enable formatting all code via `make clang_format`.
-# Note: When extending the list of file extensions or when adding new code directories,
-# be sure to update .github/workflows/coding-style-check.yml and .clang-format-ignore as well.
-CLANG_FORMAT_SOURCES = $$files(*.cpp, true) $$files(*.mm, true) $$files(*.h, true)
-CLANG_FORMAT_SOURCES = $$find(CLANG_FORMAT_SOURCES, ^\(android|ios|mac|linux|src|windows\)/)
-CLANG_FORMAT_SOURCES ~= s!^\(libs/.*/|src/res/qrc_resources\.cpp\)\S*$!!g
-clang_format.commands = 'clang-format -i $$CLANG_FORMAT_SOURCES'
-QMAKE_EXTRA_TARGETS += clang_format
diff --git a/README.md b/README.md
index aa525b0cfa..f3d3e21385 100644
--- a/README.md
+++ b/README.md
@@ -1,55 +1,21 @@
-[](https://jamulus.io)
+# JamulusPlus Build Root
-[](https://github.com/jamulussoftware/jamulus/actions/workflows/autobuild.yml)
+This repository is the authoritative JUCE/non-Qt build root for JamulusPlus. It builds the non-Qt core API, the JUCE plugin targets, and the standalone target from one CMake tree.
-# Jamulus - Internet Jam Session Software
+Contents:
+- `jamulus_core_juce.*` - non-Qt Jamulus core implementation and C API surface.
+- `juce_net_abstraction.*` - JUCE-backed networking helpers for the non-Qt core.
+- `plugin/` - JUCE plugin and standalone targets.
+- `CMakeLists.txt` - top-level non-Qt CMake entry point.
-
+Notes:
+- This is the non-Qt path. It does not require Qt packages or Qt runtime DLL deployment.
+- Use `b` as the default local build directory.
-Jamulus enables musicians to perform in real-time together over the internet.
-A Jamulus server collects the incoming audio data from each Jamulus client, mixes that data and then sends that mix back to each client. Jamulus can support large numbers of clients with minimal latency and modest bandwidth requirements.
+Build:
-Jamulus is [**free and open source software**](https://www.gnu.org/philosophy/free-sw.en.html) (FOSS) licensed under the [GPL](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html)
-and runs under **Windows** ([ASIO](https://www.steinberg.net) or [JACK](https://jackaudio.org)),
-**MacOS** ([Core Audio](https://developer.apple.com/documentation/coreaudio)) and
-**Linux** ([JACK](https://jackaudio.org)).
-It is based on the [Qt framework](https://www.qt.io) and uses the [OPUS](https://www.opus-codec.org/) audio codec.
-
-## Installation
-
-[Please see the Getting Started page](https://jamulus.io/wiki/Getting-Started) containing instructions for installing and using Jamulus for your platform.
-
-## Help
-
-Official documentation for Jamulus is on the [Jamulus homepage](https://jamulus.io)
-
-See also the [discussion forums](https://github.com/jamulussoftware/jamulus/discussions). If you have issues, feel free to ask for help there.
-
-Bugs and feature requests can be [reported here](https://github.com/jamulussoftware/jamulus/issues)
-
-## Compilation
-
-[Please see these instructions](COMPILING.md)
-
-## Contributing
-
-See the [contributing instructions](CONTRIBUTING.md)
-
-## Acknowledgements
-
-Jamulus contains code from different sources (see also [COPYING](COPYING)). The developers wish
-to thank the maintainers of these projects for making their efforts available to us under their respective licences:
-
-* Qt cross-platform application framework: [qt.io](https://www.qt.io)
-* Opus Interactive Audio Codec: [opus-codec.org](https://www.opus-codec.org/)
-* Audio reverberation code: by Perry R. Cook and Gary P. Scavone, 1995 - 2004
- (taken from "The Synthesis ToolKit in C++ (STK)"):
- [ccrma.stanford.edu/software/stk/](https://ccrma.stanford.edu/software/stk/)
-* Some pixmaps are from the Open Clip Art Library (OCAL): [openclipart.com](https://openclipart.org/)
-* Country flag icons from Mark James: [famfamfam.com](http://www.famfamfam.com)
-* [JACK Audio Connection Kit](https://jackaudio.org/) by [the JACK authors](https://github.com/jackaudio/jack2/blob/develop/AUTHORS.rst?plain=1)
-* ASIO is a trademark and software of Steinberg Media Technologies GmbH
-
-
-We would also like to acknowledge the contributors listed in the
-[Github Contributors list](https://github.com/jamulussoftware/jamulus/graphs/contributors).
+```powershell
+cmake -S . -B b -G "Visual Studio 17 2022" -A x64
+cmake --build .\b --config Release --target jamulus_dist
+cmake --build .\b --config Release --target jamulus_dist_standalone
+```
diff --git a/SECURITY.md b/SECURITY.md
deleted file mode 100644
index f6ccee588a..0000000000
--- a/SECURITY.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Reporting Security Issues
-
-**âš ï¸ Please do not open GitHub issues for security vulnerabilities. âš ï¸**
-
-We encourage responsible disclosure practices for security vulnerabilities.
-
-If you think you have found a security-relevant issue, please send the details to **team@jamulus.io**.
-
-We will then
-
-- open a placeholder issue without details,
-- assess the severity,
-- work on a fix,
-- schedule a release which includes the fix and
-- publish all relevant details as part of the issue,
-- publish a Github security advisory as necessary.
-
-# Security model
-
-## Guarantees
-
-The Jamulus project aims to provide robust software.
-It tries hard to avoid all kinds of implementation issues such as Code Execution, unwanted File system access, or similar issues.
-
-## Limitations
-
-The following is a list of areas where there may be expectations which Jamulus currently does not fulfill:
-
-- There is no registration, authentication or user database.
- Usernames can freely be chosen.
-- There is no encryption or message authentication.
- Both protocol messages and audio are transmitted in the clear.
- Anyone with access to the network traffic is able to listen to the audio or even modify it.
-- There is little protection against certain patterns of Denial of Service:
- - Servers have a limited number of slots for clients which can easily be exhausted.
- - There is no protection against spam in the chat function.
- - Jamulus is UDP-based and UDP does not provide protection against source address spoofing. This enables all kinds of Denial of Service or Impersonation attacks.
-
-For some of these areas there are long-term ideas about extending Jamulus (e.g. usage of TCP, authentication), but they have not been decided upon yet.
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
deleted file mode 100644
index 7725864d27..0000000000
--- a/android/AndroidManifest.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/android/res/drawable-hdpi/icon.png b/android/res/drawable-hdpi/icon.png
deleted file mode 100644
index 3ba6f7222f..0000000000
Binary files a/android/res/drawable-hdpi/icon.png and /dev/null differ
diff --git a/android/res/drawable-ldpi/icon.png b/android/res/drawable-ldpi/icon.png
deleted file mode 100644
index ea9221bedf..0000000000
Binary files a/android/res/drawable-ldpi/icon.png and /dev/null differ
diff --git a/android/res/drawable-mdpi/icon.png b/android/res/drawable-mdpi/icon.png
deleted file mode 100644
index 9ea7673bd8..0000000000
Binary files a/android/res/drawable-mdpi/icon.png and /dev/null differ
diff --git a/android/res/drawable-xhdpi/icon.png b/android/res/drawable-xhdpi/icon.png
deleted file mode 100644
index 33f37bdaae..0000000000
Binary files a/android/res/drawable-xhdpi/icon.png and /dev/null differ
diff --git a/android/res/drawable-xxhdpi/icon.png b/android/res/drawable-xxhdpi/icon.png
deleted file mode 100644
index 873c1fc25b..0000000000
Binary files a/android/res/drawable-xxhdpi/icon.png and /dev/null differ
diff --git a/android/res/drawable-xxxhdpi/icon.png b/android/res/drawable-xxxhdpi/icon.png
deleted file mode 100644
index 43c1851e6e..0000000000
Binary files a/android/res/drawable-xxxhdpi/icon.png and /dev/null differ
diff --git a/asioshim.cpp b/asioshim.cpp
new file mode 100644
index 0000000000..e15a45389f
--- /dev/null
+++ b/asioshim.cpp
@@ -0,0 +1,42 @@
+// Minimal ASIO shim: provides ASIO functions and a tiny AsioDrivers implementation
+// This is a compile-time shim only — it does not provide real audio I/O.
+
+// Include ASIO header with normal C++ linkage so definitions match how
+// Jamulus compiles against the header (C++ mangled names on MSVC).
+#include "third_party/JUCE/modules/juce_audio_devices/native/asio/asio.h"
+
+ASIOError ASIOInit(ASIODriverInfo* /*info*/) { return ASE_NotPresent; }
+ASIOError ASIOExit(void) { return ASE_NotPresent; }
+ASIOError ASIOStart(void) { return ASE_NotPresent; }
+ASIOError ASIOStop(void) { return ASE_NotPresent; }
+ASIOError ASIOGetChannels(long* /*numInputChannels*/, long* /*numOutputChannels*/) { return ASE_NotPresent; }
+ASIOError ASIOGetLatencies(long* /*inputLatency*/, long* /*outputLatency*/) { return ASE_NotPresent; }
+ASIOError ASIOGetBufferSize(long* /*minSize*/, long* /*maxSize*/, long* /*preferredSize*/, long* /*granularity*/) { return ASE_NotPresent; }
+ASIOError ASIOCanSampleRate(ASIOSampleRate /*sampleRate*/) { return ASE_NotPresent; }
+ASIOError ASIOGetSampleRate(ASIOSampleRate* /*currentRate*/) { return ASE_NotPresent; }
+ASIOError ASIOSetSampleRate(ASIOSampleRate /*sampleRate*/) { return ASE_NotPresent; }
+ASIOError ASIOGetClockSources(ASIOClockSource* /*clocks*/, long* /*numSources*/) { return ASE_NotPresent; }
+ASIOError ASIOSetClockSource(long /*reference*/) { return ASE_NotPresent; }
+ASIOError ASIOGetSamplePosition(ASIOSamples* /*sPos*/, ASIOTimeStamp* /*tStamp*/) { return ASE_NotPresent; }
+ASIOError ASIOGetChannelInfo(ASIOChannelInfo* /*info*/) { return ASE_NotPresent; }
+ASIOError ASIOCreateBuffers(ASIOBufferInfo* /*bufferInfos*/, long /*numChannels*/, long /*bufferSize*/, ASIOCallbacks* /*callbacks*/) { return ASE_NotPresent; }
+ASIOError ASIODisposeBuffers(void) { return ASE_NotPresent; }
+ASIOError ASIOControlPanel(void) { return ASE_NotPresent; }
+ASIOError ASIOFuture(long /*selector*/, void* /*params*/) { return ASE_NotPresent; }
+ASIOError ASIOOutputReady(void) { return ASE_NotPresent; }
+
+// Minimal AsioDrivers implementation to satisfy linker
+class AsioDrivers {
+public:
+ AsioDrivers() {}
+ ~AsioDrivers() {}
+ bool getCurrentDriverName(char* /*name*/) { return false; }
+ long getDriverNames(char** /*names*/, long /*maxDrivers*/) { return 0; }
+ bool loadDriver(char* /*name*/) { return false; }
+ void removeCurrentDriver() {}
+ long getCurrentDriverIndex() { return -1; }
+};
+
+AsioDrivers* asioDrivers = nullptr;
+
+bool loadAsioDriver(char* /*name*/) { return false; }
diff --git a/audio_fifo.cpp b/audio_fifo.cpp
new file mode 100644
index 0000000000..8cabfef418
--- /dev/null
+++ b/audio_fifo.cpp
@@ -0,0 +1,63 @@
+#include "audio_fifo.h"
+#include
+
+AudioFifo::AudioFifo(size_t capacityFrames, int channels)
+ : capacityFrames(capacityFrames), numChannels(channels), buffer(capacityFrames * channels, 0.0f)
+{
+}
+
+AudioFifo::~AudioFifo() = default;
+
+bool AudioFifo::push(const float* data, size_t frames)
+{
+ if (!data || frames == 0) return false;
+
+ size_t w = writePos.load(std::memory_order_relaxed);
+ size_t r = readPos.load(std::memory_order_acquire);
+ size_t freeFrames = (r + capacityFrames - w - 1) % capacityFrames;
+ if (frames > freeFrames) return false;
+
+ for (size_t f = 0; f < frames; ++f)
+ {
+ size_t idx = ((w + f) % capacityFrames) * numChannels;
+ for (int c = 0; c < numChannels; ++c)
+ buffer[idx + c] = data[f * numChannels + c];
+ }
+
+ writePos.store((w + frames) % capacityFrames, std::memory_order_release);
+ return true;
+}
+
+size_t AudioFifo::pop(float* out, size_t frames)
+{
+ if (!out || frames == 0) return 0;
+
+ size_t w = writePos.load(std::memory_order_acquire);
+ size_t r = readPos.load(std::memory_order_relaxed);
+ size_t availableFrames = (w + capacityFrames - r) % capacityFrames;
+ size_t toRead = std::min(frames, availableFrames);
+
+ for (size_t f = 0; f < toRead; ++f)
+ {
+ size_t idx = ((r + f) % capacityFrames) * numChannels;
+ for (int c = 0; c < numChannels; ++c)
+ out[f * numChannels + c] = buffer[idx + c];
+ }
+
+ readPos.store((r + toRead) % capacityFrames, std::memory_order_release);
+ return toRead;
+}
+
+void AudioFifo::clear()
+{
+ writePos.store(0);
+ readPos.store(0);
+ std::fill(buffer.begin(), buffer.end(), 0.0f);
+}
+
+size_t AudioFifo::available() const
+{
+ size_t w = writePos.load(std::memory_order_acquire);
+ size_t r = readPos.load(std::memory_order_acquire);
+ return (w + capacityFrames - r) % capacityFrames;
+}
diff --git a/audio_fifo.h b/audio_fifo.h
new file mode 100644
index 0000000000..a2df1a4373
--- /dev/null
+++ b/audio_fifo.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include
+#include
+#include
+
+class AudioFifo
+{
+public:
+ AudioFifo(size_t capacityFrames, int channels);
+ ~AudioFifo();
+
+ // Push frames from interleaved float buffer. Returns true if all frames were pushed.
+ bool push(const float* data, size_t frames);
+
+ // Pop up to 'frames' frames into interleaved float buffer. Returns number of frames popped.
+ size_t pop(float* out, size_t frames);
+
+ void clear();
+
+ size_t available() const;
+
+private:
+ const size_t capacityFrames;
+ const int numChannels;
+ std::vector buffer; // interleaved
+ std::atomic writePos{0};
+ std::atomic readPos{0};
+};
diff --git a/country_wire_map_generated.inc b/country_wire_map_generated.inc
new file mode 100644
index 0000000000..ba2a69775b
--- /dev/null
+++ b/country_wire_map_generated.inc
@@ -0,0 +1,262 @@
+struct JamulusCountryMapEntry { uint16_t wire; const char* iso; const char* name; };
+static const JamulusCountryMapEntry kJamulusCountryMap[] = {
+ { 1, "af", "Afghanistan" },
+ { 2, "al", "Albania" },
+ { 3, "dz", "Algeria" },
+ { 4, "as", "American Samoa" },
+ { 5, "ad", "Andorra" },
+ { 6, "ao", "Angola" },
+ { 7, "ai", "Anguilla" },
+ { 8, "aq", "Antarctica" },
+ { 9, "ag", "Antigua and Barbuda" },
+ { 10, "ar", "Argentina" },
+ { 11, "am", "Armenia" },
+ { 12, "aw", "Aruba" },
+ { 13, "au", "Australia" },
+ { 14, "at", "Austria" },
+ { 15, "az", "Azerbaijan" },
+ { 16, "bs", "Bahamas" },
+ { 17, "bh", "Bahrain" },
+ { 18, "bd", "Bangladesh" },
+ { 19, "bb", "Barbados" },
+ { 20, "by", "Belarus" },
+ { 21, "be", "Belgium" },
+ { 22, "bz", "Belize" },
+ { 23, "bj", "Benin" },
+ { 24, "bm", "Bermuda" },
+ { 25, "bt", "Bhutan" },
+ { 26, "bo", "Bolivia" },
+ { 27, "ba", "Bosnia and Herzegovina" },
+ { 28, "bw", "Botswana" },
+ { 29, "bv", "Bouvet Island" },
+ { 30, "br", "Brazil" },
+ { 31, "io", "British Indian Ocean Territory" },
+ { 32, "bn", "Brunei" },
+ { 33, "bg", "Bulgaria" },
+ { 34, "bf", "Burkina Faso" },
+ { 35, "bi", "Burundi" },
+ { 36, "kh", "Cambodia" },
+ { 37, "cm", "Cameroon" },
+ { 38, "ca", "Canada" },
+ { 39, "cv", "Cape Verde" },
+ { 40, "ky", "Cayman Islands" },
+ { 41, "cf", "Central African Republic" },
+ { 42, "td", "Chad" },
+ { 43, "cl", "Chile" },
+ { 44, "cn", "China" },
+ { 45, "cx", "Christmas Island" },
+ { 46, "cc", "Cocos Islands" },
+ { 47, "co", "Colombia" },
+ { 48, "km", "Comoros" },
+ { 49, "cd", "Congo - Kinshasa" },
+ { 50, "cg", "Congo - Brazzaville" },
+ { 51, "ck", "Cook Islands" },
+ { 52, "cr", "Costa Rica" },
+ { 53, "jm", "Jamaica" },
+ { 54, "hr", "Croatia" },
+ { 55, "cu", "Cuba" },
+ { 56, "cy", "Cyprus" },
+ { 57, "cz", "Czechia" },
+ { 58, "dk", "Denmark" },
+ { 59, "dj", "Djibouti" },
+ { 60, "dm", "Dominica" },
+ { 61, "do", "Dominican Republic" },
+ { 62, "tk", "Tokelau" },
+ { 63, "ec", "Ecuador" },
+ { 64, "eg", "Egypt" },
+ { 65, "sv", "El Salvador" },
+ { 66, "gq", "Equatorial Guinea" },
+ { 67, "er", "Eritrea" },
+ { 68, "ee", "Estonia" },
+ { 69, "et", "Ethiopia" },
+ { 70, "fo", "Faroe Islands" },
+ { 71, "fj", "Fiji" },
+ { 72, "fi", "Finland" },
+ { 73, "fr", "France" },
+ { 74, "gf", "French Guiana" },
+ { 75, "gw", "Guinea-Bissau" },
+ { 76, "pf", "French Polynesia" },
+ { 77, "tf", "French Southern Territories" },
+ { 78, "ga", "Gabon" },
+ { 79, "gm", "Gambia" },
+ { 80, "ge", "Georgia" },
+ { 81, "de", "Germany" },
+ { 82, "gh", "Ghana" },
+ { 83, "gi", "Gibraltar" },
+ { 84, "gr", "Greece" },
+ { 85, "gl", "Greenland" },
+ { 86, "gd", "Grenada" },
+ { 87, "gp", "Guadeloupe" },
+ { 88, "gu", "Guam" },
+ { 89, "gt", "Guatemala" },
+ { 90, "gg", "Guernsey" },
+ { 91, "gy", "Guyana" },
+ { 92, "gn", "Guinea" },
+ { 93, "ht", "Haiti" },
+ { 94, "hm", "Heard and McDonald Islands" },
+ { 95, "hn", "Honduras" },
+ { 96, "hk", "Hong Kong" },
+ { 97, "hu", "Hungary" },
+ { 98, "is", "Iceland" },
+ { 99, "in", "India" },
+ { 100, "id", "Indonesia" },
+ { 101, "ir", "Iran" },
+ { 102, "iq", "Iraq" },
+ { 103, "ie", "Ireland" },
+ { 104, "im", "Isle of Man" },
+ { 105, "it", "Italy" },
+ { 106, "ci", "Ivory Coast" },
+ { 107, "jp", "Japan" },
+ { 108, "je", "Jersey" },
+ { 109, "kz", "Kazakhstan" },
+ { 110, "ke", "Kenya" },
+ { 111, "ki", "Kiribati" },
+ { 112, "xk", "Kosovo" },
+ { 113, "om", "Oman" },
+ { 114, "es", "Spain" },
+ { 115, "kg", "Kyrgyzstan" },
+ { 116, "la", "Laos" },
+ { 117, "lv", "Latvia" },
+ { 118, "ls", "Lesotho" },
+ { 119, "lr", "Liberia" },
+ { 120, "ly", "Libya" },
+ { 121, "li", "Liechtenstein" },
+ { 122, "lt", "Lithuania" },
+ { 123, "lu", "Luxembourg" },
+ { 124, "mo", "Macao" },
+ { 125, "mk", "Macedonia" },
+ { 126, "mg", "Madagascar" },
+ { 127, "mw", "Malawi" },
+ { 128, "my", "Malaysia" },
+ { 129, "mv", "Maldives" },
+ { 130, "ml", "Mali" },
+ { 131, "mt", "Malta" },
+ { 132, "mh", "Marshall Islands" },
+ { 133, "mq", "Martinique" },
+ { 134, "mr", "Mauritania" },
+ { 135, "mu", "Mauritius" },
+ { 136, "yt", "Mayotte" },
+ { 137, "mx", "Mexico" },
+ { 138, "fm", "Micronesia" },
+ { 139, "md", "Moldova" },
+ { 140, "mc", "Monaco" },
+ { 141, "mn", "Mongolia" },
+ { 142, "me", "Montenegro" },
+ { 143, "ms", "Montserrat" },
+ { 144, "mz", "Mozambique" },
+ { 145, "mm", "Myanmar" },
+ { 146, "na", "Namibia" },
+ { 147, "nr", "Nauru" },
+ { 148, "np", "Nepal" },
+ { 149, "nl", "Netherlands" },
+ { 150, "nc", "New Caledonia" },
+ { 151, "nz", "New Zealand" },
+ { 152, "cw", "Curacao" },
+ { 153, "ni", "Nicaragua" },
+ { 154, "ng", "Nigeria" },
+ { 155, "ne", "Niger" },
+ { 156, "nf", "Norfolk Island" },
+ { 157, "nu", "Niue" },
+ { 158, "mp", "Northern Mariana Islands" },
+ { 159, "kp", "North Korea" },
+ { 160, "no", "Norway" },
+ { 161, "qo", "Outlying Oceania" },
+ { 162, "pk", "Pakistan" },
+ { 163, "ps", "Palestinian Territories" },
+ { 164, "pa", "Panama" },
+ { 165, "pg", "Papua New Guinea" },
+ { 166, "py", "Paraguay" },
+ { 167, "pe", "Peru" },
+ { 168, "ph", "Philippines" },
+ { 169, "pn", "Pitcairn" },
+ { 170, "pl", "Poland" },
+ { 171, "pt", "Portugal" },
+ { 172, "pr", "Puerto Rico" },
+ { 173, "qa", "Qatar" },
+ { 174, "re", "Reunion" },
+ { 175, "ro", "Romania" },
+ { 176, "ru", "Russia" },
+ { 177, "rw", "Rwanda" },
+ { 178, "bl", "Saint Barthelemy" },
+ { 179, "sh", "Saint Helena" },
+ { 180, "mf", "Saint Martin" },
+ { 181, "pm", "Saint Pierre and Miquelon" },
+ { 182, "sm", "San Marino" },
+ { 183, "st", "Sao Tome and Principe" },
+ { 184, "sa", "Saudi Arabia" },
+ { 185, "sn", "Senegal" },
+ { 186, "rs", "Serbia" },
+ { 187, "sc", "Seychelles" },
+ { 188, "sg", "Singapore" },
+ { 189, "sx", "Sint Maarten" },
+ { 190, "sk", "Slovakia" },
+ { 191, "sb", "Solomon Islands" },
+ { 192, "so", "Somalia" },
+ { 193, "za", "South Africa" },
+ { 194, "gs", "South Georgia and South Sandwich Islands" },
+ { 195, "kr", "South Korea" },
+ { 196, "ss", "South Sudan" },
+ { 197, "sd", "Sudan" },
+ { 198, "sr", "Suriname" },
+ { 199, "lc", "Saint Lucia" },
+ { 200, "ws", "Samoa" },
+ { 201, "sj", "Svalbard and Jan Mayen" },
+ { 202, "se", "Sweden" },
+ { 203, "ch", "Switzerland" },
+ { 204, "sz", "Eswatini" },
+ { 205, "sy", "Syria" },
+ { 206, "tw", "Taiwan" },
+ { 207, "tj", "Tajikistan" },
+ { 208, "tz", "Tanzania" },
+ { 209, "th", "Thailand" },
+ { 210, "tl", "Timor-Leste" },
+ { 211, "tg", "Togo" },
+ { 212, "to", "Tonga" },
+ { 213, "tt", "Trinidad and Tobago" },
+ { 214, "ta", "Tristan da Cunha" },
+ { 215, "tn", "Tunisia" },
+ { 216, "tm", "Turkmenistan" },
+ { 217, "tc", "Turks and Caicos Islands" },
+ { 218, "tv", "Tuvalu" },
+ { 219, "ug", "Uganda" },
+ { 220, "ua", "Ukraine" },
+ { 221, "ae", "United Arab Emirates" },
+ { 222, "gb", "United Kingdom" },
+ { 223, "um", "United States Outlying Islands" },
+ { 224, "us", "United States" },
+ { 225, "uy", "Uruguay" },
+ { 226, "vi", "United States Virgin Islands" },
+ { 227, "vu", "Vanuatu" },
+ { 228, "va", "Vatican City" },
+ { 229, "ve", "Venezuela" },
+ { 230, "vn", "Vietnam" },
+ { 231, "wf", "Wallis and Futuna" },
+ { 232, "eh", "Western Sahara" },
+ { 233, "vg", "British Virgin Islands" },
+ { 234, "uz", "Uzbekistan" },
+ { 235, "ye", "Yemen" },
+ { 236, "zm", "Zambia" },
+ { 238, "ic", "Canary Islands" },
+ { 241, "cp", "Clipperton Island" },
+ { 242, "ma", "Morocco" },
+ { 243, "sl", "Sierra Leone" },
+ { 244, "kn", "Saint Kitts and Nevis" },
+ { 245, "vc", "Saint Vincent and Grenadines" },
+ { 246, "lb", "Lebanon" },
+ { 247, "ac", "Ascension Island" },
+ { 248, "ax", "Aland Islands" },
+ { 249, "dg", "Diego Garcia" },
+ { 250, "ea", "Ceuta and Melilla" },
+ { 251, "il", "Israel" },
+ { 252, "jo", "Jordan" },
+ { 253, "tr", "Turkey" },
+ { 254, "lk", "Sri Lanka" },
+ { 255, "bq", "Caribbean Netherlands" },
+ { 256, "si", "Slovenia" },
+ { 257, "kw", "Kuwait" },
+ { 258, "fk", "Falkland Islands" },
+ { 259, "pw", "Palau" },
+ { 260, "zw", "Zimbabwe" },
+ { 261, "eu", "European Union" },
+};
+static constexpr int kJamulusCountryMapSize = static_cast ( sizeof ( kJamulusCountryMap ) / sizeof ( kJamulusCountryMap[0] ) );
diff --git a/debug_dependencies.ps1 b/debug_dependencies.ps1
new file mode 100644
index 0000000000..483da40fd7
--- /dev/null
+++ b/debug_dependencies.ps1
@@ -0,0 +1,48 @@
+
+$code = @"
+using System;
+using System.Runtime.InteropServices;
+using System.Diagnostics;
+using System.Collections.Generic;
+
+public class DllLoader {
+ [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
+ public static extern IntPtr LoadLibrary(string lpFileName);
+
+ [DllImport("kernel32.dll", SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ public static extern bool FreeLibrary(IntPtr hModule);
+}
+"@
+Add-Type -TypeDefinition $code
+
+$vstPath = "build\plugin\jamulus_vst3_artefacts\Release\VST3\JamulusVST3.vst3\Contents\x86_64-win\JamulusVST3.vst3"
+$vstPathFull = [System.IO.Path]::GetFullPath($vstPath)
+
+Write-Host "Attempting to load: $vstPathFull"
+
+$handle = [DllLoader]::LoadLibrary($vstPathFull)
+
+if ($handle -eq [IntPtr]::Zero) {
+ Write-Host "Failed to load library. Error code: $((New-Object System.ComponentModel.Win32Exception([System.Runtime.InteropServices.Marshal]::GetLastWin32Error())).Message)"
+}
+else {
+ Write-Host "Library loaded successfully."
+
+ $process = [System.Diagnostics.Process]::GetCurrentProcess()
+ $modules = $process.Modules
+
+ Write-Host "`nLoaded Modules (excluding C:\Windows):"
+ foreach ($module in $modules) {
+ try {
+ if ($module.FileName -and -not $module.FileName.StartsWith("C:\Windows", [System.StringComparison]::OrdinalIgnoreCase)) {
+ Write-Host $module.FileName
+ }
+ }
+ catch {
+ # Ignore access denied etc
+ }
+ }
+
+ [DllLoader]::FreeLibrary($handle) | Out-Null
+}
diff --git a/docs/JAMULUS_PROTOCOL.md b/docs/JAMULUS_PROTOCOL.md
deleted file mode 100644
index 8af9df19c3..0000000000
--- a/docs/JAMULUS_PROTOCOL.md
+++ /dev/null
@@ -1,178 +0,0 @@
-# The Jamulus Audio Protocol
-
-Jamulus uses connectionless UDP packets to communicate between the client and server, and additionally for directory server registration. The `src/protocol.cpp` file contains much of the details of the packets themselves, whereas this document is intended to form a higher-level view of the protocol interactions.
-Some of the messages need to be acknowledged, some do not. If a message ID is less than 1000, the message must be acknowledged in under `SEND_MESS_TIMEOUT_MS` ms.
-
-All of this information can be discovered from reading the code, but hopefully is quicker to digest when available in one location. There is a wireshark dissector available too, [here](https://github.com/softins/jamulus-wireshark), if you would like to inspect the packet flow.
-
----
-
-## Overview
-
-The message packet structure is:
-
-```
-+-------------+------------+------------+------------------+--------------+-------------+
-| 2 bytes TAG | 2 bytes ID | 1 byte SEQ | 2 bytes data LEN | n bytes DATA | 2 bytes CRC |
-+-------------+------------+------------+------------------+--------------+-------------+
-```
-
-The TAG bytes are zero bytes.
-The ID provides the message type.
-The SEQ is a wrapping sequence number for the message
-LENgth of the data preceeds the data and is followed by a CRC for the packet.
-
-Data is sent little-endian, i.e. not network byte-order.
-
-Where a message will not fit into the maximum packet size before fragmentation, a split message container is used.
-
-```
-+------------+--------------+----------------+--------------+
-| 2 bytes ID | 1 byte FRAGS | 1 byte FRAG_ID | n bytes DATA |
-+------------+--------------+----------------+--------------+
-```
-
-The ID is the message type sent in fragments
-FRAGS is the total number of fragments
-FRAG_ID is the sequence number of the data in this fragment
-DATA is the fragment data to be re-assembled
-
-This forms the data component of the packet above.
-
-## Client Session with a Server
-
-As the protocol is connectionless, the message flow at session start up can happen out of order.
-When a client starts a session with a server, it sends valid audio packets to the server port, to which the server will respond with the audio mix for that client.
-
-The server on a new client connection will:
-
-- Tell the client connection its ID, with a `CLIENT_ID (32, 0x2000)` message.
-- Reset the connected client list with a `CONN_CLIENTS_LIST (24, 0x1800)` message.
-- Determine if the client supports split messages, with a `REQ_SPLIT_MESSAGE_SUPPORT (34, 0x2200)` message.
-- Request the details of the audio packets from the client with a `REQ_NETW_TRANSPORT_PROPS (21, 0x1500)` message,
-- Request the number of jitter buffer value to use, with a `REQ_JITT_BUF_SIZE (11, 0x0B00)` message.
-- Request the details of the channel info, with a `REQ_CHANNELS_INFOS (23, 0x1700)` message.
-- Send the version and OS of the server, with a `VERSION_AND_OS (29, 0x1d00)` message.
-
-This is defined in `CServer::OnNewConnection()`
-
-The client on a new connection will:
-
-- Send its channel info with a `CHANNELS_INFO (25, 0x1900)` message
-- Request the list of connected clients with a `REQ_CONN_CLIENT_LIST (16, 0x1000)` message
-- Set the server-side jitter buffer value with a `JITT_BUF_SIZE (10, 0x0a00)` message
-
-This is defined in `CClient::OnNewConnection()`
-
-At the end of the session, the client calls the `CLM_DISCONNECTION (1010, 0xf203)` message, until the server stops streaming audio to it.
-
-A typical flow would be:
-
-```
- Client Server
-
- AUDIO --------------------------------->
- <------------------------------------ CLIENT_ID (32, 0x2000)
- ACK(CLIENT_ID) ------------------------>
-
- <------------------------------------ CONN_CLIENTS_LIST (24, 0x1800) (Reset to zero)
- ACK(CONN_CLIENTS_LIST) ---------------->
-
- <------------------------------------ REQ_SPLIT_MESSAGE_SUPPORT (34, 0x2200)
- SPLIT_MESS_SUPPORTED (35, 0x2300) --------->
- ACK(REQ_SPLIT_MESSAGE_SUPPORT) -------->
- <------------------------------------ ACK(SPLIT_MESS_SUPPORTED)
-
- <------------------------------------ REQ_NETW_TRANSPORT_PROPS (21, 0x1500)
- NETW_TRANSPORT_PROPS (20, 0x1400) --------->
- ACK(REQ_NETW_TRANSPORT_PROPS) --------->
- <------------------------------------ ACK(NETW_TRANSPORT_PROPS)
-
- <------------------------------------ REQ_JITT_BUF_SIZE (11, 0x0B00)
- JITT_BUF_SIZE (10, 0x0a00) ---------------->
- ACK(REQ_JITT_BUF_SIZE) ---------------->
- <------------------------------------ ACK(JITT_BUF_SIZE)
-
- <------------------------------------ REQ_CHANNELS_INFOS (23, 0x1700)
- CHANNEL_INFOS (25, 0x1900) ---------------->
- ACK(REQ_CHANNELS_INFOS) --------------->
- <------------------------------------ ACK(CHANNEL_INFOS)
-
-(Optional welcome message)
- <------------------------------------ CHAT_TEXT (18, 0x1200)
- ACK(CHAT_TEXT) ------------------------>
-
- <------------------------------------ VERSION_AND_OS (29, 0x1d00)
- ACK(VERSION_AND_OS) ------------------->
-
- CHANNEL_INFOS (25, 0x1900) ---------------->
- <------------------------------------ ACK(CHANNEL_INFOS)
-
- <------------------------------------ RECORDER_STATE (33, 0x2100)
- ACK(RECORDER_STATE) ------------------->
-
-
- REQ_CONNECTED_CLIENTS_LIST (16, 0x1000) ---->
- <------------------------------------ ACK(REQ_CONNECTED_CLIENTS_LIST)
-
- REQ_CHANNEL_LEVEL_LIST (28, 0x1c00) -------->
-
- JITT_BUF_SIZE (10, 0x0a00) ---------------->
- <------------------------------------ JITT_BUF_SIZE (10, 0x0a00)
- <------------------------------------ ACK(JITT_BUF_SIZE)
- ACK(JITT_BUF_SIZE) -------------------->
-
- <------------------------------------ CONN_CLIENTS_LIST (24, 0x1800)
- ACK(CONN_CLIENTS_LIST) ---------------->
-
- NETW_TRANSPORT_PROPS (20, 0x1400) --------->
- <------------------------------------ CONN_CLIENTS_LIST (24, 0x1800)
- <------------------------------------ ACK(NETW_TRANSPORT_PROPS)
- ACK(CONN_CLIENTS_LIST) ---------------->
-```
-
-## General Streaming Messages
-
-During streaming, some control messages are used.
-Some typical messages could be:
-
-```
- Client Server
-
- <------------------------------------ CLM_CHANNEL_LEVEL_LIST (1015, 0xf703)
-
- CHANNEL_GAIN (13, 0x0d00) ----------------->
-
- CLM_PING_MS (1001, 0xe903) ------------------>
-
- <------------------------------------ ACK(CHANNEL_GAIN)
-
- <------------------------------------ CLM_PING_MS (1001, 0xe903)
-
- MUTE_STATE_CHANGED (31, 0x1f00) ----------->
- <------------------------------------ ACK(MUTE_STATE_CHANGED)
-
- NETW_TRANSPORT_PROPS (20, 0x1400) --------->
- <------------------------------------ ACK(NETW_TRANSPORT_PROPS) - Reset audio packet sequencing on change
-
- CHANNEL_PAN (30, 0x1e00) ------------------>
- <------------------------------------ ACK(CHANNEL_PAN)
-```
-
----
-
-## Audio Packet Structure
-
-The OPUS codec is used to compress the audio over the network and the packets are documented [here](https://datatracker.ietf.org/doc/html/rfc6716).
-
-Jamulus uses a custom OPUS encoder / decoder, giving some different frame sizes, but always uses a 48kHz sample rate. OPUS and OPUS64 codecs are the only supported options currently.
-
-The packet size will vary based on:
-
-- Stereo vs mono
-- Buffer size (64/128/256 samples)
-- Use of frame sequence number (from v3.6.0 onwards)
-
-These values are wrapped up into the `NETW_TRANSPORT_PROPS` messages, which the client sends to the server to tell it which values to use.
-
-Both client and server use a jitter buffer for received audio data to prevent audio drop-out. This is configurable.
diff --git a/docs/JSON-RPC.md b/docs/JSON-RPC.md
deleted file mode 100644
index c5f6aa37d0..0000000000
--- a/docs/JSON-RPC.md
+++ /dev/null
@@ -1,554 +0,0 @@
-
-# Jamulus JSON-RPC Server Documentation
-
-
-
-A JSON-RPC server can be added to both Jamulus client and Jamulus server to allow programmatic access.
-To add the JSON-RPC server, run Jamulus with the `--jsonrpcport --jsonrpcsecretfile /file/with/a/secret.txt` options.
-This will start a JSON-RPC server on the specified port on the localhost.
-
-The file referenced by `--jsonrpcsecretfile` must contain a single line with a freely chosen string with at least 16 characters.
-It can be generated like this:
-```
-$ openssl rand -base64 10 > /file/with/a/secret.txt
-```
-
-The JSON-RPC server defaults to listening on the local loopback network interface (127.0.0.1).
-This can be optionally changed by using the `--jsonrpcbindip ` command line option.
-
-
-## Wire protocol
-
-The JSON-RPC server is based on the [JSON-RPC 2.0](https://www.jsonrpc.org/specification) protocol, using [streaming newline-delimited JSON over TCP](https://clue.engineering/2018/introducing-reactphp-ndjson) as the transport. There are three main types of messages being exchanged:
-
-- A **request** from the consumer to Jamulus.
-- A **response** from Jamulus to the consumer.
-- A **notification** from Jamulus to the consumer.
-
-## Connect to a JSON-RPC server
-
-On Linux, you can connect to a JSON-RPC server using the `nc` CLI tool.
-
-On Windows, [you can download](https://nmap.org/ncat/) and use the `ncat` CLI tool.
-
-This snippet uses [jayson](https://www.npmjs.com/package/jayson) to connect using Node.js:
-
-```
-const jayson = require("jayson/promise");
-const client = new jayson.client.tcp({ host: "127.0.0.1", port: 22100 });
-
-client.request('jamulusserver/getServerInfo', {})
-.then(console.log)
-.catch(console.error)
-```
-
-## Example
-
-After opening a TCP connection to the JSON-RPC server, the connection must be authenticated:
-
-```json
-{"id":1,"jsonrpc":"2.0","method":"jamulus/apiAuth","params":{"secret": "...the secret from the file in --jsonrpcsecretfile..."}}
-```
-
-Request must be sent as a single line of JSON-encoded data, followed by a newline character. Jamulus will send back a **response** in the same manner:
-
-```json
-{"id":1,"jsonrpc":"2.0","result":"ok"}
-```
-After successful authentication, the following **request** can be sent:
-
-```json
-{"id":2,"jsonrpc":"2.0","method":"jamulus/getMode","params":{}}
-```
-
-The request must be sent as a single line of JSON-encoded data, followed by a newline character. Jamulus will send back a **response** in the same manner:
-
-```json
-{"id":2,"jsonrpc":"2.0","result":{"mode":"client"}}
-```
-
-Jamulus will also send **notifications** to the consumer:
-
-```json
-{"jsonrpc":"2.0","method":"jamulusclient/chatTextReceived","params":{"text":"(01:23:45 AM) user test"}}
-```
-
-## Method reference
-### jamulus/apiAuth
-
-Authenticates the connection which is a requirement for calling further methods.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.secret | string | The preshared secret key. |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | "ok" on success |
-
-
-### jamulus/getMode
-
-Returns the current mode, i.e. whether Jamulus is running as a server or client.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result.mode | string | The current mode (server or client). |
-
-
-### jamulus/getVersion
-
-Returns Jamulus version.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result.version | string | The Jamulus version. |
-
-
-### jamulusclient/getChannelInfo
-
-Returns the client's profile information.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result.id | number | The channel ID. |
-| result.name | string | The musician’s name. |
-| result.skillLevel | string | The musician’s skill level (beginner, intermediate, expert, or null). |
-| result.countryId | number | The musician’s country ID (see QLocale::Country). |
-| result.country | string | The musician’s country. |
-| result.city | string | The musician’s city. |
-| result.instrumentId | number | The musician’s instrument ID (see CInstPictures::GetTable). |
-| result.instrument | string | The musician’s instrument. |
-| result.skillLevel | string | Your skill level (beginner, intermediate, expert, or null). |
-
-
-### jamulusclient/getClientInfo
-
-Returns the client information.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result.connected | boolean | Whether the client is connected to the server. |
-
-
-### jamulusclient/getClientList
-
-Returns the client list.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result.clients | array | The client list. See jamulusclient/clientListReceived for the format. |
-
-
-### jamulusclient/pollServerList
-
-Request list of servers in a directory.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.directory | string | Socket address of directory to query. Example: anygenre1.jamulus.io:22124 |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | "ok" or "error" if bad arguments. |
-
-
-### jamulusclient/sendChatText
-
-Sends a chat text message.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.chatText | string | The chat text message. |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | Always "ok". |
-
-
-### jamulusclient/setName
-
-Sets your name.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.name | string | The new name. |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | Always "ok". |
-
-
-### jamulusclient/setSkillLevel
-
-Sets your skill level.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.skillLevel | string | The new skill level (beginner, intermediate, expert, or null). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | Always "ok". |
-
-
-### jamulusserver/getClients
-
-Returns the list of connected clients along with details about them.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result.connections | number | The number of active connections. |
-| result.clients | array | The list of connected clients. |
-| result.clients[*].id | number | The client’s channel id. |
-| result.clients[*].address | string | The client’s address (ip:port). |
-| result.clients[*].name | string | The client’s name. |
-| result.clients[*].jitterBufferSize | number | The client’s jitter buffer size. |
-| result.clients[*].channels | number | The number of audio channels of the client. |
-| result.clients[*].instrumentCode | number | The id of the instrument for this channel. |
-| result.clients[*].city | string | The city name provided by the user for this channel. |
-| result.clients[*].countryName | number | The text name of the country specified by the user for this channel (see QLocale::Country). |
-| result.clients[*].skillLevelCode | number | The skill level id provided by the user for this channel. |
-
-
-### jamulusserver/getRecorderStatus
-
-Returns the recorder state.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result.initialised | boolean | True if the recorder is initialised. |
-| result.errorMessage | string | The recorder error message, if any. |
-| result.enabled | boolean | True if the recorder is enabled. |
-| result.recordingDirectory | string | The recorder recording directory. |
-
-
-### jamulusserver/getServerProfile
-
-Returns the server registration profile and status.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result.name | string | The server name. |
-| result.city | string | The server city. |
-| result.countryId | number | The server country ID (see QLocale::Country). |
-| result.welcomeMessage | string | The server welcome message. |
-| result.directoryType | string | The directory type as a string (see EDirectoryType and SerializeDirectoryType). |
-| result.directoryAddress | string | The string used to look up the directory address (only assume valid if directoryType is "custom" and registrationStatus is "registered"). |
-| result.directory | string | The directory with which this server requested registration, or blank if none. |
-| result.registrationStatus | string | The server registration status as string (see ESvrRegStatus and SerializeRegistrationStatus). |
-
-
-### jamulusserver/restartRecording
-
-Restarts the recording into a new directory.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | Always "acknowledged". To check if the recording was restarted or if there is any error, call `jamulusserver/getRecorderStatus` again. |
-
-
-### jamulusserver/setDirectory
-
-Set the directory type and, for custom, the directory address.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.directoryType | string | The directory type as a string (see EDirectoryType and DeserializeDirectoryType). |
-| [params.directoryAddress] | string | (optional) The directory address, required if `directoryType` is "custom". |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | Always "ok". |
-
-
-### jamulusserver/setRecordingDirectory
-
-Sets the server recording directory.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.recordingDirectory | string | The new recording directory. |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | Always "acknowledged". To check if the directory was changed, call `jamulusserver/getRecorderStatus` again. |
-
-
-### jamulusserver/setServerName
-
-Sets the server name.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.serverName | string | The new server name. |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | Always "ok". |
-
-
-### jamulusserver/setWelcomeMessage
-
-Sets the server welcome message.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.welcomeMessage | string | The new welcome message. |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | Always "ok". |
-
-
-### jamulusserver/startRecording
-
-Starts the server recording.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | Always "acknowledged". To check if the recording was enabled, call `jamulusserver/getRecorderStatus` again. |
-
-
-### jamulusserver/stopRecording
-
-Stops the server recording.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-Results:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| result | string | Always "acknowledged". To check if the recording was disabled, call `jamulusserver/getRecorderStatus` again. |
-
-
-## Notification reference
-### jamulusclient/channelLevelListReceived
-
-Emitted when the channel level list is received.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.channelLevelList | array | The channel level list. Each item corresponds to the respective client retrieved from the jamulusclient/clientListReceived notification. |
-| params.channelLevelList[*] | number | The channel level, an integer between 0 and 9. |
-
-
-### jamulusclient/chatTextReceived
-
-Emitted when a chat text is received.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.chatText | string | The chat text. |
-
-
-### jamulusclient/clientListReceived
-
-Emitted when the client list is received.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.clients | array | The client list. |
-| params.clients[*].id | number | The channel ID. |
-| params.clients[*].name | string | The musician’s name. |
-| params.clients[*].skillLevel | string | The musician’s skill level (beginner, intermediate, expert, or null). |
-| params.clients[*].countryId | number | The musician’s country ID (see QLocale::Country). |
-| params.clients[*].country | string | The musician’s country. |
-| params.clients[*].city | string | The musician’s city. |
-| params.clients[*].instrumentId | number | The musician’s instrument ID (see CInstPictures::GetTable). |
-| params.clients[*].instrument | string | The musician’s instrument. |
-
-
-### jamulusclient/connected
-
-Emitted when the client is connected to the server.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.id | number | The channel ID assigned to the client. |
-
-
-### jamulusclient/disconnected
-
-Emitted when the client is disconnected from the server.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params | object | No parameters (empty object). |
-
-
-### jamulusclient/recorderState
-
-Emitted when the client is connected to a server whose recorder state changes.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.state | number | The recorder state. |
-
-
-### jamulusclient/serverInfoReceived
-
-Emitted when a server info is received.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.address | string | The server socket address. |
-| params.pingtime | number | The round-trip ping time, in milliseconds. |
-| params.numClients | number | The number of clients connected to the server. |
-
-
-### jamulusclient/serverListReceived
-
-Emitted when the server list is received.
-
-Parameters:
-
-| Name | Type | Description |
-| --- | --- | --- |
-| params.servers | array | The server list. |
-| params.servers[*].address | string | Socket address (ip_address:port). |
-| params.servers[*].name | string | Server name. |
-| params.servers[*].countryId | number | Server country ID (see QLocale::Country). |
-| params.servers[*].country | string | Server country. |
-| params.servers[*].city | string | Server city. |
-
-
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 97a876a90d..0000000000
--- a/docs/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Documentation
-
-Mostly documentation can be found on the Jamulus Website: https://jamulus.io
-
-## Project related documentation
-
-1. Release process: https://jamulus.io/contribute/Release-Process
-2. Style and tone guide: https://jamulus.io/contribute/Style-and-Tone
-3. Administration (i.e. how we work) of the Jamulus project: https://jamulus.io/contribute/Administration
diff --git a/docs/TRANSLATING.md b/docs/TRANSLATING.md
deleted file mode 100644
index 404b1aa66e..0000000000
--- a/docs/TRANSLATING.md
+++ /dev/null
@@ -1,299 +0,0 @@
-# Guide for Translators
-
-This guide is written to provide instructions from scratch for contributing to the translation of the Jamulus application to other languages.
-
-Jamulus is mostly developed on GitHub. However, translators are not required to use GitHub, as Jamulus is translated on [Hosted Weblate](https://hosted.weblate.org/projects/jamulus/).
-
-You have two options to translate Jamulus:
-1. Using [Weblate](https://hosted.weblate.org/projects/jamulus/jamulus-app/) (online translation, easier and more feature rich. However, as of 10/2022, it will show your e-mail address on GitHub.) (recommended)
-2. Using Git directly (more advanced, but you can test your changes on your machine locally)
-
----
-
-## Introduction (using Weblate)
-
-Translators should (if possible) have a GitHub account to communicate, as described in the **1. Setting up** paragraph in the Git section below. This account should be used to [create an account on Hosted Weblate](https://hosted.weblate.org/accounts/register/). Ensure that the Jamulus main developers are aware of your intentions to translate to your chosen language beforehand (e.g. by [creating or commenting on a respective issue during the release process for your language on GitHub](https://github.com/jamulussoftware/jamulus/issues)). This ensures you will have proper access and that support is provided. Have a look at the [adding a new language (checklist)](#adding-a-new-language-checklist) for what to expect.
-
-## Using Weblate for translation
-
-After logging into Hosted Weblate, visit the [Jamulus project page on Hosted Weblate](https://hosted.weblate.org/projects/jamulus/). There are several components dedicated to the Jamulus project. If you want to translate e.g. the main Jamulus program or the Windows installer, click on "[Jamulus app](https://hosted.weblate.org/projects/jamulus/jamulus-app/)" or "[Windows Installer](https://hosted.weblate.org/projects/jamulus/windows-installer/)" and choose your language. After that, translate the strings displayed on the Website. Weblate will open or update a pull request on the Jamulus repo within the next few hours, where your translation will be reviewed.
-
-More info is provided in the [Weblate documentation](https://docs.weblate.org/).
-
----
-
-## Introduction (using Git)
-
-For completeness, this document describes the use of both GitHub (using Git), and of _Qt Linguist_.
-
-The translator must be able to carry out the following steps, each of which are explained below:
-
-- Create their own linked copy ("repository" or "repo") of Jamulus in GitHub. This is called Forking.
-- Copy ("clone") their own repository to their computer, using either:
- - Command line `git`, or
- - [GitHub Desktop](https://docs.github.com/en/desktop)
-- Update their own local repo from the upstream main branch.
-- Create a local branch to contain the update.
-- Use the Qt Linguist tool to edit the appropriate translation (`.ts`) file.
-- Commit the updated `.ts` file to the branch their own local git repo.
-- Push the branch from their local repo to their own repo on GitHub.
-- Open a pull request (PR) the developers can use to merge the updated file into the upstream repo.
-
-This guide contains two main parts:
-
-1. Instructions for getting set up, which only needs to be done once.
-
-2. The workflow for updating and contributing translations as a part of the preparation for a release of Jamulus.
-
----
-
-## 1. Setting up
-
-### Visit github.com
-
-First of all, visit the [GitHub website](https://github.com)
-
-If you don't yet have a GitHub account, click on **Sign up** to go to the Create Your Account page. Enter:
-
-- Your chosen username. This is a simple word containing letters and, optionally, numbers, and will identify you in the GitHub world. It is not an email address. This name is represented in the examples below as `yourusername`.
-- Your email address. This will be used by GitHub to send you notifications by email, and to identify commits made by you.
-- Your chosen password. Do not use the same password as for any other website.
-- Solve the puzzle to prove you are human and click **Create account**.
-
-If you do have a GitHub account, and are not yet logged in, click on **Sign in**, and enter your username and password, then **Sign in**.
-
-Go to the [Jamulus repository](https://github.com/jamulussoftware/jamulus).
-
-Create your own copy ("fork") of the Jamulus repository by clicking the **Fork** button at the top right of the page.
-
-If your GitHub account is also part of an organisation, GitHub will ask you where to create the fork. Choose your personal GitHub account.
-
-It will then display the message "Forking jamulussoftware/jamulus", and when finished will display the home page of your own Jamulus repo (**yourusername/jamulus**).
-
-### Command line git tools
-
-Linux and Mac machines come with command-line Git tools ready-installed or easily available.
-
-- On Mac, the `git` command is available in `/usr/bin/git`, as part of the Xcode package, or can be installed separately (see below).
-- On Linux, it may be necessary to install the `git` package using one of these commands:
- - On RedHat or CentOS, `yum install git` or `dnf install git`
- - On Debian or Ubuntu: `apt install git`
-- On Windows, Git can be obtained from [Git for Windows](https://git-for-windows.github.io/)
-
-More information about installing Git on various systems can be found [here](https://www.atlassian.com/git/tutorials/install-git)
-
-Make a local copy of your Jamulus repo by using `git clone`:
-
-- At the shell command-line, navigate to the directory that will be the parent of your `jamulus` development directory.
-- Give one of the following commands:
- - For ssh access: `git clone git@github.com:yourusername/jamulus.git`
- - For https access: `git clone https://github.com/yourusername/jamulus.git`
-
-This will create a `jamulus` directory. Change to that directory.
-
-- Add the upstream repository: `git remote add upstream https://github.com/jamulussoftware/jamulus.git`
-- Check the remotes using `git remote -v`. The output should look like this:
- ```
- origin git@github.com:yourusername/jamulus.git (fetch)
- origin git@github.com:yourusername/jamulus.git (push)
- upstream https://github.com/jamulussoftware/jamulus.git (fetch)
- upstream https://github.com/jamulussoftware/jamulus.git (push)
- ```
- or this:
- ```
- origin https://github.com/yourusername/jamulus.git (fetch)
- origin https://github.com/yourusername/jamulus.git (push)
- upstream https://github.com/jamulussoftware/jamulus.git (fetch)
- upstream https://github.com/jamulussoftware/jamulus.git (push)
- ```
-
-### GitHub Desktop
-
-[GitHub Desktop](https://docs.github.com/en/desktop) is available for macOS 10.10 or later, and Windows 7 64-bit or later. It is not available for 32-bit Windows.
-
-To install GitHub Desktop, visit the [download page](https://desktop.github.com) and follow the link for the appropriate Operating System.
-
-When downloading for Mac, the instructions suggest opening `GitHubDesktop.zip`, but in fact, what was downloaded was `GitHubDesktop.app`. This should just be moved from `Downloads` to `Applications`.
-
-Run GitHub Desktop, and do the following steps:
-
-- On the Welcome Screen, click on **Sign in to github.com**
-- Sign in by following the instructions. These may vary depending on whether you have logged into GitHub via a web browser already. If necessary, click on **Authorize Desktop**.
-- Confirm access by entering your GitHub password.
-- for Mac, if the browser requests to open "GitHub Desktop.app", click **Allow**.
-- In Configure Git, enter your name and email address. These will be used to identify commits you make to Git. Click **Continue**.
-- Agree or decline to submit periodic usage stats, and click **Finish**.
-- Either:
- - Select **Clone a Repository from the Internet** and enter `yourusername/jamulus`, or
- - Select your own fork of Jamulus from the list (`yourusername/jamulus`) and click the **Clone** button.
-- Select the Local Path where the project should be stored, and click **Clone**.
-- It will display the page **Cloning jamulus** with progress indication.
-- On completion of cloning, it will ask "How are you planning to use this fork?". Answer "To contribute to the parent project".
-
-### Qt Linguist
-
-Qt Linguist is a part of the Qt development suite, and may either be installed via your Operating System's packaging manager,
-or by downloading from the [Qt Open Source download page](https://www.qt.io/download-open-source). In the latter case you
-will need to create an account on the Qt website.
-
-Under Linux
-
-- On RedHat or CentOS: `yum install qt5-linguist` or `dnf install qt5-linguist`
-- On Debian or Ubuntu: `apt install qttools5-dev-tools`
-
-Instructions for use are in the [Qt Linguist Manual](https://doc.qt.io/qt-5/qtlinguist-index.html)
-
----
-
-## 2. Doing a translation
-
-### Get the most up-to-date files and set up a new branch
-
-#### With git command line tools
-
-The first step is to get the local repo up to date with the upstream main:
-
-```
-cd projectdir/jamulus
-git fetch upstream
-```
-
-This fetches information about the current state of the upstream repo. It is now necessary to apply any upstream changes to the local repo.
-As the user will not be updating the `main` branch themselves, `git rebase` can be used to fast-forward to the current state:
-
-```
-git checkout main
-git rebase upstream/main
-git push
-```
-
-Finally, create a new branch for the changes that will be done (do not just do them on `main`).
-The actual name of the branch is not critical, since the branch will be deleted after being merged,
-but it's worth choosing a meaningful name:
-
-```
-git checkout -b translate-r3_7_0-german
-```
-
-(The branch name is chosen by the user; the above name translate-r3_7_0-german is an example for the German translation of V3.7.0)
-
-The branch will be used later as the source of a pull request.
-
-#### With GitHub Desktop
-
-Select the current repository as `jamulus`, and the current branch as `main`.
-
-Click on "Fetch origin" to get fully up to date with upstream.
-
-Drop down the "Current Branch" menu and click on the **New Branch** button. Give the branch a meaningful name such as `translate-r3_7_0-german` and click **Create Branch**.
-
-Do not click on **Publish branch** just yet.
-
-### Work on the translation file
-
-Open Qt Linguist, and navigate to the directory `src/translation` within your project directory.
-
-In this directory are translation source files for each language, each with a `.ts` suffix.
-
-Open the `.ts` file for the language being worked on.
-
-Each context in the left-hand column represents a source file or graphical form containing translatable words and phrases ("strings"). The icon beside each shows a green tick if there is nothing further to be done,
-a yellow tick if a translation needs attention, and a question mark if there are untranslated strings.
-
-After clicking on a Context, the list of strings needing translation is shown, with a green tick beside the ones that have been done. The right-hand pane will show either the source code or the form,
-so that the usage can be checked, in case this aids the translation.
-
-Strings with a grey tick can be ignored. They are old strings that used to be used but are no longer. They are retained for reference in case they should be used again in the future.
-
-Again, strings with a question mark require translation.
-
-After some or all of the required strings have been translated, the file can be saved.
-
-### Submit the updated translation as a pull request (PR)
-
-Once all translations have been done, the branch containing the changes must be commited to your own repo, pushed to GitHub (`origin`) and then a pull request raised to the upstream repo.
-
-#### With git command line tools
-
-First, check the current branch with `git status`, to make sure it is correct, and then do a commit,
-with a commit message describing the change, for example:
-
-```
-git commit -am 'Update German translations for v3.7.0'
-```
-
-Then do a `git push`.
-
-It will probably tell you to set the upstream repository for tracking, and conveniently gives the command for copying and pasting:
-
-```
-git push --set-upstream origin translate-r3_7_0-german
-```
-
-Finally, go to the GitHub website where it will most likely offer a banner saying there is a recent commit and offering to open a pull request. Do so.
-
-#### With GitHub Desktop
-
-Select the current repository as `jamulus`, and the branch that was created above, such as `translate-r3_7_0-german`.
-
-The changed file(s) should be listed in the left-hand column as `src/translation/translation_xx_YY.ts`. When the file is selected, the differences will be displayed in the main panel.
-
-Add a simple commit message in the first box below the file list, (e.g. change "Update filename"
-to something like "Update German translations for v3.7.0"), and add any extra description in the Description box (optional, probably not required).
-
-Commit the changes to the local git repo by clicking on **Commit to **.
-
-Click on **Publish branch** or **Push origin**. This will push the branch to your own repo on GitHub. (It will say **Publish branch** for a new branch, or **Push origin** if the branch has already been published).
-
-There will now be a section offering **Create pull request**. Click on that to create the PR to the upstream repository.
-
-#### Updating a PR/fixing conflicts
-
-Other contributors may have edited your files after you began your work, which can cause conflicts. If GitHub or git tells you about conflicts, or if you are requested to [rebase](https://teamairship.com/update-outdated-branch-without-creating-merge-commit/) your work, do so as follows:
-
-```shell
-git remote add upstream git@github.com:jamulussoftware/jamulus ;# add the main repo as upstream remote if you didn’t already as mentioned above
-git fetch upstream ; # Get the latest changes from the main upstream repo you added before (if needed)
-git checkout ;# switch to (= checkout) the branch you want to rebase
-git rebase upstream/main ;# replay (=rebase) your changes onto the latest code (and fix conflicts if needed)
-git rebase --continue # to continue the rebasing progress after having fixed the conflicts
-git push --force # Push the changes to your repo. Be aware that this will overwrite your remote branch!
-```
-
----
-
-## Adding a new language (checklist)
-
-The following section describes how to add a new language and what to do or wait for.
-Please open an issue on GitHub and introduce yourself first, even if you intend to add the translation files yourself.
-
-After having opened an issue on GitHub:
-1. Fork the Jamulus repository as described above, then install Qt on your machine (See [COMPILING.md](../COMPILING.md)). (You will need `lupdate` later on.)
-2. Create a branch based on the `main` branch: Locally navigate to the folder you cloned the repo to (with `cd /path/to/jamulus/repo`) and type `git checkout -b "translate-add-xx_YY"` (where xx_YY is the language code of the new language).
-3. Open Jamulus.pro in an editor such as `nano`: `nano Jamulus.pro` and add your language file (which will be created later) in alphabetical order to the `TRANSLATIONS` variable. The format should match the other present languages.
-4. Save and close Jamulus.pro.
-5. Now move back to the repository root and run `lupdate Jamulus.pro`. This will create a new language file `src/translation/translation_xx_YY.ts` for your new language.
-6. If the source files have changed since the other language `.ts` files were last updated, then as well as creating the new language file, `lupdate` above will create updates to all the existing language files. You can check if this has happened with `git status` and look for files flagged as "modified". You don't want to update them all in your pull request, so you need to undo the changes to the existing files. The easiest way to do this is with the command `git restore src`. This will not affect the new language file just created, as `git` doesn't yet know about it. It must be done _before_ adding the new language file to `git` in the next step below.
-7. Finally, add, commit and push the changes to your repository with the following commands: `git add Jamulus.pro src/translation/translation_xx_YY.ts`, `git commit -m "Translation: Add empty xx_YY translation"`, `git push`
-8. Open a pull request from your repo to the main repo with a brief description that you plan to translate Jamulus to your language
-9. Once the pull request is merged, Weblate should pick up the new language.
-
-### Adding a translation to the Windows installer
-
-To add a new translation to the Installer (while undertaking the above steps with Git) [as described above](#adding-a-new-language-checklist):
-
-1. Copy `src/translation/wininstaller/en_UK.nsi` to `src/translation/wininstaller/xx_YY.nsi`
-2. Add your language with [the correct language code](https://nsis.sourceforge.io/Examples/Modern%20UI/MultiLanguage.nsi) to `src/translation/installerlng.nsi` by following the file format
-3. Rename `${LANG_ENGLISH}` to the respective value you set in installerlng.nsi in xx_YY.nsi
-
-### After a language is added
-
-Start translating the new language using Hosted Weblate or Git (as described in the first section of this guide). If you plan to work on the translation for a longer period, please contact the administrators to be invited to the Jamulus organisation as well as translators channel on Discord or Matrix.
-
-Since every contributor can and should be added to the in-app contributor list, please remind us to add you to the `src/utils.h` file as translator or open a pull request yourself.
-
----
-
-## That's all
-
-Thank you for contributing!
diff --git a/COPYING b/installer/LICENSE.txt
similarity index 100%
rename from COPYING
rename to installer/LICENSE.txt
diff --git a/installer/jamulus_vst3.iss b/installer/jamulus_vst3.iss
new file mode 100644
index 0000000000..48f9f52c99
--- /dev/null
+++ b/installer/jamulus_vst3.iss
@@ -0,0 +1,163 @@
+#ifndef MyAppName
+ #define MyAppName "JamulusPlus"
+#endif
+#ifndef MyAppVersion
+ #define MyAppVersion "0.1.0"
+#endif
+#ifndef MyAppDisplayVersion
+ #define MyAppDisplayVersion MyAppVersion
+#endif
+#ifndef MyVersionInfoVersion
+ #define MyVersionInfoVersion MyAppVersion
+#endif
+#ifndef MyAppPublisher
+ #define MyAppPublisher "AndyMcProducer"
+#endif
+#ifndef MyAppURL
+ #define MyAppURL "https://github.com/AndyMcProducer/JamulusPlus"
+#endif
+#ifndef MyAppCopyright
+ #define MyAppCopyright "Copyright (C) 2026 AndyMcProducer"
+#endif
+#ifndef MyVst3Dir
+ #define MyVst3Dir "{commoncf64}\VST3"
+#endif
+#ifndef MyStandaloneDir
+ #define MyStandaloneDir "{autopf64}\JamulusPlus"
+#endif
+#ifndef MyVst3SourceDir
+ #define MyVst3SourceDir "..\dist\JamulusPlus.vst3"
+#endif
+#ifndef MyStandaloneSourceDir
+ #define MyStandaloneSourceDir "..\dist\JamulusPlus-Standalone"
+#endif
+#ifndef MyOutputDir
+ #define MyOutputDir "installer_output"
+#endif
+#ifndef MyOutputBaseFilename
+ #define MyOutputBaseFilename "JamulusPlus_Setup_{#MyAppVersion}"
+#endif
+
+[Setup]
+AppId={{0E0E7283-1D30-4D38-8EEA-6C69490B5B81}
+AppName={#MyAppName}
+AppVersion={#MyAppDisplayVersion}
+AppVerName={#MyAppName} {#MyAppDisplayVersion}
+AppPublisher={#MyAppPublisher}
+AppPublisherURL={#MyAppURL}
+AppSupportURL={#MyAppURL}
+AppUpdatesURL={#MyAppURL}
+AppCopyright={#MyAppCopyright}
+VersionInfoVersion={#MyVersionInfoVersion}
+VersionInfoCompany={#MyAppPublisher}
+VersionInfoDescription={#MyAppName} Installer
+VersionInfoCopyright={#MyAppCopyright}
+VersionInfoProductName={#MyAppName}
+VersionInfoProductVersion={#MyVersionInfoVersion}
+DefaultDirName={#MyStandaloneDir}
+DefaultGroupName={#MyAppName}
+PrivilegesRequired=admin
+PrivilegesRequiredOverridesAllowed=dialog
+ArchitecturesAllowed=x64compatible
+ArchitecturesInstallIn64BitMode=x64compatible
+OutputDir={#MyOutputDir}
+OutputBaseFilename={#MyOutputBaseFilename}
+SetupIconFile=compiler:SetupClassicIcon.ico
+UninstallDisplayIcon={app}\JamulusPlus.exe
+Compression=lzma2/max
+SolidCompression=no
+LZMANumBlockThreads=1
+WizardStyle=modern
+WizardSizePercent=120
+WizardResizable=yes
+UninstallDisplayName={#MyAppName}
+CreateUninstallRegKey=yes
+Uninstallable=yes
+MinVersion=10.0
+LicenseFile=LICENSE.txt
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+
+[Messages]
+WelcomeLabel1=Welcome to the {#MyAppName} Setup Wizard
+WelcomeLabel2=This will install the JamulusPlus standalone app and/or the VST3 plugin.%n%nStandalone location:%n{#MyStandaloneDir}%n%nVST3 location:%n{#MyVst3Dir}%n%nClick Next to continue.
+FinishedHeadingLabel=Installation Complete
+FinishedLabelNoIcons={#MyAppName} has been successfully installed.
+
+[Types]
+Name: "full"; Description: "Standalone app and VST3 plugin"
+Name: "plugin"; Description: "VST3 plugin only"
+Name: "standalone"; Description: "Standalone app only"
+Name: "custom"; Description: "Custom installation"; Flags: iscustom
+
+[Components]
+Name: "plugin"; Description: "JamulusPlus VST3 plugin"; Types: full plugin custom
+Name: "standalone"; Description: "JamulusPlus standalone app"; Types: full standalone custom
+
+[Tasks]
+Name: "desktopicon"; Description: "Create a desktop shortcut for the standalone app"; Components: standalone
+
+[Files]
+Source: "{#MyVst3SourceDir}\*"; DestDir: "{#MyVst3Dir}\JamulusPlus.vst3"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: plugin
+Source: "{#MyStandaloneSourceDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: standalone
+
+[Icons]
+Name: "{group}\JamulusPlus"; Filename: "{app}\JamulusPlus.exe"; Components: standalone
+Name: "{commondesktop}\JamulusPlus"; Filename: "{app}\JamulusPlus.exe"; Tasks: desktopicon; Components: standalone
+Name: "{group}\Uninstall JamulusPlus"; Filename: "{uninstallexe}"
+
+[Registry]
+Root: HKLM; Subkey: "Software\AndyMcProducer\JamulusPlus"; ValueType: string; ValueName: "StandaloneInstallPath"; ValueData: "{app}"; Flags: uninsdeletekey; Components: standalone
+Root: HKLM; Subkey: "Software\AndyMcProducer\JamulusPlus"; ValueType: string; ValueName: "VST3InstallPath"; ValueData: "{#MyVst3Dir}\JamulusPlus.vst3"; Flags: uninsdeletevalue; Components: plugin
+
+[Run]
+Filename: "{app}\JamulusPlus.exe"; Description: "Launch JamulusPlus"; Flags: postinstall nowait skipifsilent unchecked; Components: standalone
+
+[UninstallDelete]
+Type: filesandordirs; Name: "{#MyVst3Dir}\JamulusPlus.vst3"
+Type: filesandordirs; Name: "{app}"
+
+[Code]
+const
+ VC_REDIST_KEY = 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64';
+ VC_REDIST_KEY_WOW = 'SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64';
+ VC_REDIST_MAJOR_MIN = 14;
+ VC_REDIST_MINOR_MIN = 29;
+
+function IsVCRedistInstalled: Boolean;
+var
+ Major, Minor: Cardinal;
+begin
+ Result := False;
+ if RegQueryDWordValue(HKLM, VC_REDIST_KEY, 'Major', Major) then
+ if RegQueryDWordValue(HKLM, VC_REDIST_KEY, 'Minor', Minor) then
+ Result := (Major > VC_REDIST_MAJOR_MIN) or ((Major = VC_REDIST_MAJOR_MIN) and (Minor >= VC_REDIST_MINOR_MIN));
+
+ if not Result then
+ if RegQueryDWordValue(HKLM, VC_REDIST_KEY_WOW, 'Major', Major) then
+ if RegQueryDWordValue(HKLM, VC_REDIST_KEY_WOW, 'Minor', Minor) then
+ Result := (Major > VC_REDIST_MAJOR_MIN) or ((Major = VC_REDIST_MAJOR_MIN) and (Minor >= VC_REDIST_MINOR_MIN));
+end;
+
+function InitializeSetup(): Boolean;
+var
+ VCWarning: String;
+begin
+ Result := True;
+ if not IsVCRedistInstalled() then
+ begin
+ VCWarning := 'The Microsoft Visual C++ 2015-2022 Redistributable (x64) may not be installed.' + #13#10 + #13#10 +
+ 'JamulusPlus requires this runtime to function correctly.' + #13#10 + #13#10 +
+ 'Download: https://aka.ms/vs/17/release/vc_redist.x64.exe' + #13#10 + #13#10 +
+ 'Do you want to continue with the installation?';
+ Result := MsgBox(VCWarning, mbConfirmation, MB_YESNO or MB_DEFBUTTON1) = IDYES;
+ end;
+end;
+
+procedure CurStepChanged(CurStep: TSetupStep);
+begin
+ if CurStep = ssPostInstall then
+ Log('JamulusPlus installation completed successfully.');
+end;
+
diff --git a/installer/make_installer.ps1 b/installer/make_installer.ps1
new file mode 100644
index 0000000000..a8e51ad39d
--- /dev/null
+++ b/installer/make_installer.ps1
@@ -0,0 +1,54 @@
+<#
+.SYNOPSIS
+Builds the JamulusPlus packaged outputs and compiles a Windows installer.
+
+.DESCRIPTION
+1. Builds the Release VST3 bundle and standalone app.
+2. Copies packaged outputs into dist/.
+3. Compiles the Inno Setup installer with optional plugin/standalone components.
+#>
+
+$ErrorActionPreference = "Stop"
+$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
+$ProjectRootDir = Split-Path -Parent $ScriptDir
+$BuildDir = Join-Path $ProjectRootDir "b"
+$Vst3Bundle = Join-Path $ProjectRootDir "dist\JamulusPlus.vst3"
+$StandaloneDir = Join-Path $ProjectRootDir "dist\JamulusPlus-Standalone"
+
+Write-Host "--- Starting JamulusPlus installer build ---" -ForegroundColor Cyan
+
+if (-not (Test-Path $BuildDir)) {
+ throw "Build directory not found at $BuildDir. Configure CMake first."
+}
+
+Push-Location $ProjectRootDir
+try {
+ & cmake --build .\b --config Release --target jamulus_dist
+ & cmake --build .\b --config Release --target jamulus_dist_standalone
+} finally {
+ Pop-Location
+}
+
+if (-not (Test-Path $Vst3Bundle)) {
+ throw "Packaged VST3 bundle not found at $Vst3Bundle"
+}
+if (-not (Test-Path $StandaloneDir)) {
+ throw "Packaged standalone directory not found at $StandaloneDir"
+}
+
+$iscc = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
+if (-not (Test-Path $iscc)) {
+ $iscc = Get-Command iscc.exe -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source
+}
+if (-not $iscc) {
+ throw "Inno Setup Compiler (ISCC.exe) not found. Install Inno Setup 6."
+}
+
+$IssFile = Join-Path $ScriptDir "jamulus_vst3.iss"
+& $iscc $IssFile
+if ($LASTEXITCODE -ne 0) {
+ throw "Installer compilation failed."
+}
+
+$OutputDir = Join-Path $ScriptDir "installer_output"
+Write-Host "Installer created in: $OutputDir" -ForegroundColor Green
diff --git a/ios/Info.plist b/ios/Info.plist
deleted file mode 100644
index aa4a9559b8..0000000000
--- a/ios/Info.plist
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- $(PRODUCT_BUNDLE_PACKAGE_TYPE)
- CFBundleShortVersionString
- 1.0
- CFBundleVersion
- 1
- LSRequiresIPhoneOS
-
- NSMicrophoneUsageDescription
- We need access to your microphone to let others hear you.
- UIApplicationSceneManifest
-
- UIApplicationSupportsMultipleScenes
-
-
- UIApplicationSupportsIndirectInputEvents
-
- UIBackgroundModes
-
- audio
-
- UILaunchScreen
-
- UILaunchStoryboardName
- LaunchScreen
- UIRequiredDeviceCapabilities
-
- armv7
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
-
-
diff --git a/ios/deploy_ios.sh b/ios/deploy_ios.sh
deleted file mode 100755
index c5c150b17d..0000000000
--- a/ios/deploy_ios.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-set -eu -o pipefail
-
-## Builds an ipa file for iOS. Should be run from the repo-root
-
-# Create Xcode file and build
-qmake -spec macx-xcode Jamulus.pro
-/usr/bin/xcodebuild -project Jamulus.xcodeproj -scheme Jamulus -configuration Release clean archive -archivePath "build/Jamulus.xcarchive" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO CODE_SIGN_ENTITLEMENTS=""
-
-# Generate ipa by copying the .app file from the xcarchive directory
-mkdir build/Payload
-cp -r build/Jamulus.xcarchive/Products/Applications/Jamulus.app build/Payload/
-cd build
-zip -0 -y -r Jamulus.ipa Payload/
-
-# Make a deploy folder and copy file
-mkdir ../deploy
-mv Jamulus.ipa ../deploy
diff --git a/jack2-src/jack2-master/.cirrus.yml b/jack2-src/jack2-master/.cirrus.yml
new file mode 100644
index 0000000000..31e00ddab0
--- /dev/null
+++ b/jack2-src/jack2-master/.cirrus.yml
@@ -0,0 +1,29 @@
+task:
+ freebsd_instance:
+ matrix:
+ - image_family: freebsd-12-3
+ - image_family: freebsd-13-1
+
+ environment:
+ CFLAGS: -O2 -pipe -fPIC -fstack-protector-strong -fno-strict-aliasing -I/usr/local/include
+ CPPFLAGS: -O2 -pipe -fPIC -fstack-protector-strong -fno-strict-aliasing -I/usr/local/include
+ LDFLAGS: -L/usr/local/lib -fstack-protector-strong
+ prepare_script:
+ - mkdir /Install
+
+ matrix:
+ - name: FreeBSD Minimal Build
+ dependencies_script:
+ - pkg install -y pkgconf python3 libsamplerate libsysinfo expat
+ config_script:
+ - python3 ./waf configure --celt=no --samplerate=yes --alsa=no --classic --opus=no --prefix /Install --pkgconfigdir libdata/pkgconfig
+ - name: FreeBSD All Options
+ dependencies_script:
+ - pkg install -y pkgconf python3 libsamplerate libsysinfo alsa-lib dbus expat opus
+ config_script:
+ - python3 ./waf configure --celt=no --samplerate=yes --alsa=yes --dbus --classic --autostart=dbus --opus=yes --prefix /Install --pkgconfigdir libdata/pkgconfig
+
+ build_script:
+ - python3 ./waf
+ install_script:
+ - python3 ./waf install
diff --git a/jack2-src/jack2-master/.flake8 b/jack2-src/jack2-master/.flake8
new file mode 100644
index 0000000000..de6e2a4bb1
--- /dev/null
+++ b/jack2-src/jack2-master/.flake8
@@ -0,0 +1,4 @@
+[flake8]
+max-line-length = 120
+output-file = flake8.txt
+exclude = .git,waflib,autooptions
diff --git a/jack2-src/jack2-master/.github/ISSUE_TEMPLATE/bug_report.md b/jack2-src/jack2-master/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000000..e9bb2c2621
--- /dev/null
+++ b/jack2-src/jack2-master/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,31 @@
+---
+name: Bug report ðŸž
+about: Create a report to help us improve
+title: ''
+labels: bug
+assignees: ''
+---
+
+
+
+## Describe the bug
+
+A clear and concise description of what the bug is.
+
+## Environment
+
+* **JACK Version:** Which version of jack2 are you using? (e.g. the output of `jackd --version` or a git commit checksum)
+* **Operating System:** What operating system or distribution in which version are you using? (e.g. Linux, macOS, Windows)
+* **Installation:** How did you install jack2? (e.g. package manager, from source)
+
+## Steps To Reproduce
+
+```bash
+# Paste a minimal code example here (e.g. about how you started JACK)
+```
+
+### Expected vs. actual behavior
+
+A clear and concise description of what you expected to happen vs. what happened.
+
+
diff --git a/jack2-src/jack2-master/.github/ISSUE_TEMPLATE/feature_request.md b/jack2-src/jack2-master/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000000..91d80b7e7f
--- /dev/null
+++ b/jack2-src/jack2-master/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,21 @@
+---
+name: Feature Request 💡
+about: Suggest a new idea for the project.
+labels: enhancement
+---
+
+
+
+## Summary
+
+Brief explanation of the feature.
+
+### Basic example
+
+If the proposal involves a new feature or change in behavior, include a basic code example. Omit this section if it's not applicable.
+
+### Motivation
+
+Why are we doing this? What use cases does it support? What is the expected outcome?
+
+
diff --git a/jack2-src/jack2-master/.github/workflows/build.yml b/jack2-src/jack2-master/.github/workflows/build.yml
new file mode 100644
index 0000000000..35665ba6b5
--- /dev/null
+++ b/jack2-src/jack2-master/.github/workflows/build.yml
@@ -0,0 +1,321 @@
+name: build
+
+on:
+ push:
+ branches:
+ - '*'
+ pull_request:
+ branches:
+ - '*'
+env:
+ CACHE_VERSION: 6
+ DEBIAN_FRONTEND: noninteractive
+ HOMEBREW_NO_AUTO_UPDATE: 1
+ PAWPAW_VERSION: 86d947d472e1478af882175ee329a6f769b4d15c
+ PAWPAW_SKIP_LTO: 1
+
+jobs:
+ # macOS native intel build
+ macos:
+ runs-on: macos-10.15
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Set up cache
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/PawPawBuilds
+ key: macos-v${{ env.CACHE_VERSION }}
+ - name: Set up dependencies
+ run: |
+ brew install cmake jq meson
+ - name: Bootstrap macOS intel
+ shell: bash
+ run: |
+ if [ ! -d PawPaw ]; then
+ git clone https://github.com/DISTRHO/PawPaw.git
+ git -C PawPaw checkout ${PAWPAW_VERSION}
+ fi
+ ./PawPaw/bootstrap-jack2.sh macos && ./PawPaw/.cleanup.sh macos
+ - name: Build jack2
+ shell: bash
+ run: |
+ pushd PawPaw && source local.env macos && popd
+ python ./waf configure --platform=darwin --prefix=/usr/local
+ python ./waf build -j $(sysctl -n hw.logicalcpu)
+ python ./waf install --destdir=$(pwd)/destdir
+ - name: Set sha8
+ id: slug
+ run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)"
+ - name: Generate macOS package
+ shell: bash
+ run: |
+ ./macosx/generate-pkg.sh $(pwd)/destdir/usr/local ${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}
+ - uses: actions/upload-artifact@v3
+ with:
+ name: jack2-macOS-intel-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}
+ path: macosx/jack2-osx-*.pkg
+
+ # macOS native universal build
+ macos_universal:
+ runs-on: macos-10.15
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Set up cache
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/PawPawBuilds
+ key: macos-universal-v${{ env.CACHE_VERSION }}
+ - name: Set up dependencies
+ run: |
+ brew install cmake jq meson
+ - name: Fix up Xcode
+ run: |
+ sudo rm -Rf /Library/Developer/CommandLineTools/SDKs/*
+ sudo xcode-select -s /Applications/Xcode_12.3.app
+ - name: Bootstrap macOS universal
+ shell: bash
+ run: |
+ if [ ! -d PawPaw ]; then
+ git clone https://github.com/DISTRHO/PawPaw.git
+ git -C PawPaw checkout ${PAWPAW_VERSION}
+ fi
+ ./PawPaw/bootstrap-jack2.sh macos-universal && ./PawPaw/.cleanup.sh macos-universal
+ - name: Build jack2
+ shell: bash
+ run: |
+ pushd PawPaw && source local.env macos-universal && popd
+ python ./waf configure --platform=darwin --prefix=/usr/local
+ python ./waf build -j $(sysctl -n hw.logicalcpu)
+ python ./waf install --destdir=$(pwd)/destdir
+ - name: Set sha8
+ id: slug
+ run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)"
+ - name: Generate macOS package
+ shell: bash
+ run: |
+ ./macosx/generate-pkg.sh $(pwd)/destdir/usr/local ${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}
+ - uses: actions/upload-artifact@v3
+ with:
+ name: jack2-macOS-universal-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}
+ path: macosx/jack2-osx-*.pkg
+
+ # linux with win32 cross-compilation
+ win32:
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Set up cache
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/PawPawBuilds
+ key: win32-v${{ env.CACHE_VERSION }}
+ - name: Restore debian packages cache
+ run: |
+ if [ -d ~/PawPawBuilds/debs ] && [ "$(ls ~/PawPawBuilds/debs | wc -l)" -ne 0 ]; then \
+ sudo cp ~/PawPawBuilds/debs/*.deb /var/cache/apt/archives/; \
+ fi
+ - name: Fix GitHub's mess
+ run: |
+ sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
+ sudo apt-get update -qq
+ sudo apt-get install -yqq --allow-downgrades libgd3/focal libpcre2-8-0/focal libpcre2-16-0/focal libpcre2-32-0/focal libpcre2-posix2/focal
+ sudo apt-get purge -yqq libmono* moby* mono* php* libgdiplus libpcre2-posix3 libzip4
+ - name: Set up dependencies
+ run: |
+ sudo dpkg --add-architecture i386
+ sudo apt-get update -qq
+ sudo apt-get install -y autopoint build-essential curl cmake jq llvm mingw-w64 xvfb \
+ binutils-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64 wine-stable:i386
+ - name: Cache debian packages
+ run: |
+ mkdir -p ~/PawPawBuilds/debs && \
+ sudo mv /var/cache/apt/archives/*.deb ~/PawPawBuilds/debs/
+ - name: Bootstrap win32 cross-compiled
+ shell: bash
+ run: |
+ if [ ! -d PawPaw ]; then
+ git clone https://github.com/DISTRHO/PawPaw.git
+ git -C PawPaw checkout ${PAWPAW_VERSION}
+ fi
+ ./PawPaw/bootstrap-jack2.sh win32 && ./PawPaw/.cleanup.sh win32
+ - name: Build jack2
+ shell: bash
+ run: |
+ pushd PawPaw && source local.env win32 && popd
+ ./waf configure --platform=win32 --prefix=$(pwd)/destdir --static
+ ./waf build -j $(nproc)
+ ./waf install
+ - name: Generate MSVC lib files
+ shell: bash
+ run: |
+ pushd $(pwd)/destdir/lib
+ llvm-dlltool -m i386 -D libjack.dll -d libjack.def -l libjack.lib
+ llvm-dlltool -m i386 -D libjacknet.dll -d libjacknet.def -l libjacknet.lib
+ llvm-dlltool -m i386 -D libjackserver.dll -d libjackserver.def -l libjackserver.lib
+ popd
+ - name: Set sha8
+ id: slug
+ run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)"
+ - name: Generate Windows installer
+ shell: bash
+ run: |
+ # Setup wine
+ export WINEDLLOVERRIDES="mscoree,mshtml="
+ export WINEPREFIX=$(pwd)/innosetup
+ xvfb-run wineboot -u
+ # Download and install innosetup
+ curl -L https://jrsoftware.org/download.php/is.exe?site=2 -o is.exe
+ xvfb-run wine is.exe /allusers /dir=C:\\InnoSeup /nocancel /norestart /verysilent
+ # create installer
+ ln -sf $(pwd)/destdir windows/inno/win32
+ pushd windows/inno
+ echo "#define VERSION \"${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}\"" > version.iss
+ xvfb-run wine ${WINEPREFIX}/drive_c/InnoSeup/ISCC.exe win32-mini.iss
+ popd
+ - uses: actions/upload-artifact@v3
+ with:
+ name: jack2-win32-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}
+ path: windows/inno/jack2-*.exe
+
+ # linux with win64 cross-compilation
+ win64:
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Set up cache
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/PawPawBuilds
+ key: win64-v${{ env.CACHE_VERSION }}
+ - name: Restore debian packages cache
+ run: |
+ if [ -d ~/PawPawBuilds/debs ] && [ "$(ls ~/PawPawBuilds/debs | wc -l)" -ne 0 ]; then \
+ sudo cp ~/PawPawBuilds/debs/*.deb /var/cache/apt/archives/; \
+ fi
+ - name: Fix GitHub's mess
+ run: |
+ sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
+ sudo apt-get update -qq
+ sudo apt-get install -yqq --allow-downgrades libgd3/focal libpcre2-8-0/focal libpcre2-16-0/focal libpcre2-32-0/focal libpcre2-posix2/focal
+ sudo apt-get purge -yqq libmono* moby* mono* php* libgdiplus libpcre2-posix3 libzip4
+ - name: Set up dependencies
+ run: |
+ sudo dpkg --add-architecture i386
+ sudo apt-get update -qq
+ sudo apt-get install -y autopoint build-essential curl cmake jq llvm mingw-w64 xvfb \
+ binutils-mingw-w64-x86-64 g++-mingw-w64-x86-64 mingw-w64 wine-stable
+ - name: Cache debian packages
+ run: |
+ mkdir -p ~/PawPawBuilds/debs && \
+ sudo mv /var/cache/apt/archives/*.deb ~/PawPawBuilds/debs/
+ - name: Bootstrap win64 cross-compiled
+ shell: bash
+ run: |
+ if [ ! -d PawPaw ]; then
+ git clone https://github.com/DISTRHO/PawPaw.git
+ git -C PawPaw checkout ${PAWPAW_VERSION}
+ fi
+ ./PawPaw/bootstrap-jack2.sh win64 && ./PawPaw/.cleanup.sh win64
+ - name: Build jack2
+ shell: bash
+ run: |
+ pushd PawPaw && source local.env win64 && popd
+ export PATH+=":/usr/i686-w64-mingw32/bin"
+ export LDFLAGS+="-L~/PawPawBuilds/targets/win64/lib32"
+ ./waf configure --platform=win32 --prefix=$(pwd)/destdir --static --mixed
+ ./waf build -j $(nproc)
+ ./waf install
+ - name: Generate MSVC lib files
+ shell: bash
+ run: |
+ # 32bit
+ pushd $(pwd)/destdir/lib32
+ llvm-dlltool -m i386 -D libjack.dll -d libjack.def -l libjack.lib
+ popd
+ # 64bit
+ pushd $(pwd)/destdir/lib
+ llvm-dlltool -m i386:x86-64 -D libjack64.dll -d libjack64.def -l libjack64.lib
+ llvm-dlltool -m i386:x86-64 -D libjacknet64.dll -d libjacknet64.def -l libjacknet64.lib
+ llvm-dlltool -m i386:x86-64 -D libjackserver64.dll -d libjackserver64.def -l libjackserver64.lib
+ popd
+ - name: Set sha8
+ id: slug
+ run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)"
+ - name: Generate Windows installer
+ shell: bash
+ run: |
+ # Setup wine
+ export WINEDLLOVERRIDES="mscoree,mshtml="
+ export WINEPREFIX=$(pwd)/innosetup
+ xvfb-run wineboot -u
+ # Download and install innosetup
+ curl -L https://jrsoftware.org/download.php/is.exe?site=2 -o is.exe
+ xvfb-run wine64 is.exe /allusers /dir=C:\\InnoSeup /nocancel /norestart /verysilent
+ # create installer
+ ln -sf $(pwd)/destdir windows/inno/win64
+ pushd windows/inno
+ echo "#define VERSION \"${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}\"" > version.iss
+ xvfb-run wine64 ${WINEPREFIX}/drive_c/InnoSeup/ISCC.exe win64-mini.iss
+ popd
+ - uses: actions/upload-artifact@v3
+ with:
+ name: jack2-win64-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}
+ path: windows/inno/jack2-*.exe
+
+ # ubuntu-20.04
+ #ubuntu_20_04:
+ #runs-on: ubuntu-20.04
+ #steps:
+ #- uses: actions/checkout@v3
+ #with:
+ #submodules: recursive
+ #- name: Set up cache
+ #uses: actions/cache@v3
+ #with:
+ #path: |
+ #~/debs
+ #key: ubuntu-20.04-v${{ env.CACHE_VERSION }}
+ #- name: Restore debian packages cache
+ #run: |
+ #if [ -d ~/debs ] && [ "$(ls ~/debs | wc -l)" -ne 0 ]; then \
+ #sudo cp ~/debs/*.deb /var/cache/apt/archives/; \
+ #fi
+ #- name: Set up dependencies
+ #run: |
+ #sudo add-apt-repository -y ppa:ubuntustudio-ppa/backports
+ #sudo sed -i "s/# deb-src/deb-src/" /etc/apt/sources.list /etc/apt/sources.list.d/*.list
+ #sudo apt-get update -qq
+ #sudo apt-get build-dep jackd2
+ #sudo apt-get install devscripts
+ #- name: Cache debian packages
+ #run: |
+ #mkdir -p ~/debs && \
+ #sudo mv /var/cache/apt/archives/*.deb ~/debs/
+ #- name: Set sha8
+ #id: slug
+ #run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)"
+ #- name: Build jack2 packages
+ #shell: bash
+ #run: |
+ #apt-get source -d jackd2
+ #tar xf *.debian.tar.xz
+ #rm -rf debian/source
+ #sed -i "s|--prefix=/usr --classic|--prefix=/usr --classic|" debian/rules
+ #dch -M -b -v "$(cat wscript | awk 'sub("^VERSION = ","")' | tr -d "'")~$(date +"%Y%m%d")git${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}" -D focal "automated build"
+ #debuild -rfakeroot --no-lintian || true
+ #- uses: actions/upload-artifact@v3
+ #with:
+ #name: jack2-ubuntu-20.04-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}
+ #path: ~/work/jack2/*.deb
diff --git a/jack2-src/jack2-master/.github/workflows/irc.yml b/jack2-src/jack2-master/.github/workflows/irc.yml
new file mode 100644
index 0000000000..d248c616f6
--- /dev/null
+++ b/jack2-src/jack2-master/.github/workflows/irc.yml
@@ -0,0 +1,20 @@
+name: irc
+
+on: [push]
+
+jobs:
+ notification:
+ runs-on: ubuntu-latest
+ name: IRC notification
+ steps:
+ - name: Format message
+ id: message
+ run: |
+ message="${{ github.actor }} pushed $(echo '${{ github.event.commits[0].message }}' | head -n 1) ${{ github.event.commits[0].url }}"
+ echo ::set-output name=message::"${message}"
+ - name: IRC notification
+ uses: Gottox/irc-message-action@v2
+ with:
+ channel: '#jack'
+ nickname: jackaudio-bot
+ message: ${{ steps.message.outputs.message }}
diff --git a/jack2-src/jack2-master/.github/workflows/lint.yml b/jack2-src/jack2-master/.github/workflows/lint.yml
new file mode 100644
index 0000000000..91845d1b83
--- /dev/null
+++ b/jack2-src/jack2-master/.github/workflows/lint.yml
@@ -0,0 +1,22 @@
+---
+
+name: Test wscript files
+
+on:
+ push:
+ branches: [master, develop]
+ pull_request:
+ branches: [master, develop]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install flake8 findutils
+ - name: Lint with flake8
+ run: find . -type f \( -iname wscript -or -iname jack_control \) -exec flake8 {} \;
diff --git a/jack2-src/jack2-master/.gitignore b/jack2-src/jack2-master/.gitignore
new file mode 100644
index 0000000000..a36363a395
--- /dev/null
+++ b/jack2-src/jack2-master/.gitignore
@@ -0,0 +1,27 @@
+.lock*
+.stamp_*
+.DS_Store
+__pycache__
+*.dll
+*.pyc
+*.pkg
+flake8.txt
+codeBlocks
+/android/.server/
+/android/.client/
+/build/
+/man/*.1
+
+# common release files
+/destdir/
+
+# macos release files
+/macos/package.xml
+/macos/package-welcome.txt
+
+# windows release files
+/innosetup/
+/is.exe
+/windows/inno/version.iss
+/windows/inno/win32
+/windows/inno/win64
diff --git a/jack2-src/jack2-master/.wafupdaterc b/jack2-src/jack2-master/.wafupdaterc
new file mode 100644
index 0000000000..0135a81f35
--- /dev/null
+++ b/jack2-src/jack2-master/.wafupdaterc
@@ -0,0 +1,134 @@
+# This file is sourced by wafupdate when waf is updated.
+# wafupdate home page: https://gitlab.com/karllinden/wafupdate
+
+WAFLIB_STRIP_TOOLS="
+ asm
+ bison
+ compiler_d
+ compiler_fc
+ cs
+ d
+ d_config
+ d_scan
+ dbus
+ dmd
+ fc
+ fc_config
+ fc_scan
+ flex
+ g95
+ gas
+ gdc
+ gfortran
+ glib2
+ gnu_dirs
+ ifort
+ intltool
+ javaw
+ ldc2
+ lua
+ md5_tstamp
+ nasm
+ nobuild
+ perl
+ python
+ qt5
+ ruby
+ tex
+ vala
+ winres
+"
+
+WAFLIB_STRIP_EXTRAS="
+ biber
+ bjam
+ blender
+ boo
+ boost
+ buildcopy
+ c_dumbpreproc
+ c_emscripten
+ cabal
+ cfg_altoptions
+ clang_compilation_database
+ codelite
+ compat15
+ color_gcc
+ color_rvct
+ cppcheck
+ cpplint
+ cross_gnu
+ cython
+ dcc
+ distnet
+ doxygen
+ dpapi
+ eclipse
+ erlang
+ fast_partial
+ fc_bgxlf
+ fc_cray
+ fc_nag
+ fc_nec
+ fc_open64
+ fc_pgfortran
+ fc_solstudio
+ fc_xlf
+ file_to_object
+ fluid
+ freeimage
+ fsb
+ fsc
+ gccdeps
+ gdbus
+ gob2
+ halide
+ javatest
+ kde4
+ local_rpath
+ make
+ midl
+ msvcdeps
+ msvs
+ netcache_client
+ objcopy
+ ocaml
+ package
+ parallel_debug
+ pch
+ pep8
+ pgicc
+ pgicxx
+ proc
+ protoc
+ pyqt5
+ pytest
+ qnxnto
+ qt4
+ relocation
+ remote
+ resx
+ review
+ rst
+ run_do_script
+ run_m_script
+ run_py_script
+ run_r_script
+ sas
+ satellite_assembly
+ scala
+ slow_qt4
+ softlink_libs
+ stale
+ stracedeps
+ swig
+ syms
+ ticgt
+ unity
+ use_config
+ valadoc
+ waf_xattr
+ why
+ win32_opts
+ wix
+"
diff --git a/jack2-src/jack2-master/AUTHORS.rst b/jack2-src/jack2-master/AUTHORS.rst
new file mode 100644
index 0000000000..7b7185ec00
--- /dev/null
+++ b/jack2-src/jack2-master/AUTHORS.rst
@@ -0,0 +1,104 @@
+Authors
+#######
+(Ordered alphabetically)
+
+Adrian Knoth
+Alba Mendez
+Alexander Graf
+Alexandre Prokoudine
+Alexandru Tofan
+Andreas Müller
+Andrew Kelley
+Andrzej Szombierski
+Andy Wingo
+Anthony Van Groningen
+Arnout Diels
+Arnaud Rebillout
+Arnold Krille
+Bernhard M. Wiedemann
+Bruno Vernay
+Cédric Schieli
+Chris Caudle
+David Garcia Garzon
+David Robillard
+David Runge
+Deven Lahoti
+Devin Anderson
+Dmitry Baikov
+Edward Betts
+Eliot Blennerhassett
+Fernando Lopez-Lezcano
+Filipe Coelho
+Florian Faber
+Francis Pinteric
+Gabriel M. Beddingfield
+Gaël Portay
+Holger Dehnhardt
+Hunter L. Allen
+Ian Esten
+Jacek Konieczny
+Jack O'Quin
+James Cowgill
+James P. Thomas
+Jan Engelhardt
+Jaroslav Kysela
+Jeremy Hall
+John Emmas
+Johnny Petrantoni
+Jonathan Woithe
+Josh Green
+Joshua Moyerman
+Julien Acroute
+Jussi Laako
+Juuso Alasuutari
+Kai Vehmanen
+Karl Lindén
+Karsten Wiese
+Kim Jeong Yeon
+Kjetil S. Matheussen
+Lars-Peter Clausen
+Lee Revell
+Maks Naumov
+Marc-Olivier Barre
+Mario Lang
+Markus Seeber
+Matt Flax
+Matthias Geier
+Maxim Grishin
+Melanie Thielker
+Michael Voigt
+Michał Szymański
+Nedko Arnaudov
+Olaf Hering
+Olivier Humbert
+Paul Davis
+Peter Bridgman
+Peter L Jones
+Pieter Palmers
+Ricardo Crudo
+Robert Ham
+Robin Gareus
+Rohan Drape
+Romain Moret
+Rui Nuno Capela
+Samuel Martin
+Samuel Tracol
+Stefan Schwandter
+Stéphane Letz
+Steve Harris
+Steven Chamberlain
+Taybin Rutkin
+Thibault LeMeur
+Thomas Brand
+Thomas Petazzoni
+Thom Johansen
+Tilman Linneweh
+Tim Blechmann
+Timo Wischer
+Tom Szilagyi
+Torben Hohn
+Valentin David
+Valerio Pilo
+Viktor Wilhelmsson
+Yasuhiro Fujii
+Youri Westerman
diff --git a/jack2-src/jack2-master/COPYING b/jack2-src/jack2-master/COPYING
new file mode 100644
index 0000000000..d8cf7d463e
--- /dev/null
+++ b/jack2-src/jack2-master/COPYING
@@ -0,0 +1,280 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/jack2-src/jack2-master/ChangeLog.rst b/jack2-src/jack2-master/ChangeLog.rst
new file mode 100644
index 0000000000..d1f1c1f29d
--- /dev/null
+++ b/jack2-src/jack2-master/ChangeLog.rst
@@ -0,0 +1,962 @@
+ChangeLog
+#########
+
+* 1.9.22 (2023-02-02)
+
+ * The waf autooption ``--example-tools`` has been removed.
+ The example clients and tools are no longer part of the jack2 project.
+ * Drop dependencies that were only used for example clients and tools (readline, sndfile and zita libs)
+ * Fix build with python3.11+
+ * Fix compatibility with macOS 12+
+ * Fix ringbuffer thread safety on ARM
+
+* 1.9.21 (2022-04-15)
+
+ * Add shell mode to ``jack_control`` (executes commands from stdin until EOF)
+ * The waf autooption ``--example-tools`` introduced in 1.9.20 is now off by default,
+ To get the previous behavior back pass ``--example-tools`` during build.
+ This flag (and the related tools and their code) are going to be removed in the next release.
+ * Fix alignas() on non-packed architectures
+ * Fix build of jack-example-tools man pages (1.9.20 regression)
+ * Fix compatibility with macOS 12
+ * Fix missing symbols from jack client library (error and info callback pointers)
+ * Fix potential memory corruption in midi_latency_test tool
+ * Fix JackWeakAPI on Windows
+ * Use predefined variables in pkg-config file (required for mingw)
+
+External changes, related to macOS/Windows installer:
+ * Fix application style in QJackCtl (qwindowsvistastyle.dll was missing)
+ * Update QjackCtl used in macOS/Windows installers to 0.9.7
+
+* 1.9.20 (2022-01-15)
+
+ * Add waf autooption ``--example-tools`` to allow optional build of
+ executables, libraries and man pages provided by `jack-example-tools
+ `_ (the files are built by
+ default). Building and installing the additional files can be disabled by
+ using ``--example-tools=no`` or ``--no-example-tools``.
+ * Fix 32-bit support in ALSA driver
+ * Fix incomplete ASIO support on Windows
+ * Fix metadata usage with multiple users
+ * Fix netsource tool missing on Windows
+ * Fix semaphore usage on macOS
+ * Official FreeBSD support
+
+External changes, related to macOS/Windows installer:
+ * Update Qt5 used in macOS/Windows installers to 5.12.12
+ * Update QjackCtl used in macOS/Windows installers to 0.9.6
+
+* 1.9.19 (2021-07-15)
+
+ * Add jack_position_t::tick_double, and flags around it
+ * Add zalsa "-w" argument to wait for soundcard to be available
+ * Bump internal protocol version to 9 (due to struct alignment)
+ * Fix alignment of fields for atomic accesses
+ * Fix build for platforms needing __STDC_FORMAT_MACROS
+ * Fix compilation of documentation
+
+* 1.9.18 (2021-04-15)
+
+ * Add zalsa_in/out as internal client (based on zita-a2j/j2a and jack1 code)
+ * Fix jack_midi_dump deadlock on close after the jack server is restarted
+ * Fix interrupt signal for linux futex waits
+ * Fix usage of meta-data in official macOS builds (private DB errors)
+ * Log error message when cleaning previous DB (macOS and Windows)
+
+* 1.9.17 (2021-01-15)
+
+ * Fix jack_control stopping after first command iteration
+ * Fix library compat/current version under macOS
+ * Fix return codes of jackd on success
+ * Ignore DB_VERSION_MISMATCH error on windows, it is expected
+ * Remove old workaround for asio4all, as it breaks with jack-router
+
+External changes, related to macOS/Windows installer:
+ * Add jack-router to Windows installer, opt-in
+ * Fix registry keys for Windows, add 32bit compat ones on 64bit
+ * Support for arm64 macOS builds
+ * Show welcome and license pages on windows installer
+ * Update QjackCtl used in macOS/Windows installers to v0.9.0, with some commits cherry-picked from develop branch
+
+* 1.9.16 (2020-10-16)
+
+ * Fix/revert a change in how meta-data definitions were exposed (regression in 1.9.15)
+ * Remove jack-router Windows code from the repository
+
+* 1.9.15 (2020-10-15)
+
+ * Automated builds for macOS and Windows (see jackaudio/jack2-releases repository)
+ * Adapt wscript Windows build configuration to match old v1.9.11 installer
+ * Bump maximum default number of clients and ports (now 256 clients and 2048 ports)
+ * Delete various macOS and Windows-related files from the source code (no longer relevant)
+ * Mark JACK-Session as deprecated, please use NSM instead
+ * Remove unnecessary GPL include from LGPL code
+ * Split example-clients and tools, as done in JACK1 many years ago (WIP)
+ * Write Windows registry key during installation, so 3rd parties can find jackd.exe (as HKLM\\Software\\JACK\\Location)
+ * jack_control: Fix handling of dbus bytes
+ * jack_control: Return a proper exit status on DBus exception
+ * jack_property: Fix possible crash with "-l" argument usage
+ * jack_wait: Add client name option -n/--name
+ * Fix compilation of documentation
+ * Fix compilation of mixed mode with meta-data enabled
+ * Fix compilation with mingw
+ * Fix client-side crash if initial meta-data DB setup fails
+ * Fix macOS semaphore usage, so it works again
+ * Several fixes for Windows (with contributions from Kjetil S. Matheussen)
+ * Several minor fixes and grammar corrections (with contributions from Adam Miartus and Timo Wischer)
+
+* 1.9.14 (2019-10-28)
+
+ * Fix ARM build
+ * Fix mixed mode build when meta-data is enabled
+ * Fix blocking DBus device reservation, so it plays nice with others (like PipeWire)
+ * Use python3 for the waf build scripts
+
+* 1.9.13 (2019-10-06)
+
+ * Meta-data API implementation. (and a few tools updated with support for it)
+ * Correct GPL licence to LGPL for files needed to build libjack.
+ * Remove FreeBoB backend (superseded by FFADO).
+ * define JACK_LIB_EXPORT, useful for internal clients.
+ * Mark jack_midi_reset_buffer as deprecated.
+ * Add example systemd unit file
+ * Signal to systemd when jackd is ready.
+ * Set "seq" alsa midi driver to maximum resolution possible.
+ * Fix loading internal clients from another internal client.
+ * Code cleanup and various fixes. (too many to mention here, see git log for details)
+
+* 1.9.12 (2017-12-13)
+
+ * Fix Windows build issues.
+ * Fix build with gcc-7.
+ * Show hint when DBus device reservation fails.
+ * Add support for internal session files.
+
+* 1.9.11-RC1 (2017-06-13)
+
+ * Various corrections in NetJack2 code. Partial buffers can now be
+ transmitted with libjacknet API.
+ * Including S24_LE/BE formats to linux ALSA driver.
+ * More robust shared memory allocator.
+ * Allow autostart of jackd on OSX where device-names can contain spaces.
+ * Correct CoreAudio devices aggregation code.
+ * Waf and wscripts improvement and update.
+ * More flexible RT priority setup on Windows.
+ * New JackProxyDriver.
+ * Various fixes in JACK MIDI code.
+ * Fix return value of SetTimebaseCallback().
+ * Correct netmanager latency reporting.
+ * Implement new jack_port_rename and JackPortRenameCallback API.
+ * For OSX El Capitan support, use of Posix semaphore and move of Frameworks
+ in /Library folder.
+ * Fix CPU hogging of the midi_thread().
+ * Release audio devices when alsa_driver_new fails.
+ * String management fix.
+ * Correct JackDriver::Open: call to fGraphManager->SetBufferSize has to use
+ current fEngineControl->fBufferSize value.
+ * Use ARM neon intrinsics for AudioBufferMixdown.
+ * Fix Netjack alignment.
+ * Various wscript improvements and cleanup.
+ * Fix initialization of several class variables.
+ * Heap-allocate client matrix in topo sort.
+ * Add a toggle command to transport utility, to allow toggling between play
+ and stop state.
+ * Avoid side effects from parsing of "version" option in jackd.
+ * Allow firewire device be selected via -d.
+ * Add ARM-NEON acceleration for all non-dithering sample conversion
+ functions.
+ * Add jack_simdtest utility.
+ * Use Linux futex as JackSynchro.
+ * Add autoclose option to jack_load.
+
+* 1.9.10 (2014-07-19)
+
+ * More robust code in JackPortAudioDriver to handle buffer size change and
+ backend switching.
+ * Fix bus error on ARM platforms.
+ * Dynamically scan and print backend and internal names in jackd.
+ * CoreMIDI driver fixes.
+ * Rework NetJack2 code (OPUS codec on OSX, latency management, libjacknet
+ code).
+ * Correct auto-connect for audioadapter.
+ * Add IIO driver.
+ * Merge of Nedko no-self-connect branch.
+ * Fix freewheel mode.
+ * JackServer::SwitchMaster now correctly notify buffer_size and sample_rate
+ changes, cleanup/improvements in JackNetDriver.
+ * Tim Mayberry : Add support for building with mingw compiler.
+ * Merge of Kim Jeong Yeon Android branch.
+ * Partial port of metadata API.
+
+* 1.9.9.5 (2012-11-26)
+
+ * Adrian Knoth fix in midiseq.c.
+ * Fix library symbols export issue.
+ * Cleanup drivers and internals loading code.
+ * jackctl_driver_params_parse API moved in public control.h.
+ * More general drivers/internals loading model on Windows.
+ * Factorize code the server/client request in JackRequestDecoder class.
+ * More robust server/client protocol.
+ * Implement shutdown for in server clients.
+ * Better time-out management in NetJack2.
+ * Experimental system port alias use in Windows JackRouter.
+ * Improve ShutDown in NetManager.
+ * Correct ShutDown in JackInternalClient and JackLibClient.
+ * Fix NetJack2 initialisation bug.
+ * Add EndTime function (especially for Windows).
+ * Rename JackProcessSync in JackPosixProcessSync.
+ * A bit more robust JackMessageBuffer implementation (in progress).
+ * Check server API callback from notification thread.
+ * Use a time-out in notification channel write function.
+ * Fix lock management in JackEngine.
+ * In control API, UNIX like sigset_t replaced by more abstract
+ jackctl_sigmask_t * opaque struct.
+ * Improve libjacknet master mode.
+ * Remove JACK_32_64 flag, so POST_PACKED_STRUCTURE now always used.
+ POST_PACKED_STRUCTURE used for jack_latency_range_t type.
+ * Rework JackMessageBuffer. [firewire]
+
+ * Introduce UpdateLatencies() in FFADO backend. [firewire]
+
+ * Allow FFADO backend to change the buffer size.
+ * Update waf.
+ * New jack_get_cycle_times() implementation from Fons Adriennsen.
+ * Align buffers to 32 byte boundaries to allow AVX processing.
+ * Extend jack_control to have parameter reset commands.
+ * Fix alsa driver parameter order.
+ * Control API: Enforce driver/internal parameter order.
+ * Fix in ALSA adapter.
+ * Devin Anderson patch for Jack/CoreMIDI duplicated messages.
+ * Change framework installation hierarchy for OSX Mountain Lion.
+ * Update JackCoreAudioDriver and JackCoreAudioAdapter with more recent API.
+ * jack_control: fix epr command.
+ * Add opus support to NetJack2.
+ * More robust channel mapping handling in JackCoreAudioDriver.
+ * netjack1/netone opus support.
+ * controlapi: fix double free on master switch.
+ * Use string ids in the alsa device list.
+ * netjack/opus: don't re-init en/decoders.
+ * Correct JackPortAudioDriver::Open: special case for ASIO drivers.
+
+* 1.9.8 (2011-12-19)
+
+ * Merge newer-midi branch (Devin Anderson redesign of the MIDI drivers:
+ alsarawmidi, ffado, coremidi and winmme).
+ * Correction in jackdmp.cpp: notify_server_stop should be done after server
+ destruction.
+ * Correct driver lifetime management.
+ * Add XRun detection in PortAudio driver.
+ * CELT code for NetJack2.
+ * Merge branch switch-master-port-registration-notifications: correct driver
+ port registration.
+ * Libjacknet in progress.
+ * Correct MIDI in NetJack2.
+ * Correct OSX real-time thread setup.
+ * Correct rd_acquire in dbus code.
+ * Correct NetJack2 connection handling.
+ * SaveConnections/RestoreConnections in NetDriver and JackAudioDriver.
+ * Special version of jack_attach_shm/jack_release_shm on client side for
+ POSIX shared memory, to solve a memory leak issue.
+ * Another round of code improvements to handle completely buggy Digidesign
+ CoreAudio user-land driver.
+ * Special CATCH_CLOSE_EXCEPTION_RETURN to handle Close API calls.
+ * Add JACK_NETJACK_PORT and JACK_NETJACK_MULTICAST environment variables for
+ NetJack2. NetJack2 now only send data on network only is ports are
+ connected both sides.
+ * Fix for "starting two instances of same app in parallel does not work"
+ bug.
+ * Enable explicit channel mapping in CoreAudio driver.
+ * New JackTimedDriver class to be used by JackDummyDriver, JackNetDriver and
+ JackNetOneDriver classes.
+ * More robust code in synchronization primitives and in JackMessageBuffer.
+ * More robust Control API implementation. Add jackctl_driver_get_type in
+ Control API.
+ * Singleton behaviour for JackCoreMidiDriver and JackWinMMEDriver.
+ * John Emmas patch for DSP CPU computation.
+ * John Emmas Windows server launching patch.
+ * Fix jack_set_port_name API.
+ * Enable local access in NetJack2 code.
+ * Dynamic port management in JACK/CoreMidi bridge.
+
+* 1.9.7 (2011-03-30)
+
+ * Sync JackAlsaDriver::alsa_driver_check_card_type with JACK1 backend.
+ * Correct JackServer::Open to avoid a race when control API is used on OSX.
+ * Improve backend error handling: fatal error returned by Read/Write now
+ cause a Process failure (so a thread exit for blocking backends).
+ Recoverable ones (XRuns..) are now treated internally in ALSA, FreeBob and
+ FFADO backends.
+ * In jackdmp.cpp, jackctl_setup_signals moved before jackctl_server_start.
+ * Correct symbols export in backends on OSX. ALSA backend: suspend/resume
+ handling.
+ * Correct dummy driver.
+ * Adrian Knoth jack_lsp patch.
+ * Remove JackPortIsActive flag.
+ * New latency API implementation.
+ * ComputeTotalLatencies now a client/server call.
+ * Add latent test client for latency API.
+ * Also print playback and capture latency in jack_lsp.
+ jack_client_has_session_callback implementation.
+ * Check requested buffer size and limit to 1..8192 - avoids weird behaviour
+ caused by jack_bufsize foobar.
+ * jack_port_type_get_buffer_size implementation.
+ * Stop using alloca and allocate buffer on the heap for alsa_io.
+ * Rename jdelay to jack_iodelay as per Fons' request.
+ * Call buffer size callback in activate (actually this is done on client side
+ in the RT thread Init method).
+ * Add jack_midi_dump client.
+ * Synchronize net JACK1 with JACK1 version.
+ * Synchronize jack_connect/jack_disconnect with JACK1 version.
+ * Correct JackNetMaster::SetBufferSize.
+ * Use jack_default_audio_sample_t instead of float consistently, fix ticket
+ #201.
+ * -X now allows to add several slave backends, add -I to load several
+ internal clients.
+ * Rework internal slave driver management, JackServerGlobals now handle same
+ parameters as jackdmp.
+ * Correct JackEngine::NotifyGraphReorder, update JackDebugClient with latest
+ API.
+ * Devin Anderson server-ctl-proposal branch merged on trunk: improved control
+ API, slave backend reworked. Implement renaming in JackDriver::Open to
+ avoid name collision (thanks Devin Anderson).
+ * Correct alsa_driver_restart (thanks Devin Anderson). Correction of
+ jack_connect/jack_disconnect: use of jack_activate and volatile keyword for
+ thread shared variable.
+ * Correction of JackNetOneDriver for latest CELT API.
+ * Synchronize JackWeakAPI.cpp with new APIs.
+
+* 1.9.6 (2010-08-30)
+
+ * Improve JackCoreAudioDriver and JackCoreAudioAdapter : when no devices are
+ described, takes default input and output and aggregate them.
+ * Correct JackGraphManager::DeactivatePort.
+ * Correct JackMachServerChannel::Execute : keep running even in error cases.
+ Raise JACK_PROTOCOL_VERSION number.
+ * Arnold Krille firewire patch.
+ * Raise JACK_DRIVER_PARAM_STRING_MAX and JACK_PARAM_STRING_MAX to 127
+ otherwise some audio drivers cannot be loaded on OSX.
+ * Fix some file header to have library side code use LGPL.
+ * On Windows, now use TRE library for regexp (BSD license instead of GPL
+ license).
+ * ffado-portname-sync.patch from ticket #163 applied.
+ * Remove call to exit in library code.
+ * Make jack_connect/jack_disconnect wait for effective port
+ connection/disconnection.
+ * Add tests to validate intclient.h API.
+ * On Linux, inter-process synchronization primitive switched to POSIX
+ semaphore.
+ * In JackCoreAudioDriver, move code called in MeasureCallback to be called
+ once in IO thread.
+ * David Garcia Garzon netone patch.
+ * Fix from Fernando Lopez-Lezcano for compilation on fc13.
+ * Fix JackPosixSemaphore::TimedWait : same behavior as
+ JackPosixSemaphore::Wait regarding EINTR.
+ * David Garcia Garzon unused_pkt_buf_field_jack2 netone patch.
+ * Arnold Krille firewire snooping patch.
+ * Jan Engelhardt patch for get_cycles on SPARC.
+ * Adrian Knoth hurd.patch, kfreebsd-fix.patch and alpha_ia64-sigsegv.patch
+ from ticket 177.
+ * Adrian Knoth fix for linux cycle.h (ticket 188).
+ * In JackCoreAudioDriver, fix an issue when no value is given for input.
+
+* 1.9.5 (2010-02-12)
+
+ * Dynamic choice of maximum port number.
+ * More robust sample rate change handling code in JackCoreAudioDriver.
+ * Devin Anderson patch for Jack FFADO driver issues with lost MIDI bytes
+ between periods (and more).
+ * Fix port_rename callback: now both old name and new name are given as
+ parameters.
+ * Special code in JackCoreAudio driver to handle completely buggy Digidesign
+ CoreAudio user-land driver.
+ * Ensure that client-side message buffer thread calls thread_init callback
+ if/when it is set by the client (backport of JACK1 rev 3838).
+ * Check dynamic port-max value.
+ * Fix JackCoreMidiDriver::ReadProcAux when ring buffer is full (thanks Devin
+ Anderson).
+ * Josh Green ALSA driver capture only patch.
+ * When threads are cancelled, the exception has to be rethrown.
+ * Use a QUIT notification to properly quit the server channel, the server
+ channel thread can then be 'stopped' instead of 'canceled'.
+ * Mario Lang alsa_io time calculation overflow patch. Shared memory manager
+ was calling abort in case of fatal error, now return an error in caller.
+ * Change JackEngineProfiling and JackAudioAdapterInterface gnuplot scripts
+ to output SVG instead of PDF.
+
+* 1.9.4 (2009-11-19)
+
+ * Solaris boomer backend now working in capture or playback only mode.
+ * Add a -G parameter in CoreAudio backend (the computation value in RT
+ thread expressed as percent of period).
+ * Use SNDCTL_DSP_SYNCGROUP/SNDCTL_DSP_SYNCSTART API to synchronize input and
+ output in Solaris boomer backend.
+ * Big endian bug fix in memops.c.
+ * Fix issues in JackNetDriver::DecodeTransportData and
+ JackNetDriver::Initialize.
+ * Correct CPU timing in JackNetDriver, now take cycle begin time after Read.
+ * Simplify transport in NetJack2: master only can control transport.
+ * Change CoreAudio notification thread setup for OSX Snow Leopard.
+ * Correct server temporary mode: now set a global and quit after
+ server/client message handling is finished.
+ * Add a string parameter to server ==> client notification, add a new
+ JackInfoShutdownCallback type.
+ * CoreAudio backend now issue a JackInfoShutdownCallback when an
+ unrecoverable error is detected (sampling rate change, stream
+ configuration change).
+ * Correct jackdmp.cpp (failures case were not correct..).
+ * Improve JackCoreAudioDriver code.
+ * Raise default port number to 2048.
+ * Correct JackProcessSync::LockedTimedWait.
+ * Correct JACK_MESSAGE_SIZE value, particularly in OSX RPC code.
+ * Now start server channel thread only when backend has been started (so in
+ JackServer::Start).
+ * Should solve race conditions at start time.
+ * jack_verbose moved to JackGlobals class.
+ * Improve aggregate device management in JackCoreAudioDriver: now a
+ "private" device only and cleanup properly.
+ * Aggregate device code added to JackCoreAudioAdapter.
+ * Implement "hog mode" (exclusive access of the audio device) in
+ JackCoreAudioDriver.
+ * Fix jack_set_sample_rate_callback to have he same behavior as in JACK1.
+ * Dynamic system version detection in JackCoreAudioDriver to either create
+ public or private aggregate device.
+ * In JackCoreAudioDriver, force the SR value to the wanted one *before*
+ creating aggregate device (otherwise creation will fail).
+ * In JackCoreAudioDriver, better cleanup of AD when intermediate open
+ failure.
+ * In JackCoreAudioDriver::Start, wait for the audio driver to effectively
+ start (use the MeasureCallback).
+ * In JackCoreAudioDriver, improve management of input/output channels: -1 is
+ now used internally to indicate a wanted max value.
+ * In JackCoreAudioDriver::OpenAUHAL, correct stream format setup and
+ cleanup.
+ * Correct crash bug in JackAudioAdapterInterface when not input is used in
+ adapter (temporary fix).
+ * Sync JackCoreAudioAdapter code on JackCoreAudioDriver one.
+ * JACK_SCHED_POLICY switched to SCHED_FIFO.
+ * Now can aggregate device that are themselves AD.
+ * No reason to make jack_on_shutdown deprecated, so revert the incorrect
+ change.
+ * Thread AcquireRealTime and DropRealTime were (incorrectly) using fThread
+ field.
+ * Use pthread_self()) (or GetCurrentThread() on Windows) to get the calling
+ thread.
+ * Correctly save and restore RT mode state in freewheel mode.
+ * Correct freewheel code on client side.
+ * Fix AcquireRealTime and DropRealTime: now distinguish when called from
+ another thread (AcquireRealTime/DropRealTime) and from the thread itself
+ (AcquireSelfRealTime/DropSelfRealTime).
+ * Correct JackPosixThread::StartImp: thread priority setting now done in the
+ RT case only.
+ * Correct JackGraphManager::GetBuffer for the "client loop with one
+ connection" case: buffer must be copied.
+ * Correct JackInfoShutdownCallback prototype, two new
+ JackClientProcessFailure and JackClientZombie JackStatus code.
+ * Correct JackCoreAudio driver when empty strings are given as -C, -P or -d
+ parameter.
+ * Better memory allocation error checking on client (library) side.
+ * Better memory allocation error checking in ringbuffer.c, weak import
+ improvements.
+ * Memory allocation error checking for jack_client_new and jack_client_open
+ (server and client side).
+ * Memory allocation error checking in server for RPC.
+ * Simplify server temporary mode: now use a JackTemporaryException.
+ * Lock/Unlock shared memory segments (to test...).
+ * Sync with JACK1 : -r parameter now used for no-realtime, realtime (-R) is
+ now default, usable backend given vie platform.
+ * In JackCoreAudio driver, (possibly) clock drift compensation when needed
+ in aggregated devices.
+ * In JackCoreAudio driver, clock drift compensation in aggregated devices
+ working.
+ * In JackCoreAudio driver, clock drift compensation semantic changed a bit:
+ when on, does not activate if not needed (same clock domain).
+ * Sync JackCoreAudioAdapter code with JackCoreAudioDriver.
+
+* 1.9.3 (2009-07-21)
+
+ * New JackBoomerDriver class for Boomer driver on Solaris.
+ * Add mixed 32/64 bits mode (off by default).
+ * Native MIDI backend (JackCoreMidiDriver, JackWinMMEDriver).
+ * In ALSA audio card reservation code, tries to open the card even if
+ reservation fails.
+ * Clock source setting on Linux.
+ * Add jackctl_server_switch_master API.
+ * Fix transport callback (timebase master, sync) issue when used after
+ jack_activate (RT thread was not running).
+ * D-Bus access for jackctl_server_add_slave/jackctl_server_remove_slave API.
+ * Cleanup "loopback" stuff in server.
+ * Torben Hohn fix for InitTime and GetMicroSeconds in JackWinTime.c.
+ * New jack_free function added in jack.h.
+ * Reworked Torben Hohn fix for server restart issue on Windows.
+ * Correct jack_set_error_function, jack_set_info_function and
+ jack_set_thread_creator functions.
+ * Correct JackFifo::TimedWait for EINTR handling.
+ * Move DBus based audio device reservation code in ALSA backend compilation.
+ * Correct JackTransportEngine::MakeAllLocating, sync callback has to be
+ called in this case also.
+ * NetJack2 code: better error checkout, method renaming.
+ * Tim Bechmann patch: hammerfall, only release monitor thread, if it has
+ been created.
+ * Tim Bechmann memops.c optimization patches.
+ * In combined --dbus and --classic compilation code, use PulseAudio
+ acquire/release code.
+ * Big rewrite of Solaris boomer driver, seems to work in duplex mode at
+ least.
+ * Loopback backend reborn as a dynamically loadable separated backend.
+
+* 1.9.2 (2009-02-11)
+
+ * Solaris version.
+ * New "profiling" tools.
+ * Rework the mutex/signal classes.
+ * Support for BIG_ENDIAN machines in NetJack2.
+ * D-BUS based device reservation to better coexist with PulseAudio on Linux.
+ * Add auto_connect parameter in netmanager and netadapter.
+ * Use Torben Hohn PI controler code for adapters.
+ * Client incorrect re-naming fixed : now done at socket and fifo level.
+ * Virtualize and allow overriding of thread creation function, to allow Wine
+ support (from JACK1).
+
+* 1.9.1 (2008-11-14)
+
+ * Fix jackctl_server_unload_internal.
+ * Filter SIGPIPE to avoid having client get a SIGPIPE when trying to access
+ a died server.
+ * Libjack shutdown handler does not "deactivate" (fActive = false) the
+ client anymore, so that jack_deactivate correctly does the job later on.
+ * Better isolation of server and clients system resources to allow starting
+ the server in several user account at the same time.
+ * Report ringbuffer.c fixes from JACK1.
+ * Client and library global context cleanup in case of incorrect shutdown
+ handling (that is applications not correctly closing client after server
+ has shutdown).
+ * Use JACK_DRIVER_DIR variable in internal clients loader.
+ * For ALSA driver, synchronize with latest JACK1 memops functions.
+ * Synchronize JACK2 public headers with JACK1 ones.
+ * Implement jack_client_real_time_priority and
+ jack_client_max_real_time_priority API.
+ * Use up to BUFFER_SIZE_MAX frames in midi ports, fix for ticket #117.
+ * Cleanup server starting code for clients directly linked with
+ libjackserver.so.
+ * JackMessageBuffer was using thread "Stop" scheme in destructor, now use
+ the safer thread "Kill" way.
+ * Synchronize ALSA backend code with JACK1 one.
+ * Set default mode to 'slow' in JackNetDriver and JackNetAdapter.
+ * Simplify audio packet order verification.
+ * Fix JackNetInterface::SetNetBufferSize for socket buffer size computation
+ and JackNetMasterInterface::DataRecv if synch packet is received, various
+ cleanup.
+ * Better recovery of network overload situations, now "resynchronize" by
+ skipping cycles.".
+ * Support for BIG_ENDIAN machines in NetJack2.
+ * Support for BIG_ENDIAN machines in NetJack2 for MIDI ports.
+ * Support for "-h" option in internal clients to print the parameters.
+ * In NetJack2, fix a bug when capture or playback only channels are used.
+ * Add a JACK_INTERNAL_DIR environment variable to be used for internal
+ clients.
+ * Add a resample quality parameter in audioadapter.
+ * Now correctly return an error if JackServer::SetBufferSize could not
+ change the buffer size (and was just restoring the current one).
+ * Use PRIu32 kind of macro in JackAlsaDriver again.
+ * Add a resample quality parameter in netadapter.
+
+* 1.9.0 (2008-03-18)
+
+ * Waf based build system: Nedko Arnaudov, Grame for preliminary OSX support.
+ * Control API, dbus based server control access: Nedko Arnaudov, Grame.
+ * NetJack2 components (in progress): jack_net backend, netmanager,
+ audioadapter, netadapter : Romain Moret, Grame.
+ * Code restructuring to help port on other architectures: Michael Voigt.
+ * Code cleanup/optimization: Tim Blechmann.
+ * Improve handling of server internal clients that can now be
+ loaded/unloaded using the new server control API: Grame.
+ * A lot of bug fix and improvements.
+
+* 0.72 (2008-04-10)
+
+* 0.71 (2008-02-14)
+
+ * Add port register/unregister notification in JackAlsaDriver.
+ * Correct JACK_port_unregister in MIDI backend.
+ * Add TimeCallback in JackDebugClient class.
+ * Correct jack_get_time propotype.
+ * Correct JackSocketClientChannel::ClientClose to use ServerSyncCall instead
+ of ServerAsyncCall.
+ * Better documentation in jack.h. libjackdmp.so renamed to
+ libjackservermp.so and same for OSX framework.
+ * Define an internal jack_client_open_aux needed for library wrapper feature.
+ * Remove unneeded jack_port_connect API.
+ * Correct jack_port_get_connections function (should return NULL when no
+ connections).
+ * In thread model, execute a dummy cycle to be sure thread has the correct
+ properties (ensure thread creation is finished).
+ * Fix engine real-time notification (was broken since ??).
+ * Implements wrapper layer.
+ * Correct jack_port_get_total_latency.
+ * Correct all backend playback port latency in case of "asynchronous" mode
+ (1 buffer more).
+ * Add test for jack_cycle_wait, jack_cycle_wait and jack_set_process_thread
+ API.
+ * RT scheduling for OSX thread (when used in dummy driver).
+ * Add -L (extra output latency in aynchronous mode) in CoreAudio driver.
+ * New JackLockedEngine decorator class to serialize access from ALSA Midi
+ thread, command thread and in-server clients.
+ * Use engine in JackAlsaDriver::port_register and
+ JackAlsaDriver::port_unregister.
+ * Fix connect notification to deliver *one* notification only.
+ * Correct JackClient::Activate so that first kGraphOrderCallback can be
+ received by the client notification thread.
+ * New jack_server_control client to test notifications when linked to the
+ server library.
+ * Synchronise transport.h with latest jackd version (Video handling).
+ * Transport timebase fix.
+ * Dmitry Baikov patch for alsa_rawmidi driver.
+ * Pieter Palmers patch for FFADO driver.
+ * Add an Init method for blocking drivers to be decorated using
+ JackThreadedDriver class.
+ * Correct PortRegister, port name checking must be done on server side.
+ * Correct a missing parameter in the usage message of jack_midiseq.
+ * New SetNonBlocking method for JackSocket.
+ * Correct a dirty port array issue in JackGraphManager::GetPortsAux.
+
+* 0.70 (2008-01-24)
+
+ * Updated API to match jack 0.109.0 version.
+ * Update in usx2y.c and JackPort.cpp to match jackd 0.109.2.
+ * Latest jack_lsp code from jack SVN.
+ * Add jack_mp_thread_wait client example.
+ * Add jack_thread_wait client example.
+ * Remove checking thread in CoreAudio driver, better device state change
+ recovery strategy: the driver is stopped and restarted.
+ * Move transport related methods from JackEngine to JackServer.
+
+
+ * Tim Blechmann sse optimization patch for JackaudioPort::MixAudioBuffer,
+ use of Apple Accelerate framework on OSX.
+ * Remove use of assert in JackFifo, JackMachSemaphore, and
+ JackPosixSemaphore: print an error instead.
+ * Correct "server_connect": close the communication channel.
+ * More robust external API.
+ * Use SetAlias for port naming.
+ * Use jackd midi port naming scheme.
+ * Notify ports unregistration in JackEngine::ClientCloseAux.
+ * Fix in JackClient::Error(): when RT thread is failing and calling
+ Shutdown, Shutdown was not desactivating the client correctly.
+
+* 0.69
+
+ * On OSX, use CFNotificationCenterPostNotificationWithOptions with
+ kCFNotificationDeliverImmediately | kCFNotificationPostToAllSessions for
+ server ==> JackRouter plugin notification.
+ * On OSX, use jack server name in notification system.
+ * Correct fPeriodUsecs computation in JackAudioDriver::SetBufferSize and
+ JackAudioDriver::SetSampleRate.
+ * Correct JackMachNotifyChannel::ClientNotify.
+ * Correct bug in CoreAudio driver sample rate management.
+ * Add a sample_rate change listener in CoreAudio driver.
+ * Correct sample_rate management in JackCoreAudioDriver::Open.
+ * Better handling in sample_rate change listener.
+ * Pieter Palmers FFADO driver and scons based build.
+ * Pieter Palmers second new build system: scons and Makefile based build.
+ * Tim Blechmann scons patch.
+ * Change string management for proper compilation with gcc 4.2.2.
+ * JackLog cleanup.
+ * Cleanup in CoreAudio driver.
+ * Tim Blechmann patch for JackGraphManager::GetPortsAux memory leak, Tim
+ Blechmann patch for scons install.
+ * Dmitry Baikov MIDI patch: alsa_seqmidi and alsa_rammidi drivers.
+ * CoreAudio driver improvement: detect and notify abnormal situations
+ (stopped driver in case of SR change...).
+
+* 0.68 (2007-10-16)
+
+ * Internal loadable client implementation, winpipe version added.
+ * Reorganize jack headers.
+ * Improve Linux install/remove scripts.
+ * Use LIB_DIR variable for 64 bits related compilation (drivers location).
+ * More generic Linux script.
+ * Correct jack_acquire_real_time_scheduling on OSX.
+ * Merge of Dmitry Baikov MIDI branch.
+ * Correct JackGraphManager::GetPortsAux to use port type.
+ * Remove JackEngineTiming class: code moved in JackEngineControl.
+ * Add midiseq and midisine examples.
+ * Cleanup old zombification code.
+ * Linux Makefile now install jack headers.
+ * Use of JACK_CLIENT_DEBUG environment variable to activate debug client
+ mode.
+ * Definition of JACK_LOCATION variable using -D in the Makefile.
+ * Restore jack 0.103.0 MIDI API version.
+ * Fix a bug in freewheel management in async mode: drivers now receive the
+ kStartFreewheelCallback and kStopFreewheelCallback notifications.
+ * Server and user directory related code moved in a JackTools file.
+ * Client name rewriting to remove path characters (used in fifo naming).
+ * Correct ALSA driver Attach method: internal driver may have changed the
+ buffer_size and sample_rate values.
+ * Add JackWinSemaphore class.
+ * Add an implementation for obsolete jack_internal_client_new and
+ jack_internal_client_close.
+ * Add missing jack_port_type_size.
+ * Use of JackWinSemaphore instead of JackWinEvent for inter-process
+ synchronization.
+ * Correct types.h for use with MINGW on Windows.
+ * Move OSX start/stop notification mechanism in Jackdmp.cpp.
+ * Correct CheckPort in JackAPI.cpp.
+
+* 0.67 (2007-09-28)
+
+ * Correct jack_client_open "status" management.
+ * Rename server_name from "default" to "jackdmp_default" to avoid conflict
+ with regular jackd server.
+ * Fix a resource leak issue in JackCoreAudioDriver::Close().
+ * Better implement "jack_client_open" when linking a client with the server
+ library.
+ * Correct "jack_register_server" in shm.c.
+ * Add missing timestamps.c and timestamps.h files.
+ * Correctly export public headers in OSX frameworks.
+ * Suppress JackEngine::ClientInternalCloseIm method.
+ * Use .jackdrc file (instead of .jackdmprc).
+ * Install script now creates a link "jackd ==> jackdmp" so that automatic
+ launch can work correctly.
+ * Paul Davis patch for -r (--replace-registry) feature.
+ * Internal loadable client implementation.
+ * Fix JackEngine::Close() method.
+ * Windows JackRouter.dll version 0.17: 32 integer sample format.
+
+* 0.66 (2007-09-06)
+
+ * Internal cleanup.
+ * Windows JackRouter.dll version 0.16: use of "jack_client_open" API to
+ allow automatic client renaming, better Windows VISTA support, new
+ JackRouter.ini file.
+
+* 0.65 (2007-08-30)
+
+ * Fix backend port alias management (renaming in system:xxx).
+ * Fix a bug in JackLibClient::Open introduced when adding automatic client
+ renaming.
+ * Fix a bug in jack_test.
+ * Correct JackShmMem destructor.
+ * Correct end case in JackClient::Execute.
+ * Correct JackMachSemaphore::Disconnect.
+ * Implement server temporary (-T) mode.
+ * Make "Rename" a method of JackPort class, call it from driver Attach
+ method.
+ * Server/library protocol checking implementation.
+
+* 0.64 (2007-07-26)
+
+ * Checking in the server to avoid calling the clients if no callback are
+ registered.
+ * Correct deprecated jack_set_sample_rate_callback to return 0 instead of
+ -1.
+ * Dmitry Baikov buffer size patch.
+ * Correct notification for kActivateClient event. Correct
+ JackEngine::ClientCloseAux (when called from
+ JackEngine::ClientExternalOpen).
+ * Correct JackWinEvent::Allocate.
+ * Automatic client renaming.
+ * Add "systemic" latencies management in CoreAudio driver.
+ * Automatic server launch.
+ * Removes unneeded 'volatile' for JackTransportEngine::fWriteCounter.
+
+* 0.63 (2007-04-05)
+
+ * Correct back JackAlsaDriver::Read method.
+ * Dmitry Baikov patch for JackGraphManager.cpp. Merge JackGraphManager Remove
+ and Release method in a unique Release method.
+ * Dmitry Baikov jackmp-time patch : add jack_get_time, jack_time_to_frames,
+ jack_frames_to_time. Add missing -D__SMP__in OSX project. Add new
+ jack_port_set_alias, jack_port_unset_alias and jack_port_get_aliases API.
+ * Steven Chamberlain patch to fix jack_port_by_id export.
+ * Steven Chamberlain patch to fix jack_port_type. Test for jack_port_type
+ behaviour in jack_test.cpp tool. Add jack_set_client_registration_callback
+ API. Add "callback exiting" and "jack_frame_time" tests in jack_test.
+
+* 0.62 (2007-02-16)
+
+ * More client debug code: check if the client is still valid in every
+ JackDebugClient method, check if the library context is still valid in
+ every API call.
+ * Uses a time out value of 10 sec in freewheel mode (like jack).
+ * More robust activation/deactivation code, especially in case of client
+ crash.
+ * New LockAllMemory and UnlockAllMemory functions.
+ * Use pthread_attr_setstacksize in JackPosixThread class.
+ * Add Pieter Palmers FreeBob driver.
+ * Thibault LeMeur ALSA driver patch.
+ * Thom Johansen fix for port buffer alignment issues.
+ * Better error checking in PortAudio driver.
+
+* 0.61 (2006-12-18)
+
+ * Tom Szilagyi memory leak fix in ringbuffer.c.
+ * Move client refnum management in JackEngine.
+ * Shared_ports renamed to shared_graph.
+ * Add call to the init callback (set up using the
+ jack_set_thread_init_callback API) in Real-Time and Notification threads.
+ * Define a new 'kActivateClient' notification.
+ * New server/client data transfer model to fix a 64 bits system bug.
+ * Fix a device name reversal bug in ALSA driver.
+ * Implement thread.h API.
+
+* 0.60 (2006-11-23)
+
+ * Improve audio driver synchronous code to better handle possible time-out
+ cases.
+ * Correct JackWinEnvent::Allocate (handle the ERROR_ALREADY_EXISTS case).
+ * Correct JackEngine::ClientExternalNew.
+
+* 0.59 (2006-09-22)
+
+ * Various fixes in Windows version.
+ * Signal handling in the Windows server.
+ * Improved JackRouter ASIO/Jack bridge on Windows.
+ * Rename global "verbose" in "jack_verbose" to avoid symbol clash with
+ PureData.
+ * Add a new cpu testing/loading client.
+ * Correct server SetBufferSize in case of failure.
+ * Correct PortAudio driver help.
+ * Use -D to setup ADDON_DIR on OSX and Linux.
+ * Synchronize ALSA backend with jack one.
+
+* 0.58 (2006-09-06)
+
+ * Correct a bug introduced in 0.55 version that was preventing coreaudio
+ audio inputs to work.
+ * Restructured code structure after import on svn.
+
+* 0.57
+
+ * Correct bug in Mutex code in JackClientPipeThread::HandleRequest.
+ * ASIO JackRouter driver supports more applications.
+ * Updated HTML documentation.
+ * Windows dll binaries are compiled in "release" mode.
+
+* 0.56
+
+ * Correct SetBufferSize in coreaudio driver, portaudio driver and
+ JackServer.
+ * Real-time notifications for Windows version.
+ * In the PortAudio backend, display more informations for installed WinMME,
+
+ * DirectSound and ASIO drivers.
+
+* 0.55
+
+ * Windows version.
+ * Correct management of monitor ports in ALSA driver.
+ * Engine code cleanup.
+ * Apply Rui patch for more consistent parameter naming in coreaudio driver.
+ * Correct JackProcessSync::TimedWait: time-out was not computed correctly.
+ * Check the return code of NotifyAddClient in JackEngine.
+
+* 0.54
+
+ * Use the latest shm implementation that solve the uncleaned shm segment
+ problem on OSX.
+ * Close still opened file descriptors (report from Giso Grimm). Updated html
+ documentation.
+
+* 0.53
+
+ * Correct JackPilotMP tool on OSX.
+ * Correct CoreAudio driver for half duplex cases.
+ * Fix a bug in transport for "unactivated" clients.
+ * Fix a bug when removing "unactivated" clients from the server. Tested on
+ Linux/PPC.
+
+* 0.52
+
+ * Universal version for Mac Intel and PPC.
+ * Improvement of CoreAudio driver for half duplex cases.
+
+* 0.51
+
+ * Correct bugs in transport API implementation.
+
+* 0.50
+
+ * Transport API implementation.
+
+* 0.49
+
+ * Internal connection manager code cleanup.
+
+* 0.48
+
+ * Finish software monitoring implementation for ALSA and CoreAudio drivers.
+ * Simpler shared library management on OSX.
+
+* 0.47
+
+ * More fix for 64 bits compilation.
+ * Correct ALSA driver.
+ * Create a specific folder for jackdmp drivers.
+ * Use /dev/shm as default for fifo and sockets.
+ * "Install" and "Remove" script for smoother use with regular jack.
+
+* 0.46
+
+ * Fix a bug in loop management.
+ * Fix a bug in driver loading/unloading code.
+ * Internal code cleanup for better 64 bits architecture support.
+ * Compilation on OSX/Intel.
+ * Add the -d option for coreaudio driver (display CoreAudio devices internal
+ name).
+
+* 0.45
+
+ * Script to remove the OSX binary stuff.
+ * Correct an export symbol issue that was preventing QjackCtl to work on OSX.
+ * Fix the consequences of the asynchronous semantic of
+ connections/disconnections.
+
+* 0.44
+
+ * Patch from Dmitry Daikov: use clock_gettime by default for timing.
+ * Correct dirty buffer issue in CoreAudio driver. Updated doc.
+
+* 0.43
+
+ * Correct freewheel mode.
+ * Optimize ALSA and coreaudio drivers.
+ * Correct OSX installation script.
+
+* 0.42
+
+ * Patch from Nick Mainsbridge.
+ * Correct default mode for ALSA driver.
+ * Correct XCode project.
+
+* 0.41
+
+ * Add the ALSA MMAP_COMPLEX support for ALSA driver.
+ * Patch from Dmitry Daikov: compilation option to choose between
+ "get_cycles" and "gettimeofday" to measure timing.
+
+* 0.4
+
+ * Linux version, code cleanup, new -L parameter to activate the loopback
+ driver (see Documentation), a number of loopback ports can be defined.
+ Client validation tool.
+
+* 0.31
+
+ * Correct bug in mixing code that caused Ardour + jackdmp to crash...
+
+* 0.3
+
+ * Implement client zombification + correct feedback loop management + code
+ cleanup.
+
+* 0.2
+
+ * Implements jack_time_frame, new -S (sync) mode: when "synch" mode is
+ activated, the jackdmp server waits for the graph to be finished in the
+ current cycle before writing the output buffers. Note: To experiment with
+ the -S option, jackdmp must be launched in a console.
+
+* 0.1
+
+ * First published version
+
diff --git a/jack2-src/jack2-master/README.rst b/jack2-src/jack2-master/README.rst
new file mode 100644
index 0000000000..79d4465654
--- /dev/null
+++ b/jack2-src/jack2-master/README.rst
@@ -0,0 +1,40 @@
+`JACK2 `_
+################################
+
+.. image:: https://travis-ci.org/jackaudio/jack2.svg?branch=master
+ :target: https://travis-ci.org/jackaudio/jack2
+.. image:: https://repology.org/badge/tiny-repos/jack-audio-connection-kit.svg
+ :target: https://repology.org/metapackage/jack-audio-connection-kit/versions
+
+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 at 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.
+
+For further information, see the JACK `homepage `_ and `wiki `_. There are also the #jack and #lad chat channels on `Libera Chat IRC `_.
+
diff --git a/jack2-src/jack2-master/README_NETJACK2 b/jack2-src/jack2-master/README_NETJACK2
new file mode 100644
index 0000000000..85be9ab402
--- /dev/null
+++ b/jack2-src/jack2-master/README_NETJACK2
@@ -0,0 +1,72 @@
+-------------------------------
+NetJack2 for Jack2
+-------------------------------
+
+
+This release includes a version of netjack designed for jack2. Indeed, the original concept has been completely redesigned to better fit to the Jack2 architecture, but also in order to provide additional capabilities, and ultimately a greater robustness.
+
+This document describes the major changes between those two systems, then a simple how-to for setting up a basic usage of 'netjack2'.
+
+
+-------------------------------
+Major changes and architecture
+-------------------------------
+
+
+The biggest difference between netjack1 and netjack2 is the way of slicing audio and midi streams into network packets. For one audio cycle, netjack1 used to take all audio and midi buffers (one per channel), put butt all of them, then send it over the network. The problem is that a network packet has a fixed maximum size, depending on the network infrastructure (for 100mb, it reaches 1500bytes - MTU of the network). The solution is then to slice those buffers into smaller ones, and then send as many packets as we need. This cutting up can be done by network equipment, but it's more efficient and secure to include it in the software data management. Still this slicing brings another issue : all the packets are not pleased with any emission order and are unfortunately received in a random order, thanks to UDP. So we can't deal with data as it comes, we need to re-bufferize incoming streams in order to rebuild complete audio buffers.
+
+In netjack2, the main idea is to make this slicing depending on the network capabilities. If we can put only 128 complete audio frames (128 samples for all audio channels) in a network packet, the elementary packet will so carry 128 frames, and in one cycle, we will transmit as many packet as we need. We take the example of 128 frames because it's the current value for 2 channels. This value is determined by taking the maximum 'power of 2' frames we can put in a packet. If we take 2 channels, 4 bytes per sample (float values), we get 8 bytes per frame, with 128 frames, we now have 1024 bytes, so we can put these 1024 bytes in one packet, and add a small header which identify the packet. This technique allows to separate the packets (in time) so they can be received in the order they have been emitted. If the master is running at 512 frames per second, four audio packets are sent per cycle and the slave deals with them as they arrive. With gigabytes networks, the MTU is larger, so we can put more data in one packet (in this example, we can even put the complete cycle in one packet).
+
+For midi data, netjack1 used to send the whole buffer, in this example, 512 frames * 4 bytes per sample and per midi port. Those 2048 bytes are in 99% of the time filled to a few bytes, but rarely more. This means that if we have 2 audio and 2 midi channels to transmit, everything happens as if we had 4 audio channels, which is quite a waste of bandwidth. In netjack2, the idea is to take into account that fact, by sending only the useful bytes, and not more. It's completely inappropriate to overload the network with useless data. So we now have : 99% of the time one midi packet (of a few dozen of bytes), followed by four audio packets (in this example).
+
+This way of separating audio and midi is quite important. We deal here with network transmissions, and also need to be 'realtime'. We need a system which allow to carry as many audio and midi data streams as we need and can, as if the distant computer was in fact a simple jack client. With all those constraints, we can't avoid packets loss. The better thing to do is to deal with it. But to loose an audio packet is different from skipping a midi one. Indeed, an audio loss leads to audio click, or undesirable, but very short side effect. Whereas a midi data loss can be completely disastrous. Imagine that we play some notes, with sustain, and we loose the sustain 0 value, which stops the effect. The sustain keeps going on on all following notes until the next 'sustain off' event. A simple missing byte can put all the midi system offside (that's the purpose of all the big PANIC buttons on midi software...). That's why we need to separate audio (more than one per cycle) from midi (one packet at 99% of the time). If we loose an audio packet, we probably still have an available midi packet, so we can use what we received, even if some audio is missing.
+
+Those audio and midi packets are preceded by a synchronization packet, which will make the slave directly synchronized on the master's cycle rhythm. This packet also carries transport data. Thus it's actually possible to synchronize also transport. This feature goes a little further than in netjack1. The idea here is to make every computer of the network fully synchronized on the master's transport. That means the master needs to know the state of every slow sync clients of each of its slaves. The master can now manage the transport state (especially the 'rolling' state) of each slave thus the main transport waits for the last slow sync client before turning 'rolling'. By doing this, the transport can start (roll) in the same cycle for every computers managed by the master.
+
+
+The second main difference between netjack1 and netjack2 is the way the two computers (master and slave) synchronize their parameters and launch. In netjack1, once the slave configured (by the command line) and launched, it was waiting for the first incoming packet to synchronize (launch its first audio cycle) then run. The two computers needed to be configured separately but with the same parameters to run correctly.
+
+In netjack2, the only thing you have to set for the slave is its number of in/out midi and audio channels. No more need to choose and set parameters depending on the master, they are automatically determined and communicated to the slave. This first synchronization step uses a multicast communication, no more need to know by advance all the IP addresses. The slave says on a multicast address "hey, I'm available". A master get the message, and communicate parameterers to the slave. Once synchronization done, data transfers can start. Moreover, the master being still listening on the multicast address, it can catch other slaves and manage them (create a jack client to communicate with the slave, and neatly close everything when the slave is gone).
+
+The loaded internal client is no longer only an interface for the slave, like in netjack1. It's now called 'network manager', it doesn't deal with audio or midi, just with some kind of 'network logistical messages'. The manager automatically create a new internal client as soon as a new slave is seen on the network (by sending messages on the multicast address the manager is listening on). This manager is also able to remove one of its internal client as soon as a slave has left the network. This conception allow a complete separation of audio exchanges from parameterers and management.
+
+The 'unloading' of the internal client (the manager) will cause a full cleaning of the infrastructure. The jack clients are all removed from the server, the slave are all turned available again, ready to be caught by another master etc. When a slave quits, it's also automatically removed from the manager's slaves list.
+
+
+-------------------------------
+How-to use this ?
+-------------------------------
+
+
+Netjackmp is very simple to use. On the master's side, an internal client deals with the slaves, and the slaves themselves are classical jack servers running under a 'network audio driver'. The difference between the two versions is that the master now has a manager, which takes care of the slaves, while listening on the multicast address and create a new master as soon as a slave is available. But everything is transparent to the user, that's why it uses multicast (someone says "hello", and anyone who wants to hear it just has to listen).
+
+So, just compile and install Jack2 as you are used to, on linux, using './waf configure', './waf' and './waf install' as root. On macosx, you can use the xcode project. On Windows, you can use the Code::Blocks workspace (you also have a small script to make an all in one installer).
+
+On the master, just launch a classical jack server, the period size doesn't matter. Then, load the network manager using jack_load :
+
+'jack_load netmanager'
+
+This will load the internal client, which will wait for an available slave (see the message window on QjackCtl - or the console output). If you want to listen to a specific multicast socket, you can add some options. To specify a complete command line, you can use :
+
+'jack_load netmanager -i"-a xxx.xxx.xxx.xxx -p udp_port"'
+
+If you set another multicast address or port, you have to set the same on the slave's side. The default value should be working in many cases.
+
+On the slave, just launch a new jack server using :
+
+'jackd -R -d net'
+
+As in a standard backend in Jack2, you can use '-S' (synchronous mode). The asynchronous mode (without '-S') allows to send the computed data during the next cycle. In synchronous mode, data are sent back at the end of the cycle, that means after the process. You can specify some options, like '-n name' (will give a name to the slave, default is the network hostname), '-C input_ports' (the number of master-->slave channels), '-P output_ports' (the number of slave-->master channels), default is 2 ; or '-i midi_in_ports' and '-o midi_out_ports', default is 0. If you set multicast address or port on the master, you can add '-a xxx.xxx.xxx.xxx' and '-p udp_port'.
+
+Latency (-n) is the number of buffers added in network transmission. Zero is for cases when the audio buffers can be sent to the other size, transformed by the process and returned in the same cycle. By default latency is 5 buffers.
+
+For additional information, you can go to the NetJack2 Wiki at : http://trac.jackaudio.org/wiki/WalkThrough/User/NetJack2.
+
+
+-------------------------------
+What's next ?
+-------------------------------
+
+The development of netjack2 continues and some things are always moving... If you use it, please report encountered bugs, ideas or anything you think about.
+
+If you have any question, you can subscribe the jackaudio developers mailing list at http://www.jackaudio.org/ or join the IRC channel '#jack' on FreeNode.
diff --git a/jack2-src/jack2-master/android/Android.mk b/jack2-src/jack2-master/android/Android.mk
new file mode 100644
index 0000000000..22177c227e
--- /dev/null
+++ b/jack2-src/jack2-master/android/Android.mk
@@ -0,0 +1,1323 @@
+#
+# jack-1.9.10
+#
+
+LOCAL_PATH := $(call my-dir)
+JACK_ROOT := $(call my-dir)/..
+SUPPORT_ALSA_IN_JACK := true
+SUPPORT_ANDROID_REALTIME_SCHED := false
+ifeq ($(TARGET_BOARD_PLATFORM),mrvl)
+ALSA_INCLUDES := vendor/marvell/external/alsa-lib/include
+else
+ALSA_INCLUDES := vendor/samsung/common/external/alsa-lib/include
+endif
+JACK_STL_LDFLAGS := -Lprebuilts/ndk/current/sources/cxx-stl/gnu-libstdc++/libs/$(TARGET_CPU_ABI) -lgnustl_static
+JACK_STL_INCLUDES := $(JACK_ROOT)/android/cxx-stl/gnu-libstdc++/libs/$(TARGET_CPU_ABI)/include \
+ prebuilts/ndk/current/sources/cxx-stl/gnu-libstdc++/libs/$(TARGET_CPU_ABI)/include \
+ prebuilts/ndk/current/sources/cxx-stl/gnu-libstdc++/include
+
+##########################################################
+# common
+##########################################################
+
+common_cflags := -O0 -g -Wall -fexceptions -fvisibility=hidden -DHAVE_CONFIG_H
+common_cflags += -Wno-unused -Wno-sign-compare -Wno-deprecated-declarations -Wno-cpp
+common_cppflags := -frtti -Wno-sign-promo -fcheck-new
+common_shm_cflags := -O0 -g -Wall -fexceptions -DHAVE_CONFIG_H -Wno-unused
+ifeq ($(TARGET_BOARD_PLATFORM),clovertrail)
+common_ldflags := -ldl
+else
+common_ldflags :=
+endif
+common_c_includes := \
+ $(JACK_ROOT) \
+ $(JACK_ROOT)/common \
+ $(JACK_ROOT)/common/jack \
+ $(JACK_ROOT)/android \
+ $(JACK_ROOT)/linux \
+ $(JACK_ROOT)/linux/alsa \
+ $(JACK_ROOT)/posix \
+ $(JACK_STL_INCLUDES)
+
+# copy common source file
+common_libsource_server_dir = .server
+common_libsource_client_dir = .client
+
+$(shell rm -rf $(LOCAL_PATH)/$(common_libsource_server_dir))
+$(shell rm -rf $(LOCAL_PATH)/$(common_libsource_client_dir))
+$(shell mkdir $(LOCAL_PATH)/$(common_libsource_server_dir))
+$(shell mkdir $(LOCAL_PATH)/$(common_libsource_client_dir))
+
+$(shell cp -f $(LOCAL_PATH)/../common/JackActivationCount.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackActivationCount.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackAPI.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackAPI.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackClient.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackClient.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackConnectionManager.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackConnectionManager.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/ringbuffer.c $(LOCAL_PATH)/$(common_libsource_server_dir)/ringbuffer.c)
+$(shell cp -f $(LOCAL_PATH)/JackError.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackError.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackException.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackException.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackFrameTimer.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackFrameTimer.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackGraphManager.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackGraphManager.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackPort.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackPort.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackPortType.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackPortType.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackAudioPort.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackAudioPort.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackMidiPort.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackMidiPort.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackMidiAPI.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackMidiAPI.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackEngineControl.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackEngineControl.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackShmMem.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackShmMem.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackGenericClientChannel.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackGenericClientChannel.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackGlobals.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackGlobals.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackDebugClient.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackDebugClient.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackTransportEngine.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackTransportEngine.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/timestamps.c $(LOCAL_PATH)/$(common_libsource_server_dir)/timestamps.c)
+$(shell cp -f $(LOCAL_PATH)/../common/JackTools.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackTools.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackMessageBuffer.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackMessageBuffer.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackEngineProfiling.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackEngineProfiling.cpp)
+$(shell cp -f $(LOCAL_PATH)/JackAndroidThread.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackAndroidThread.cpp)
+$(shell cp -f $(LOCAL_PATH)/JackAndroidSemaphore.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackAndroidSemaphore.cpp)
+$(shell cp -f $(LOCAL_PATH)/../posix/JackPosixProcessSync.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackPosixProcessSync.cpp)
+$(shell cp -f $(LOCAL_PATH)/../posix/JackPosixMutex.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackPosixMutex.cpp)
+$(shell cp -f $(LOCAL_PATH)/../posix/JackSocket.cpp $(LOCAL_PATH)/$(common_libsource_server_dir)/JackSocket.cpp)
+$(shell cp -f $(LOCAL_PATH)/../linux/JackLinuxTime.c $(LOCAL_PATH)/$(common_libsource_server_dir)/JackLinuxTime.c)
+
+$(shell cp -f $(LOCAL_PATH)/../common/JackActivationCount.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackActivationCount.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackAPI.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackAPI.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackClient.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackClient.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackConnectionManager.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackConnectionManager.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/ringbuffer.c $(LOCAL_PATH)/$(common_libsource_client_dir)/ringbuffer.c)
+$(shell cp -f $(LOCAL_PATH)/JackError.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackError.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackException.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackException.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackFrameTimer.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackFrameTimer.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackGraphManager.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackGraphManager.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackPort.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackPort.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackPortType.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackPortType.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackAudioPort.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackAudioPort.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackMidiPort.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackMidiPort.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackMidiAPI.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackMidiAPI.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackEngineControl.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackEngineControl.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackShmMem.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackShmMem.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackGenericClientChannel.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackGenericClientChannel.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackGlobals.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackGlobals.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackDebugClient.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackDebugClient.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackTransportEngine.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackTransportEngine.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/timestamps.c $(LOCAL_PATH)/$(common_libsource_client_dir)/timestamps.c)
+$(shell cp -f $(LOCAL_PATH)/../common/JackTools.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackTools.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackMessageBuffer.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackMessageBuffer.cpp)
+$(shell cp -f $(LOCAL_PATH)/../common/JackEngineProfiling.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackEngineProfiling.cpp)
+$(shell cp -f $(LOCAL_PATH)/JackAndroidThread.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackAndroidThread.cpp)
+$(shell cp -f $(LOCAL_PATH)/JackAndroidSemaphore.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackAndroidSemaphore.cpp)
+$(shell cp -f $(LOCAL_PATH)/../posix/JackPosixProcessSync.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackPosixProcessSync.cpp)
+$(shell cp -f $(LOCAL_PATH)/../posix/JackPosixMutex.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackPosixMutex.cpp)
+$(shell cp -f $(LOCAL_PATH)/../posix/JackSocket.cpp $(LOCAL_PATH)/$(common_libsource_client_dir)/JackSocket.cpp)
+$(shell cp -f $(LOCAL_PATH)/../linux/JackLinuxTime.c $(LOCAL_PATH)/$(common_libsource_client_dir)/JackLinuxTime.c)
+
+common_libsource_server := \
+ $(common_libsource_server_dir)/JackActivationCount.cpp \
+ $(common_libsource_server_dir)/JackAPI.cpp \
+ $(common_libsource_server_dir)/JackClient.cpp \
+ $(common_libsource_server_dir)/JackConnectionManager.cpp \
+ $(common_libsource_server_dir)/ringbuffer.c \
+ $(common_libsource_server_dir)/JackError.cpp \
+ $(common_libsource_server_dir)/JackException.cpp \
+ $(common_libsource_server_dir)/JackFrameTimer.cpp \
+ $(common_libsource_server_dir)/JackGraphManager.cpp \
+ $(common_libsource_server_dir)/JackPort.cpp \
+ $(common_libsource_server_dir)/JackPortType.cpp \
+ $(common_libsource_server_dir)/JackAudioPort.cpp \
+ $(common_libsource_server_dir)/JackMidiPort.cpp \
+ $(common_libsource_server_dir)/JackMidiAPI.cpp \
+ $(common_libsource_server_dir)/JackEngineControl.cpp \
+ $(common_libsource_server_dir)/JackShmMem.cpp \
+ $(common_libsource_server_dir)/JackGenericClientChannel.cpp \
+ $(common_libsource_server_dir)/JackGlobals.cpp \
+ $(common_libsource_server_dir)/JackDebugClient.cpp \
+ $(common_libsource_server_dir)/JackTransportEngine.cpp \
+ $(common_libsource_server_dir)/timestamps.c \
+ $(common_libsource_server_dir)/JackTools.cpp \
+ $(common_libsource_server_dir)/JackMessageBuffer.cpp \
+ $(common_libsource_server_dir)/JackEngineProfiling.cpp \
+ $(common_libsource_server_dir)/JackAndroidThread.cpp \
+ $(common_libsource_server_dir)/JackAndroidSemaphore.cpp \
+ $(common_libsource_server_dir)/JackPosixProcessSync.cpp \
+ $(common_libsource_server_dir)/JackPosixMutex.cpp \
+ $(common_libsource_server_dir)/JackSocket.cpp \
+ $(common_libsource_server_dir)/JackLinuxTime.c
+
+common_libsource_client := \
+ $(common_libsource_client_dir)/JackActivationCount.cpp \
+ $(common_libsource_client_dir)/JackAPI.cpp \
+ $(common_libsource_client_dir)/JackClient.cpp \
+ $(common_libsource_client_dir)/JackConnectionManager.cpp \
+ $(common_libsource_client_dir)/ringbuffer.c \
+ $(common_libsource_client_dir)/JackError.cpp \
+ $(common_libsource_client_dir)/JackException.cpp \
+ $(common_libsource_client_dir)/JackFrameTimer.cpp \
+ $(common_libsource_client_dir)/JackGraphManager.cpp \
+ $(common_libsource_client_dir)/JackPort.cpp \
+ $(common_libsource_client_dir)/JackPortType.cpp \
+ $(common_libsource_client_dir)/JackAudioPort.cpp \
+ $(common_libsource_client_dir)/JackMidiPort.cpp \
+ $(common_libsource_client_dir)/JackMidiAPI.cpp \
+ $(common_libsource_client_dir)/JackEngineControl.cpp \
+ $(common_libsource_client_dir)/JackShmMem.cpp \
+ $(common_libsource_client_dir)/JackGenericClientChannel.cpp \
+ $(common_libsource_client_dir)/JackGlobals.cpp \
+ $(common_libsource_client_dir)/JackDebugClient.cpp \
+ $(common_libsource_client_dir)/JackTransportEngine.cpp \
+ $(common_libsource_client_dir)/timestamps.c \
+ $(common_libsource_client_dir)/JackTools.cpp \
+ $(common_libsource_client_dir)/JackMessageBuffer.cpp \
+ $(common_libsource_client_dir)/JackEngineProfiling.cpp \
+ $(common_libsource_client_dir)/JackAndroidThread.cpp \
+ $(common_libsource_client_dir)/JackAndroidSemaphore.cpp \
+ $(common_libsource_client_dir)/JackPosixProcessSync.cpp \
+ $(common_libsource_client_dir)/JackPosixMutex.cpp \
+ $(common_libsource_client_dir)/JackSocket.cpp \
+ $(common_libsource_client_dir)/JackLinuxTime.c
+
+server_libsource := \
+ ../common/JackAudioDriver.cpp \
+ ../common/JackTimedDriver.cpp \
+ ../common/JackMidiDriver.cpp \
+ ../common/JackDriver.cpp \
+ ../common/JackEngine.cpp \
+ ../common/JackExternalClient.cpp \
+ ../common/JackFreewheelDriver.cpp \
+ ../common/JackInternalClient.cpp \
+ ../common/JackServer.cpp \
+ ../common/JackThreadedDriver.cpp \
+ ../common/JackRestartThreadedDriver.cpp \
+ ../common/JackWaitThreadedDriver.cpp \
+ ../common/JackServerAPI.cpp \
+ ../common/JackDriverLoader.cpp \
+ ../common/JackServerGlobals.cpp \
+ ../common/JackControlAPI.cpp \
+ JackControlAPIAndroid.cpp \
+ ../common/JackNetTool.cpp \
+ ../common/JackNetInterface.cpp \
+ ../common/JackArgParser.cpp \
+ ../common/JackRequestDecoder.cpp \
+ ../common/JackMidiAsyncQueue.cpp \
+ ../common/JackMidiAsyncWaitQueue.cpp \
+ ../common/JackMidiBufferReadQueue.cpp \
+ ../common/JackMidiBufferWriteQueue.cpp \
+ ../common/JackMidiRawInputWriteQueue.cpp \
+ ../common/JackMidiRawOutputWriteQueue.cpp \
+ ../common/JackMidiReadQueue.cpp \
+ ../common/JackMidiReceiveQueue.cpp \
+ ../common/JackMidiSendQueue.cpp \
+ ../common/JackMidiUtil.cpp \
+ ../common/JackMidiWriteQueue.cpp \
+ ../posix/JackSocketServerChannel.cpp \
+ ../posix/JackSocketNotifyChannel.cpp \
+ ../posix/JackSocketServerNotifyChannel.cpp \
+ ../posix/JackNetUnixSocket.cpp
+
+net_libsource := \
+ ../common/JackNetAPI.cpp \
+ ../common/JackNetInterface.cpp \
+ ../common/JackNetTool.cpp \
+ ../common/JackException.cpp \
+ ../common/JackAudioAdapterInterface.cpp \
+ ../common/JackLibSampleRateResampler.cpp \
+ ../common/JackResampler.cpp \
+ ../common/JackGlobals.cpp \
+ ../posix/JackPosixMutex.cpp \
+ ../common/ringbuffer.c \
+ ../posix/JackNetUnixSocket.cpp \
+ $(common_libsource_server_dir)/JackAndroidThread.cpp \
+ ../linux/JackLinuxTime.c
+
+client_libsource := \
+ ../common/JackLibClient.cpp \
+ ../common/JackLibAPI.cpp \
+ ../posix/JackSocketClientChannel.cpp \
+ ../posix/JackPosixServerLaunch.cpp
+
+netadapter_libsource := \
+ ../common/JackResampler.cpp \
+ ../common/JackLibSampleRateResampler.cpp \
+ ../common/JackAudioAdapter.cpp \
+ ../common/JackAudioAdapterInterface.cpp \
+ ../common/JackNetAdapter.cpp
+
+audioadapter_libsource := \
+ ../common/JackResampler.cpp \
+ ../common/JackLibSampleRateResampler.cpp \
+ ../common/JackAudioAdapter.cpp \
+ ../common/JackAudioAdapterInterface.cpp \
+ ../common/JackAudioAdapterFactory.cpp \
+ ../linux/alsa/JackAlsaAdapter.cpp
+
+ifeq ($(SUPPORT_ANDROID_REALTIME_SCHED), true)
+sched_c_include := bionic/libc/bionic \
+ frameworks/av/services/audioflinger
+endif
+
+# ========================================================
+# libjackserver.so
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_libsource_server) $(server_libsource)
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libjackshm
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := libjackserver
+ifeq ($(SUPPORT_ANDROID_REALTIME_SCHED), true)
+LOCAL_CFLAGS += -DJACK_ANDROID_REALTIME_SCHED
+LOCAL_C_INCLUDES += $(sched_c_include)
+LOCAL_SHARED_LIBRARIES += libbinder
+LOCAL_STATIC_LIBRARIES := libscheduling_policy
+endif
+
+include $(BUILD_SHARED_LIBRARY)
+
+## ========================================================
+## libjacknet.so
+## ========================================================
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := $(net_libsource)
+#LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+#LOCAL_CPPFLAGS := $(common_cppflags)
+#LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+#LOCAL_C_INCLUDES := $(common_c_includes) $(JACK_ROOT)/../libsamplerate/include
+#LOCAL_SHARED_LIBRARIES := libc libdl libcutils libsamplerate
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := libjacknet
+#
+#include $(BUILD_SHARED_LIBRARY)
+
+# ========================================================
+# libjack.so
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(common_libsource_client) $(client_libsource)
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libjackshm
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := libjack
+ifeq ($(SUPPORT_ANDROID_REALTIME_SCHED), true)
+LOCAL_CFLAGS += -DJACK_ANDROID_REALTIME_SCHED
+LOCAL_C_INCLUDES += $(sched_c_include)
+LOCAL_SHARED_LIBRARIES += libbinder
+LOCAL_STATIC_LIBRARIES := libscheduling_policy
+endif
+
+include $(BUILD_SHARED_LIBRARY)
+
+# ========================================================
+# netmanager.so
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../common/JackNetManager.cpp
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := netmanager
+
+include $(BUILD_SHARED_LIBRARY)
+
+# ========================================================
+# profiler.so
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../common/JackProfiler.cpp
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := profiler
+
+include $(BUILD_SHARED_LIBRARY)
+
+## ========================================================
+## netadapter.so
+## ========================================================
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := $(netadapter_libsource)
+#LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+#LOCAL_CPPFLAGS := $(common_cppflags)
+#LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+#LOCAL_C_INCLUDES := $(common_c_includes) $(JACK_ROOT)/../libsamplerate/include
+#LOCAL_SHARED_LIBRARIES := libc libdl libcutils libsamplerate libjackserver
+#LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := netadapter
+#
+#include $(BUILD_SHARED_LIBRARY)
+
+## ========================================================
+## audioadapter.so
+## ========================================================
+#ifeq ($(SUPPORT_ALSA_IN_JACK),true)
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := $(audioadapter_libsource)
+#LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE -D_POSIX_SOURCE
+#LOCAL_CPPFLAGS := $(common_cppflags)
+#LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+#LOCAL_C_INCLUDES := $(common_c_includes) $(JACK_ROOT)/../libsamplerate/include $(ALSA_INCLUDES)
+#LOCAL_SHARED_LIBRARIES := libc libdl libcutils libasound libsamplerate libjackserver
+#LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := audioadapter
+#
+#include $(BUILD_SHARED_LIBRARY)
+##endif
+
+# ========================================================
+# in.so - sapaproxy internal client
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := JackSapaProxy.cpp JackSapaProxyIn.cpp
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := in
+
+include $(BUILD_SHARED_LIBRARY)
+
+# ========================================================
+# out.so - sapaproxy internal client
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := JackSapaProxy.cpp JackSapaProxyOut.cpp
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := out
+
+include $(BUILD_SHARED_LIBRARY)
+
+##########################################################
+# linux
+##########################################################
+
+# ========================================================
+# jackd
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+ ../common/Jackdmp.cpp
+# ../dbus/reserve.c
+# ../dbus/audio_reserve.c
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(JACK_STL_LDFLAGS) -ldl -Wl,--no-fatal-warnings
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libutils libjackserver
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jackd
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# driver - dummy
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../common/JackDummyDriver.cpp
+#'HAVE_CONFIG_H','SERVER_SIDE', 'HAVE_PPOLL', 'HAVE_TIMERFD
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_dummy
+
+include $(BUILD_SHARED_LIBRARY)
+
+# ========================================================
+# driver - alsa
+# ========================================================
+ifeq ($(SUPPORT_ALSA_IN_JACK),true)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+ ../linux/alsa/JackAlsaDriver.cpp \
+ ../linux/alsa/alsa_midi_jackmp.cpp \
+ ../common/memops.c \
+ ../linux/alsa/generic_hw.c \
+ ../linux/alsa/hdsp.c \
+ ../linux/alsa/alsa_driver.c \
+ ../linux/alsa/hammerfall.c \
+ ../linux/alsa/ice1712.c
+# ../linux/alsa/alsa_rawmidi.c
+# ../linux/alsa/alsa_seqmidi.c
+#'HAVE_CONFIG_H','SERVER_SIDE', 'HAVE_PPOLL', 'HAVE_TIMERFD
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE -D_POSIX_SOURCE -D_XOPEN_SOURCE=600
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes) $(ALSA_INCLUDES)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver libasound
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_alsa
+
+include $(BUILD_SHARED_LIBRARY)
+endif
+
+## ========================================================
+## driver - alsarawmidi
+## ========================================================
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := \
+# ../linux/alsarawmidi/JackALSARawMidiDriver.cpp \
+# ../linux/alsarawmidi/JackALSARawMidiInputPort.cpp \
+# ../linux/alsarawmidi/JackALSARawMidiOutputPort.cpp \
+# ../linux/alsarawmidi/JackALSARawMidiPort.cpp \
+# ../linux/alsarawmidi/JackALSARawMidiReceiveQueue.cpp \
+# ../linux/alsarawmidi/JackALSARawMidiSendQueue.cpp \
+# ../linux/alsarawmidi/JackALSARawMidiUtil.cpp
+##'HAVE_CONFIG_H','SERVER_SIDE', 'HAVE_PPOLL', 'HAVE_TIMERFD
+#LOCAL_CFLAGS := $(common_cflags) -D_POSIX_SOURCE -D__ALSA_RAWMIDI_H
+#LOCAL_CPPFLAGS := $(common_cppflags)
+#LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+#LOCAL_C_INCLUDES := $(common_c_includes) $(ALSA_INCLUDES)
+#LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver libasound
+#LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := jack_alsarawmidi
+#
+#include $(BUILD_SHARED_LIBRARY)
+
+## LIBFFADO required
+## ========================================================
+## driver - firewire
+## ========================================================
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := \
+# ../linux/firewire/JackFFADODriver.cpp \
+# ../linux/firewire/JackFFADOMidiInputPort.cpp \
+# ../linux/firewire/JackFFADOMidiOutputPort.cpp \
+# ../linux/firewire/JackFFADOMidiReceiveQueue.cpp \
+# ../linux/firewire/JackFFADOMidiSendQueue.cpp
+##'HAVE_CONFIG_H','SERVER_SIDE', 'HAVE_PPOLL', 'HAVE_TIMERFD
+#LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+#LOCAL_CPPFLAGS := $(common_cppflags)
+#LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+#LOCAL_C_INCLUDES := $(common_c_includes)
+#LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver
+#LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := jack_firewire
+#
+#include $(BUILD_SHARED_LIBRARY)
+
+# ========================================================
+# driver - net
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../common/JackNetDriver.cpp
+#'HAVE_CONFIG_H','SERVER_SIDE', 'HAVE_PPOLL', 'HAVE_TIMERFD
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_net
+
+include $(BUILD_SHARED_LIBRARY)
+
+# ========================================================
+# driver - loopback
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../common/JackLoopbackDriver.cpp
+#'HAVE_CONFIG_H','SERVER_SIDE', 'HAVE_PPOLL', 'HAVE_TIMERFD
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_loopback
+
+include $(BUILD_SHARED_LIBRARY)
+
+##HAVE_SAMPLERATE, HAVE_CELT required
+## ========================================================
+## driver - netone
+## ========================================================
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := \
+# ../common/JackNetOneDriver.cpp \
+# ../common/netjack.c \
+# ../common/netjack_packet.c
+##'HAVE_CONFIG_H','SERVER_SIDE', 'HAVE_PPOLL', 'HAVE_TIMERFD
+#LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+#LOCAL_CPPFLAGS := $(common_cppflags)
+#LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+#LOCAL_C_INCLUDES := $(common_c_includes) $(JACK_ROOT)/../libsamplerate/include
+#LOCAL_SHARED_LIBRARIES := libc libdl libcutils libsamplerate libjackserver
+#LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := jack_netone
+#
+#include $(BUILD_SHARED_LIBRARY)
+
+##########################################################
+# android
+##########################################################
+
+# ========================================================
+# libjackshm.so
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := BnAndroidShm.cpp BpAndroidShm.cpp IAndroidShm.cpp AndroidShm.cpp Shm.cpp
+LOCAL_CFLAGS := $(common_shm_cflags) -DSERVER_SIDE
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libbinder
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := libjackshm
+
+include $(BUILD_SHARED_LIBRARY)
+
+# ========================================================
+# jack_goldfish.so - Goldfish driver for emulator
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := JackGoldfishDriver.cpp
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_goldfish
+
+include $(BUILD_SHARED_LIBRARY)
+
+# ========================================================
+# jack_opensles.so - OpenSL ES driver
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := JackOpenSLESDriver.cpp opensl_io.c
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes) frameworks/wilhelm/include
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver libOpenSLES
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_opensles
+
+include $(BUILD_SHARED_LIBRARY)
+
+##########################################################
+# android/AndroidShmServer
+##########################################################
+
+# ========================================================
+# androidshmservice
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ./AndroidShmServer/main_androidshmservice.cpp
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libcutils libutils libbinder libjackshm
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE:= androidshmservice
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# shmservicetest
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ./AndroidShmServer/test/shmservicetest.cpp
+LOCAL_CFLAGS := $(common_cflags) -DLOG_TAG=\"ShmServiceTest\"
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libcutils libutils libjackshm libbinder
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := shmservicetest
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# shmservicedump
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ./AndroidShmServer/test/shmservicedump.cpp
+LOCAL_CFLAGS := $(common_cflags) -DLOG_TAG=\"ShmServiceDump\"
+LOCAL_CPPFLAGS := $(common_cppflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_SHARED_LIBRARIES := libcutils libutils libjackshm libbinder
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := shmservicedump
+
+include $(BUILD_EXECUTABLE)
+
+##########################################################
+# example-clients
+##########################################################
+
+# ========================================================
+# jack_freewheel
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/freewheel.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_freewheel
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_connect
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/connect.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_connect
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_disconnect
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/connect.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_disconnect
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_lsp
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/lsp.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_lsp
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_metro
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/metro.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_metro
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_midiseq
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/midiseq.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_midiseq
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_midisine
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/midisine.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_midisine
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_showtime
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/showtime.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_showtime
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_simple_client
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/simple_client.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_simple_client
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_zombie
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/zombie.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_zombie
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_load
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/ipload.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_load
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_unload
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/ipunload.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_unload
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_alias
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/alias.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_alias
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_bufsize
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/bufsize.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_bufsize
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_wait
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/wait.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_wait
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_samplerate
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/samplerate.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_samplerate
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_evmon
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/evmon.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_evmon
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_monitor_client
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/monitor_client.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_monitor_client
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_thru
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/thru_client.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_thru
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_cpu_load
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/cpu_load.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_cpu_load
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_simple_session_client
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/simple_session_client.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_simple_session_client
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_session_notify
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/session_notify.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_session_notify
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_server_control
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/server_control.cpp
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjackserver
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_server_control
+
+include $(BUILD_EXECUTABLE)
+
+## ========================================================
+## jack_net_slave
+## ========================================================
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := ../example-clients/netslave.c
+#LOCAL_CFLAGS := $(common_cflags)
+#LOCAL_LDFLAGS := $(common_ldflags)
+#LOCAL_C_INCLUDES := $(common_c_includes)
+#LOCAL_SHARED_LIBRARIES := libjacknet
+#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := jack_net_slave
+#
+#include $(BUILD_EXECUTABLE)
+
+## ========================================================
+## jack_net_master
+## ========================================================
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := ../example-clients/netmaster.c
+#LOCAL_CFLAGS := $(common_cflags)
+#LOCAL_LDFLAGS := $(common_ldflags)
+#LOCAL_C_INCLUDES := $(common_c_includes)
+#LOCAL_SHARED_LIBRARIES := libjacknet
+#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := jack_net_master
+#
+#include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_latent_client
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/latent_client.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_latent_client
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_midi_dump
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/midi_dump.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_midi_dump
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_midi_latency_test
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/midi_latency_test.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_midi_latency_test
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_transport
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/transport.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_transport
+
+include $(BUILD_EXECUTABLE)
+
+## ========================================================
+## jack_rec
+## ========================================================
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := ../example-clients/capture_client.c
+#LOCAL_CFLAGS := $(common_cflags)
+#LOCAL_LDFLAGS := $(common_ldflags)
+#LOCAL_C_INCLUDES := $(common_c_includes) $(JACK_ROOT)/../libsndfile/src
+#LOCAL_SHARED_LIBRARIES := libjack libsndfile
+#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := jack_rec
+#
+#include $(BUILD_EXECUTABLE)
+
+## ========================================================
+## jack_netsource
+## ========================================================
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := ../example-clients/netsource.c ../common/netjack_packet.c
+#LOCAL_CFLAGS := $(common_cflags) -DNO_JACK_ERROR
+#LOCAL_LDFLAGS := $(common_ldflags)
+#LOCAL_C_INCLUDES := $(common_c_includes) $(JACK_ROOT)/../libsamplerate/include
+#LOCAL_SHARED_LIBRARIES := libsamplerate libjack
+#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := jack_netsource
+#
+#include $(BUILD_EXECUTABLE)
+
+## ========================================================
+## alsa_in
+## ========================================================
+#ifeq ($(SUPPORT_ALSA_IN_JACK),true)
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := ../example-clients/alsa_in.c ../common/memops.c
+#LOCAL_CFLAGS := $(common_cflags) -DNO_JACK_ERROR -D_POSIX_SOURCE -D_XOPEN_SOURCE=600
+#LOCAL_LDFLAGS := $(common_ldflags)
+#LOCAL_C_INCLUDES := $(common_c_includes) $(JACK_ROOT)/../libsamplerate/include $(ALSA_INCLUDES)
+#LOCAL_SHARED_LIBRARIES := libasound libsamplerate libjack
+#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := alsa_in
+#
+#include $(BUILD_EXECUTABLE)
+#endif
+
+## ========================================================
+## alsa_out
+## ========================================================
+#ifeq ($(SUPPORT_ALSA_IN_JACK),true)
+#include $(CLEAR_VARS)
+#
+#LOCAL_SRC_FILES := ../example-clients/alsa_out.c ../common/memops.c
+#LOCAL_CFLAGS := $(common_cflags) -DNO_JACK_ERROR -D_POSIX_SOURCE -D_XOPEN_SOURCE=600
+#LOCAL_LDFLAGS := $(common_ldflags)
+#LOCAL_C_INCLUDES := $(common_c_includes) $(JACK_ROOT)/../libsamplerate/include $(ALSA_INCLUDES)
+#LOCAL_SHARED_LIBRARIES := libasound libsamplerate libjack
+#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+#LOCAL_MODULE_TAGS := eng optional
+#LOCAL_MODULE := alsa_out
+#
+#include $(BUILD_EXECUTABLE)
+#endif
+
+# ========================================================
+# inprocess
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../example-clients/inprocess.c
+LOCAL_CFLAGS := $(common_cflags) -DSERVER_SIDE
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libjackserver
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/jack
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := inprocess
+
+include $(BUILD_SHARED_LIBRARY)
+
+##########################################################
+# tests
+##########################################################
+
+# ========================================================
+# jack_test
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../tests/test.cpp
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack libjackshm
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_test
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_cpu
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../tests/cpu.c
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack libjackshm
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_cpu
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_iodelay
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../tests/iodelay.cpp
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_CFLAGS += -Wno-narrowing
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack libjackshm
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_iodelay
+
+include $(BUILD_EXECUTABLE)
+
+# ========================================================
+# jack_multiple_metro
+# ========================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := ../tests/external_metro.cpp
+LOCAL_CFLAGS := $(common_cflags)
+LOCAL_LDFLAGS := $(common_ldflags) $(JACK_STL_LDFLAGS)
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_SHARED_LIBRARIES := libjack libjackshm
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng optional
+LOCAL_MODULE := jack_multiple_metro
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/jack2-src/jack2-master/android/AndroidShm.cpp b/jack2-src/jack2-master/android/AndroidShm.cpp
new file mode 100644
index 0000000000..ff9847c3b8
--- /dev/null
+++ b/jack2-src/jack2-master/android/AndroidShm.cpp
@@ -0,0 +1,251 @@
+#define LOG_TAG "JAMSHMSERVICE"
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "BnAndroidShm.h"
+#include "AndroidShm.h"
+
+
+#include "JackConstants.h"
+
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "JackError.h"
+
+#include
+
+
+#define MEMORY_SIZE 10*1024
+
+#define SEMAPHORE_NULL_CHAR '\0'
+
+// remove ALOGI log
+#undef ALOGI
+#define ALOGI
+
+namespace android {
+
+
+ int AndroidShm::instantiate() {
+ defaultServiceManager()->addService(String16("com.samsung.android.jam.IAndroidShm"), new AndroidShm); // SINGLETON WITH SAME NAME
+ return 0;
+ }
+
+ int AndroidShm::sendCommand(const char* command) {
+ ALOGI("I(pid:%d) send command is %s\n", getpid(), command);
+ if(strcmp(command, "semaphore") == 0) {
+ // print debug message about semaphore simulation
+ for(int i = MAX_SEMAPHORE_MEMORY_COUNT -1 ; i >= 0; i--) {
+ printf("index[%3d] = ptr[%p] name[%s]\n", i, (mSemaphore[i] != NULL)?mSemaphore[i]->getBase():0, mSemaphoreName[i]);
+ ALOGI("index[%3d] = ptr[%p] name[%s]\n", i, (mSemaphore[i] != NULL)?mSemaphore[i]->getBase():0, mSemaphoreName[i]);
+ }
+ }
+ return NO_ERROR;
+ }
+
+ int AndroidShm::testGetBufferByNewProcess() {
+ ALOGI("testGetBufferByNewProcess...");
+ int status;
+ int childPid = fork();
+
+ if(childPid > 0) {
+ ALOGI("I(pid%d) made a child process(pid:%d)", getpid(), childPid);
+ ALOGI("I(pid%d) wait until child(%d) was finish", getpid(), childPid);
+ wait(&status);
+ // wait ÇÏÁö ¾ÊÀ¸¸é child process°¡ ³²¾Æ ÀÖÀ½.
+ ALOGI("child(%d) was finished. ", childPid);
+ } else if(childPid == 0) {
+ ALOGI("im a new child process(pid:%d) ", getpid());
+ if(-1 == execlp("/system/bin/getbufferclient","getbufferclient",NULL)) {
+ ALOGE("failed to execute getbufferclient");
+ }
+ exit(0);
+ } else {
+ ALOGI("failed creating child process");
+ }
+ return 0;
+ }
+
+ int AndroidShm::testGetBuffer() {
+ ALOGI("I(pid:%d) trying to test get buffer...", getpid());
+ sp sm = defaultServiceManager();
+ ALOGI("get default ServiceManager is done");
+ sp b;
+ //String16* serviceName = new String16("com.samsung.android.jam.IAndroidShm");
+ do {
+ //ALOGI("here");
+ b = sm->getService(String16("com.samsung.android.jam.IAndroidShm"));
+ //ALOGI("getservice is done");
+
+ if(b != 0)
+ break;
+ //ALOGI("AndroidShm is not working, waiting...");
+ usleep(500000);
+
+ } while(true);
+
+ sp service = interface_cast(b);
+
+ //shared buffer.
+ sp receiverMemBase = service->getBuffer(0);
+
+ unsigned int *base = (unsigned int *) receiverMemBase->getBase();
+ int ret = 0;
+ if(base != (unsigned int *) -1) {
+ ALOGD("AndroidShm::testGetBuffer base=%p Data=0x%x\n",base, *base);
+ *base = (*base)+1;
+ ret = (unsigned int)(*base);
+ ALOGI("AndroidShm::testGetBuffer base=%p Data=0x%x CHANGED\n",base, *base);
+ receiverMemBase = 0;
+ } else {
+ ALOGE("Error shared memory not available\n");
+ }
+ return 0;
+ }
+
+ sp AndroidShm::getBuffer(int index) {
+ ALOGI("I(pid:%d) getBuffer index:%d", getpid(), index);
+ if(index < 0 || index >= MAX_SHARED_MEMORY_COUNT) {
+ ALOGE("error : out of index [%d]", index);
+ return NULL;
+ }
+ return mMemHeap[index];
+ }
+
+ int AndroidShm::MemAlloc(unsigned int size) {
+ ALOGI("try to allocate memory size[%d]", size);
+ for(int i = 0; i < MAX_SHARED_MEMORY_COUNT; i++) {
+ if(mMemHeap[i] == NULL) {
+ mMemHeap[i] = new MemoryHeapBase(size);
+ if(mMemHeap[i] == NULL){
+ ALOGI("fail to alloc, try one more...");
+ continue; // try one more.
+ }
+ return i;
+ }
+ }
+ ALOGE("fail to MemAlloc");
+ return -1; // fail to alloc
+ }
+
+ AndroidShm::AndroidShm() {
+ ALOGI("AndroidShm is created");
+ for(int i = 0; i < MAX_SHARED_MEMORY_COUNT; i++) {
+ mMemHeap[i] = NULL;
+ }
+ mRegistryIndex = 10000;
+ //mMemHeap = new MemoryHeapBase(MEMORY_SIZE);
+ //unsigned int *base = (unsigned int*) mMemHeap->getBase();
+ //*base = 0xdeadcafe;//
+
+ for(int j = 0; j < MAX_SEMAPHORE_MEMORY_COUNT; j++) {
+ mSemaphore[j] = NULL;
+ memset(mSemaphoreName[j], SEMAPHORE_NULL_CHAR, MAX_SEMAPHORE_NAME_LENGTH);
+ }
+ }
+
+ AndroidShm::~AndroidShm() {
+ ALOGI("AndroidShm is destroyed");
+ for(int i = 0; i < MAX_SHARED_MEMORY_COUNT; i++) {
+ (mMemHeap[i]).clear();
+ }
+ for(int j = 0; j < MAX_SEMAPHORE_MEMORY_COUNT; j++) {
+ (mSemaphore[j]).clear();
+ }
+ }
+
+ //status_t AndroidShm::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
+ // return BnAndroidShm::onTransact(code, data, reply, flags);
+ //}
+
+ int AndroidShm::allocShm(const int size) { // if negative return value is error
+ ALOGI("try to alloc shared memory size[%d]", size);
+ return MemAlloc(size);
+ }
+
+ int AndroidShm::removeShm(const unsigned int index) { // shared memory Á¦°Å
+ ALOGI("try to remove shared memory index[%d]", index);
+ if(index >= MAX_SHARED_MEMORY_COUNT) {
+ ALOGE("remove shared memory: out of index");
+ return -1;
+ }
+ (mMemHeap[index]).clear();
+ return 1;
+ }
+
+ int AndroidShm::isAllocated(const unsigned int index) { // allocated ¿©ºÎ È®ÀÎ
+ ALOGI("try to check the memory allocation index[%d]", index);
+ if(index >= MAX_SHARED_MEMORY_COUNT) {
+ ALOGE("shared memory: out of index");
+ return 0;
+ }
+ if(mMemHeap[index] == NULL)
+ return 0;
+ else
+ return 1;
+ }
+
+ int AndroidShm::setRegistryIndex(const unsigned int index) {
+ ALOGI("set registry index %d", index);
+ mRegistryIndex = index;
+ return 1;
+ }
+
+ int AndroidShm::getRegistryIndex() {
+ return mRegistryIndex;
+ }
+
+ sp AndroidShm::InitSemaphore(const char* name) {
+ ALOGI("init semaphore [%s]", name);
+ for(int i = 0; i < MAX_SEMAPHORE_MEMORY_COUNT; i++) {
+ if(mSemaphoreName[i][0] == SEMAPHORE_NULL_CHAR) {
+ mSemaphore[i] = new MemoryHeapBase(sizeof(sem_t));
+ if(mSemaphore[i] == NULL){
+ ALOGI("fail to alloc, try one more...");
+ continue;
+ }
+ if(sem_init((sem_t*)(mSemaphore[i]->getBase()), 1, 0) == 0) {
+ strncpy(mSemaphoreName[i], name, MAX_SEMAPHORE_NAME_LENGTH - 1);
+ mSemaphoreName[i][MAX_SEMAPHORE_NAME_LENGTH - 1] = '\0';
+ ALOGI("sem_init success");
+ return mSemaphore[i];
+ } else {
+ (mSemaphore[i]).clear();
+ ALOGE("sem_init failed null returned");
+ return NULL;
+ }
+ } else {
+ // find already exist name
+ if(strcmp(mSemaphoreName[i], name) == 0) { // found
+ ALOGI("found - return alread allocated semaphore");
+ return mSemaphore[i];
+ }
+ }
+ }
+ ALOGE("sem_init failed null returned 2");
+ return NULL;
+ }
+
+};
+
diff --git a/jack2-src/jack2-master/android/AndroidShm.h b/jack2-src/jack2-master/android/AndroidShm.h
new file mode 100644
index 0000000000..b868827a8d
--- /dev/null
+++ b/jack2-src/jack2-master/android/AndroidShm.h
@@ -0,0 +1,51 @@
+#ifndef ANDROIDSHM
+#define ANDROIDSHM
+
+#include
+#include "BnAndroidShm.h"
+#include
+#include
+#include "shm.h"
+#include "android/Shm.h" //android extension of shm.h
+
+namespace android {
+
+ class AndroidShm : public BnAndroidShm
+ {
+#define MAX_SHARED_MEMORY_COUNT 257
+ private:
+ int MemAlloc(unsigned int size);
+
+ public:
+ virtual ~AndroidShm();
+ static int instantiate();
+ virtual int sendCommand(const char* command);
+ virtual int allocShm(const int size); // if negative return value is error
+ virtual int removeShm(const unsigned int index); // shared memory Á¦°Å
+ virtual int isAllocated(const unsigned int index); // allocated ¿©ºÎ È®ÀÎ
+ virtual int setRegistryIndex(const unsigned int index);
+ virtual int getRegistryIndex();
+ virtual sp InitSemaphore(const char* name);
+ virtual sp getBuffer(int index);
+ //virtual status_t onTransact(
+ // uint32_t code,
+ // const Parcel& data,
+ // Parcel* reply,
+ // uint32_t flags);
+ private:
+ int testGetBuffer();
+ int testGetBufferByNewProcess();
+ AndroidShm();
+
+ sp mMemHeap[MAX_SHARED_MEMORY_COUNT];
+ unsigned int mRegistryIndex;
+
+ // for named semaphore simulation
+ #define MAX_SEMAPHORE_MEMORY_COUNT 300
+ #define MAX_SEMAPHORE_NAME_LENGTH 300
+ sp mSemaphore[MAX_SEMAPHORE_MEMORY_COUNT];
+ char mSemaphoreName[MAX_SEMAPHORE_MEMORY_COUNT][MAX_SEMAPHORE_NAME_LENGTH];
+ };
+};
+
+#endif
diff --git a/jack2-src/jack2-master/android/AndroidShmServer/main_androidshmservice.cpp b/jack2-src/jack2-master/android/AndroidShmServer/main_androidshmservice.cpp
new file mode 100644
index 0000000000..1c6dde8f7f
--- /dev/null
+++ b/jack2-src/jack2-master/android/AndroidShmServer/main_androidshmservice.cpp
@@ -0,0 +1,19 @@
+#define LOG_TAG "main_androidshmservice"
+
+#include
+#include
+#include
+#include
+
+#include "../../common/shm.h"
+#include "../Shm.h" //android extension of shm.h
+
+using namespace android;
+
+int main(int argc, char *argv[]) {
+ jack_instantiate();
+ ProcessState::self()->startThreadPool();
+ ALOGI("AndroidShmService is starting now");
+ IPCThreadState::self()->joinThreadPool();
+ return 0;
+}
diff --git a/jack2-src/jack2-master/android/AndroidShmServer/readme.txt b/jack2-src/jack2-master/android/AndroidShmServer/readme.txt
new file mode 100644
index 0000000000..9b475beb7e
--- /dev/null
+++ b/jack2-src/jack2-master/android/AndroidShmServer/readme.txt
@@ -0,0 +1,23 @@
+IAndroidShmÀÇ ±â´ÉÀ» Å×½ºÆ® Çϱâ À§ÇÑ ¿ëµµ·Î »ç¿ëµÇ´Â ÇÁ·Î±×·¥ÀÔ´Ï´Ù.
+
+AndroidShmÀº service manager¿¡ shared memory¸¦ ÇÒ´çÇØÁÖ´Â ¼ºñ½ºÀÔ´Ï´Ù.
+
+service name: com.sec.apa.IAndroidShm
+
+½ÇÇà ÆÄÀÏ:
+/system/bin/androidshmservice
+
+-------------------------------------------
+./test
+
+AndroidShmService¸¦ Å×½ºÆ®ÇÏ´Â ÇÁ·Î±×·¥
+
+/system/bin/shmservicetest
+
+AndroidShmService¿¡¼ Á¦°øÇÏ´Â ±â´ÉÀ» UnitTestÇÕ´Ï´Ù.
+
+µ¿ÀÛ È®ÀÎ ¹æ¹ý:
+adb logcat À¸·Î ·Î±×·Î ¼º°ø/½ÇÆÐ È®ÀÎÇÔ.
+
+ÀüÁ¦ Á¶°Ç:
+/system/bin/androidshmservice¸¦ ½ÇÇàÁßÀÎ »óÅÂÀ̾î¾ß ÇÕ´Ï´Ù.
\ No newline at end of file
diff --git a/jack2-src/jack2-master/android/AndroidShmServer/test/shmservicedump.cpp b/jack2-src/jack2-master/android/AndroidShmServer/test/shmservicedump.cpp
new file mode 100644
index 0000000000..d7413f74b5
--- /dev/null
+++ b/jack2-src/jack2-master/android/AndroidShmServer/test/shmservicedump.cpp
@@ -0,0 +1,177 @@
+#include "../../IAndroidShm.h"
+#include
+#include
+#include "../../../common/shm.h"
+
+namespace android {
+
+static sp receiverMemBase;
+#define MAX_SHARED_MEMORY_COUNT 257
+
+sp getAndroidShmService() {
+ sp shm = 0;
+
+ /* Get the buffer service */
+ if (shm == NULL) {
+ sp sm = defaultServiceManager();
+ sp binder;
+ binder = sm->getService(String16("com.samsung.android.jam.IAndroidShm"));
+ if (binder != 0) {
+ shm = IAndroidShm::asInterface(binder);
+ //shm = interface_cast(binder);
+ }
+ }
+ return shm;
+}
+
+unsigned int * getBufferMemPointer(int index)
+{
+ sp shm = getAndroidShmService();
+ if (shm == NULL) {
+ printf("The EneaBufferServer is not published\n");
+ return (unsigned int *)-1; /* return an errorcode... */
+ } else {
+ receiverMemBase = shm->getBuffer(index);
+ if(receiverMemBase != NULL)
+ return (unsigned int *) receiverMemBase->getBase();
+ else
+ return (unsigned int*)-1;
+ }
+}
+
+}
+
+using namespace android;
+
+void showStatus() {
+ sp shm = getAndroidShmService();
+ if(shm == NULL) {
+ printf("shm service is not available\n");
+ return;
+ }
+
+ printf("<<<<<<<<<<< dump memory allocation status >>>>>>>>>>\n");
+ for(int i = 256; i >= 0; i--) {
+ if(shm->isAllocated(i) == 1) {
+ printf("Mem[%3d] == 0x%x\n", i, (unsigned int)getBufferMemPointer(i));
+ } else {
+ printf("Mem[%3d] == NULL\n", i);
+ }
+ }
+}
+
+void showRegistryIndex() {
+ sp shm = getAndroidShmService();
+
+ if(shm == NULL) {
+ printf("shm service is not available\n");
+ return;
+ }
+
+ printf("<<<<<<<<<<< show registry index >>>>>>>>>>\n");
+
+ printf("index [%3d]\n",shm->getRegistryIndex());
+}
+
+void showHeader() {
+ sp shm = getAndroidShmService();
+
+ if(shm == NULL) {
+ printf("shm service is not available\n");
+ return;
+ }
+
+ if(shm->getRegistryIndex() > 256) {
+ printf("don't have a registry header\n");
+ return;
+ }
+
+ unsigned int* buffer = getBufferMemPointer(shm->getRegistryIndex());
+ if(buffer) {
+ jack_shm_header_t * header = (jack_shm_header_t*)buffer;
+ printf("<<<<<<<<<< register header value >>>>>>>>>>\n");
+ printf("memory address 0x%x 0x%x\n", (unsigned int)(header), (unsigned int)buffer);
+ printf("magic = %d\n", header->magic);
+ printf("protocol = %d\n", header->protocol);
+ printf("type = %d\n", header->type);
+ printf("size = %d\n", header->size);
+ printf("hdr_len = %d\n", header->hdr_len);
+ printf("entry_len = %d\n", header->entry_len);
+ for(int j = 0; j < MAX_SERVERS; j++) {
+ //char name[256];
+ //memset(name, '\0', 256);
+ //strncpy(name, header->server[j].name, 10);
+ printf("server[%d] pid = %d, name = %s\n", j, header->server[j].pid, header->server[j].name);
+ }
+ }
+}
+
+void showBody() {
+ sp shm = getAndroidShmService();
+
+ if(shm == NULL) {
+ printf("shm service is not available\n");
+ return;
+ }
+
+ if(shm->getRegistryIndex() > 256) {
+ printf("don't have a registry body\n");
+ return;
+ }
+ unsigned int* buffer = getBufferMemPointer(shm->getRegistryIndex());
+ if(buffer) {
+ jack_shm_header_t * header = (jack_shm_header_t*)buffer;
+ printf("<<<<<<<<<< registry body value >>>>>>>>>>\n");
+ jack_shm_registry_t * registry = (jack_shm_registry_t *) (header + 1);
+ for(int k = 255; k >= 0; k--) {
+ printf("registry[%3d] index[%3d],allocator[%3d],size[%6d],id[%10s],fd[%3d]\n", k,
+ registry[k].index, registry[k].allocator, registry[k].size,
+ registry[k].id,
+ registry[k].fd);
+ }
+ }
+}
+
+void showSemaphore() {
+ sp shm = getAndroidShmService();
+
+ if(shm == NULL) {
+ printf("shm service is not available\n");
+ return;
+ }
+
+ shm->sendCommand("semaphore");
+ printf("log will be shown in the logcat log\n");
+}
+
+int main(int argc, char** argv) {
+ // base could be on same address as Servers base but this
+ // is purely by luck do NEVER rely on this. Linux memory
+ // management may put it wherever it likes.
+
+ if(argc < 2) {
+ printf("usage\n shmservicedump [status|header|body|index|semaphore]\n");
+ printf(" status: show the shared memory allocation status\n");
+ printf(" header: show the registry header infomations if the registry exist\n");
+ printf(" body: show the registry body infomations if the registry exist\n");
+ printf(" index: show the index of array that is allocated registry shared memory\n");
+ printf(" semaphore: show the memory array about semaphore simulation\n");
+ return 0;
+ }
+
+ if(strcmp(argv[1], "semaphore") == 0) {
+ showSemaphore();
+ } else if(strcmp(argv[1], "index") == 0) {
+ showRegistryIndex();
+ } else if(strcmp(argv[1], "status") == 0) {
+ showStatus();
+ } else if(strcmp(argv[1], "header") == 0) {
+ showHeader();
+ } else if(strcmp(argv[1], "body") == 0) {
+ showBody();
+ } else {
+ printf("%s is invalid parameter\n", argv[1]);
+ }
+
+ return 0;
+}
diff --git a/jack2-src/jack2-master/android/AndroidShmServer/test/shmservicetest.cpp b/jack2-src/jack2-master/android/AndroidShmServer/test/shmservicetest.cpp
new file mode 100644
index 0000000000..d91670ccf8
--- /dev/null
+++ b/jack2-src/jack2-master/android/AndroidShmServer/test/shmservicetest.cpp
@@ -0,0 +1,189 @@
+#include "../../IAndroidShm.h"
+#include
+#include
+
+namespace android {
+
+static sp receiverMemBase;
+#define MAX_SHARED_MEMORY_COUNT 257
+
+sp getAndroidShmService() {
+ sp shm = 0;
+
+ /* Get the buffer service */
+ if (shm == NULL) {
+ sp sm = defaultServiceManager();
+ sp binder;
+ binder = sm->getService(String16("com.samsung.android.jam.IAndroidShm"));
+ if (binder != 0) {
+ shm = IAndroidShm::asInterface(binder);
+ //shm = interface_cast(binder);
+ }
+ }
+ return shm;
+}
+
+unsigned int * getBufferMemPointer(int index) {
+ sp shm = getAndroidShmService();
+ if (shm == NULL) {
+ ALOGE("The EneaBufferServer is not published");
+ return (unsigned int *)-1; /* return an errorcode... */
+ } else {
+ receiverMemBase = shm->getBuffer(index);
+ if(receiverMemBase != NULL)
+ return (unsigned int *) receiverMemBase->getBase();
+ else
+ return (unsigned int*)-1;
+ }
+}
+
+}
+
+using namespace android;
+
+void setup_test() {
+ sp shm = getAndroidShmService();
+ if(shm == NULL) return;
+ for(int i = 0; i < MAX_SHARED_MEMORY_COUNT; i++) {
+ shm->removeShm(i);
+ }
+}
+
+void teardown_test() {
+}
+
+void increase_value_once() {
+ ALOGD("*****test: increase_value_once*****\n");
+ sp shm = getAndroidShmService();
+ if(shm == NULL) return;
+
+ int slot = shm->allocShm(10000);
+ unsigned int *base = getBufferMemPointer(slot);
+ if(base != (unsigned int *)-1) {
+ ALOGD("ShmServiceTest base=%p Data=0x%x\n",base, *base);
+ *base = (*base)+1;
+ ALOGD("ShmServiceTest base=%p Data=0x%x CHANGED\n",base, *base);
+ //receiverMemBase = 0;
+ } else {
+ ALOGE("Error shared memory not available\n");
+ }
+}
+
+void increase_value_10times() {
+ ALOGD("*****test: increase_value_10times*****\n");
+ sp shm = getAndroidShmService();
+ if(shm == NULL) return;
+
+ int slot = shm->allocShm(10000);
+
+ for(int i = 0; i < 10; i++) {
+ unsigned int *base = getBufferMemPointer(slot);
+ if(base != (unsigned int *)-1) {
+ ALOGD("ShmServiceTest base=%p Data=0x%x\n",base, *base);
+ *base = (*base)+1;
+ ALOGD("ShmServiceTest base=%p Data=0x%x CHANGED\n",base, *base);
+ //receiverMemBase = 0;
+ } else {
+ ALOGE("Error shared memory not available\n");
+ }
+ }
+}
+
+void check_allocated() {
+ ALOGD("*****test: check_allocated*****\n");
+ sp shm = getAndroidShmService();
+ if(shm == NULL) return;
+
+ int slot = shm->allocShm(10000);
+ int i = 0;
+ for(; i < MAX_SHARED_MEMORY_COUNT; i++) {
+ if(slot == i) {
+ if(shm->isAllocated(i) == 1) {
+ //ALOGD("pass\n");
+ } else {
+ ALOGD("failed\n");
+ }
+ } else {
+ if(shm->isAllocated(i) == 0) {
+ //ALOGD("pass\n");
+ } else {
+ ALOGD("failed\n");
+ }
+ }
+ }
+
+ if(i == MAX_SHARED_MEMORY_COUNT) {
+ ALOGD("pass\n");
+ }
+}
+
+void test_set_get_registry_index() {
+ ALOGD("*****test: test_set_get_registry_index*****\n");
+ sp shm = getAndroidShmService();
+ if(shm == NULL) return;
+
+ int registry = 1;
+ shm->setRegistryIndex(registry);
+ if(registry == shm->getRegistryIndex()) {
+ ALOGD("pass\n");
+ } else {
+ ALOGD("fail\n");
+ }
+
+ registry = 0;
+ shm->setRegistryIndex(registry);
+ if(registry == shm->getRegistryIndex()) {
+ ALOGD("pass\n");
+ } else {
+ ALOGD("fail\n");
+ }
+}
+
+void test_memset() {
+ ALOGD("*****test: test_memset*****\n");
+ sp shm = getAndroidShmService();
+ if(shm == NULL) return;
+
+ int slot = shm->allocShm(10000);
+
+ unsigned int * pnt = getBufferMemPointer(slot);
+
+ memset (pnt, 0, 10000);
+
+ ALOGD("result : 0 0 0 0\n");
+ ALOGD("memory dump : %d %d %d %d\n", pnt[0], pnt[1], pnt[2], pnt[3]);
+
+ memset (pnt, 0xffffffff, 10000);
+
+ ALOGD("result : -1 -1 -1 -1\n");
+ ALOGD("memory dump : %d %d %d %d", pnt[0], pnt[1], pnt[2], pnt[3]);
+}
+
+int main(int argc, char** argv) {
+ // base could be on same address as Servers base but this
+ // is purely by luck do NEVER rely on this. Linux memory
+ // management may put it wherever it likes.
+
+ setup_test();
+ increase_value_once();
+ teardown_test();
+
+ setup_test();
+ increase_value_10times();
+ teardown_test();
+
+ setup_test();
+ check_allocated();
+ teardown_test();
+
+ setup_test();
+ test_set_get_registry_index();
+ teardown_test();
+
+ setup_test();
+ test_memset();
+ teardown_test();
+
+ return 0;
+}
+
diff --git a/jack2-src/jack2-master/android/BnAndroidShm.cpp b/jack2-src/jack2-master/android/BnAndroidShm.cpp
new file mode 100644
index 0000000000..6ea0afcc5c
--- /dev/null
+++ b/jack2-src/jack2-master/android/BnAndroidShm.cpp
@@ -0,0 +1,83 @@
+#include "BnAndroidShm.h"
+#include
+
+namespace android {
+ status_t BnAndroidShm::onTransact( uint32_t code,
+ const Parcel &data,
+ Parcel *reply,
+ uint32_t flags)
+ {
+ switch(code) {
+ case HW_SENDCOMMAND:{
+ CHECK_INTERFACE(IAndroidShm, data, reply);
+ const char *str;
+ str = data.readCString();
+ reply->writeInt32(sendCommand(str));
+ return NO_ERROR;
+ }break;
+
+ case HW_GETBUFFER:{
+ CHECK_INTERFACE(IAndroidShm, data, reply);
+ int32_t index;
+ data.readInt32(&index);
+ sp Data = getBuffer(index);
+ if(Data != NULL){
+ reply->writeStrongBinder(Data->asBinder());
+ }
+ return NO_ERROR;
+ }break;
+
+ case HW_ALLOC_SHM:{
+ CHECK_INTERFACE(IAndroidShm, data, reply);
+ int32_t size;
+ data.readInt32(&size);
+ reply->writeInt32(allocShm(size));
+ return NO_ERROR;
+ }break;
+
+ case HW_REMOVE_SHM:{
+ CHECK_INTERFACE(IAndroidShm, data, reply);
+ int32_t index;
+ data.readInt32(&index);
+ reply->writeInt32(removeShm(index));
+ return NO_ERROR;
+ }break;
+
+ case HW_IS_ALLOCATED:{
+ CHECK_INTERFACE(IAndroidShm, data, reply);
+ int32_t index;
+ data.readInt32(&index);
+ reply->writeInt32(isAllocated(index));
+ return NO_ERROR;
+ }break;
+
+ case HW_SET_REGISTRY_INDEX:{
+ CHECK_INTERFACE(IAndroidShm, data, reply);
+ int32_t index;
+ data.readInt32(&index);
+ reply->writeInt32(setRegistryIndex(index));
+ return NO_ERROR;
+ }break;
+
+ case HW_GET_REGISTRY_INDEX:{
+ CHECK_INTERFACE(IAndroidShm, data, reply);
+ reply->writeInt32(getRegistryIndex());
+ return NO_ERROR;
+ }break;
+
+ case HW_INIT_SEMAPHORE:{
+ CHECK_INTERFACE(IAndroidShm, data, reply);
+ const char *name;
+ name = data.readCString();
+ sp Data = InitSemaphore(name);
+ if(Data != NULL){
+ reply->writeStrongBinder(Data->asBinder());
+ }
+ return NO_ERROR;
+ }break;
+
+ default:
+ return BBinder::onTransact(code, data, reply, flags);
+ }
+ }
+};
diff --git a/jack2-src/jack2-master/android/BnAndroidShm.h b/jack2-src/jack2-master/android/BnAndroidShm.h
new file mode 100644
index 0000000000..9b3a46afa7
--- /dev/null
+++ b/jack2-src/jack2-master/android/BnAndroidShm.h
@@ -0,0 +1,16 @@
+#ifndef BNANDROIDSHM
+#define BNANDROIDSHM
+
+#include
+#include "IAndroidShm.h"
+
+namespace android {
+ class BnAndroidShm : public BnInterface {
+ public:
+ virtual status_t onTransact( uint32_t code,
+ const Parcel& data,
+ Parcel* reply,
+ uint32_t flags = 0);
+ };
+};
+#endif
diff --git a/jack2-src/jack2-master/android/BpAndroidShm.cpp b/jack2-src/jack2-master/android/BpAndroidShm.cpp
new file mode 100644
index 0000000000..49dc8c47f3
--- /dev/null
+++ b/jack2-src/jack2-master/android/BpAndroidShm.cpp
@@ -0,0 +1,111 @@
+#include
+#include
+#include "BpAndroidShm.h"
+
+namespace android{
+
+ int BpAndroidShm::sendCommand(const char*command) {
+ Parcel data, reply;
+ data.writeInterfaceToken(
+ IAndroidShm::getInterfaceDescriptor());
+ data.writeCString(command);
+ status_t status = remote()->transact(HW_SENDCOMMAND, data, &reply);
+ if(status != NO_ERROR) {
+ ALOGE("print sendCommand error: %s", strerror(-status));
+ } else {
+ status= reply.readInt32();
+ }
+ return status;
+ }
+
+ sp BpAndroidShm::getBuffer(int index) {
+ Parcel data, reply;
+ sp memHeap = NULL;
+ data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
+ data.writeInt32(index);
+ remote()->transact(HW_GETBUFFER, data, &reply);
+ memHeap = interface_cast (reply.readStrongBinder());
+ return memHeap;
+ }
+
+ BpAndroidShm::BpAndroidShm( const sp& impl)
+ : BpInterface(impl)
+ {}
+
+ BpAndroidShm::~BpAndroidShm()
+ {}
+
+ int BpAndroidShm::allocShm(const int size) { // if negative return value is error
+ Parcel data, reply;
+ data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
+ data.writeInt32(size);
+ status_t status = remote()->transact(HW_ALLOC_SHM, data, &reply);
+ if(status != NO_ERROR) {
+ ALOGE("print allocShm error: %s", strerror(-status));
+ } else {
+ status= reply.readInt32();
+ }
+ return status;
+ }
+
+ int BpAndroidShm::removeShm(const unsigned int index) { // shared memory Á¦°Å
+ Parcel data, reply;
+ data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
+ data.writeInt32(index);
+ status_t status = remote()->transact(HW_REMOVE_SHM, data, &reply);
+ if(status != NO_ERROR) {
+ ALOGE("print removeShm error: %s", strerror(-status));
+ } else {
+ status= reply.readInt32();
+ }
+ return status;
+ }
+
+ int BpAndroidShm::isAllocated(const unsigned int index) { // allocated ¿©ºÎ È®ÀÎ
+ Parcel data, reply;
+ data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
+ data.writeInt32(index);
+ status_t status = remote()->transact(HW_IS_ALLOCATED, data, &reply);
+ if(status != NO_ERROR) {
+ ALOGE("print isAllocated error: %s", strerror(-status));
+ } else {
+ status= reply.readInt32();
+ }
+ return status;
+ }
+
+ int BpAndroidShm::setRegistryIndex(const unsigned int index) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
+ data.writeInt32(index);
+ status_t status = remote()->transact(HW_SET_REGISTRY_INDEX, data, &reply);
+ if(status != NO_ERROR) {
+ ALOGE("print setRegistryIndex error: %s", strerror(-status));
+ } else {
+ status= reply.readInt32();
+ }
+ return status;
+ }
+
+ int BpAndroidShm::getRegistryIndex() {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
+ status_t status = remote()->transact(HW_GET_REGISTRY_INDEX, data, &reply);
+ if(status != NO_ERROR) {
+ ALOGE("print getRegistryIndex error: %s", strerror(-status));
+ } else {
+ status= reply.readInt32();
+ }
+ return status;
+ }
+
+ sp BpAndroidShm::InitSemaphore(const char* name) {
+ Parcel data, reply;
+ sp memHeap = NULL;
+ data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
+ data.writeCString(name);
+ status_t status = remote()->transact(HW_INIT_SEMAPHORE, data, &reply);
+ memHeap = interface_cast (reply.readStrongBinder());
+ return memHeap;
+ }
+};
diff --git a/jack2-src/jack2-master/android/BpAndroidShm.h b/jack2-src/jack2-master/android/BpAndroidShm.h
new file mode 100644
index 0000000000..e079cc49e1
--- /dev/null
+++ b/jack2-src/jack2-master/android/BpAndroidShm.h
@@ -0,0 +1,25 @@
+#ifndef BPANDROIDSHM
+#define BPANDROIDSHM
+
+#include
+#include "IAndroidShm.h"
+#include
+
+namespace android {
+ class BpAndroidShm: public BpInterface {
+ public:
+ BpAndroidShm( const sp & impl);
+ virtual ~BpAndroidShm();
+ virtual sp getBuffer(int index);
+ virtual int sendCommand(const char *command);
+ virtual int allocShm(const int size); // if negative return value is error
+ virtual int removeShm(const unsigned int index); // shared memory Á¦°Å
+ virtual int isAllocated(const unsigned int index); // allocated ¿©ºÎ È®ÀÎ
+ virtual int setRegistryIndex(const unsigned int index);
+ virtual int getRegistryIndex();
+
+ virtual sp InitSemaphore(const char* name);
+ };
+};
+
+#endif
diff --git a/jack2-src/jack2-master/android/CleanSpec.mk b/jack2-src/jack2-master/android/CleanSpec.mk
new file mode 100644
index 0000000000..f819ea9218
--- /dev/null
+++ b/jack2-src/jack2-master/android/CleanSpec.mk
@@ -0,0 +1,68 @@
+
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/common)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/alsa_in_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/alsa_out_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/androidshmservice_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/shmservicetest_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/shmservicedump_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_samplerate_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_freewheel_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_connect_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_disconnect_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_latent_client_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_midiseq_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_zombie_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_lsp_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_load_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jackd_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_monitor_client_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_simple_looper_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_simple_client_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_cpu_load_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_iodelay_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_midisine_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_cpu_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_simple_keyboard_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_unload_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_wait_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_alias_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_metro_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_bufsize_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_thru_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_session_notify_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_midi_latency_test_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_rec_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_netsource_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_net_master_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_net_slave_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_showtime_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_server_control_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_evmon_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_test_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_transport_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_simple_session_client_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_simple_effect_intermediates)
+$(call add_clean_step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_multiple_metro_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/jack_midi_dump_intermediates)
+
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/common)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/posix)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libjack_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libjacknet_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libjackserver_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libjackshm_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/jack_alsa_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/jack_dummy_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/jack_net_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/jack_loopback_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/jack_netone_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/audioadapter_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/inprocess_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/netadapter_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/netmanager_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/profiler_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/jack_goldfish_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/jack_opensles_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/in_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/out_intermediates)
+
diff --git a/jack2-src/jack2-master/android/IAndroidShm.cpp b/jack2-src/jack2-master/android/IAndroidShm.cpp
new file mode 100644
index 0000000000..95f5924b34
--- /dev/null
+++ b/jack2-src/jack2-master/android/IAndroidShm.cpp
@@ -0,0 +1,6 @@
+#include "IAndroidShm.h"
+#include "BpAndroidShm.h"
+
+namespace android{
+ IMPLEMENT_META_INTERFACE(AndroidShm, "com.samsung.android.jam.IAndroidShm");
+};
diff --git a/jack2-src/jack2-master/android/IAndroidShm.h b/jack2-src/jack2-master/android/IAndroidShm.h
new file mode 100644
index 0000000000..a890162c4e
--- /dev/null
+++ b/jack2-src/jack2-master/android/IAndroidShm.h
@@ -0,0 +1,41 @@
+#ifndef IANDROIDSHM
+#define IANDROIDSHM
+
+#include
+#include
+
+ namespace android {
+
+ enum {
+ HW_GETBUFFER = IBinder::FIRST_CALL_TRANSACTION,
+ HW_MULTIPLY,
+ HW_STARTSERVER,
+ HW_MAKECLIENT,
+ HW_SENDCOMMAND,
+ HW_LOADSO,
+ HW_ALLOC_SHM,
+ HW_REMOVE_SHM,
+ HW_IS_ALLOCATED,
+ HW_SET_REGISTRY_INDEX,
+ HW_GET_REGISTRY_INDEX,
+ HW_INIT_SEMAPHORE
+ };
+
+ class IAndroidShm: public IInterface {
+ public:
+ DECLARE_META_INTERFACE(AndroidShm);
+
+ virtual sp getBuffer(int index) = 0;
+ virtual int sendCommand(const char *command) = 0;
+ virtual int allocShm(const int size) = 0; // if negative return value is error
+ virtual int removeShm(const unsigned int index) = 0; // shared memory Á¦°Å
+ virtual int isAllocated(const unsigned int index) = 0; // allocated ¿©ºÎ È®ÀÎ
+ virtual int setRegistryIndex(const unsigned int index) = 0;
+ virtual int getRegistryIndex() = 0;
+
+ // for named semaphore simulation
+ virtual sp InitSemaphore(const char* name) = 0;
+ };
+};
+
+#endif
diff --git a/jack2-src/jack2-master/android/JackAndroidSemaphore.cpp b/jack2-src/jack2-master/android/JackAndroidSemaphore.cpp
new file mode 100644
index 0000000000..703e289c54
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackAndroidSemaphore.cpp
@@ -0,0 +1,262 @@
+/*
+Copyright (C) 2004-2008 Grame
+Copyright (C) 2013 Samsung Electronics
+
+This program 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.
+
+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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#include "JackAndroidSemaphore.h"
+#include "JackTools.h"
+#include "JackConstants.h"
+#include "JackError.h"
+#include
+#include
+#include
+#include "IAndroidShm.h"
+#include "shm.h"
+#include "android/Shm.h" //android extension of shm.h
+
+namespace Jack
+{
+
+pthread_mutex_t JackAndroidSemaphore::mutex = PTHREAD_MUTEX_INITIALIZER;
+
+void JackAndroidSemaphore::BuildName(const char* client_name, const char* server_name, char* res, int size)
+{
+ char ext_client_name[SYNC_MAX_NAME_SIZE + 1];
+ JackTools::RewriteName(client_name, ext_client_name);
+ if (getenv("JACK_PROMISCUOUS_SERVER")) {
+ snprintf(res, size, "jack_sem.%s_%s", server_name, ext_client_name);
+ } else {
+ snprintf(res, size, "jack_sem.%d_%s_%s", JackTools::GetUID(), server_name, ext_client_name);
+ }
+}
+
+bool JackAndroidSemaphore::Signal()
+{
+ int res;
+
+ if (!fSemaphore) {
+ jack_error("JackAndroidSemaphore::Signal name = %s already deallocated!!", fName);
+ return false;
+ }
+
+ if (fFlush)
+ return true;
+
+ if ((res = sem_post(fSemaphore)) != 0) {
+ jack_error("JackAndroidSemaphore::Signal name = %s err = %s", fName, strerror(errno));
+ }
+ return (res == 0);
+}
+
+bool JackAndroidSemaphore::SignalAll()
+{
+ int res;
+
+ if (!fSemaphore) {
+ jack_error("JackAndroidSemaphore::SignalAll name = %s already deallocated!!", fName);
+ return false;
+ }
+
+ if (fFlush)
+ return true;
+
+ if ((res = sem_post(fSemaphore)) != 0) {
+ jack_error("JackAndroidSemaphore::SignalAll name = %s err = %s", fName, strerror(errno));
+ }
+ return (res == 0);
+}
+
+/*
+bool JackAndroidSemaphore::Wait()
+{
+ int res;
+
+ if (!fSemaphore) {
+ jack_error("JackAndroidSemaphore::Wait name = %s already deallocated!!", fName);
+ return false;
+ }
+
+ if ((res = sem_wait(fSemaphore)) != 0) {
+ jack_error("JackAndroidSemaphore::Wait name = %s err = %s", fName, strerror(errno));
+ }
+ return (res == 0);
+}
+*/
+
+bool JackAndroidSemaphore::Wait()
+{
+ int res;
+
+ while ((res = sem_wait(fSemaphore) < 0)) {
+ jack_error("JackAndroidSemaphore::Wait name = %s err = %s", fName, strerror(errno));
+ if (errno != EINTR) {
+ break;
+ }
+ }
+ return (res == 0);
+}
+
+bool JackAndroidSemaphore::TimedWait(long usec)
+{
+ int res;
+ struct timeval now;
+ timespec time;
+
+ if (!fSemaphore) {
+ jack_error("JackAndroidSemaphore::TimedWait name = %s already deallocated!!", fName);
+ return false;
+ }
+ gettimeofday(&now, 0);
+ time.tv_sec = now.tv_sec + usec / 1000000;
+ long tv_usec = (now.tv_usec + (usec % 1000000));
+ time.tv_sec += tv_usec / 1000000;
+ time.tv_nsec = (tv_usec % 1000000) * 1000;
+
+ while ((res = sem_timedwait(fSemaphore, &time)) < 0) {
+ jack_error("JackAndroidSemaphore::TimedWait err = %s", strerror(errno));
+ jack_log("JackAndroidSemaphore::TimedWait now : %ld %ld ", now.tv_sec, now.tv_usec);
+ jack_log("JackAndroidSemaphore::TimedWait next : %ld %ld ", time.tv_sec, time.tv_nsec/1000);
+ if (errno == ETIMEDOUT) {
+ timespec ts;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ ts.tv_sec = time.tv_sec - ts.tv_sec;
+ ts.tv_nsec = time.tv_nsec - ts.tv_nsec;
+ if (ts.tv_nsec < 0) {
+ ts.tv_nsec += 1000000000;
+ ts.tv_sec -= 1;
+ }
+ if (ts.tv_sec < 0 || ts.tv_nsec < 0) {
+ jack_error("JackAndroidSemaphore::TimedWait time may changed or client killed already! wait again!");
+ gettimeofday(&now, 0);
+ time.tv_sec = now.tv_sec + usec / 1000000;
+ long tv_usec = (now.tv_usec + (usec % 1000000));
+ time.tv_sec += tv_usec / 1000000;
+ time.tv_nsec = (tv_usec % 1000000) * 1000;
+ if ((res = sem_timedwait(fSemaphore, &time)) < 0) {
+ jack_error("JackAndroidSemaphore::TimedWait err = %s", strerror(errno));
+ jack_log("JackAndroidSemaphore::TimedWait now : %ld %ld ", now.tv_sec, now.tv_usec);
+ jack_log("JackAndroidSemaphore::TimedWait next : %ld %ld ", time.tv_sec, time.tv_nsec/1000);
+ }
+ }
+ }
+ if (errno != EINTR) {
+ break;
+ }
+ }
+ return (res == 0);
+}
+
+// Server side : publish the semaphore in the global namespace
+bool JackAndroidSemaphore::Allocate(const char* name, const char* server_name, int value)
+{
+ pthread_mutex_lock (&mutex);
+ BuildName(name, server_name, fName, sizeof(fName));
+ jack_log("JackAndroidSemaphore::Allocate name = %s val = %ld", fName, value);
+
+ android::sp service = android::Shm::getShmService();
+ if(service == NULL){
+ jack_error("shm service is null");
+ return false;
+ }
+ fSemaphoreMemory = service->InitSemaphore(fName);
+ if(fSemaphoreMemory != NULL){
+ fSemaphore = (sem_t*)(fSemaphoreMemory->getBase());
+ }
+
+ if(fSemaphore == NULL) {
+ jack_error("Allocate: can't check in named semaphore name = %s err = %s", fName, strerror(errno));
+ pthread_mutex_unlock (&mutex);
+ return false;
+ } else {
+ sem_init(fSemaphore, 1, 0);
+ jack_log("sem_init()");
+ pthread_mutex_unlock (&mutex);
+ return true;
+ }
+}
+
+// Client side : get the published semaphore from server
+bool JackAndroidSemaphore::ConnectInput(const char* name, const char* server_name)
+{
+ pthread_mutex_lock (&mutex);
+ BuildName(name, server_name, fName, sizeof(fName));
+ jack_log("JackAndroidSemaphore::Connect name = %s", fName);
+
+ // Temporary...
+ if (fSemaphore) {
+ jack_log("Already connected name = %s", name);
+ pthread_mutex_unlock (&mutex);
+ return true;
+ }
+
+ android::sp service = android::Shm::getShmService();
+ if(service == NULL){
+ jack_error("shm service is null");
+ return false;
+ }
+
+ fSemaphoreMemory = service->InitSemaphore(fName);
+ if(fSemaphoreMemory != NULL){
+ fSemaphore = (sem_t*)(fSemaphoreMemory->getBase());
+ }
+
+ if(fSemaphore == NULL) {
+ jack_error("Connect: can't connect named semaphore name = %s err = %s", fName, strerror(errno));
+ pthread_mutex_unlock (&mutex);
+ return false;
+ } else {
+ int val = 0;
+ sem_getvalue(fSemaphore, &val);
+ jack_log("JackAndroidSemaphore::Connect sem_getvalue %ld", val);
+ pthread_mutex_unlock (&mutex);
+ return true;
+ }
+}
+
+bool JackAndroidSemaphore::Connect(const char* name, const char* server_name)
+{
+ return ConnectInput(name, server_name);
+}
+
+bool JackAndroidSemaphore::ConnectOutput(const char* name, const char* server_name)
+{
+ return ConnectInput(name, server_name);
+}
+
+bool JackAndroidSemaphore::Disconnect()
+{
+ if (fSemaphore) {
+ jack_log("JackAndroidSemaphore::Disconnect name = %s", fName);
+ fSemaphore = NULL;
+ }
+ return true;
+}
+
+// Server side : destroy the semaphore
+void JackAndroidSemaphore::Destroy()
+{
+ if (fSemaphore != NULL) {
+ jack_log("JackAndroidSemaphore::Disconnect name = %s", fName);
+ fSemaphore = NULL;
+ } else {
+ jack_error("JackAndroidSemaphore::Destroy semaphore == NULL");
+ }
+}
+
+} // end of namespace
+
diff --git a/jack2-src/jack2-master/android/JackAndroidSemaphore.h b/jack2-src/jack2-master/android/JackAndroidSemaphore.h
new file mode 100644
index 0000000000..dd8afdb943
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackAndroidSemaphore.h
@@ -0,0 +1,76 @@
+/*
+Copyright (C) 2004-2008 Grame
+Copyright (C) 2013 Samsung Electronics
+
+This program 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.
+
+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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#ifndef __JackAndroidSemaphore__
+#define __JackAndroidSemaphore__
+
+#include "JackSynchro.h"
+#include "JackCompilerDeps.h"
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+namespace Jack
+{
+
+/*!
+\brief Inter process synchronization using POSIX semaphore.
+*/
+
+class SERVER_EXPORT JackAndroidSemaphore : public detail::JackSynchro
+{
+
+ private:
+
+ sem_t* fSemaphore;
+ android::sp fSemaphoreMemory;
+ static pthread_mutex_t mutex;
+
+ protected:
+
+ void BuildName(const char* name, const char* server_name, char* res, int size);
+
+ public:
+
+ JackAndroidSemaphore():JackSynchro(), fSemaphore(NULL)
+ {}
+
+ bool Signal();
+ bool SignalAll();
+ bool Wait();
+ bool TimedWait(long usec);
+
+ bool Allocate(const char* name, const char* server_name, int value);
+ bool Connect(const char* name, const char* server_name);
+ bool ConnectInput(const char* name, const char* server_name);
+ bool ConnectOutput(const char* name, const char* server_name);
+ bool Disconnect();
+ void Destroy();
+};
+
+} // end of namespace
+
+
+#endif
+
diff --git a/jack2-src/jack2-master/android/JackAndroidThread.cpp b/jack2-src/jack2-master/android/JackAndroidThread.cpp
new file mode 100644
index 0000000000..b30dc7894a
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackAndroidThread.cpp
@@ -0,0 +1,386 @@
+/*
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2008 Grame
+Copyright (C) 2013 Samsung Electronics
+
+This program 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.
+
+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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#include "JackAndroidThread.h"
+#include "JackError.h"
+#include "JackTime.h"
+#include "JackGlobals.h"
+#include // for memset
+#include // for _POSIX_PRIORITY_SCHEDULING check
+#include
+
+#ifdef JACK_ANDROID_REALTIME_SCHED
+#include "SchedulingPolicyService.h"
+#endif
+
+//#define JACK_SCHED_POLICY SCHED_RR
+#define JACK_SCHED_POLICY SCHED_FIFO
+
+namespace Jack
+{
+
+void JackAndroidThread::thread_exit_handler(int sig)
+{
+ printf("this signal is %d \n", sig);
+ pthread_exit(0);
+}
+
+void* JackAndroidThread::ThreadHandler(void* arg)
+{
+ JackAndroidThread* obj = (JackAndroidThread*)arg;
+ JackRunnableInterface* runnable = obj->fRunnable;
+ int err;
+
+ // Signal creation thread when started with StartSync
+ jack_log("JackAndroidThread::ThreadHandler : start");
+ obj->fStatus = kIniting;
+
+ // Call Init method
+ if (!runnable->Init()) {
+ jack_error("Thread init fails: thread quits");
+ return 0;
+ }
+
+ obj->fStatus = kRunning;
+
+ // If Init succeed, start the thread loop
+ bool res = true;
+ while (obj->fStatus == kRunning && res) {
+ res = runnable->Execute();
+ }
+
+ jack_log("JackAndroidThread::ThreadHandler : exit");
+ pthread_exit(0);
+ return 0; // never reached
+}
+
+int JackAndroidThread::Start()
+{
+ fStatus = kStarting;
+
+ // Check if the thread was correctly started
+ if (StartImp(&fThread, fPriority, fRealTime, ThreadHandler, this) < 0) {
+ fStatus = kIdle;
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+int JackAndroidThread::StartSync()
+{
+ fStatus = kStarting;
+
+ if (StartImp(&fThread, fPriority, fRealTime, ThreadHandler, this) < 0) {
+ fStatus = kIdle;
+ return -1;
+ } else {
+ int count = 0;
+ while (fStatus == kStarting && ++count < 1000) {
+ JackSleep(1000);
+ }
+ return (count == 1000) ? -1 : 0;
+ }
+}
+
+int JackAndroidThread::StartImp(jack_native_thread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg)
+{
+ pthread_attr_t attributes;
+ struct sched_param rt_param;
+ pthread_attr_init(&attributes);
+ int res;
+
+ struct sigaction actions;
+ memset(&actions, 0, sizeof(actions));
+ sigemptyset(&actions.sa_mask);
+ actions.sa_flags = 0;
+ actions.sa_handler = thread_exit_handler;
+ sigaction(SIGUSR1,&actions,NULL);
+
+ if ((res = pthread_attr_setdetachstate(&attributes, PTHREAD_CREATE_JOINABLE))) {
+ jack_error("Cannot request joinable thread creation for thread res = %d", res);
+ return -1;
+ }
+
+ if ((res = pthread_attr_setscope(&attributes, PTHREAD_SCOPE_SYSTEM))) {
+ jack_error("Cannot set scheduling scope for thread res = %d", res);
+ return -1;
+ }
+
+ if (realtime) {
+
+ jack_log("JackAndroidThread::StartImp : create RT thread");
+
+ if ((res = pthread_attr_setschedpolicy(&attributes, JACK_SCHED_POLICY))) {
+ jack_error("Cannot set RR scheduling class for RT thread res = %d", res);
+ return -1;
+ }
+
+ memset(&rt_param, 0, sizeof(rt_param));
+ rt_param.sched_priority = priority;
+
+ if ((res = pthread_attr_setschedparam(&attributes, &rt_param))) {
+ jack_error("Cannot set scheduling priority for RT thread res = %d", res);
+ return -1;
+ }
+
+ } else {
+ jack_log("JackAndroidThread::StartImp : create non RT thread");
+ }
+
+ if ((res = pthread_attr_setstacksize(&attributes, THREAD_STACK))) {
+ jack_error("Cannot set thread stack size res = %d", res);
+ return -1;
+ }
+
+ if ((res = JackGlobals::fJackThreadCreator(thread, &attributes, start_routine, arg))) {
+ jack_error("Cannot create thread res = %d", res);
+ return -1;
+ }
+
+ pthread_attr_destroy(&attributes);
+ return 0;
+}
+
+int JackAndroidThread::Kill()
+{
+ if (fThread != (jack_native_thread_t)NULL) { // If thread has been started
+ jack_log("JackAndroidThread::Kill");
+ void* status;
+
+ pthread_kill(fThread, SIGUSR1);
+ pthread_join(fThread, &status);
+ fStatus = kIdle;
+ fThread = (jack_native_thread_t)NULL;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+int JackAndroidThread::Stop()
+{
+ if (fThread != (jack_native_thread_t)NULL) { // If thread has been started
+ jack_log("JackAndroidThread::Stop");
+ void* status;
+ fStatus = kIdle; // Request for the thread to stop
+ pthread_join(fThread, &status);
+ fThread = (jack_native_thread_t)NULL;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+int JackAndroidThread::KillImp(jack_native_thread_t thread)
+{
+ if (thread != (jack_native_thread_t)NULL) { // If thread has been started
+ jack_log("JackAndroidThread::Kill");
+ void* status;
+ pthread_kill(thread, SIGUSR1);
+ pthread_join(thread, &status);
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+int JackAndroidThread::StopImp(jack_native_thread_t thread)
+{
+ if (thread != (jack_native_thread_t)NULL) { // If thread has been started
+ jack_log("JackAndroidThread::Stop");
+ void* status;
+ pthread_join(thread, &status);
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+int JackAndroidThread::AcquireRealTime()
+{
+ return (fThread != (jack_native_thread_t)NULL) ? AcquireRealTimeImp(fThread, fPriority) : -1;
+}
+
+int JackAndroidThread::AcquireSelfRealTime()
+{
+ return AcquireRealTimeImp(pthread_self(), fPriority);
+}
+
+int JackAndroidThread::AcquireRealTime(int priority)
+{
+ fPriority = priority;
+ return AcquireRealTime();
+}
+
+int JackAndroidThread::AcquireSelfRealTime(int priority)
+{
+ fPriority = priority;
+ return AcquireSelfRealTime();
+}
+int JackAndroidThread::AcquireRealTimeImp(jack_native_thread_t thread, int priority)
+{
+ struct sched_param rtparam;
+ int res;
+ memset(&rtparam, 0, sizeof(rtparam));
+ rtparam.sched_priority = priority;
+
+ jack_log("JackAndroidThread::AcquireRealTimeImp priority = %d", priority);
+
+#ifndef JACK_ANDROID_REALTIME_SCHED
+ if ((res = pthread_setschedparam(thread, JACK_SCHED_POLICY, &rtparam)) != 0) {
+ jack_error("Cannot use real-time scheduling (RR/%d)"
+ "(%d: %s)", rtparam.sched_priority, res,
+ strerror(res));
+ return -1;
+ }
+#else
+ if ((res = android::requestPriority(getpid(), gettid(), priority)) != 0) {
+ jack_log("Failed to get SCHED_FIFO priority pid %d tid %d; error %d",
+ getpid(), gettid(), res);
+ return -1;
+ }
+#endif
+ return 0;
+}
+
+int JackAndroidThread::DropRealTime()
+{
+ return (fThread != (jack_native_thread_t)NULL) ? DropRealTimeImp(fThread) : -1;
+}
+
+int JackAndroidThread::DropSelfRealTime()
+{
+ return DropRealTimeImp(pthread_self());
+}
+
+int JackAndroidThread::DropRealTimeImp(jack_native_thread_t thread)
+{
+ struct sched_param rtparam;
+ int res;
+ memset(&rtparam, 0, sizeof(rtparam));
+ rtparam.sched_priority = 0;
+
+ if ((res = pthread_setschedparam(thread, SCHED_OTHER, &rtparam)) != 0) {
+ jack_error("Cannot switch to normal scheduling priority(%s)", strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+
+jack_native_thread_t JackAndroidThread::GetThreadID()
+{
+ return fThread;
+}
+
+bool JackAndroidThread::IsThread()
+{
+ return pthread_self() == fThread;
+}
+
+void JackAndroidThread::Terminate()
+{
+ jack_log("JackAndroidThread::Terminate");
+ pthread_exit(0);
+}
+
+SERVER_EXPORT void ThreadExit()
+{
+ jack_log("ThreadExit");
+ pthread_exit(0);
+}
+
+} // end of namespace
+
+bool jack_get_thread_realtime_priority_range(int * min_ptr, int * max_ptr)
+{
+#if defined(_POSIX_PRIORITY_SCHEDULING) && !defined(__APPLE__)
+ int min, max;
+
+ min = sched_get_priority_min(JACK_SCHED_POLICY);
+ if (min == -1)
+ {
+ jack_error("sched_get_priority_min() failed.");
+ return false;
+ }
+
+ max = sched_get_priority_max(JACK_SCHED_POLICY);
+ if (max == -1)
+ {
+ jack_error("sched_get_priority_max() failed.");
+ return false;
+ }
+
+ *min_ptr = min;
+ *max_ptr = max;
+
+ return true;
+#else
+ return false;
+#endif
+}
+
+bool jack_tls_allocate_key(jack_tls_key *key_ptr)
+{
+ int ret;
+
+ ret = pthread_key_create(key_ptr, NULL);
+ if (ret != 0)
+ {
+ jack_error("pthread_key_create() failed with error %d", ret);
+ return false;
+ }
+
+ return true;
+}
+
+bool jack_tls_free_key(jack_tls_key key)
+{
+ int ret;
+
+ ret = pthread_key_delete(key);
+ if (ret != 0)
+ {
+ jack_error("pthread_key_delete() failed with error %d", ret);
+ return false;
+ }
+
+ return true;
+}
+
+bool jack_tls_set(jack_tls_key key, void *data_ptr)
+{
+ int ret;
+
+ ret = pthread_setspecific(key, (const void *)data_ptr);
+ if (ret != 0)
+ {
+ jack_error("pthread_setspecific() failed with error %d", ret);
+ return false;
+ }
+
+ return true;
+}
+
+void *jack_tls_get(jack_tls_key key)
+{
+ return pthread_getspecific(key);
+}
diff --git a/jack2-src/jack2-master/android/JackAndroidThread.h b/jack2-src/jack2-master/android/JackAndroidThread.h
new file mode 100644
index 0000000000..d6ec66d852
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackAndroidThread.h
@@ -0,0 +1,97 @@
+/*
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2008 Grame
+Copyright (C) 2013 Samsung Electronics
+
+This program 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.
+
+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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#ifndef __JackAndroidThread__
+#define __JackAndroidThread__
+
+#include "JackThread.h"
+#include
+
+namespace Jack
+{
+
+/* use 512KB stack per thread - the default is way too high to be feasible
+ * with mlockall() on many systems */
+#define THREAD_STACK 524288
+
+enum
+{
+ PTHREAD_CANCEL_DEFERRED,
+ PTHREAD_CANCEL_ASYNCHRONOUS
+};
+
+/*!
+\brief The POSIX thread base class.
+*/
+
+class SERVER_EXPORT JackAndroidThread : public detail::JackThreadInterface
+{
+
+ protected:
+
+ jack_native_thread_t fThread;
+ static void* ThreadHandler(void* arg);
+ static void thread_exit_handler(int sig);
+
+ public:
+
+ JackAndroidThread(JackRunnableInterface* runnable, bool real_time, int priority, int cancellation)
+ : JackThreadInterface(runnable, priority, real_time, cancellation), fThread((jack_native_thread_t)NULL)
+ {}
+ JackAndroidThread(JackRunnableInterface* runnable, int cancellation = PTHREAD_CANCEL_ASYNCHRONOUS)
+ : JackThreadInterface(runnable, 0, false, cancellation), fThread((jack_native_thread_t)NULL)
+ {}
+
+ int Start();
+ int StartSync();
+ int Kill();
+ int Stop();
+ void Terminate();
+
+ int AcquireRealTime(); // Used when called from another thread
+ int AcquireSelfRealTime(); // Used when called from thread itself
+
+ int AcquireRealTime(int priority); // Used when called from another thread
+ int AcquireSelfRealTime(int priority); // Used when called from thread itself
+
+ int DropRealTime(); // Used when called from another thread
+ int DropSelfRealTime(); // Used when called from thread itself
+
+ jack_native_thread_t GetThreadID();
+ bool IsThread();
+
+ static int AcquireRealTimeImp(jack_native_thread_t thread, int priority);
+ static int AcquireRealTimeImp(jack_native_thread_t thread, int priority, UInt64 period, UInt64 computation, UInt64 constraint)
+ {
+ return JackAndroidThread::AcquireRealTimeImp(thread, priority);
+ }
+ static int DropRealTimeImp(jack_native_thread_t thread);
+ static int StartImp(jack_native_thread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg);
+ static int StopImp(jack_native_thread_t thread);
+ static int KillImp(jack_native_thread_t thread);
+};
+
+SERVER_EXPORT void ThreadExit();
+
+} // end of namespace
+
+
+#endif
diff --git a/jack2-src/jack2-master/android/JackCompilerDeps_os.h b/jack2-src/jack2-master/android/JackCompilerDeps_os.h
new file mode 100644
index 0000000000..8e6e5ff553
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackCompilerDeps_os.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2004-2008 Grame
+ Copyright (C) 2013 Samsung Electronics
+
+ This program 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.
+
+ 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ */
+
+#ifndef __JackCompilerDeps_android__
+#define __JackCompilerDeps_android__
+
+#include "JackConstants.h"
+
+#if __GNUC__
+
+ #define MEM_ALIGN(x,y) x __attribute__((aligned(y)))
+ #define LIB_EXPORT __attribute__((visibility("default")))
+ #ifdef SERVER_SIDE
+ #if (__GNUC__< 4)
+ #define SERVER_EXPORT
+ #else
+ #define SERVER_EXPORT __attribute__((visibility("default")))
+ #endif
+ #else
+ #define SERVER_EXPORT __attribute__((visibility("hidden")))
+ #endif
+
+#else
+ #define MEM_ALIGN(x,y) x
+ #define LIB_EXPORT
+ #define SERVER_EXPORT
+
+ /* Add other things here for non-gcc platforms */
+#endif
+
+#endif /* __JackCompilerDeps_android__ */
diff --git a/jack2-src/jack2-master/android/JackControlAPIAndroid.cpp b/jack2-src/jack2-master/android/JackControlAPIAndroid.cpp
new file mode 100644
index 0000000000..a915b4ddaa
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackControlAPIAndroid.cpp
@@ -0,0 +1,89 @@
+// u/* -*- Mode: C++ ; c-basic-offset: 4 -*- */
+/*
+ JACK control API implementation
+
+ Copyright (C) 2008 Nedko Arnaudov
+ Copyright (C) 2008 Grame
+ Copyright (C) 2013 Samsung Electronics
+
+ 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; version 2 of the License.
+
+ 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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef WIN32
+#include
+#include
+#include
+#endif
+
+#include "types.h"
+#include
+#include
+#include
+#include
+#include
+
+#include "JackControlAPIAndroid.h"
+#include "JackConstants.h"
+#include "JackServerGlobals.h"
+
+using namespace Jack;
+
+struct jackctl_sigmask
+{
+ sigset_t signals;
+};
+
+static jackctl_sigmask sigmask;
+
+SERVER_EXPORT int
+jackctl_wait_signals_and_return(jackctl_sigmask_t * sigmask)
+{
+ int sig;
+ bool waiting = true;
+
+ while (waiting) {
+ #if defined(sun) && !defined(__sun__) // SUN compiler only, to check
+ sigwait(&sigmask->signals);
+ #else
+ sigwait(&sigmask->signals, &sig);
+ #endif
+ fprintf(stderr, "Jack main caught signal %d\n", sig);
+
+ switch (sig) {
+ case SIGUSR1:
+ //jack_dump_configuration(engine, 1);
+ break;
+ case SIGUSR2:
+ // driver exit
+ waiting = false;
+ break;
+ case SIGTTOU:
+ break;
+ default:
+ waiting = false;
+ break;
+ }
+ }
+
+ if (sig != SIGSEGV) {
+ // unblock signals so we can see them during shutdown.
+ // this will help prod developers not to lose sight of
+ // bugs that cause segfaults etc. during shutdown.
+ sigprocmask(SIG_UNBLOCK, &sigmask->signals, 0);
+ }
+
+ return sig;
+}
+
diff --git a/jack2-src/jack2-master/android/JackControlAPIAndroid.h b/jack2-src/jack2-master/android/JackControlAPIAndroid.h
new file mode 100644
index 0000000000..92694113ca
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackControlAPIAndroid.h
@@ -0,0 +1,44 @@
+/*
+ JACK control API
+
+ Copyright (C) 2008 Nedko Arnaudov
+ Copyright (C) 2008 Grame
+ Copyright (C) 2013 Samsung Electronics
+
+ 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; version 2 of the License.
+
+ 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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __JackControlAPIAndroid__
+#define __JackControlAPIAndroid__
+
+#include "JackCompilerDeps.h"
+
+/** opaque type for sigmask object */
+typedef struct jackctl_sigmask jackctl_sigmask_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+SERVER_EXPORT int
+jackctl_wait_signals_and_return(
+ jackctl_sigmask_t * signals);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
+
diff --git a/jack2-src/jack2-master/android/JackError.cpp b/jack2-src/jack2-master/android/JackError.cpp
new file mode 100644
index 0000000000..e1ba18bc4a
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackError.cpp
@@ -0,0 +1,153 @@
+/*
+ Copyright (C) 2001 Paul Davis
+ Copyright (C) 2004-2008 Grame
+ Copyright (C) 2008 Nedko Arnaudov
+ Copyright (C) 2013 Samsung Electronics
+
+ This program 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.
+
+ 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ */
+
+#include
+#include
+#include "JackError.h"
+#include "JackGlobals.h"
+#include "JackMessageBuffer.h"
+
+#define LOG_BUF_SIZE 1024
+#undef LOG_TAG
+#ifdef SERVER_SIDE
+#define LOG_TAG "JackAudioServer"
+#else
+#define LOG_TAG "JackAudioClient"
+#endif
+#include
+
+using namespace Jack;
+
+static bool change_thread_log_function(jack_log_function_t log_function)
+{
+ return (jack_tls_get(JackGlobals::fKeyLogFunction) == NULL
+ && jack_tls_set(JackGlobals::fKeyLogFunction, (void*)log_function));
+}
+
+SERVER_EXPORT int set_threaded_log_function()
+{
+ return change_thread_log_function(JackMessageBufferAdd);
+}
+
+void jack_log_function(int level, const char *message)
+{
+ void (* log_callback)(const char *);
+
+ switch (level)
+ {
+ case LOG_LEVEL_INFO:
+ log_callback = jack_info_callback;
+ break;
+ case LOG_LEVEL_ERROR:
+ log_callback = jack_error_callback;
+ break;
+ default:
+ return;
+ }
+
+ log_callback(message);
+}
+
+static void jack_format_and_log(int level, const char *prefix, const char *fmt, va_list ap)
+{
+ char buffer[256];
+ size_t len;
+ jack_log_function_t log_function;
+
+ if (prefix != NULL) {
+ len = strlen(prefix);
+ assert(len < 256);
+ memcpy(buffer, prefix, len);
+ } else {
+ len = 0;
+ }
+
+ vsnprintf(buffer + len, sizeof(buffer) - len, fmt, ap);
+
+ log_function = (jack_log_function_t)jack_tls_get(JackGlobals::fKeyLogFunction);
+
+ /* if log function is not overridden for thread, use default one */
+ if (log_function == NULL)
+ {
+ log_function = jack_log_function;
+ //log_function(LOG_LEVEL_INFO, "------ Using default log function");
+ }
+ else
+ {
+ //log_function(LOG_LEVEL_INFO, "++++++ Using thread-specific log function");
+ }
+
+ log_function(level, buffer);
+}
+
+SERVER_EXPORT void jack_error(const char *fmt, ...)
+{
+ va_list ap;
+ char buf[LOG_BUF_SIZE];
+ va_start(ap, fmt);
+ vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
+ va_end(ap);
+ __android_log_write(ANDROID_LOG_ERROR, LOG_TAG, buf);
+}
+
+SERVER_EXPORT void jack_info(const char *fmt, ...)
+{
+ va_list ap;
+ char buf[LOG_BUF_SIZE];
+ va_start(ap, fmt);
+ vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
+ va_end(ap);
+ __android_log_write(ANDROID_LOG_INFO, LOG_TAG, buf);
+}
+
+SERVER_EXPORT void jack_log(const char *fmt,...)
+{
+ va_list ap;
+ char buf[LOG_BUF_SIZE];
+ if (JackGlobals::fVerbose) {
+ va_start(ap, fmt);
+ vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
+ va_end(ap);
+ __android_log_write(ANDROID_LOG_VERBOSE, LOG_TAG, buf);
+ }
+}
+
+SERVER_EXPORT void default_jack_error_callback(const char *desc)
+{
+ fprintf(stderr, "%s\n", desc);
+ fflush(stderr);
+}
+
+SERVER_EXPORT void default_jack_info_callback(const char *desc)
+{
+ fprintf(stdout, "%s\n", desc);
+ fflush(stdout);
+}
+
+SERVER_EXPORT void silent_jack_error_callback(const char *desc)
+{}
+
+SERVER_EXPORT void silent_jack_info_callback(const char *desc)
+{}
+
+SERVER_EXPORT void (*jack_error_callback)(const char *desc) = &default_jack_error_callback;
+SERVER_EXPORT void (*jack_info_callback)(const char *desc) = &default_jack_info_callback;
diff --git a/jack2-src/jack2-master/android/JackGoldfishDriver.cpp b/jack2-src/jack2-master/android/JackGoldfishDriver.cpp
new file mode 100644
index 0000000000..0765d8b356
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackGoldfishDriver.cpp
@@ -0,0 +1,212 @@
+/*
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2008 Grame
+Copyright (C) 2013 Samsung Electronics
+
+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 2 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, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "JackGoldfishDriver.h"
+#include "JackDriverLoader.h"
+#include "JackThreadedDriver.h"
+#include "JackEngineControl.h"
+#include "JackGraphManager.h"
+#include "JackCompilerDeps.h"
+#include
+#include
+#include
+#include
+
+#define JACK_GOLDFISH_BUFFER_SIZE 4096
+
+namespace Jack
+{
+
+static char const * const kAudioDeviceName = "/dev/eac";
+
+int JackGoldfishDriver::Open(jack_nframes_t buffer_size,
+ jack_nframes_t samplerate,
+ bool capturing,
+ bool playing,
+ int inchannels,
+ int outchannels,
+ bool monitor,
+ const char* capture_driver_uid,
+ const char* playback_driver_uid,
+ jack_nframes_t capture_latency,
+ jack_nframes_t playback_latency) {
+ jack_log("JackGoldfishDriver::Open");
+
+ // Generic JackAudioDriver Open
+ if (JackAudioDriver::Open(buffer_size, samplerate, capturing, playing, inchannels, outchannels, monitor,
+ capture_driver_uid, playback_driver_uid, capture_latency, playback_latency) != 0) {
+ return -1;
+ }
+
+ mFd = ::open(kAudioDeviceName, O_RDWR);
+ jack_log("JackGoldfishDriver::Open(mFd=%d)", mFd);
+
+ if (!mBuffer)
+ mBuffer = (short *) malloc(sizeof(short) * JACK_GOLDFISH_BUFFER_SIZE * 2);
+
+ //JackAudioDriver::SetBufferSize(buffer_size);
+ //JackAudioDriver::SetSampleRate(samplerate);
+
+ return 0;
+}
+
+int JackGoldfishDriver::Close() {
+ jack_log("JackGoldfishDriver::Close");
+
+ // Generic audio driver close
+ int res = JackAudioDriver::Close();
+
+ if (mFd >= 0) ::close(mFd);
+
+ if (mBuffer) {
+ free(mBuffer);
+ mBuffer = NULL;
+ }
+
+ return res;
+}
+
+int JackGoldfishDriver::Read() {
+ jack_log("JackGoldfishDriver::Read");
+ for (int i = 0; i < fCaptureChannels; i++) {
+ //silence
+ memset(GetInputBuffer(i), 0, sizeof(jack_default_audio_sample_t) * JACK_GOLDFISH_BUFFER_SIZE /* fEngineControl->fBufferSize */);
+ }
+ return 0;
+}
+
+int JackGoldfishDriver::Write() {
+ jack_log("JackGoldfishDriver::Write");
+ //write(mFd, GetOutputBuffer(i), sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize);
+
+ jack_default_audio_sample_t* outputBuffer_1 = GetOutputBuffer(0);
+ jack_default_audio_sample_t* outputBuffer_2 = GetOutputBuffer(1);
+
+ for(int i=0, j=0; ifBufferSize */; i++) {
+ //convert float to short
+ *(mBuffer + j) = (short) (*(outputBuffer_1 + i) * 32640); j++;
+ *(mBuffer + j) = (short) (*(outputBuffer_2 + i) * 32640); j++;
+ }
+ write(mFd, mBuffer, sizeof(short) * JACK_GOLDFISH_BUFFER_SIZE * 2);
+ return 0;
+}
+
+int JackGoldfishDriver::SetBufferSize(jack_nframes_t buffer_size) {
+ jack_log("JackGoldfishDriver::SetBufferSize");
+ JackAudioDriver::SetBufferSize(buffer_size);
+ return 0;
+}
+
+} // end of namespace
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+ SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor () {
+ jack_driver_desc_t * desc;
+ jack_driver_desc_filler_t filler;
+ jack_driver_param_value_t value;
+
+ desc = jack_driver_descriptor_construct("goldfish", JackDriverMaster, "Timer based backend", &filler);
+
+ value.ui = 2U;
+ jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamUInt, &value, NULL, "Number of capture ports", NULL);
+ jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamUInt, &value, NULL, "Number of playback ports", NULL);
+
+ value.ui = 44100U;
+ jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL);
+
+ value.i = 0;
+ jack_driver_descriptor_add_parameter(desc, &filler, "monitor", 'm', JackDriverParamBool, &value, NULL, "Provide monitor ports for the output", NULL);
+
+ value.ui = JACK_GOLDFISH_BUFFER_SIZE;
+ jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL);
+
+ value.ui = 21333U;
+ jack_driver_descriptor_add_parameter(desc, &filler, "wait", 'w', JackDriverParamUInt, &value, NULL, "Number of usecs to wait between engine processes", NULL);
+
+ return desc;
+ }
+
+ SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) {
+ jack_nframes_t sample_rate = 44100;
+ jack_nframes_t buffer_size = JACK_GOLDFISH_BUFFER_SIZE;
+ unsigned int capture_ports = 2;
+ unsigned int playback_ports = 2;
+ int wait_time = 0;
+ const JSList * node;
+ const jack_driver_param_t * param;
+ bool monitor = false;
+
+ for (node = params; node; node = jack_slist_next (node)) {
+ param = (const jack_driver_param_t *) node->data;
+
+ switch (param->character) {
+
+ case 'C':
+ capture_ports = param->value.ui;
+ break;
+
+ case 'P':
+ playback_ports = param->value.ui;
+ break;
+
+ case 'r':
+ sample_rate = param->value.ui;
+ break;
+
+ case 'p':
+ buffer_size = param->value.ui;
+ break;
+
+ case 'w':
+ wait_time = param->value.ui;
+ break;
+
+ case 'm':
+ monitor = param->value.i;
+ break;
+ }
+ }
+
+ if (wait_time > 0) {
+ buffer_size = lroundf((wait_time * sample_rate) / 1000000.0f);
+ if (buffer_size > BUFFER_SIZE_MAX) {
+ buffer_size = BUFFER_SIZE_MAX;
+ jack_error("Buffer size set to %d", BUFFER_SIZE_MAX);
+ }
+ }
+
+ Jack::JackDriverClientInterface* driver = new Jack::JackThreadedDriver(new Jack::JackGoldfishDriver("system", "goldfish_pcm", engine, table));
+ if (driver->Open(buffer_size, sample_rate, 1, 1, capture_ports, playback_ports, monitor, "goldfish", "goldfish", 0, 0) == 0) {
+ return driver;
+ } else {
+ delete driver;
+ return NULL;
+ }
+ }
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/jack2-src/jack2-master/android/JackGoldfishDriver.h b/jack2-src/jack2-master/android/JackGoldfishDriver.h
new file mode 100644
index 0000000000..c30aec5c40
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackGoldfishDriver.h
@@ -0,0 +1,70 @@
+/*
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2008 Grame
+Copyright (C) 2013 Samsung Electronics
+
+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 2 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, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __JackGoldfishDriver__
+#define __JackGoldfishDriver__
+
+#include "JackAudioDriver.h"
+
+namespace Jack
+{
+
+/*!
+\brief The goldfish driver.
+*/
+
+class JackGoldfishDriver : public JackAudioDriver
+{
+
+ public:
+
+ JackGoldfishDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table)
+ : JackAudioDriver(name, alias, engine, table), mFd(-1), mBuffer(NULL)
+ {}
+ virtual ~JackGoldfishDriver()
+ {}
+
+ int Open(jack_nframes_t buffe_size,
+ jack_nframes_t samplerate,
+ bool capturing,
+ bool playing,
+ int chan_in,
+ int chan_out,
+ bool monitor,
+ const char* capture_driver_name,
+ const char* playback_driver_name,
+ jack_nframes_t capture_latency,
+ jack_nframes_t playback_latency);
+ int Close();
+ int Read();
+ int Write();
+ int SetBufferSize(jack_nframes_t buffer_size);
+
+private:
+
+ int mFd;
+ short *mBuffer;
+
+};
+
+} // end of namespace
+
+#endif
diff --git a/jack2-src/jack2-master/android/JackOpenSLESDriver.cpp b/jack2-src/jack2-master/android/JackOpenSLESDriver.cpp
new file mode 100644
index 0000000000..f4e8608a52
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackOpenSLESDriver.cpp
@@ -0,0 +1,233 @@
+/*
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2008 Grame
+Copyright (C) 2013 Samsung Electronics
+
+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 2 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, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "JackOpenSLESDriver.h"
+#include "JackDriverLoader.h"
+#include "JackThreadedDriver.h"
+#include "JackEngineControl.h"
+#include "JackGraphManager.h"
+#include "JackCompilerDeps.h"
+#include
+#include
+#include
+#include
+
+#include
+#include "opensl_io.h"
+
+#define JACK_OPENSLES_DEFAULT_SAMPLERATE 48000
+#define JACK_OPENSLES_DEFAULT_BUFFER_SIZE 960
+
+namespace Jack
+{
+
+static OPENSL_STREAM *pOpenSL_stream;
+
+int JackOpenSLESDriver::Open(jack_nframes_t buffer_size,
+ jack_nframes_t samplerate,
+ bool capturing,
+ bool playing,
+ int inchannels,
+ int outchannels,
+ bool monitor,
+ const char* capture_driver_uid,
+ const char* playback_driver_uid,
+ jack_nframes_t capture_latency,
+ jack_nframes_t playback_latency) {
+ jack_log("JackOpenSLESDriver::Open");
+
+ // Generic JackAudioDriver Open
+ if (JackAudioDriver::Open(buffer_size, samplerate, capturing, playing, inchannels, outchannels, monitor,
+ capture_driver_uid, playback_driver_uid, capture_latency, playback_latency) != 0) {
+ return -1;
+ }
+
+ if (capturing) {
+ inbuffer = (float *) malloc(sizeof(float) * buffer_size); //mono input
+ memset(inbuffer, 0, sizeof(float) * buffer_size);
+ }
+ if (playing) {
+ outbuffer = (float *) malloc(sizeof(float) * buffer_size * 2); //stereo output
+ memset(outbuffer, 0, sizeof(float) * buffer_size * 2);
+ }
+ pOpenSL_stream = android_OpenAudioDevice(samplerate, capturing ? 1 : 0, playing ? 2 : 0, buffer_size);
+ if (pOpenSL_stream == NULL) return -1;
+
+ return 0;
+}
+
+int JackOpenSLESDriver::Close() {
+ jack_log("JackOpenSLESDriver::Close");
+
+ // Generic audio driver close
+ int res = JackAudioDriver::Close();
+
+ android_CloseAudioDevice(pOpenSL_stream);
+
+ if (inbuffer) {
+ free(inbuffer);
+ inbuffer = NULL;
+ }
+ if (outbuffer) {
+ free(outbuffer);
+ outbuffer = NULL;
+ }
+ return res;
+}
+
+int JackOpenSLESDriver::Read() {
+ //jack_log("JackOpenSLESDriver::Read");
+ jack_default_audio_sample_t* inputBuffer_1 = GetInputBuffer(0);
+ jack_default_audio_sample_t* inputBuffer_2 = GetInputBuffer(1);
+
+ if (inbuffer) {
+ int samps = android_AudioIn(pOpenSL_stream,inbuffer,fEngineControl->fBufferSize);
+ for (int i = 0; i < samps; i++) {
+ *(inputBuffer_1 + i) = *(inbuffer + i);
+ *(inputBuffer_2 + i) = *(inbuffer + i);
+ }
+ } else {
+ for (int i = 0; i < fCaptureChannels; i++) {
+ memset(GetInputBuffer(i), 0, sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize); //silence
+ }
+ }
+
+ return 0;
+}
+
+int JackOpenSLESDriver::Write() {
+ //jack_log("JackOpenSLESDriver::Write");
+ jack_default_audio_sample_t* outputBuffer_1 = GetOutputBuffer(0);
+ jack_default_audio_sample_t* outputBuffer_2 = GetOutputBuffer(1);
+
+ if (outbuffer) {
+ android_AudioOut(pOpenSL_stream, outbuffer, fEngineControl->fBufferSize * 2); //stereo output
+ for (unsigned int i = 0, j = 0; i < fEngineControl->fBufferSize; i++) {
+ *(outbuffer + j) = *(outputBuffer_1 + i); j++;
+ *(outbuffer + j) = *(outputBuffer_2 + i); j++;
+ }
+ }
+
+ return 0;
+}
+
+int JackOpenSLESDriver::SetBufferSize(jack_nframes_t buffer_size) {
+ jack_log("JackOpenSLESDriver::SetBufferSize");
+ JackAudioDriver::SetBufferSize(buffer_size);
+ return 0;
+}
+
+} // end of namespace
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+ SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor () {
+ jack_driver_desc_t * desc;
+ jack_driver_desc_filler_t filler;
+ jack_driver_param_value_t value;
+
+ desc = jack_driver_descriptor_construct("opensles", JackDriverMaster, "Timer based backend", &filler);
+
+ value.ui = 2U;
+ jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamUInt, &value, NULL, "Number of capture ports", NULL);
+ jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamUInt, &value, NULL, "Number of playback ports", NULL);
+
+ value.ui = 48000U;
+ jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL);
+
+ value.i = 0;
+ jack_driver_descriptor_add_parameter(desc, &filler, "monitor", 'm', JackDriverParamBool, &value, NULL, "Provide monitor ports for the output", NULL);
+
+ value.ui = JACK_OPENSLES_DEFAULT_BUFFER_SIZE;
+ jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL);
+
+ value.ui = 21333U;
+ jack_driver_descriptor_add_parameter(desc, &filler, "wait", 'w', JackDriverParamUInt, &value, NULL, "Number of usecs to wait between engine processes", NULL);
+
+ return desc;
+ }
+
+ SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) {
+ jack_nframes_t sample_rate = JACK_OPENSLES_DEFAULT_SAMPLERATE;
+ jack_nframes_t buffer_size = JACK_OPENSLES_DEFAULT_BUFFER_SIZE;
+ unsigned int capture_ports = 0;
+ unsigned int playback_ports = 2;
+ int wait_time = 0;
+ const JSList * node;
+ const jack_driver_param_t * param;
+ bool monitor = false;
+
+ for (node = params; node; node = jack_slist_next (node)) {
+ param = (const jack_driver_param_t *) node->data;
+
+ switch (param->character) {
+
+ case 'C':
+ capture_ports = param->value.ui;
+ break;
+
+ case 'P':
+ playback_ports = param->value.ui;
+ break;
+
+ case 'r':
+ sample_rate = param->value.ui;
+ break;
+
+ case 'p':
+ buffer_size = param->value.ui;
+ break;
+
+ case 'w':
+ wait_time = param->value.ui;
+ break;
+
+ case 'm':
+ monitor = param->value.i;
+ break;
+ }
+ }
+
+ if (wait_time > 0) {
+ buffer_size = lroundf((wait_time * sample_rate) / 1000000.0f);
+ if (buffer_size > BUFFER_SIZE_MAX) {
+ buffer_size = BUFFER_SIZE_MAX;
+ jack_error("Buffer size set to %d", BUFFER_SIZE_MAX);
+ }
+ }
+
+ Jack::JackDriverClientInterface* driver = new Jack::JackThreadedDriver(new Jack::JackOpenSLESDriver("system", "opensles_pcm", engine, table));
+ if (driver->Open(buffer_size, sample_rate, capture_ports? 1 : 0, playback_ports? 1 : 0, capture_ports, playback_ports, monitor, "opensles", "opensles", 0, 0) == 0) {
+ return driver;
+ } else {
+ delete driver;
+ return NULL;
+ }
+ }
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/jack2-src/jack2-master/android/JackOpenSLESDriver.h b/jack2-src/jack2-master/android/JackOpenSLESDriver.h
new file mode 100644
index 0000000000..04ddf6a1bd
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackOpenSLESDriver.h
@@ -0,0 +1,70 @@
+/*
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2008 Grame
+Copyright (C) 2013 Samsung Electronics
+
+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 2 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, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __JackOpenSLESDriver__
+#define __JackOpenSLESDriver__
+
+#include "JackAudioDriver.h"
+
+namespace Jack
+{
+
+/*!
+\brief The OpenSLES driver.
+*/
+
+class JackOpenSLESDriver : public JackAudioDriver
+{
+
+ public:
+
+ JackOpenSLESDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table)
+ : JackAudioDriver(name, alias, engine, table), inbuffer(NULL), outbuffer(NULL)
+ {}
+ virtual ~JackOpenSLESDriver()
+ {}
+
+ int Open(jack_nframes_t buffe_size,
+ jack_nframes_t samplerate,
+ bool capturing,
+ bool playing,
+ int chan_in,
+ int chan_out,
+ bool monitor,
+ const char* capture_driver_name,
+ const char* playback_driver_name,
+ jack_nframes_t capture_latency,
+ jack_nframes_t playback_latency);
+ int Close();
+ int Read();
+ int Write();
+ int SetBufferSize(jack_nframes_t buffer_size);
+
+ private:
+
+ float *inbuffer;
+ float *outbuffer;
+
+};
+
+} // end of namespace
+
+#endif
diff --git a/jack2-src/jack2-master/android/JackPlatformPlug_os.h b/jack2-src/jack2-master/android/JackPlatformPlug_os.h
new file mode 100644
index 0000000000..cc35d478bf
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackPlatformPlug_os.h
@@ -0,0 +1,91 @@
+/*
+ Copyright (C) 2004-2008 Grame
+ Copyright (C) 2013 Samsung Electronics
+
+ This program 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.
+
+ 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ */
+
+#ifndef __JackPlatformPlug_android__
+#define __JackPlatformPlug_android__
+
+#define jack_server_dir "/data/misc/jack"
+#define jack_client_dir "/data/misc/jack"
+#define JACK_DEFAULT_DRIVER "alsa"
+
+namespace Jack
+{
+ struct JackRequest;
+ struct JackResult;
+
+ class JackPosixMutex;
+ class JackAndroidThread;
+ class JackFifo;
+ class JackSocketServerChannel;
+ class JackSocketClientChannel;
+ class JackSocketServerNotifyChannel;
+ class JackSocketNotifyChannel;
+ class JackClientSocket;
+ class JackNetUnixSocket;
+}
+
+/* __JackPlatformMutex__ */
+#include "JackPosixMutex.h"
+namespace Jack {typedef JackPosixMutex JackMutex; }
+
+/* __JackPlatformThread__ */
+#include "JackAndroidThread.h"
+namespace Jack { typedef JackAndroidThread JackThread; }
+
+/* __JackPlatformSynchro__ client activation */
+/*
+#include "JackFifo.h"
+namespace Jack { typedef JackFifo JackSynchro; }
+*/
+
+#include "JackAndroidSemaphore.h"
+namespace Jack { typedef JackAndroidSemaphore JackSynchro; }
+
+/* __JackPlatformChannelTransaction__ */
+/*
+#include "JackSocket.h"
+namespace Jack { typedef JackClientSocket JackChannelTransaction; }
+*/
+
+/* __JackPlatformProcessSync__ */
+#include "JackPosixProcessSync.h"
+namespace Jack { typedef JackPosixProcessSync JackProcessSync; }
+
+/* __JackPlatformServerChannel__ */
+#include "JackSocketServerChannel.h"
+namespace Jack { typedef JackSocketServerChannel JackServerChannel; }
+
+/* __JackPlatformClientChannel__ */
+#include "JackSocketClientChannel.h"
+namespace Jack { typedef JackSocketClientChannel JackClientChannel; }
+
+/* __JackPlatformServerNotifyChannel__ */
+#include "JackSocketServerNotifyChannel.h"
+namespace Jack { typedef JackSocketServerNotifyChannel JackServerNotifyChannel; }
+
+/* __JackPlatformNotifyChannel__ */
+#include "JackSocketNotifyChannel.h"
+namespace Jack { typedef JackSocketNotifyChannel JackNotifyChannel; }
+
+/* __JackPlatformNetSocket__ */
+#include "JackNetUnixSocket.h"
+namespace Jack { typedef JackNetUnixSocket JackNetSocket; }
+
+#endif
diff --git a/jack2-src/jack2-master/android/JackSapaProxy.cpp b/jack2-src/jack2-master/android/JackSapaProxy.cpp
new file mode 100644
index 0000000000..45c2c979b8
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackSapaProxy.cpp
@@ -0,0 +1,158 @@
+/*
+Copyright (C) 2014 Samsung Electronics
+
+This program 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.
+
+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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#include "JackSapaProxy.h"
+#include "JackServerGlobals.h"
+#include "JackEngineControl.h"
+#include "JackLockedEngine.h"
+#include "JackArgParser.h"
+#include
+#include
+
+// Example)
+// sapaproxy
+// .----------.
+// sapaproxy:__system_capture_1 -->| |--> sapaproxy:capture_1
+// sapaproxy:__system_capture_2 -->| |--> sapaproxy:capture_2
+// ... | | ...
+// | |
+// sapaproxy:playback_1 ---------->| |--> sapaproxy:__system_playback_1
+// sapaproxy:playback_2 ---------->| |--> sapaproxy:__system_playback_2
+// sapaproxy:playback_3 ---------->| |--> sapaproxy:__system_playback_3
+// sapaproxy:playback_4 ---------->| |--> sapaproxy:__system_playback_4
+// ... | | ...
+// '----------'
+
+namespace Jack
+{
+
+ JackSapaProxy::JackSapaProxy(jack_client_t* client, const JSList* params)
+ :fClient(client)
+ {
+ jack_log("JackSapaProxy::JackSapaProxy");
+
+ fCapturePorts = fPlaybackPorts = 0;
+
+ const JSList* node;
+ const jack_driver_param_t* param;
+ for (node = params; node; node = jack_slist_next(node)) {
+ param = (const jack_driver_param_t*)node->data;
+
+ switch (param->character) {
+ case 'C':
+ fCapturePorts = (param->value.ui > SAPAPROXY_PORT_NUM_FOR_CLIENT)? SAPAPROXY_PORT_NUM_FOR_CLIENT : param->value.ui;
+ break;
+
+ case 'P':
+ fPlaybackPorts = (param->value.ui > SAPAPROXY_PORT_NUM_FOR_CLIENT)? SAPAPROXY_PORT_NUM_FOR_CLIENT : param->value.ui;
+ break;
+ }
+ }
+ }
+
+ JackSapaProxy::~JackSapaProxy()
+ {
+ jack_log("JackSapaProxy::~JackSapaProxy");
+ }
+
+ int JackSapaProxy::Setup(jack_client_t* client)
+ {
+ jack_log("JackSapaProxy::Setup");
+
+ //refer to system ports and create sapaproxy ports
+ unsigned int i = 0, j = 0;
+ const char **ports_system_capture;
+ const char **ports_system_playback;
+ unsigned int ports_system_capture_cnt = 0;
+ unsigned int ports_system_playback_cnt = 0;
+ char port_name[JACK_PORT_NAME_SIZE] = {0,};
+ ports_system_capture = jack_get_ports(client, "system:.*", NULL, JackPortIsPhysical | JackPortIsOutput);
+ if (ports_system_capture != NULL) {
+ for (i = 0; i < fCapturePorts && ports_system_capture[i]; i++) {
+ sprintf(port_name, "__system_capture_%d", i + 1);
+ fInputPorts[i] = jack_port_register(client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
+ sprintf(port_name, "capture_%d", i + 1);
+ fOutputPorts[i] = jack_port_register(client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+ ports_system_capture_cnt++;
+ }
+ jack_free(ports_system_capture);
+ }
+
+ ports_system_playback = jack_get_ports(client, "system:.*", NULL, JackPortIsPhysical | JackPortIsInput);
+ if (ports_system_playback != NULL) {
+ for (j = 0; j < fPlaybackPorts && ports_system_playback[j]; j++, i++) {
+ sprintf(port_name, "playback_%d", j + 1);
+ fInputPorts[i] = jack_port_register(client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
+ sprintf(port_name, "__system_playback_%d", j + 1);
+ fOutputPorts[i] = jack_port_register(client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+ ports_system_playback_cnt++;
+ }
+ jack_free(ports_system_playback);
+ }
+
+ //store actual number of system ports
+ fCapturePorts = ports_system_capture_cnt;
+ fPlaybackPorts = ports_system_playback_cnt;
+
+ jack_set_process_callback(client, Process, this);
+ jack_activate(client);
+
+ //connect between sapaproxy and system ports
+ for (unsigned int i = 0; i < ports_system_capture_cnt; i++) {
+ sprintf(port_name, "system:capture_%d", i + 1);
+ jack_connect(client, port_name, jack_port_name(fInputPorts[i]));
+ }
+
+ for (unsigned int i = 0; i < ports_system_playback_cnt; i++) {
+ sprintf(port_name, "system:playback_%d", i + 1);
+ jack_connect(client, jack_port_name(fOutputPorts[ports_system_capture_cnt + i]), port_name);
+ }
+
+ return 0;
+ }
+
+ int JackSapaProxy::Process(jack_nframes_t nframes, void* arg)
+ {
+ JackSapaProxy* sapaproxy = static_cast(arg);
+ jack_default_audio_sample_t *in, *out;
+
+ //for capture
+ for (unsigned int i = 0; i < sapaproxy->fCapturePorts; i++) {
+ in = (jack_default_audio_sample_t*)jack_port_get_buffer(sapaproxy->fInputPorts[i] , nframes);
+ out = (jack_default_audio_sample_t*)jack_port_get_buffer(sapaproxy->fOutputPorts[i], nframes);
+
+ // TODO: adjust pcm gain each platform here
+
+ memcpy(out, in, sizeof(jack_default_audio_sample_t) * nframes);
+ }
+
+ //for playback
+ for (unsigned int i = sapaproxy->fCapturePorts; i < (sapaproxy->fCapturePorts + sapaproxy->fPlaybackPorts); i++) {
+ in = (jack_default_audio_sample_t*)jack_port_get_buffer(sapaproxy->fInputPorts[i] , nframes);
+ out = (jack_default_audio_sample_t*)jack_port_get_buffer(sapaproxy->fOutputPorts[i], nframes);
+
+ // TODO: adjust pcm gain each platform here
+
+ memcpy(out, in, sizeof(jack_default_audio_sample_t) * nframes);
+ }
+
+ return 0;
+ }
+
+} // namespace Jack
diff --git a/jack2-src/jack2-master/android/JackSapaProxy.h b/jack2-src/jack2-master/android/JackSapaProxy.h
new file mode 100644
index 0000000000..05d119cff9
--- /dev/null
+++ b/jack2-src/jack2-master/android/JackSapaProxy.h
@@ -0,0 +1,59 @@
+/*
+Copyright (C) 2014 Samsung Electronics
+
+This program 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.
+
+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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#ifndef __JackSapaProxy__
+#define __JackSapaProxy__
+
+#include "JackConstants.h"
+#include "JackPlatformPlug.h"
+#include "jack.h"
+#include "jslist.h"
+#include